I'm new to Arduino, but I have my unit up and running. I am using an IR receiver to control 4 relays which in turn switch lights on and off. I found the sketch code online, changed the IR values to match my remote, and things work. I have tried 2 different sketches and both work for me, but both have the same minor glitches. When I press '1' on the remote, it should turn relay 1 on. When I press '1" again, relay 1 should turn off. Same for buttons 2, 3 and 4, they operate corresponding relays. Both sketches have the same minor glitch - sometimes it takes more than one press of a button to turn the relay on or off. I know for sure that one of the sketches accounted for this glitch with some extra lines of code, because I read about the fix in the forum. The other sketch uses a Samsung remote. I am using the $5 Keyes remote that is common with these projects. Does anyone know if the Keyes remote could be causing the glitch? Both of the sketches I read about and tested seemed to have accounted for the need to hit buttons multiple times, which is why I'm asking about the remote.
I will gladly provide the sketch if someone wants to see if something should be added to eliminate the glitch, but I thought I should ask about this $5 remote before I got too worked up. Thanks!
The Keyes IR remote control works fine for me. It uses NEC encoding (38KHz).
Post your code and a data sheet for the IR sensor and someone may be able to help.
State what library you are using for the IR device.
The delay(250) statement is unhealthy and could result in things getting lost.
Build into the code a Serial.print which shows the value returned by the sensor so you can see what happens. Depending on the library, a long press of a button could result in a repeat code being issued.
int NECDecode(unsigned long irValue) {
Serial.print("IR value: 0x") ;
Serial.println(irValue, HEX ) ;
switch (irValue) {
case 0xFF6897:
return 1;
case 0xFF9867:
return 2;
case 0xFFB04F:
return 3;
case 0xFF30CF:
return 4;
case 0xFF42BD:
return 5;
case 0xFF4AB5:
return 0;
}
return -1;
}
//**********************************************************************
#include "IRremote.h"
//LarryD
//Sketch to demonstrate using an IR hand remote to control Arduino outputs.
//The remote used here uses the NEC protocol.
//This remote sends the button code (example 0xFF629D) then a repeat code 0xFFFFFFFF
//The repeat code is re-sent as long as an IR remote button is pressed.
//The IR receiver used is the TSOP4838
/* 17 IR button remote layout http://i.imgur.com/X1KIdqI.png
^
< OK >
v
1 2 3
4 5 6
7 8 9
* 0 #
*/
const byte RECV_PIN = 7; //IR receive pin
IRrecv irrecv(RECV_PIN); //create instance of 'IRrecv'
decode_results results; //create instance of 'decode_results'
unsigned long TimerUp; //UP arrow on the remote
boolean TimerUpFlag = false;
unsigned long TimerDown; //DOWN arrow on the remote
boolean TimerDownFlag = false;
unsigned long TimerIntensity;
unsigned long TimerIncDec;
boolean intesityUpFlag = false;
boolean intesityDownFlag = false;
int brightness;
unsigned long dummy;
unsigned long * TimerPtr = &dummy; //pointer to the current timer
const byte upLED = 13; //turns on as long as the UP button is pressed
const byte downLED = 12; //turns on as long as the DOWN button is pressed
const byte leftLED = 11; //toggles on/off
const byte rightLED = 10; //toggles on/off
const byte intensityLED = 9; //a LED which can have its intensity adjusted
// s e t u p ( )
//**********************************************************************
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); //start receive
pinMode(upLED, OUTPUT);
pinMode(downLED, OUTPUT);
pinMode(leftLED, OUTPUT);
pinMode(rightLED, OUTPUT);
pinMode(intensityLED, OUTPUT); //this is a PWM output pin
} // E N D O F s e t u p ( )
// l o o p ( )
//**********************************************************************
void loop()
{
if (irrecv.decode(&results)) //is there IR remote button code
{
//Serial.println(results.value);
processButton(); //process button press
irrecv.resume(); //restart for next button press
}
//********************** //Turn off upLED
//if timing is enabled, is it time to stop
if (TimerUpFlag && millis() - TimerUp >= 250ul)
{
TimerUpFlag = false; //disable timing
TimerPtr = &dummy; //pointer to dummy timer
digitalWrite(upLED, LOW);
}
//********************** //Turn off downLED
//if timing is enabled, is it time to stop
if (TimerDownFlag && millis() - TimerDown >= 250ul)
{
TimerDownFlag = false; //disable timing
TimerPtr = &dummy; //pointer to dummy timer
digitalWrite(downLED, LOW);
}
//********************** //LED intensity
//are we still within the adjustment time
if (millis() - TimerIntensity <= 300ul)
{
//is it time to increase/decrease the intensity
if (millis() - TimerIncDec >= 200ul)
{
TimerIncDec = millis();
if (intesityUpFlag == true) //Increase
{
brightness += 5;
if (brightness > 255)
{
brightness = 255;
}
}
else if (intesityDownFlag == true) //Decrease
{
brightness -= 5;
if (brightness < 0)
{
brightness = 0;
}
}
analogWrite(intensityLED, brightness);
//Serial.println(brightness); //debug
}
}
//stop increasing/decreasing intensity
else
{
intesityUpFlag = false;
intesityDownFlag = false;
}
//************************************
//Other non blocking code goes here
//************************************
} // E N D O F l o o p ( )
//======================================================================
// F U N C T I O N S
//======================================================================
// p r o c e s s B u t t o n ( )
//**********************************************************************
//process IR remote button presses
void processButton()
{
switch (results.value)
{
//**********************
case 0xFF629D: //UP Arrow
{
Serial.println("UP");
TimerPtr = &TimerUp; //point to this timer
TimerUpFlag = true; //enable timing
digitalWrite(upLED, HIGH);
TimerUp = millis();
}
break;
//**********************
case 0xFFA857: //DOWN Arrow
{
Serial.println("DOWN");
TimerPtr = &TimerDown; //point to this timer
TimerDownFlag = true; //enable timing
digitalWrite(downLED, HIGH);
TimerDown = millis();
}
break;
//**********************
case 0xFF22DD: //LEFT Arrow
{
Serial.println("LEFT");
digitalWrite(leftLED, !digitalRead(leftLED)); //Toggle LED
}
break;
//**********************
case 0xFFC23D: //RIGHT Arrow
{
Serial.println("RIGHT");
digitalWrite(rightLED, !digitalRead(rightLED)); //Toggle LED
}
break;
//**********************
case 0xFF42BD: // * button
{
Serial.println("*");
TimerPtr = &TimerIntensity; //point to this timer
intesityUpFlag = true; //enable intensity up adjustment
intesityDownFlag = false;
TimerIncDec = millis();
TimerIntensity = millis();
}
break;
//**********************
case 0xFF52AD: // # button
{
Serial.println("#");
TimerPtr = &TimerIntensity; //point to this timer
intesityDownFlag = true; //enable intensity down adjustment
intesityUpFlag = false;
TimerIncDec = millis();
TimerIntensity = millis();
}
break;
//**********************
case 0xFF02FD:
Serial.println("OK");
break;
//**********************
case 0xFF6897:
Serial.println("1");
break;
//**********************
case 0xFF9867:
Serial.println("2");
break;
//**********************
case 0xFFB04F:
Serial.println("3");
break;
//**********************
case 0xFF30CF:
Serial.println("4");
break;
//**********************
case 0xFF18E7:
Serial.println("5");
break;
//**********************
case 0xFF7A85:
Serial.println("6");
break;
//**********************
case 0xFF10EF:
Serial.println("7");
break;
//**********************
case 0xFF38C7:
Serial.println("8");
break;
//**********************
case 0xFF5AA5:
Serial.println("9");
break;
//**********************
case 0xFF4AB5:
Serial.println("0");
break;
//**********************
case 0xFFFFFFFF: //Repeat code
{
Serial.println("REPEAT");
*TimerPtr = millis(); //reset the current timer
}
break;
} // END switch case
} // E N D o f p r o c e s s B u t t o n ( )
//**********************************************************************
//======================================================================
// E N D O F C O D E
//======================================================================