Hi All
I was wondering if anyone's managed to get interrupts working properly with an IR receiver? I'm still fairly new to the arduino and haven't implemented any interrupts yet.
What I'm hoping to do is loop through a function until an IR code is received, increment a variable by 1, then run the corresponding function until a new code is received.
I've got some IR code that works, switching pins from low to high as needed, from another project.
I'm still working on the functions (animations on 2 TLC5904s) so am really fishing to see if my idea would work and hoping someone has a successful implementation I could have a nosey at
Hi,
I am able to access it directly, however it may be cached on my machine. I don't want to clear the cache to find out so lets see if the OP can have a look for us.
The link is up for me.
That might do what I need, or at least give me some ideas thanks.
I've been using the IR library by Ken Shirrif, that works really well too but I can't get my head around getting it to interrupt and increment when I receive a signal.
Hi Paul
Sorry, I lost my code moving from machines.
I've copied it below, though I'm still writing the functions.
I'm - obviously - not the best at coding but I can usually get my head around code once I figure out what it does.
This code is really basic but it makes sense to me I just loops to variable anim based on the code from the remote, then runs the corresponding function.
Currently it would have to wait for the function to finish before starting the loop again, probably missing the read, I was hoping I could interrupt the current function, read the code from the remote, increment or decrement anim and then run the corresponding function.
[code]#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
irrecv.enableIRIn(); // Start the receiver
}
int anim = 1;
unsigned long last = millis();
void loop() {
if (irrecv.decode(&results)) {
// If it's been at least 1/4 second since the last
// IR received, toggle the relay
if (millis() - last > 250) {
if (results.value == 0x4cb92) { // Sony DVD play
anim + 1;
}
else if (results.value == 0x1cb92) { // Sony DVD stop
anim - 1;
}
}
last = millis();
irrecv.resume(); // Receive the next value
}
if (anim = 0) { // looping anim if it goes below 1
anim = 4;
}
else if (anim = 5) { // looping anim if it goes above 4
anim = 1;
}
else if (anim = 1) {
// run function 1
}
else if (anim = 2) {
// run function 2
}
else if (anim = 3) {
// run function 3
}
else if (anim = 4) {
// run function 4
}
}
if (anim = 0) { // looping anim if it goes below 1
anim = 4;
}
else if (anim = 5) { // looping anim if it goes above 4
anim = 1;
}
else if (anim = 1) {
// run function 1
}
else if (anim = 2) {
// run function 2
}
else if (anim = 3) {
// run function 3
}
else if (anim = 4) {
// run function 4
}
I think that you are missing a few ====================. Luckily, I have some to spare. Copy and paste these into your code, as required.
An interrupt, if you create one, will not stop the long functions from running. You need to re-think how you code them, to not be blocking functions. At the very least, they need to check, periodically, to see if there has been IR input, and end if there is.