スリープ
IoT ではセンサーで適当な時間間隔 (例えば 5 分) で計測することになるが, 計測していない時間帯は消費電力を抑えるためにマイコンをスリープさせるのが一般的である.
プロジェクトの準備
$ cd ~/esp $ git clone https://github.com/gfd-dennou-club/iotex-esp32-mrubyc.git mrubyc-08-sleep $ cd mrubyc-08-sleep
なお,make menuconfig で GPIO, SHT75, DEEP SLEEP にチェックを入れること
$ make menuconfig [*] USR ESP32 GPIO [*] PERIPHERAL: Temperature/Humidity Sensor SENSIRION SHT75 ..... [*] USE DEEP SLEEP
プログラム例
サンプルプログラムを利用してみる
$ cp example/master.rb.sleep mrblib/loops/master.rb
このファイルの中身は以下のようになっており,コメントを読みながら何が生じているか確認して欲しい.
$ less -N mrblib/loops/master.rb 1 #概要 summary 2 3 =begin JA 4 LEDを点滅させる処理を用いて、 5 Light Sleep、Deep Sleepの機能を確認するプログラムです。 6 =end JA 7 8 =begin EN 9 The program shows the function of Light Sleep and Deep Sleep 10 by using process of blinking LED. 11 =end EN 12 13 puts "Start!" 14 15 led1 = GPIO.new( 13, GPIO::OUT ) 16 led2 = GPIO.new( 12, GPIO::OUT ) 17 led3 = GPIO.new( 14, GPIO::OUT ) 18 19 # スイッチ1をonにすることでもsleepから抜け出せる 20 puts "Wakeup by Switch 1 is available." 21 sw1 = GPIO.new( 34, GPIO::IN, GPIO::PULL_UP ) 22 sw1.set_wakeup(true, 1) 23 # GPIO での wakeupの有効化 24 SLEEP.enable_gpio_wakeup 25 26 # LED1を6秒間点滅させる 27 3.times do 28 led1.write(1) 29 sleep 1 30 31 led1.write(0) 32 sleep 1 33 end 34 35 # 10秒間(要求単位がマイクロ秒なので10^6倍する)light sleepする 36 puts "> SLEEP.light_sleep(10 * 1000 * 1000)" 37 # すぐlight_sleepすると”> SL"までしか出力されないことがあるため、0.1秒待つ 38 sleep 0.1 39 SLEEP.light_sleep(10 * 1000 * 1000) 40 puts "Light Sleep finished." 41 42 # LED2を6秒間点滅させる 43 3.times do 44 led2.write(0) 45 sleep 1 46 47 led2.write(1) 48 sleep 1 49 end 50 51 # 10秒間(要求単位がマイクロ秒なので10^6倍する)deep sleepする 52 puts "> SLEEP.deep_sleep(10 * 1000 * 1000)" 53 SLEEP.deep_sleep(10 * 1000 * 1000) 54 # deep sleepは終了時プログラムの最初に行くので、このメッセージは表示されない! 55 # 10秒経つと、Start!と表示されLED1が点滅する(プログラムの先頭に戻る) 56 puts "Deep Sleep finished." 57 58 # LED3を点滅させる(実行されない) 59 while 1 60 led3.write(1) 61 sleep 1 62 63 led3.write(0) 64 sleep 1 65 end
プログラムの実行
以下のように実行して, LED の点灯の様子を確認せよ.
$ make $ make flash monitor