/***************************************************************
*ESP 32 IR RELAY CHALLENGE: USING THE POWER OF REMOTE CONTROL*
*SUBMITTED BY: CO, MA.DIANNA R.*
*SUBMITTED TO: PROF.MICHAEL T. SAMONTE*
***************************************************************/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>
#define RELAY1_PIN 23 // pin for Relay 1
#define RELAY2_PIN 19 // pin for Relay 2
#define RELAY3_PIN 18 // pin for Relay 3
#define RELAY4_PIN 5 // pin for Relay 4
#define IR_PIN 26 // pin for IR receiver
#define BUTTON1_PIN 13 // pin for Button 1
#define BUTTON2_PIN 12 // pin for Button 2
#define BUTTON3_PIN 14 // pin for Button 3
#define BUTTON4_PIN 27 // pin for Button 4
LiquidCrystal_I2C lcd(0x27, 16, 4);
IRrecv irReceiver(IR_PIN);
void setup() {
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
pinMode(RELAY3_PIN, OUTPUT);
pinMode(RELAY4_PIN, OUTPUT);
pinMode(BUTTON1_PIN, INPUT_PULLUP);
pinMode(BUTTON2_PIN, INPUT_PULLUP);
pinMode(BUTTON3_PIN, INPUT_PULLUP);
pinMode(BUTTON4_PIN, INPUT_PULLUP);
lcd.init(); //initialize the LCD
lcd.backlight(); // turn on backlight
irReceiver.enableIRIn(); // Start the IR receiver
}
void loop() {
static unsigned long lastRefreshTime = 0;
static boolean ledStates[] = {false, false, false, false};
// Check for IR remote input
decode_results results;
if (irReceiver.decode(&results)) {
handleIRRemote(results.value, ledStates);
irReceiver.resume();
}
// Check button states
updateButtonState(BUTTON1_PIN, ledStates[0], RELAY1_PIN);
updateButtonState(BUTTON2_PIN, ledStates[1], RELAY2_PIN);
updateButtonState(BUTTON3_PIN, ledStates[2], RELAY3_PIN);
updateButtonState(BUTTON4_PIN, ledStates[3], RELAY4_PIN);
// Refresh LCD every 500 milliseconds
if (millis() - lastRefreshTime >= 500) {
updateLCD(ledStates);
lastRefreshTime = millis();
}
}
void handleIRRemote(uint64_t code, boolean ledStates[]) {
switch (code) {
case 0XFF0CF3: // Example IR remote code for LED 1
ledStates[0] = !ledStates[0];
digitalWrite(RELAY1_PIN, ledStates[0] ? HIGH : LOW);
break;
case 0XFF18E7: // Example IR remote code for LED 2
ledStates[1] = !ledStates[1];
digitalWrite(RELAY2_PIN, ledStates[1] ? HIGH : LOW);
break;
case 0XFF5EA1: // Example IR remote code for LED 3
ledStates[2] = !ledStates[2];
digitalWrite(RELAY3_PIN, ledStates[2] ? HIGH : LOW);
break;
case 0XFF08F7: // Example IR remote code for LED 4
ledStates[3] = !ledStates[3];
digitalWrite(RELAY4_PIN, ledStates[3] ? HIGH : LOW);
break;
// Add cases for other remote codes as needed
}
}
void updateButtonState(int buttonPin, boolean &ledState, int relayPin) {
if (digitalRead(buttonPin) == LOW) {
ledState = !ledState;
digitalWrite(relayPin, ledState ? HIGH : LOW);
delay(250); // Button debounce delay
}
}
void updateLCD(boolean ledStates[]) {
for (int i = 0; i < 4; i++) {
lcd.setCursor(0, i);
lcd.print("LED");
lcd.print(i + 1);
lcd.print(": ");
lcd.print(ledStates[i] ? "ON " : "OFF");
}
}