//#define DECODE_NEC
//#define DECODE_DENON
#include <IRremote.hpp>
#include <AsyncTimer.h>
#include <EEPROM.h>
#define TIMEOUT 500 // millisecondi
#define IRPIN 2
#define BUTTONPIN 6
#define MOTORPWM 3
#define MOTORDIR1 5
#define MOTORDIR2 4
unsigned short timeoutId=0;
unsigned short intervalId=0;
int programming_mode=0;
unsigned int speed=255; //max 255 for pwm
unsigned long up;
unsigned long down;
AsyncTimer t;
void stopmotor() {
digitalWrite(MOTORDIR1, LOW);
digitalWrite(MOTORDIR2, LOW);
}
void setup() {
EEPROM.get(0, up);
EEPROM.get(4, down);
Serial.begin(115200);
IrReceiver.begin(IRPIN);
pinMode(BUTTONPIN, INPUT_PULLUP);
pinMode(MOTORPWM, OUTPUT);
pinMode(MOTORDIR1, OUTPUT);
pinMode(MOTORDIR2, OUTPUT);
stopmotor();
analogWrite(MOTORPWM, speed);
}
void loop() {
t.handle();
if (digitalRead(BUTTONPIN)==LOW){
if (programming_mode>0){
if (programming_mode==3)
EEPROM.put(8,speed);
programming_mode=0;
digitalWrite(LED_BUILTIN,HIGH);
} else {
programming_mode=1;
t.cancel(intervalId);
intervalId=t.setInterval([](){digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));},100);
return;
}
}
if (IrReceiver.decode()) {
Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
//IrReceiver.printIRResultShort(&Serial); // optional use new print version
if (programming_mode==1) {
up=IrReceiver.decodedIRData.decodedRawData;
EEPROM.put(0,up);
delay(250);
programming_mode=2;
t.cancel(intervalId);
intervalId=t.setInterval([](){digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));},300);
} else if (programming_mode==2) {
down=IrReceiver.decodedIRData.decodedRawData;
EEPROM.put(4,down);
delay(250);
programming_mode=3;
t.cancel(intervalId);
analogWrite(LED_BUILTIN,speed);
} else if (programming_mode==3) {
if (IrReceiver.decodedIRData.decodedRawData==up)
speed=((speed+25)>255)?255:(speed+25);
else if (IrReceiver.decodedIRData.decodedRawData==down)
speed=((speed-25)<0)?0:(speed-25);
else {
programming_mode=0;
EEPROM.put(8,speed);
digitalWrite(LED_BUILTIN,HIGH);
return;
}
analogWrite(LED_BUILTIN,speed);
delay(250);
} else if (IrReceiver.decodedIRData.decodedRawData==up) {
t.cancel(timeoutId);
timeoutId=t.setTimeout(stopmotor,TIMEOUT);
digitalWrite(MOTORDIR1,HIGH);
digitalWrite(MOTORDIR2,LOW);
} else if (IrReceiver.decodedIRData.decodedRawData==down) {
t.cancel(timeoutId);
timeoutId=t.setTimeout(stopmotor,TIMEOUT);
digitalWrite(MOTORDIR1,LOW);
digitalWrite(MOTORDIR2,HIGH);
};
IrReceiver.resume();
};
}