#include #include #include "IRremote.h" #include #include #include #include #include #include #define EEPROM_SIZE 512 #define IRPin 13 #define zerocross 14 #define DimmerPin 27 #define Relay1 26 #define Relay2 25 #define Relay3 33 #define Relay4 32 #define Relay5 34 // Changed from 35 to 34, as 35 is input-only IRrecv irrecv(IRPin); decode_results results; dimmerLamp dimmer(DimmerPin, zerocross); WiFiManager wifiManager; WiFiServer server(80); WiFiClient client; Adafruit_SSD1306 display(128, 64, &Wire, -1); int Relay1State = 0; int Relay2State = 0; int Relay3State = 0; int Relay4State = 0; int Relay5State = 0; int outVal = 0; int dim_val; void IRRemote() { if((results.value == 3772784863) || (results.value == 16724175) || (results.value == 2352232746)) { digitalWrite(Relay1, Relay1State); EEPROM.write(1, Relay1State); Relay1State = !Relay1State; EEPROM.commit(); } if((results.value == 3772817503) || (results.value == 16718055) || (results.value == 3646859238)) { digitalWrite(Relay2, Relay2State); EEPROM.write(2, Relay2State); Relay2State = !Relay2State; EEPROM.commit(); } if((results.value == 3772801183) || (results.value == 16743045) || (results.value == 863828746)) { digitalWrite(Relay3, Relay3State); EEPROM.write(3, Relay3State); Relay3State = !Relay3State; EEPROM.commit(); } if((results.value == 3772780783) || (results.value == 16716015) || (results.value == 2868241258)) { digitalWrite(Relay4, Relay4State); EEPROM.write(4, Relay4State); Relay4State = !Relay4State; EEPROM.commit(); } if((results.value == 3772813423) || (results.value == 16726215) || (results.value == 1133568189)) { digitalWrite(Relay5, Relay5State); EEPROM.write(5, Relay5State); Relay5State = !Relay5State; EEPROM.commit(); } if((results.value == 3772793023) || (results.value == 16753245)) { digitalWrite(Relay1, Relay1State = 0); EEPROM.write(1, Relay1State); digitalWrite(Relay2, Relay2State = 0); EEPROM.write(2, Relay2State); digitalWrite(Relay3, Relay3State = 0); EEPROM.write(3, Relay3State); digitalWrite(Relay4, Relay4State = 0); EEPROM.write(4, Relay4State); digitalWrite(Relay5, Relay5State = 0); EEPROM.write(5, Relay5State); EEPROM.commit(); } if((results.value == 3772837903) || (results.value == 16769565)) { digitalWrite(Relay1, Relay1State = 1); EEPROM.write(1, Relay1State); digitalWrite(Relay2, Relay2State = 1); EEPROM.write(2, Relay2State); digitalWrite(Relay3, Relay3State = 1); EEPROM.write(3, Relay3State); digitalWrite(Relay4, Relay4State = 1); EEPROM.write(4, Relay4State); digitalWrite(Relay5, Relay5State = 1); EEPROM.write(5, Relay5State); EEPROM.commit(); } if((results.value == 3772833823) || (results.value == 16750695) || (results.value == 3023253057)) { if(outVal < 850) { outVal = outVal + 50; if(outVal > 850) { outVal = 850; } } } if((results.value == 3772829743) || (results.value == 16738455) || (results.value == 2628849121)) { if(outVal <= 850) { outVal = outVal - 50; if(outVal < 0) { outVal = 0; } } } dim_val = map(outVal, 0, 1023, 0, 100); dimmer.setPower(dim_val); EEPROM.write(6, dim_val); EEPROM.commit(); delay(40); irrecv.resume(); } void WifiVal() { client = server.available(); if (!client) return; while (!client.available()) delay(1); String request = client.readStringUntil('\r'); request.remove(0, 5); request.remove(request.length() - 9, 9); for (int i = 0; i < request.length(); i++) { if (request.substring(i, i + 1) == "/") { String RelayName = request.substring(0, i); int RelayValue = request.substring(i + 1).toInt(); Serial.print("RelayName: "); Serial.println(RelayName); Serial.print("RelayValue: "); Serial.println(RelayValue); if (RelayValue == 1 && RelayName == "Relay1") { digitalWrite(Relay1, Relay1State); EEPROM.write(1, Relay1State); Relay1State = !Relay1State; EEPROM.commit(); } if (RelayValue == 2 && RelayName == "Relay2") { digitalWrite(Relay2, Relay2State); EEPROM.write(2, Relay2State); Relay2State = !Relay2State; EEPROM.commit(); } if (RelayValue == 3 && RelayName == "Relay3") { digitalWrite(Relay3, Relay3State); EEPROM.write(3, Relay3State); Relay3State = !Relay3State; EEPROM.commit(); } if (RelayValue == 4 && RelayName == "Relay4") { digitalWrite(Relay4, Relay4State); EEPROM.write(4, Relay4State); Relay4State = !Relay4State; EEPROM.commit(); } if (RelayValue == 5 && RelayName == "Relay5") { digitalWrite(Relay5, Relay5State); EEPROM.write(5, Relay5State); Relay5State = !Relay5State; EEPROM.commit(); } if (RelayValue == 21 && RelayName == "AllRelay") { digitalWrite(Relay1, Relay1State = 0); EEPROM.write(1, Relay1State); Relay1State = !Relay1State; digitalWrite(Relay2, Relay2State = 0); EEPROM.write(2, Relay2State); Relay2State = !Relay2State; digitalWrite(Relay3, Relay3State = 0); EEPROM.write(3, Relay3State); Relay3State = !Relay3State; digitalWrite(Relay4, Relay4State = 0); EEPROM.write(4, Relay4State); Relay4State = !Relay4State; digitalWrite(Relay5, Relay5State = 0); EEPROM.write(5, Relay5State); Relay5State = !Relay5State; EEPROM.commit(); } if (RelayName == "Slider1") { outVal = RelayValue; dim_val = map(outVal, 0, 1023, 0, 100); dimmer.setPower(dim_val); EEPROM.write(6, dim_val); EEPROM.commit(); } } } request = ""; } void IRSetup() { irrecv.enableIRIn(); Serial.println("IR Receiver Setup Done."); } void RouterSetup() { WiFi.mode(WIFI_STA); wifiManager.setConfigPortalBlocking(false); wifiManager.setConfigPortalTimeout(60); if(wifiManager.autoConnect("SmartHome","SmartHome")) { Serial.println("Smart Home Connected To Wifi."); } else { Serial.println("Browse 192.168.0.4 To Configure Wifi ID, Password"); } } void WifiSetup() { server.begin(); Serial.println("Wifi Server Setup Done."); } void IRTask(void *parameter) { IRSetup(); for (;;) { if (irrecv.decode(&results)) { Serial.println(results.value, DEC); IRRemote(); } vTaskDelay(10 / portTICK_PERIOD_MS); } } void RouterTask(void *parameter) { RouterSetup(); for (;;) { wifiManager.process(); vTaskDelay(10 / portTICK_PERIOD_MS); } } void WifiTask(void *parameter) { WifiSetup(); for (;;) { WifiVal(); vTaskDelay(10 / portTICK_PERIOD_MS); } } void setup() { Serial.begin(115200); pinMode(Relay1, OUTPUT); pinMode(Relay2, OUTPUT); pinMode(Relay3, OUTPUT); pinMode(Relay4, OUTPUT); pinMode(Relay5, OUTPUT); digitalWrite(Relay1, EEPROM.read(1)); digitalWrite(Relay2, EEPROM.read(2)); digitalWrite(Relay3, EEPROM.read(3)); digitalWrite(Relay4, EEPROM.read(4)); digitalWrite(Relay5, EEPROM.read(5)); dimmer.begin(NORMAL_MODE, ON); dimmer.setPower(EEPROM.read(6)); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); for(;;); } delay(1000); display.setTextSize(1); display.setTextColor(WHITE); display.clearDisplay(); // 1. Function to implement the task, 2. Name of the task, 3. Stack size in words, 4. Task input parameter, 5. Priority of the task, 6. Task handle, 7. Core where the task should run xTaskCreatePinnedToCore(IRTask, "IR Task", 8192, NULL, 1, NULL, 0); xTaskCreatePinnedToCore(RouterTask, "Router Task", 8192, NULL, 1, NULL, 1); xTaskCreatePinnedToCore(WifiTask, "Wifi Task", 8192, NULL, 2, NULL, 1); } void loop() {}