#include #include #include #include #include #define LED_SEND D5 #define LED_RECEIVE D0 #define IR_RECEIVER D2 #define IR_EMITTER D6 #define STATE_LED D4 char ssid[] = "?????????"; char pass[] = "?????????"; char host[] = "ESP-OTA"; IRrecv irrecv(IR_RECEIVER); IRsend irsend(IR_EMITTER); decode_results results; ESP8266WebServer server(80); String currentLog=""; String pageHead = ""; String page; int blinkDelay = 0; int toggle; unsigned long codeValue; // The code value if not raw int codeLen; // The length of the code int codeType = -1; // The type of code unsigned int rawCodes[RAWBUF]; // The durations if raw unsigned long codeValueToSend; int codeLenToSend; int codeTypeToSend = -1; unsigned int rawCodesToSend[RAWBUF]; bool enableServer = false; void setup() { Serial.begin(9600); Serial.println(""); Serial.println("-------------- INITIALIZING SERVICES --------------"); pinMode(IR_RECEIVER, INPUT); // IR Input pinMode(IR_EMITTER, OUTPUT); // IR Output pinMode(STATE_LED, OUTPUT); pinMode(LED_SEND, OUTPUT); pinMode(LED_RECEIVE, OUTPUT); digitalWrite(STATE_LED, HIGH); //INITIALIZING DEVICE digitalWrite(LED_SEND, HIGH); //INITIALIZING DEVICE digitalWrite(LED_RECEIVE, HIGH); //INITIALIZING DEVICE Serial.println("Pins ready"); //RUN WIFI ESP.eraseConfig(); Serial.print("Connecting"); WiFi.mode(WIFI_STA); WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("WiFi ready: Connected to "); Serial.print(ssid); Serial.print(" at "); Serial.println(WiFi.localIP()); //RUN HTTP SERVER if (enableServer) { server.on("/", [](){ //Serial.print(""); //Serial.print("Received HTTP request. Sending: "); //Serial.println(page); server.send(200, "text/html", page); }); server.begin(); page = pageHead + "

Ready

"; Serial.println("HTTP Server ready"); } //RUN OTA ArduinoOTA.begin(); Serial.println("OTA ready"); //RUN IR irrecv.enableIRIn(); Serial.println("IR receiver ready"); //DEVICE READY Serial.println("-------------- ALL SERVICES READY --------------"); digitalWrite(STATE_LED, LOW); //DEVICE READY digitalWrite(LED_SEND, LOW); //INITIALIZING DEVICE digitalWrite(LED_RECEIVE, LOW); //INITIALIZING DEVICE } String typeToProtocol(int type) { switch(type) { case UNKNOWN: return "UNKNOWN"; case NEC: return "NEC"; case SONY: return "SONY"; case PANASONIC: return "PANASONIC"; case JVC: return "JVC"; case RC5: return "RC5"; case RC6: return "RC6"; } return "???"; } void loop() { if (enableServer) { server.handleClient(); //Anwser HTTP requests } ArduinoOTA.handle(); //Anwser OTA requests HandleIR(); } void HandleIR() { if (irrecv.decode(&results)) { storeCode(&results); blinkReceived(); irrecv.resume(); // resume receiver } } void blinkSend() { digitalWrite(LED_SEND, HIGH); delay(blinkDelay); digitalWrite(LED_SEND, LOW); } void blinkReceived() { digitalWrite(LED_RECEIVE, HIGH); delay(blinkDelay); digitalWrite(LED_RECEIVE, LOW); } void storeCode(decode_results *results) { codeType = results->decode_type; codeValue = results->value; codeLen = results->bits; currentLog += "Received IR: "; currentLog += String(codeValue) + "/" + typeToProtocol(codeType) + "/" + String(codeLen); bool known=false; if (codeValue == REPEAT) { known = true; currentLog += "(REPEAT)"; SendCodeValues(codeTypeToSend, codeValueToSend, codeLenToSend, "(REPEAT LAST CODE)"); } if (codeValue == 551502015 || codeValue == -1643507457) { known = true; currentLog += "(TV VOLUME UP)"; AudioVolumeUp(); } if (codeValue == 551534655 || codeValue == -1896920189) { known = true; currentLog += "(TV VOLUME DOWN)"; AudioVolumeDown(); } if (codeValue == 551522415 || codeValue==1907962371) { known = true; currentLog += "(TV MUTE)"; delay(200); AudioMute(); codeValueToSend = REPEAT; } if (codeValue == 551505585 || codeValue == -718962725) { known = true; currentLog += "(TV 1 RED)"; delay(200); AudioPower(); codeValueToSend = REPEAT; } if (codeValue == 551521905 || codeValue == -2136846781) { known = true; currentLog += "(TV 2 GREEN)"; delay(200); codeValueToSend = REPEAT; } if (codeValue == 551536185 || codeValue == 255616091) { known = true; currentLog += "(TV 3 YELLOW)"; delay(200); codeValueToSend = REPEAT; } if (codeValue == 551519865 || codeValue == 533969343) { known = true; currentLog += "(TV 4 BLUE)"; delay(200); codeValueToSend = REPEAT; } if (codeValue == 551541285) { known = true; currentLog += "(TV EXIT)"; delay(200); codeValueToSend = REPEAT; } if (!known) { currentLog += "{{UNASSIGNED}}"; codeValueToSend = -1; codeTypeToSend = -1; } currentLog += String(codeValue, HEX); Serial.println(currentLog); if (enableServer) { page = page + "

"+currentLog+"

"; if (page.length()>1024) { page = pageHead + "

"+currentLog+"

"; } } currentLog=""; } void AudioPower() { SendCodeValues(1, 1074070014, 32, "(AUDIO ON/OFF)"); } void AudioVolumeUp() { SendCodeValues(1, 1074091434, 32, "(AUDIO VOLUME UP)"); } void AudioVolumeDown() { SendCodeValues(1, 1074091689, 32, "(AUDIO VOLUME DOWN)"); } void AudioMute() { SendCodeValues(1, 1074091944, 32, "(AUDIO VOLUME MUTE)"); } void SendCodeValues(int type, unsigned long value, int len, String message) { codeTypeToSend = type; codeValueToSend = value; codeLenToSend = len; currentLog += " -> "; currentLog += String(codeValueToSend) + "/" + codeTypeToSend + "/" + codeLenToSend; currentLog += message; sendCode(0); } void sendCode(int repeat) { blinkSend(); if (codeTypeToSend == NEC) { if (repeat) { irsend.sendNEC(REPEAT, codeLenToSend); //Serial.println("Sent NEC repeat"); } else { irsend.sendNEC(codeValueToSend, codeLenToSend); //Serial.print("Sent NEC "); //Serial.println(codeValueToSend, HEX); } } else if (codeTypeToSend == SONY) { irsend.sendSony(codeValueToSend, codeLenToSend); //Serial.print("Sent Sony "); //Serial.println(codeValueToSend, HEX); } else if (codeTypeToSend == PANASONIC) { irsend.sendPanasonic(codeValueToSend, codeLenToSend); //Serial.print("Sent Panasonic"); //Serial.println(codeValueToSend, HEX); } else if (codeTypeToSend == JVC) { irsend.sendJVC(codeValueToSend, codeLenToSend, false); //Serial.print("Sent JVC"); //Serial.println(codeValueToSend, HEX); } else if (codeTypeToSend == RC5 || codeTypeToSend == RC6) { if (!repeat) { // Flip the toggle bit for a new button press toggle = 1 - toggle; } // Put the toggle bit into the code to send codeValueToSend = codeValueToSend & ~(1 << (codeLenToSend - 1)); codeValueToSend = codeValueToSend | (toggle << (codeLenToSend - 1)); if (codeTypeToSend == RC5) { //Serial.print("Sent RC5 "); //Serial.println(codeValueToSend, HEX); irsend.sendRC5(codeValueToSend, codeLenToSend); } else { irsend.sendRC6(codeValueToSend, codeLenToSend); //Serial.print("Sent RC6 "); //Serial.println(codeValueToSend, HEX); } } else if (codeTypeToSend == UNKNOWN /* i.e. raw */) { // Assume 38 KHz irsend.sendRaw(rawCodesToSend, codeLenToSend, 38); /* Serial.println("Sent raw"); for (int i=0; i