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