arduino led 問題

各位,小弟是初學者,自已睇書看懂了如何運用 ir remote

但係我只能用 ir 控制 led (開) 和 (關)
想令到 粒 led 收到指令後 閃爍 或是 慢慢由光變暗、再由暗變光,好像摸不著頭腦…
有師兄可以指點一二嗎??

以下是小弟的 code:

#include <IRremote.h>

int RECV_PIN = 2; // the pin where you connect the output pin of TSOP4838
int led1 = 8;

int led[] = {0,0};   //* the initial state of LEDs is OFF (zero)

#define code1  20655 // code received from button A

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);   
  irrecv.enableIRIn();
  pinMode(led1, OUTPUT);
  
}

void loop() {
  if (irrecv.decode(&results)) {
    unsigned int value = results.value;
    switch(value) {
       case code1:
         if(led[1] == 1) {        // if first led is on then
            digitalWrite(led1, LOW);   // turn it off when button is pressed
            led[1] = 0;           // and set its state as off
         } else {                      // else if first led is off
             digitalWrite(led1, HIGH); // turn it on when the button is pressed
             led[1] = 1;          // and set its state as on
         }
          break;
        
        
    }
    Serial.println(value); // you can comment this line
    irrecv.resume(); // Receive the next value
  }
}

用pwm pin,有255 levels

TOP

switch(value)入面唔需要SET開燈/熄燈
響出面先再用IF去行開燈/熄燈
閃爍用delay, 呼吸燈就用個FOR LOOP去LOOP 0-255 +delay 用analogWrite去較光暗

switch(value) {
       case code1:
         if(led[1] == 1) {        // if first led is on then
            led[1] = 0;           // and set its state as off
         } else {                      // else if first led is off
             led[1] = 1;          // and set its state as on
         }
          break;
        
          if(led[1])
          {
                digitalWrite(led1, HIGH); // turn it on when the button is pressed
                delay(500);
                digitalWrite(led1, LOW); // turn it on when the button is pressed
                delay(500);
            }


寫住閃個個俾你參考,另外個個俾你諗下先
同埋依個CODE有一個問題就係粒燈要完左一個循環先可以控制佢開關,因為個delay會卡住成段CODE,要完曬個兩個delay先會返去check個制既狀態,你可以諗下應該點改可以令佢著緊一半都可以熄左佢

TOP

回覆 3# peter95811658

多謝師兄指教,我自已個問題就係唔識得學你咁將個 IF 寫出去…所以一直的 在打圈。

至於 呼吸燈,我是這樣寫的…
唔知有無錯,不過又係回到當初問題…如果想加到紅外線上控制,就唔知點攪…

希望師兄 有時間可以指教一下…如果可以的話,可否寫個 code 出黎,我會慢慢去研究…
註:師兄,我無電子或 c 的底子,全是自已睇書摸摸下,所以有好多電腦語言還是看不明,見諒。
const int led[] ={9,10};           
int brightness=0;
int lighten=5;
int ledNums=0;
int direct=0;
void setup()  
{
}
void loop()  
{
  while(1)
  {  
   if(direct==0)
    {
      brightness=brightness+lighten;
      if(brightness>=250)
        direct=1;   
    }  
    else
    {  
      brightness=brightness-lighten;
      if(brightness<=15)
      {
        analogWrite(led[ledNums],0);
        direct=0;        
        ledNums=ledNums+1;
        if(ledNums>1)
         ledNums=0;
      }      
    }
    analogWrite(led[ledNums],brightness);  
    delay(15);     
  }  
}

TOP

當個receiver收到code1之後就轉去ledMode:1 (呼吸燈mode)
delay盡量唔好set太耐,因為佢會卡住塊板行irrecv.decode
寧願個brightStep整細啲,個delay都唔好太大
  1. #include <IRremote.h>

  2. int RECV_PIN = 2; // the pin where you connect the output pin of TSOP4838
  3. int led1 = 8;
  4. int led[] = {0,0};   //* the initial state of LEDs is OFF (zero)

  5. int ledMode = 0;
  6. unsigned int ledBrightness=0;
  7. int brightStep=1;


  8. #define code1  20655 // code received from button A

  9. IRrecv irrecv(RECV_PIN);

  10. decode_results results;

  11. void setup()
  12. {
  13.   Serial.begin(9600);   
  14.   irrecv.enableIRIn();
  15.   pinMode(led1, OUTPUT);
  16.   
  17. }

  18. void loop() {
  19.   if (irrecv.decode(&results)) {
  20.     unsigned int value = results.value;
  21.     switch(value) {
  22.        case code1:        ledMode=(ledMode==1?:0:1);                       
  23.                                         break;
  24.     }
  25.     Serial.println(value); // you can comment this line
  26.     irrecv.resume(); // Receive the next value
  27.   }
  28.   switch (ledMode){
  29.                 case 0:        //LED OFF
  30.                                 led[1] = 0;
  31.                                 break;
  32.                 case 1: //LED Breathing
  33.                                 if(ledBrightness==255 || ledBrightness==0)
  34.                                 {
  35.                                         brightStep *= -1;        //Inverse the direction
  36.                                 }
  37.                                 ledBrightness+=brightStep;
  38.                                 analogWrite(led1,ledBrightness);
  39.                                 delay(20);
  40.   }
  41. }
複製代碼

TOP

本帖最後由 Frankie3063 於 2016-4-6 18:15 編輯

回覆 5# pc323

多謝指教…我是否應稱呼你做 師姊?

天生有點蠢,請問圖中的 code那段,小弟看不明白

ledMode==1?:0:1  <個問號是代表甚麼呢?而且 code 不能 upload,紅線的地方出問題

師姊可否再指教下?希望不會給你帶來麻煩。
螢幕快照 2016-04-06 18.13.38.png
2016-4-6 18:15

TOP

回覆 6# Frankie3063


    係師兄
ledMode=(ledMode==1?0:1);
打多左個冒號喺?後面
(condition ? expr1 : expr2 )
其實係簡化版嘅if嚟
相等於
if (ledMode==1)
{
  ledMode=0;
}
else
{
  ledMode=1;
}

TOP

回覆 7# pc323

感謝師兄指教,明白了

還有個私人問題,想問下如果想正式去學 arduino程式,自學好像進步很慢,而且一有問題就卡住了…
有沒有坊間的課堂教 arduino 呢??想請問有沒有私人教授的呢?

TOP

回覆 8# Frankie3063

中學因為要推STEM先會教下arduino, 坊間有冇arduino班真係唔清楚
不過我覺得本身學左c之後再睇其他人啲arduino project/example,應該大概都明個logic點寫

TOP

回覆 9# pc323

噢  好多人都話要先學 C,真係難題了…

起初以為 arduino 係比較易上手的,本身沒有電腦語言的底子,所以剛起步就困難重重…書買了不少,但都係自學困難

無論如何,多謝師兄 指教…有問題希望日後師兄再指教一下。

TOP