Advertisement
Guest User

Untitled

a guest
Feb 20th, 2020
267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.86 KB | None | 0 0
  1. // Arduino 番外編13 スリープモード編
  2. // https://omoroya.com
  3. // https://omoroya.com/arduino-extra-edition-13/
  4.  
  5.  
  6. #include <avr/sleep.h>
  7. int wakePin = 2; // 割り込み用のピン番号
  8.  
  9. void setup() {
  10.   pinMode(LED_BUILTIN, OUTPUT);
  11.   pinMode(wakePin, INPUT_PULLUP);          // 割込み用のピンを入力のプルアップあり指定
  12.   Serial.begin(115200);                    // シリアルポートの指定
  13.   Serial.println("-- Sleep Test Start --");
  14.   digitalWrite(LED_BUILTIN, HIGH);
  15. }
  16.  
  17. void loop() {
  18.   if (Serial.available()) {                // シリアルモニターからの入力の受け取り
  19.     int val = Serial.read();               // val変数に格納
  20.  
  21.     if (val == 'i') {                      // "i" が入力された場合 SLEEP_MODE_IDLE
  22.       Serial.println(" MODE <- IDLE");     // モニタに表示
  23.       standBy();                           // スタンバイ突入調整関数読み出し
  24.       set_sleep_mode(SLEEP_MODE_IDLE);     // スリープモードの設定
  25.       interrupt();                         // 割込み関数の呼び出し
  26.     }
  27.     if (val == 'a') {                      // "a" が入力された場合 SLEEP_MODE_ADC
  28.       Serial.println(" MODE <- ADC");      // モニタに表示
  29.       standBy();                           // スタンバイ突入調整関数読み出し
  30.       set_sleep_mode(SLEEP_MODE_ADC);      // スリープモードの設定
  31.       interrupt();                         // 割込み関数の呼び出し
  32.     }
  33.     if (val == 'd') {                      // "d" が入力された場合 SLEEP_MODE_PWR_DOWN
  34.       Serial.println(" MODE <- DOWN");     // モニタに表示
  35.       standBy();                           // スタンバイ突入調整関数読み出し
  36.       set_sleep_mode(SLEEP_MODE_PWR_DOWN); // スリープモードの設定
  37.       interrupt();                         // 割込み関数の呼び出し
  38.     }
  39.     if (val == 's') {                      // "s" が入力された場合 SLEEP_MODE_PWR_SAVE
  40.       Serial.println(" MODE <- SAVE");     // モニタに表示
  41.       standBy();                           // スタンバイ突入調整関数読み出し
  42.       set_sleep_mode(SLEEP_MODE_PWR_SAVE); // スリープモードの設定
  43.       interrupt();                         // 割込み関数の呼び出し
  44.     }
  45.     if (val == 'b') {                      // "b" が入力された場合 SLEEP_MODE_STANDBY
  46.       Serial.println(" MODE <- STANDBY");  // モニタに表示
  47.       standBy();                           // スタンバイ突入調整関数読み出し
  48.       set_sleep_mode(SLEEP_MODE_STANDBY);  // スリープモードの設定
  49.       interrupt();                         // 割込み関数の呼び出し
  50.     }
  51.   }
  52.  
  53.   Serial.println("In operation.");         // モニタに動作中を表示
  54. //  digitalWrite(LED_BUILTIN, HIGH);
  55.   delay(500);
  56.   // 何か動作させたい場合はここにコードを追加
  57.   // 例えばLEDを点灯させるなど。
  58.   // setup関数での設定もお忘れなく!
  59. }
  60.  
  61. // スタンバイ突入調整関数
  62. void standBy() {
  63.   Serial.println("Arduino is standby.");   // モニタ表示
  64. //  digitalWrite(LED_BUILTIN, LOW);
  65.   delay(100);                              // 時間調整
  66. }
  67.  
  68. // 割込み関数
  69. void interrupt() {
  70.   attachInterrupt(0, wakeUp, LOW); // 割り込み処理の設定、2番ピンがLowで復帰
  71.   PRR = PRR | 0b00100000;          // 8bitタイマーdisable
  72.   sleep_mode();                    // スリープモードを有効にする
  73.   detachInterrupt(0);              // 割り込み処理を解除する
  74. }
  75.  
  76. void wakeUp() {
  77.   Serial.println("Wake up from standby."); // 復帰時にシリアルモニターに表示
  78.   digitalWrite(LED_BUILTIN, HIGH);
  79.   PRR = PRR & 0b00000000;                  // 8bitタイマーenable
  80.   delay(30000);                            // 時間調整
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement