Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
サンプルプログラム解説

概要

外部(デジタルピン)からの入力によって、ディープスリープ状態から復帰します。

プログラム

定義等

/*
Deep Sleep with External Wake Up
=====================================
This code displays how to use deep sleep with
an external trigger as a wake up source and how
to store data in RTC memory to use it over reboots

This code is under Public Domain License.

Hardware Connections
======================
Push Button to GPIO 33 pulled down with a 10K Ohm
resistor

NOTE:
======
Only RTC IO can be used as a source for external wake
source. They are pins: 0,2,4,12-15,25-27,32-39.

Author:
Pranav Cherukupalli <cherukupallip@gmail.com>
*/

#define BUTTON_PIN_BITMASK 0x200000000 // 2^33 in hex

RTC_DATA_ATTR int bootCount = 0;

BUTTON_PIN_BITMASKは定義していますが、このスケッチでは利用していません。

bootCountは、何回ブートされたかをカウントする変数です。RTC_DATA_ATTRは、変数をRTC SLOW Memoryに配置するよう指示します。RTC SLOW Memoryはディープスリープ中でもデータが消えないメモリです。

print_wakeup_reason()

/*
Method to print the reason by which ESP32
has been awaken from sleep
*/
void print_wakeup_reason(){
  esp_sleep_wakeup_cause_t wakeup_reason;

  wakeup_reason = esp_sleep_get_wakeup_cause();

  switch(wakeup_reason)
  {
    case 1  : Serial.println("Wakeup caused by external signal using RTC_IO"); break;
    case 2  : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
    case 3  : Serial.println("Wakeup caused by timer"); break;
    case 4  : Serial.println("Wakeup caused by touchpad"); break;
    case 5  : Serial.println("Wakeup caused by ULP program"); break;
    default : Serial.println("Wakeup was not caused by deep sleep"); break;
  }
}

print_wakeup_reason()は、ディープスリープからの復帰理由を表示します。

esp_sleep_get_wakeup_cause()は、ディープスリープから復帰した理由を返すESP-IDFのAPIです。

setup()

void setup(){
  Serial.begin(115200);
  delay(1000); //Take some time to open up the Serial Monitor

  //Increment boot number and print it every reboot
  ++bootCount;
  Serial.println("Boot number: " + String(bootCount));

  //Print the wakeup reason for ESP32
  print_wakeup_reason();

  /*
  First we configure the wake up source
  We set our ESP32 to wake up for an external trigger.
  There are two types for ESP32, ext0 and ext1 .
  ext0 uses RTC_IO to wakeup thus requires RTC peripherals
  to be on while ext1 uses RTC Controller so doesnt need
  peripherals to be powered on.
  Note that using internal pullups/pulldowns also requires
  RTC peripherals to be turned on.
  */
  esp_sleep_enable_ext0_wakeup(GPIO_NUM_33,1); //1 = High, 0 = Low

  //If you were to use ext1, you would use it like
  //esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK,ESP_EXT1_WAKEUP_ANY_HIGH);

  //Go to sleep now
  Serial.println("Going to sleep now");
  esp_deep_sleep_start();
  Serial.println("This will never be printed");
}

最初にbootCountをインクリメントすることで、ブート回数を設定した後、print_wakeup_reason()でブート理由を表示します。

esp_sleep_enable_ext0_wakeup()は、デジタルピンを使ったディープスリープからの復帰を有効にする関数です。今回は、GPIO33が1(=HIGH)になったら復帰するように設定しています。

次に、esp_deep_sleep_start()で、実際にディープスリープします。

loop()

void loop(){
  //This is not going to be called
}

何もしません。

実行結果

以下に実行結果を示します。ただし、最後にSerial.flush()を入れないとうまく表示されませんでした。

初回のブートは、Wakeup was not caused by deep sleep と表示され、2回目のブート(ディープスリープからの復帰)は、Wakeup caused by external signal using RTC_IOと表示されました。

バージョン

1.0.0



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2018 garretlab all rights reserved.
inserted by FC2 system