2017-10-26 20 views
0

Arduino Unoを搭載したシンプルなLEDコントローラを実装したいと思います。Arduino LED制御スリープ

  • デジタル2:ONためのボタンがOFF
  • デジタル3:ボタンの

    機能がある

すべてがうまく動作ウェイクアップするためのボタンが、それは、スリープ状態になったときLEDも消灯します。私はArduinoが眠りにつく30秒後にライトが欲しいと思っています。あなたはAVRのパワーダウンスリープモードを使用している

 #include <avr/sleep.h> 
     #define REDPIN 10 
     #define GREENPIN 11 
     #define BLUEPIN 9 
     #define delayTime 20 //za fading cas 

     unsigned long interval= 30000; 
     unsigned long previousMillis = 0; 
     const int ledPin = 12;  // the pin that the LED is attached to 
     const int buttonPin1 = 2;  //on off 

     bool vklop = false; 
     int bela = 10; 
     int barva; 
     int prejsnja_barva = 0; 

     int buttonPushCounter1 = 0; // counter for the number of button presses 
     int buttonState1 = 0;   // current state of the button 
     int lastButtonState1 = 0;  // previous state of the button 



     /////////////////////////////////////*SETUP*///////////////////////////////////////// 
     void setup() 
     { 
     pinMode(buttonPin1, INPUT); 
     pinMode(ledPin, OUTPUT); 
     Serial.begin(9600); 
     pinMode(3,INPUT);    //because of interrupts PIN digital 3 
     digitalWrite(3,HIGH); 
     } 

     /////////////////////////////////////*LOOP*///////////////////////////////////////// 
     void loop() 
     { 
     unsigned long currentMillis = millis(); 

     if ((currentMillis-previousMillis) > interval)  //15s timer 
     { 
      previousMillis = currentMillis;  
      Serial.println("SLEEP!"); // kaj delaj po preteku 5s 
      delay(50); 
      sleepSetup();      //sleep mode 
     } 
     else 
     { 
     buttonState1 = digitalRead(buttonPin1); 


     /////////////////////////////////////ON/OFF///////////////////////////////////////// 
     /////////////////////////////////////ON/OFF///////////////////////////////////////// 
     if (buttonState1 != lastButtonState1) // compare the buttonState to its previous state 
     { 

      if (buttonState1 == HIGH) // if the state has changed, increment the counter 
      { 

      buttonPushCounter1++; // if the current state is HIGH then the button went from off to on: 
      Serial.println("on"); 
      Serial.print("number of BUTTON1 pushes: "); 
      Serial.println(buttonPushCounter1); 
      digitalWrite(ledPin, HIGH); 
      if(buttonPushCounter1 % 2 == 0) 
      { 
       setColor(bela, bela, bela); 
       vklop = true; 
       barva = 13; 
      } 
      else 
      { 
       setColor(0, 0, 0); 
       vklop = false; 

      } 
      } 
      else      // if the current state is LOW then the button went from on to off: 
      { 

      Serial.println("off"); 
      digitalWrite(ledPin, LOW); 
      } 

      delay(50);    // Delay a little bit to avoid bouncing 
     } 

     lastButtonState1 = buttonState1; // save the current state as the last state, for next time through the loop 

     } 

     } 



     /////////////////////////////////functions///////////////////////////////////////////// 
     /////////////////////////////////functions///////////////////////////////////////////// 
     /////////////////////////////////functions///////////////////////////////////////////// 
     void setColor(int red, int green, int blue) 
     { 
     analogWrite(REDPIN, red); 
     analogWrite(GREENPIN, green); 
     analogWrite(BLUEPIN, blue); 
     } 




     void sleepSetup(void) 
     { 

      sleep_enable(); // Set sleep enable (SE) bit: 
      attachInterrupt(1, pinInterrupt, LOW); // Set pin 2 as interrupt and attach handler: 
      set_sleep_mode(SLEEP_MODE_PWR_DOWN); // define our preferred sleep mode: 
      digitalWrite(13,LOW); 
      sleep_cpu();  

      Serial.println("Just woke up!");   //OD TU SE NADALJUJE PO PRITISKU TIPKE 
      digitalWrite(13,HIGH); 
     } 


     void pinInterrupt() //ISR 
     { 
     sleep_disable(); 
     detachInterrupt(0); 
     } 
+0

何が眠っていますか?私はコード内のスリープへの参照が表示されません。また、未使用の変数や関数がありません。 [最小限の、完全で検証可能な例](https://stackoverflow.com/help/mcve)を作成します。 –

+0

あなたの投稿をありがとう、それは私の最初のものです。次回は、より良いものを作ります。私は他の機能を貼り付けます。すべての変数が使用されています。申し訳ありませんが、今から将来的にはより良いコードを作成します。私はすべてのコードを貼り付けることができません、それは文字によって制限されるので、 –

+1

あなたはすべてのコードを投稿するはずです。あなたはあなたのコードを[mcve]に減らすことになっています。あなたが直面している問題に属さないものはすべて削除してください。睡眠がすべてのLEDを消すことを実証するために、8つのボタン、無数の色などを必要としません。 1つはまた、十分であろう。不要なものはすべて削除してください。とにかくこのエラーを見つけるのに役立ちます。 – Piglet

答えて

2

は、ここに私のコードです。このモードでは、節電のためにすべてのタイマーがオフになっています。 タイマーなし - > PWMなし - >アナログ出力なし - > PWM駆動LEDなし

LEDをオンにしたままにすると、別のスリープモードが使用されます。

詳細は http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdfを参照してください。

しかし、正直言って、これが意味をなさないかどうかはわかりません。 3つの出力からLEDを駆動する場合、MCUをスリープ状態にすることで節約できる電力は、おそらく数パーセントです。

スリープがCPUを停止するため、プログラムが30秒後にLEDを消灯させることができなくなります。

なぜ寝る30代はないのですか?代わりに、電力を消費する外部タイミング回路もあります。だから私は30秒間数ミリアンペア以上のものがまだ良い選択肢だと思います。

関連する問題