wifi + NTP (mruby/c)

はじめに

wifi 接続して, 時刻を NTP で取得する. 得られた時刻で RTC を初期化し,LCD に時刻表示を行う. なお, RTC と LCD は git リポジトリに含まれるライブラリを用いることにする.

プロジェクトの準備

$ cd ~/esp

$ git clone https://github.com/gfd-dennou-club/iotex-esp32-mrubyc.git mrubyc-05-wifi

$ cd mrubyc-05-wifi

なお,make menuconfig で I2C, LCD, RTC, WIFI, SNTP にチェックを入れること.

$ make menuconfig

  [*] USR ESP32 I2C
  [*]     PERIPHERAL: LCD Display AQM0802A
  [*]     PERIPHERAL: Real Time Clock RC8035SA
  .......
  [*] USR ESP32 WIFI
  [*]     SERVICE: SNTP

プログラムの例

mrblib/loops/master.rb を以下のように編集せよ.これは NTP でネットワーク経由で時計 (RTC) を設定し, 液晶モニタに現在時刻を表示させるプログラムとなっている. SSID とパスフレーズは演習中に連絡する.

1  # coding: utf-8
2 
3  WiFi.init()
4  # WiFi.setup_ent_peap("id", "ssid", "username", "password")
5  WiFi.setup_psk("ssid", "password")          #SSID, パスフレーズを入力すること
6  WiFi.start()
7 
8  #I2C 初期化
9  i2c = I2C.new(22, 21)
10 
11 # LCD 初期化
12 lcd = AQM0802A.new(i2c)
13 lcd.setup
14 
15 # 時刻取得
16 SNTP.init()
17 
18 # RTC 初期化. 時刻設定
19 rtc = RC8035SA.new(i2c)
20 
21 #BCDコードへ変換. 
22 year = ((SNTP.year - 2000) / 10).to_i(2) << 4 | ((SNTP.year - 2000) % 10).to_i(2)
23 mon  = (SNTP.mon  / 10).to_i(2) << 4 | (SNTP.mon  % 10).to_i(2)
24 mday = (SNTP.mday / 10).to_i(2) << 4 | (SNTP.mday % 10).to_i(2)
25 hour = (SNTP.hour / 10).to_i(2) << 4 | (SNTP.hour % 10).to_i(2)
26 min  = (SNTP.min  / 10).to_i(2) << 4 | (SNTP.min  % 10).to_i(2)
27 sec  = (SNTP.sec  / 10).to_i(2) << 4 | (SNTP.sec  % 10).to_i(2)
28 
29 # RTCに時刻を与える.
30 #rtc.write([0x20, 0x03, 0x31, 1, 0x23, 0x59, 0x50]) #年(下2桁), 月, 日, 曜日, 時, 分, 秒
31 rtc.write([year, mon, mday, SNTP.wday, hour, min, sec]) #年(下2桁), 月, 日, 曜日, 時, 分, 秒
32 
33 while true
34   tt = rtc.read
35   lcd.cursor(0, 0)
36   lcd.write_string(sprintf("%02x-%02x-%02x", tt[0], tt[1], tt[2]))
37   lcd.cursor(0, 1)
38   lcd.write_string(sprintf("%02x:%02x:%02x", tt[4], tt[5], tt[6]))
39   sleep(1)
40 end

プログラムの実行

以下のように実行して, 現在時刻が LCD モニタに表示されることを確認すること.

$ make 

$ make flash monitor