정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

PWM핀 버그
박찬민 | 2016-11-26

#include <IRremote.h>                   //적외선 통신 라이브러리 추가
#include <MsTimer2.h>
const int irReceiverPin = 2;      //적외선센서
const int Rled = 9;               //빨간LED
const int Gled = 10;              //초록LED
const int Bled = 11;              //파랑LED
const int buzzer= 12;             //부저
boolean lightState = false;       //LED의 상태를 저장하기위한 변수
int led=9;                        //현재 어떤 LED(9,10,11)가 켜져있는지를 기억하기위한 변수
unsigned long last = millis();    //remember when we last received an IR message
int nextled=9;                    //다음에 켜질 LED(9,10,11)를 기억하기위한 변수
int brightness = 0;               //밝기값
int fadeAmount = 5;               //증감값
IRrecv irrecv(irReceiverPin);    //IRrecv 오브젝트 생성
decode_results decodedSignal;   //리모컨 적외선 value값
boolean flag = true;
void setup()
{
  // Open serial communications and wait for port to open:
   Serial.begin(9600);
   while (!Serial) {
   ;
   }

  pinMode(Rled, OUTPUT);
  pinMode(Gled, OUTPUT);
  pinMode(Bled, OUTPUT);
  pinMode(buzzer, OUTPUT);
  irrecv.enableIRIn();
}

void loop()  { 
  
  if (irrecv.decode(&decodedSignal) == true) 
  {
      if(decodedSignal.value==0xFFA25D){                            //리모컨의 전원버튼이 눌렸을때 RGB LED를 다킴!
        lightState = !lightState;
        if(lightState==true){
          Serial.print("$CLEAR\r\n");
          Serial.print("$GO 1 4\r\n");
          Serial.print("$PRINT LED ON\r\n");
        }
        else{
          Serial.print("$CLEAR\r\n");
          Serial.print("$GO 1 4\r\n");
          Serial.print("$PRINT LED OFF\r\n");
          delay(1000);
          Serial.print("$CLEAR\r\n");
        }
        digitalWrite(Rled,lightState);
        digitalWrite(Gled,lightState);
        digitalWrite(Bled,lightState);
        
      }
      
      if(decodedSignal.value==0xFF22DD && lightState==true){        //리모컨의 재생버튼을 누를때마다 R,G,B순으로 LED를 하나씩 켬!
        digitalWrite(Rled,!lightState);
        digitalWrite(Gled,!lightState);
        digitalWrite(Bled,!lightState);
        digitalWrite(nextled,lightState);
        Serial.print("$CLEAR\r\n");
        Serial.print("$GO 1 4\r\n");
        Serial.print("$PRINT Light Mode\n");
        Serial.println(nextled);
        led=nextled;                                                //현재 켜져있는 LED를 따로 저장함
        nextled=nextled+1;
        if(led==11)                                                 //현재 켜진 LED가 파랑이면 다음 켜질LED를 다시 빨강으로 초기화
          nextled=9;
      }
      
      if(decodedSignal.value==0xFF629D && lightState==true){        //리모컨의 MODE버튼을 누를때 analogWrite를 이용하여 LED를 서서히 밝아졌다가 서서히 줄어들게 함!
          Serial.print("$CLEAR\r\n");
          Serial.print("$GO 1 3\r\n");
          Serial.print("$PRINT Mood LED Mode\n");
          if(flag){
            Serial.println(nextled+100);
             MsTimer2::set(30,ModeTest);
             MsTimer2::start();
          }else{
            Serial.println(nextled+200);
             MsTimer2::stop();
          }
          flag = !flag;
      }
      //버튼이눌릴때마다 부저가 띠띡! 하고 울림
      digitalWrite(buzzer,HIGH);
      delay(50);
      digitalWrite(buzzer,LOW);
      delay(50);
      digitalWrite(buzzer,HIGH);
      delay(50);
      digitalWrite(buzzer,LOW);
      
      //버튼의 value값을 알아내기위해 필요한 문장
      Serial.print("value=");
      Serial.println(decodedSignal.value, HEX);
      irrecv.resume();
  }
}

void ModeTest(){
         Serial.println(led);
          analogWrite(led, brightness); 
          brightness = brightness + fadeAmount;
            if (brightness == 0 || brightness == 255)
               fadeAmount = -fadeAmount ;
}

 

 

 

 

소스는 이렇고 

 if(decodedSignal.value==0xFF629D && lightState==true)

안으로들어가면 현재 켜져있는 LED의 빛이 서서히 빛났다가 흐려지는 동작을 반복하는데

9,10번핀에 꽂은 빨강 초록 LED는 정상작동을합니다

그러나 11번핀에 꽂은 파랑 LED는 한번 켜졌다가 꺼지는것만 반복하더군여 왜이러나요;;;;

제아두이노 보드에 11번핀도 분명 ~ 표시가 있고 연결잘못한건 없는데말이죠....

이전글   |    아두이노 2개 연결 2016-11-26
다음글   |    스텝모터 제어시 궁금한 점이 있습니다. ... 2016-11-27