wifi + NTP (mruby/c)

はじめに

wifi 接続して, 時刻を NTP で取得する. 得られた時刻で RTC を初期化し,LCD に時刻表示を行う.

プロジェクトの準備

先に使ったディレクトリ mrubyc-04-i2c をそのまま使うことにする. メインプログラムはバックアップしておくこと.

$ cd ~/esp/mrubyc-04-i2c

$ cp mrblib/loops/master.rb mrblib/loops/master.rb.bk

プログラムの例

NTP でネットワーク経由で時計 (RTC) を設定し, 液晶モニタに現在時刻を表示させる.

1  # coding: utf-8
2 
3  WiFi.init()
4  #WiFi.setup_ent_peap("id", "ssid", "username", "password")
5  WiFi.setup_psk("ssid", "key")
6  WiFi.start()
7 
8  sleep 3
9 
10 #I2C 初期化
11 i2c = I2C.new(0, 22, 21)
12 i2c.driver_install
13 
14 # LCD 初期化
15 lcd = AQM0802A.new(i2c)
16 lcd.setup
17 
18 # 時刻取得
19 SNTP.init()
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 = RC8035SA.new(i2c)
31 
32 #RTCに時刻を与える.
33 rtc.write([year, mon, mday, SNTP.wday, hour, min, sec]) #年(下2桁), 月, 日, 曜日, 時, 分, 秒
34 
35 while true
36   # 1 秒毎に時刻表示 
37   tt = rtc.read
38   lcd.cursor(0, 0)
39   lcd.write_string(sprintf("%02x-%02x-%02x", tt[0], tt[1], tt[2]))
40   lcd.cursor(0, 1)
41   lcd.write_string(sprintf("%02x:%02x:%02x", tt[4], tt[5], tt[6]))
42   sleep(2)
43 end

プログラムの実行

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

$ make 

$ make flash monitor