Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <avr/sleep.h> //スリープ(パワーオフ休止状態)機能を使うためのライブラリを読み込む
- uint8_t val = 0; //スイッチに連動する変数 / 0-255
- uint8_t flash = 0; //フラッシュモードのフラグ
- uint8_t plus = 1; //フラッシュモードの増減方向フラグ
- void setup() {
- pinMode(0, OUTPUT); //LED駆動用PWM用ピン
- pinMode(1, INPUT_PULLUP); //DOWNボタン、プルアップ
- pinMode(2, INPUT_PULLUP); //UPボタン、プルアップ
- //コード節約のためanalogWrite()は使わない。よって直接TCCR0A/Bを操作してアナログ(PWM)出力の初期化が必要
- TCCR0A = 0b10000001; //OCR0A:8ビット位相基準PWM動作(比較一致でLOW) / OCR0Bは切断
- TCCR0B = 0b00000001; //8ビット位相基準PWM動作 / 前置分周無し(8MHz) / PWM 31.25KHz
- //TCCR0B = 0b00000011; //8ビット位相基準PWM動作 / クロック64分周(8MHz/64=125KHz) / PWM 488.28125Hz / Arduinoの標準的なPWMの周波数
- //TCCR0B = 0b00000101; //8ビット位相基準PWM動作 / クロック1024分周(8MHz/1024=7.8125KHz) / PWM 30.5175781Hz / 刺激的なフラッシュになる周波数
- set_sleep_mode(SLEEP_MODE_PWR_DOWN); //スリープ時のモードを「パワーダウン休止状態」に設定(省電力)
- if (digitalRead(1) == LOW) flash = 1; //SW_DW(PB1)を押しながらバッテリ接続でフラッシュモードに入るフラグをセット
- }
- void loop() {
- //スイッチの読み取り
- if (digitalRead(2) == LOW) { //SW_UP(PB2)がLOWに落ちている間
- if (val < 255) val++; //増やす(最高255まで)
- }
- if (digitalRead(1) == LOW) { //SW_DW(PB1)がLOWに落ちている間
- if (val > 0) val--; //減らす(最低0まで)
- }
- //輝度の計算
- if (!flash) { //通常モード
- OCR0AL = val; //valをそのまま輝度OCR0AL(PWM)とする / コード節約のためanalogWrite()は使わずOCR0ALレジスタに直接書き込む
- }
- else { //フラッシュモード
- if (plus) { //輝度増加時
- if ((255 - OCR0AL) >= val) //OCR0ALにvalを足しても255以上にならない場合だけ
- OCR0AL += val; //輝度OC0ALにvalを加算
- else { //255以上になってしまう場合
- OCR0AL = 255; //最大輝度にする
- plus = 0; //減少方向に転換
- }
- }
- else { //輝度減少時
- if (OCR0AL >= val) //OCR0ALからvalを引いても0以下にならない場合だけ
- OCR0AL -= val; //輝度OC0ALからvalを減算
- else { //0以下になってしまう場合
- OCR0AL = 0; //最小輝度にする
- plus = 1; //増加方向に転換
- }
- }
- }
- //ウェイト
- if (!flash) delay(5); //通常モード時のウェイト / 0から255までに、5ms*256=1.28sかかる
- else { //フラッシュモード時のウェイト
- if (val < 128) delay((255 - val) / 8); // valが0-127の範囲 / 周波数約0.0615Hzから15.625Hzまで変化 / 周波数=1000/((255/val)*((255-val)/8)*2) (*割り算の余りは切り捨て)
- else delay((255 - val) / 4); // valが128-255の範囲 / 周波数約15.748Hzから2000Hzまで変化 / 周波数=1000/((255/val)*((255-val)/4)*2) (*割り算の余りは切り捨て)
- }
- //輝度の設定とスリープ
- if (val == 0) { //valが0の時はパワーオフする
- OCR0AL = 0; //OCR0ALに0をセット
- plus = 1; //変化をプラス方向にセット
- delay(10); //OCR0ALへの0値のセットがPWMに反映される前にスリープに入るのを防ぐ
- attachInterrupt(0, wakeup, LOW); //割り込みを設定。スリープ中でもINT0(pinModeで言う2ピン、UPボタン)がLOWになると割り込み発生でwakeupに飛ぶ
- sleep_mode(); //スリープ開始。ボタン押下でdimmer()に飛んだ後ここから再開
- detachInterrupt(0); //割り込みを解除。これをしないとスリープ時以外の時も割り込みが発生してしまう
- }
- }
- void wakeup() {
- //attachInterruptで指定したこのwakeup()関数に飛ぶが
- //この関数内ではなにもしない
- //ただ、sleep_mode();直後の行から復帰する
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement