スリープ

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