Advertisement
INOUETAICHI

New MIERUNDES

May 7th, 2017
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.95 KB | None | 0 0
  1. #include <avr/sleep.h>                    //スリープ(パワーオフ休止状態)機能を使うためのライブラリを読み込む
  2.  
  3. uint8_t val = 0;                          //スイッチに連動する変数 / 0-255
  4. uint8_t flash = 0;                        //フラッシュモードのフラグ
  5. uint8_t plus = 1;                         //フラッシュモードの増減方向フラグ
  6.  
  7. void setup() {
  8.   pinMode(0, OUTPUT);                     //LED駆動用PWM用ピン
  9.   pinMode(1, INPUT_PULLUP);               //DOWNボタン、プルアップ
  10.   pinMode(2, INPUT_PULLUP);               //UPボタン、プルアップ
  11.   //コード節約のためanalogWrite()は使わない。よって直接TCCR0A/Bを操作してアナログ(PWM)出力の初期化が必要
  12.   TCCR0A = 0b10000001;                    //OCR0A:8ビット位相基準PWM動作(比較一致でLOW) / OCR0Bは切断
  13.   TCCR0B = 0b00000001;                    //8ビット位相基準PWM動作 / 前置分周無し(8MHz) / PWM 31.25KHz
  14. //TCCR0B = 0b00000011;                    //8ビット位相基準PWM動作 / クロック64分周(8MHz/64=125KHz) / PWM 488.28125Hz / Arduinoの標準的なPWMの周波数
  15. //TCCR0B = 0b00000101;                    //8ビット位相基準PWM動作 / クロック1024分周(8MHz/1024=7.8125KHz) / PWM 30.5175781Hz / 刺激的なフラッシュになる周波数
  16.   set_sleep_mode(SLEEP_MODE_PWR_DOWN);    //スリープ時のモードを「パワーダウン休止状態」に設定(省電力)
  17.   if (digitalRead(1) == LOW) flash = 1;   //SW_DW(PB1)を押しながらバッテリ接続でフラッシュモードに入るフラグをセット
  18. }
  19.  
  20. void loop() {
  21.  
  22.   //スイッチの読み取り
  23.   if (digitalRead(2) == LOW) {            //SW_UP(PB2)がLOWに落ちている間
  24.     if (val < 255) val++;                 //増やす(最高255まで)
  25.   }
  26.   if (digitalRead(1) == LOW) {            //SW_DW(PB1)がLOWに落ちている間
  27.     if (val > 0) val--;                   //減らす(最低0まで)
  28.   }
  29.  
  30.   //輝度の計算
  31.   if (!flash) {                           //通常モード
  32.     OCR0AL = val;                         //valをそのまま輝度OCR0AL(PWM)とする / コード節約のためanalogWrite()は使わずOCR0ALレジスタに直接書き込む
  33.   }
  34.   else {                                  //フラッシュモード
  35.     if (plus) {                           //輝度増加時
  36.       if ((255 - OCR0AL) >= val)          //OCR0ALにvalを足しても255以上にならない場合だけ
  37.         OCR0AL += val;                    //輝度OC0ALにvalを加算
  38.       else {                              //255以上になってしまう場合
  39.         OCR0AL = 255;                     //最大輝度にする
  40.         plus = 0;                         //減少方向に転換
  41.       }
  42.     }
  43.     else {                                //輝度減少時
  44.       if (OCR0AL >= val)                  //OCR0ALからvalを引いても0以下にならない場合だけ
  45.         OCR0AL -= val;                    //輝度OC0ALからvalを減算
  46.       else {                              //0以下になってしまう場合
  47.         OCR0AL = 0;                       //最小輝度にする
  48.         plus = 1;                         //増加方向に転換
  49.       }
  50.     }
  51.   }
  52.  
  53.   //ウェイト
  54.   if (!flash)  delay(5);                  //通常モード時のウェイト / 0から255までに、5ms*256=1.28sかかる
  55.   else {                                  //フラッシュモード時のウェイト
  56.     if (val < 128)  delay((255 - val) / 8); // valが0-127の範囲 / 周波数約0.0615Hzから15.625Hzまで変化 / 周波数=1000/((255/val)*((255-val)/8)*2) (*割り算の余りは切り捨て)
  57.     else            delay((255 - val) / 4); // valが128-255の範囲 / 周波数約15.748Hzから2000Hzまで変化 / 周波数=1000/((255/val)*((255-val)/4)*2) (*割り算の余りは切り捨て)
  58.   }
  59.  
  60.   //輝度の設定とスリープ
  61.   if (val == 0) {                         //valが0の時はパワーオフする
  62.     OCR0AL = 0;                           //OCR0ALに0をセット
  63.     plus = 1;                             //変化をプラス方向にセット
  64.     delay(10);                            //OCR0ALへの0値のセットがPWMに反映される前にスリープに入るのを防ぐ
  65.     attachInterrupt(0, wakeup, LOW);      //割り込みを設定。スリープ中でもINT0(pinModeで言う2ピン、UPボタン)がLOWになると割り込み発生でwakeupに飛ぶ
  66.     sleep_mode();                         //スリープ開始。ボタン押下でdimmer()に飛んだ後ここから再開
  67.     detachInterrupt(0);                   //割り込みを解除。これをしないとスリープ時以外の時も割り込みが発生してしまう
  68.   }
  69. }
  70.  
  71. void wakeup() {
  72.   //attachInterruptで指定したこのwakeup()関数に飛ぶが
  73.   //この関数内ではなにもしない
  74.   //ただ、sleep_mode();直後の行から復帰する
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement