/* Fill-in your Template ID (only if using Blynk.Cloud) */
//Update the HEX code of IR Remote buttons 0x<HEX CODE>
#define IR_Button_1 48
#define IR_Button_2 24
#define IR_Fan_Up 2
#define IR_Fan_Down 152
#define IR_All_Off 162
//#define BLYNK_PRINT Serial
#include <Preferences.h>
#include <IRremote.h>
Preferences pref;
// define the GPIO connected with Relays and switches
#define RelayPin1 23 //D23
#define RelayPin2 22 //D22
#define SwitchPin1 13 //D13
#define SwitchPin2 12 //D12
#define FanRelay1 18 //D18
#define FanRelay2 5 //D5
#define FanRelay3 25 //D25
#define FanSwitch1 33 //D33
#define FanSwitch2 32 //D32
#define FanSwitch3 15 //D15
#define FanSwitch4 4 //D4
#define IR_RECV_PIN 35 // D35 (IR receiver pin)
//Change the virtual pins according the rooms
int currSpeed = 0;
// Relay State
bool toggleState_1 = LOW; //Define integer to remember the toggle state for relay 1
bool toggleState_2 = LOW; //Define integer to remember the toggle state for relay 2
bool fanSpeed_0 = LOW;
bool fanSpeed_1 = LOW; //Define integer to remember the toggle state for relay 5
bool fanSpeed_2 = LOW; //Define integer to remember the toggle state for relay 6
bool fanSpeed_3 = LOW; //Define integer to remember the toggle state for relay 7
bool fanSpeed_4 = LOW; //Define integer to remember the toggle state for relay 8
// Switch State
bool SwitchState_1 = LOW;
bool SwitchState_2 = LOW;
IRrecv irrecv(IR_RECV_PIN);
decode_results results;
void manual_control()
{
if (digitalRead(SwitchPin1) == LOW && SwitchState_1 == LOW) {
digitalWrite(RelayPin1, LOW);
toggleState_1 = HIGH;
SwitchState_1 = HIGH;
pref.putBool("Relay1", toggleState_1);
Serial.println("Switch-1 on");
}
if (digitalRead(SwitchPin1) == HIGH && SwitchState_1 == HIGH) {
digitalWrite(RelayPin1, HIGH);
toggleState_1 = LOW;
SwitchState_1 = LOW;
pref.putBool("Relay1", toggleState_1);
Serial.println("Switch-1 off");
}
if (digitalRead(SwitchPin2) == LOW && SwitchState_2 == LOW) {
digitalWrite(RelayPin2, LOW);
toggleState_2 = HIGH;
SwitchState_2 = HIGH;
pref.putBool("Relay2", toggleState_2);
Serial.println("Switch-2 on");
}
if (digitalRead(SwitchPin2) == HIGH && SwitchState_2 == HIGH) {
digitalWrite(RelayPin2, HIGH);
toggleState_2 = LOW;
SwitchState_2 = LOW;
pref.putBool("Relay2", toggleState_2);
Serial.println("Switch-2 off");
}
}
void ir_remote(){
if (irrecv.decode(&results)) {
switch(results.value){
case IR_Button_1:
digitalWrite(RelayPin1, toggleState_1);
toggleState_1 = !toggleState_1;
pref.putBool("Relay1", toggleState_1);
delay(100);
break;
case IR_Button_2:
digitalWrite(RelayPin2, toggleState_2);
toggleState_2 = !toggleState_2;
pref.putBool("Relay2", toggleState_2);
delay(100);
break;
case IR_Fan_Up:
if(currSpeed < 4){
currSpeed = currSpeed + 1;
fanSpeedControl(currSpeed);
pref.putInt("Fan", currSpeed);
}
delay(100);
break;
case IR_Fan_Down:
if(currSpeed > 0){
currSpeed = currSpeed - 1;
fanSpeedControl(currSpeed);
pref.putInt("Fan", currSpeed);
}
delay(100);
break;
case IR_All_Off:
all_SwitchOff();
break;
default : break;
}
//Serial.println(results.value, HEX);
irrecv.resume();
}
}
void all_SwitchOff(){
toggleState_1 = 0; digitalWrite(RelayPin1, HIGH); pref.putBool("Relay1", toggleState_1);delay(100);
toggleState_2 = 0; digitalWrite(RelayPin2, HIGH); pref.putBool("Relay2", toggleState_2); delay(100);
currSpeed = 0; fanSpeedControl(currSpeed); pref.putInt("Fan", currSpeed); delay(100);
}
void getRelayState()
{
//Serial.println("reading data from NVS");
toggleState_1 = pref.getBool("Relay1", 0);
digitalWrite(RelayPin1, !toggleState_1);
delay(200);
toggleState_2 = pref.getBool("Relay2", 0);
digitalWrite(RelayPin2, !toggleState_2);
delay(200);
currSpeed = pref.getInt("Fan", 0);
fanSpeedControl(currSpeed);
delay(200);
}
void setup()
{
Serial.begin(9600);
//Open namespace in read-write mode
pref.begin("Relay_State", false);
pinMode(RelayPin1, OUTPUT);
pinMode(RelayPin2, OUTPUT);
pinMode(FanRelay1, OUTPUT);
pinMode(FanRelay2, OUTPUT);
pinMode(FanRelay3, OUTPUT);
pinMode(SwitchPin1, INPUT_PULLUP);
pinMode(SwitchPin2, INPUT_PULLUP);
pinMode(FanSwitch1, INPUT_PULLUP);
pinMode(FanSwitch2, INPUT_PULLUP);
pinMode(FanSwitch3, INPUT_PULLUP);
pinMode(FanSwitch4, INPUT_PULLUP);
//During Starting all Relays should TURN OFF
digitalWrite(RelayPin1, !toggleState_1);
digitalWrite(RelayPin2, !toggleState_2);
digitalWrite(FanRelay1, HIGH);
digitalWrite(FanRelay2, HIGH);
digitalWrite(FanRelay3, HIGH);
irrecv.enableIRIn(); // Enabling IR sensor
getRelayState(); //fetch data from NVS Flash Memory
// delay(1000);
}
void loop()
{
manual_control();
fanRegularor(); //Control Fan Speed
ir_remote(); //IR remote Control
}
void fanRegularor(){
if (digitalRead(FanSwitch1) == HIGH && digitalRead(FanSwitch2) == HIGH && digitalRead(FanSwitch3) == HIGH && digitalRead(FanSwitch4) == HIGH && fanSpeed_0 == LOW)
{
currSpeed = 0;
fanSpeedControl(currSpeed);
pref.putInt("Fan", currSpeed);
fanSpeed_1 = LOW;
fanSpeed_2 = LOW;
fanSpeed_3 = LOW;
fanSpeed_4 = LOW;
fanSpeed_0 = HIGH;
}
if (digitalRead(FanSwitch1) == LOW && fanSpeed_1 == LOW)
{
currSpeed = 1;
fanSpeedControl(currSpeed);
pref.putInt("Fan", currSpeed);
fanSpeed_1 = HIGH;
fanSpeed_2 = LOW;
fanSpeed_3 = LOW;
fanSpeed_4 = LOW;
fanSpeed_0 = LOW;
}
if (digitalRead(FanSwitch2) == LOW && digitalRead(FanSwitch3) == HIGH && fanSpeed_2 == LOW)
{
currSpeed = 2;
fanSpeedControl(currSpeed);
pref.putInt("Fan", currSpeed);
fanSpeed_1 = LOW;
fanSpeed_2 = HIGH;
fanSpeed_3 = LOW;
fanSpeed_4 = LOW;
fanSpeed_0 = LOW;
}
if (digitalRead(FanSwitch2) == LOW && digitalRead(FanSwitch3) == LOW && fanSpeed_3 == LOW)
{
currSpeed = 3;
fanSpeedControl(currSpeed);
pref.putInt("Fan", currSpeed);
fanSpeed_1 = LOW;
fanSpeed_2 = LOW;
fanSpeed_3 = HIGH;
fanSpeed_4 = LOW;
fanSpeed_0 = LOW;
}
if (digitalRead(FanSwitch4) == LOW && fanSpeed_4 == LOW)
{
currSpeed = 4;
fanSpeedControl(currSpeed);
pref.putInt("Fan", currSpeed);
fanSpeed_1 = LOW;
fanSpeed_2 = LOW;
fanSpeed_3 = LOW;
fanSpeed_4 = HIGH;
fanSpeed_0 = LOW;
}
}
void fanSpeedControl(int fanSpeed){
switch(fanSpeed){
case 0:
digitalWrite(FanRelay1, HIGH);
digitalWrite(FanRelay2, HIGH);
digitalWrite(FanRelay3, HIGH);
break;
case 1:
digitalWrite(FanRelay1, HIGH);
digitalWrite(FanRelay2, HIGH);
digitalWrite(FanRelay3, HIGH);
delay(500);
digitalWrite(FanRelay1, LOW);
break;
case 2:
digitalWrite(FanRelay1, HIGH);
digitalWrite(FanRelay2, HIGH);
digitalWrite(FanRelay3, HIGH);
delay(500);
digitalWrite(FanRelay2, LOW);
break;
case 3:
digitalWrite(FanRelay1, HIGH);
digitalWrite(FanRelay2, HIGH);
digitalWrite(FanRelay3, HIGH);
delay(500);
digitalWrite(FanRelay1, LOW);
digitalWrite(FanRelay2, LOW);
break;
case 4:
digitalWrite(FanRelay1, HIGH);
digitalWrite(FanRelay2, HIGH);
digitalWrite(FanRelay3, HIGH);
delay(500);
digitalWrite(FanRelay3, LOW);
break;
default : break;
}
}