Advertisement
INOUETAICHI

MIERUNDUINO

Aug 6th, 2016
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.21 KB | None | 0 0
  1. //MIERUNDES Arduino版 attachInterrupt(INT0)使用 PCINT0不使用 デフォルトの64分周でLEDちらつき有り
  2. //LED抜きパワーオン時2.43mA
  3. //200mAh/(320+2.43)mA=37.2173805min.
  4. #include <avr/sleep.h>                    //スリープ(パワーオフ休止状態)機能を使うためのライブラリを読み込む
  5.  
  6. //ソフトウェアリセットのためのマクロ
  7. //http://www.atmel.com/webdoc/AVRLibcReferenceManual/FAQ_1faq_softreset.html
  8. #include <avr/wdt.h>
  9. void soft_reset() {  
  10.   do {
  11.     wdt_enable(WDTO_15MS);
  12.     for (;;) {
  13.     }
  14.   } while (0);
  15. }
  16.  
  17. int brightness = 0;                       //輝度を格納するための変数(LED側でショートしたときに出力0%でリセットされ回路が保護される)
  18.  
  19. void setup() {
  20.   pinMode(0, INPUT_PULLUP);               //DOWNボタン、プルアップ
  21.   pinMode(1, OUTPUT);                     //LED駆動用PWM用ピン
  22.   pinMode(2, INPUT_PULLUP);               //UPボタン、プルアップ、(INT0ピンでもある)
  23.   set_sleep_mode(SLEEP_MODE_PWR_DOWN);    //スリープ時のモードを「パワーダウン休止状態」に設定(省電力)
  24. }
  25.  
  26. void loop() {
  27.  
  28.   unsigned long lastmillis = millis();    //1同時押しの時間をカウントするためmillis()を記録
  29.   while (digitalRead(2) == LOW && digitalRead(0) == LOW) {
  30.     if ((millis() - lastmillis) > 1000) soft_reset(); //SW_UPとSW_DWの同時押しが1秒続いたらリセット
  31.   }
  32.  
  33.   if (digitalRead(2) == LOW) {            //SW_UP(PB2)がLOWに落ちている間
  34.     if (brightness < 255) brightness++;   //輝度を増やす(最高255まで)
  35.   }
  36.   if (digitalRead(0) == LOW) {            //SW_DW(PB1)がLOWに落ちている間
  37.     if (brightness > 0) brightness--;     //輝度を減らす(最低0まで)
  38.   }
  39.  
  40.   analogWrite(1, brightness);             //輝度の変更を実行
  41.   //TCCR0B = ((TCCR0B & 0xF8) | 0x01);      //周波数を64周分 → 1周分に設定変更してLEDのちらつきをなくす
  42.   //bitDuinoの場合は必要ないが、Trinket互換の場合、delay等micros()を使う関数は
  43.   //64倍してやらないと正しいディレイにならない
  44.  
  45.   if (brightness == 0) {                  //輝度0の時はパワーオフする
  46.     attachInterrupt(0, wakeup, LOW);      //割り込みを設定。スリープ中でもINT0(pinModeで言う2ピン、UPボタン)がLOWになると割り込み発生でwakeupに飛ぶ
  47.     sleep_mode();                         //スリープ開始。ボタン押下でdimmer()に飛んだ後ここから再開
  48.     detachInterrupt(0);                   //割り込みを解除。これをしないとスリープ時以外の時も割り込みが発生してしまう
  49.     pinMode(2, INPUT_PULLUP);             //UPボタン、プルアップ
  50.   }
  51.  
  52.   delay(4);                            //brightness変化速度調整のためのウェイト
  53.   //delay(4*64);                            //brightness変化速度調整のためのウェイト
  54.   //TCCR0Bを操作しているので64倍してある
  55.  
  56. }
  57.  
  58. void wakeup() {
  59.   //attachInterruptで指定したこのwakeup()関数に飛ぶが
  60.   //この関数内ではなにもしない
  61.   //ただ、sleep_mode();直後の行から復帰する
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement