2017-10-26 24 views
0

Arduino Uno로 간단한 LED 컨트롤러를 구현하고 싶습니다. 잠자기 상태가되어 다른 버튼이 있습니다.Arduino LED control sleep

  • 디지털 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

어떤 수면? 코드에서 수면 참조가 표시되지 않습니다. 또한 사용하지 않은 변수와 누락 된 함수가 많이 있습니다. [Minimal, Complete, Verifiable example] (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 초 동안 몇 밀리 암페어가 더 좋은 대안이라고 생각합니다.