Blynk based 4 channel home automation with feedback also work with two way toggle switch and physical switch control without internet connectivity

here is my code

//#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h> // here is the SimpleTimer library
#include <TimeLib.h>            // Used by WidgetRTC.h
SimpleTimer timer;


// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "chaitanyak";
char pass[] = "9510574409";
       
// Lighting control pins and AC feedback
int RELAY1_PIN = 16;       // Relay 1 pin
int RELAY2_PIN = 5;       // Relay 2 pin
int RELAY3_PIN = 4;       // Relay 3 pin
int RELAY4_PIN = 0;       // Relay 4 pin
int AC_Sens1_pin = 2;     // Relay 1 ac sens pin
int AC_Sens2_pin = 14;     // Relay 2 ac sens pin
int AC_Sens3_pin = 12;     // Relay 3 ac sens pin
int AC_Sens4_pin = 13;     // Relay 4 ac sens pin
int feedback1;            // AC feedback variable
int feedback2;            // AC feedback variable
int feedback3;            // AC feedback variable
int feedback4;            // AC feedback variable
int feedback5;            // AC feedback variable
int feedback6;            // AC feedback variable
int feedback7;            // AC feedback variable
int feedback8;            // AC feedback variable



void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
  pinMode(RELAY1_PIN, OUTPUT);
  pinMode(RELAY2_PIN, OUTPUT);
  pinMode(RELAY3_PIN, OUTPUT);
  pinMode(RELAY4_PIN, OUTPUT);
  pinMode(AC_Sens1_pin, INPUT);
  pinMode(AC_Sens2_pin, INPUT);
  pinMode(AC_Sens3_pin, INPUT);
  pinMode(AC_Sens4_pin, INPUT);

  // Default ALL relays to OFF before reinstating stored states
  digitalWrite(RELAY1_PIN, 0);
  digitalWrite(RELAY2_PIN, 0);
  digitalWrite(RELAY3_PIN, 0);
  digitalWrite(RELAY4_PIN, 0);

  //Lets sync up all the store states for the V pins and load the appropriate variables listed below
  Blynk.syncVirtual(V3);             // Light 1 Relay state
  Blynk.syncVirtual(V6);             // Light 2 Relay state
  Blynk.syncVirtual(V9);             // Light 3 Relay state
  Blynk.syncVirtual(V12);             // Light 4 Relay state

  timer.setInterval(300, AC_detect);      // Check AC_detect for AC presence every 50 milliseconds
}

void loop()
{
  Blynk.run();
  timer.run();
}

void AC_detect()
{
  feedback1 = digitalRead(AC_Sens1_pin); // Read the digital pin for an AC input
  feedback3 = digitalRead(AC_Sens2_pin); // Read the digital pin for an AC input
  feedback5 = digitalRead(AC_Sens3_pin); // Read the digital pin for an AC input
  feedback7 = digitalRead(AC_Sens4_pin); // Read the digital pin for an AC input

  // update SWITCH widget state only if AC input has changed since last check
  // this prevents widget switch bounce on the app device screen
  if (feedback1 != feedback2) Blynk.virtualWrite(V2, !feedback1);
  if (feedback3 != feedback4) Blynk.virtualWrite(V5, !feedback3);
  if (feedback5 != feedback6) Blynk.virtualWrite(V8, !feedback5);
  if (feedback7 != feedback8) Blynk.virtualWrite(V11, !feedback7);
  feedback2 = feedback1;
  feedback4 = feedback3;
  feedback6 = feedback5;
  feedback8 = feedback7;
}

// Sync up all of the virtual pin data
BLYNK_WRITE(V2)  // Runs every-time switch widget is toggled - For Light 1
BLYNK_WRITE(V5)  // Runs every-time switch widget is toggled - For Light 2
BLYNK_WRITE(V8)  // Runs every-time switch widget is toggled - For Light 3
BLYNK_WRITE(V11)  // Runs every-time switch widget is toggled - For Light 4
{
  
  digitalWrite(RELAY1_PIN, !digitalRead(RELAY1_PIN)); // Toggle relay1
  digitalWrite(RELAY2_PIN, !digitalRead(RELAY2_PIN)); // Toggle relay2
  digitalWrite(RELAY3_PIN, !digitalRead(RELAY3_PIN)); // Toggle relay3
  digitalWrite(RELAY4_PIN, !digitalRead(RELAY4_PIN)); // Toggle relay4
  Blynk.virtualWrite(V3, digitalRead(RELAY1_PIN));    // Store Light 1 relay state in V3
  Blynk.virtualWrite(V6, digitalRead(RELAY2_PIN));    // Store Light 2 relay state in V6
  Blynk.virtualWrite(V9, digitalRead(RELAY3_PIN));    // Store Light 3 relay state in V9
  Blynk.virtualWrite(V12, digitalRead(RELAY4_PIN));    // Store Light 4 relay state in V12
}

BLYNK_WRITE(V3)
BLYNK_WRITE(V6)
BLYNK_WRITE(V9)
BLYNK_WRITE(V12)
{
  int pinData = param.asInt();
  digitalWrite(RELAY1_PIN, pinData); // and reinstate relay state
  digitalWrite(RELAY2_PIN, pinData); // and reinstate relay state
  digitalWrite(RELAY3_PIN, pinData); // and reinstate relay state
  digitalWrite(RELAY4_PIN, pinData); // and reinstate relay state
}

but i am facing some issue like

C:\Users\Chaitanya\Documents\Arduino\libraries\blynk-library-master\src/Blynk/BlynkHandlers.h:163:31: note: in expansion of macro 'BLYNK_WRITE_2'

 #define BLYNK_WRITE(pin)      BLYNK_WRITE_2(pin)

                               ^

C:\Users\Chaitanya\Desktop\_4_channel_with_ac_sense\_4_channel_with_ac_sense.ino:109:1: note: in expansion of macro 'BLYNK_WRITE'

 BLYNK_WRITE(V6)

 ^

Read up in the Documents for direction on these and other Blynk commands: http://docs.blynk.cc/#blynk-firmware-virtual-pins-control

These are all Blynk functions and require the following bare basic syntax for each:

BLYNK_WRITE(Vx)
{   
  int value = param.asInt(); // Get value of Vx as integer
  // Do something based on value
}

Yeah hi @Khatrichaitanya you have gone a bit wrong with your pins syncing

here is my code for a single channel - ie 2 pins needed

Each Blynk_write function has to do something within it

so to extend this for two channel it would look like :slight_smile:

Hope this helps

Cheers

kev

@Khatrichaitanya In fact quicker do give you the newest version of the code - so here is a full 2ch version of the code. Note the AC feedback loop now has some bounce avoidance logic applied which helps the update to the widget buttons to be smoother. Just expand this as is for as many channesl as you need.

Should add to help you get your head around this you need 2 digital pins and 2 virtual pins per channel.
1 digital output per relay (pin 2 for relay 1 light 1)
1 digital input for each AC feedback detect(pin 3 for AC_sens 1 light 1)

1st virtual pin toggles relay when button widget pressed on app (V2 for relay 1 light 1)
2nd virtual pin stores relay state (V3 for relay 1 light 1)

Cheers

kev

#include<BlynkSimpleEthernet.h>
#include<SimpleTimer.h>
SimpleTimer timer;

// Lighting control pins and AC feedback
// Light 1
int RELAY1_PIN = 2;       // Relay 1 pin
int AC_Sens1_pin = 3;     // Relay 1 ac sens pin
int feedback;                   // AC Relay 1 feedback variable
int feedback1;                 // AC Realy 1 feedback1 variable
// Light 2
int RELAY2_PIN = 4;       // Relay 2 pin
int AC_Sens2_pin = 5;     // Relay 2 ac sens pin
int feedback2;                 // AC Relay 2 feedback2 variable
int feedback3;                 // AC Relay 2 feedback3 variable


char auth[] = "xxxxxxxxxxxxxxxxx";

void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth);
  // Setup all of the pins and default ALL relays to OFF before reinstating stored states
  //Light 1
  pinMode(RELAY1_PIN, OUTPUT);
  pinMode(AC_Sens1_pin, INPUT);
  digitalWrite(RELAY1_PIN, 0);
  //Light 2
  pinMode(RELAY2_PIN, OUTPUT);
  pinMode(AC_Sens2_pin, INPUT);
  digitalWrite(RELAY2_PIN, 0);

  //Lets sync up all the store states for the V pins and load the appropriate variables listed below
  Blynk.syncVirtual(V3);             // Light 1 Relay state
  Blynk.syncVirtual(V5);             // Light 2 Relay state

  timer.setInterval(200, AC_detect); // Check AC_detect for AC presence every 50 milliseconds
}

void loop()
{
  Blynk.run();
  timer.run();
}

void AC_detect()
{
  feedback1 = digitalRead(AC_Sens1_pin);
  feedback3 = digitalRead(AC_Sens2_pin);

  if (feedback != feedback1)
  { //state has changed
    Blynk.virtualWrite(V2, feedback1); // update SWITCH widget state from AC input only if it has changed
    feedback = feedback1;
  }
  if (feedback2 != feedback3)
  { //state has changed
    Blynk.virtualWrite(V4, feedback3);
    feedback2 = feedback3;
  }
}


// Sync up all of the virtual pin data
// Light  1
BLYNK_WRITE(V2)  // Runs every-time switch widget is toggled - For Light 1
{
  digitalWrite(RELAY1_PIN, !digitalRead(RELAY1_PIN)); // Toggle relay1
  Blynk.virtualWrite(V3, digitalRead(RELAY1_PIN));    // Store Light 1 relay state in V3
}

BLYNK_WRITE(V3)
{
  int pinData = param.asInt();       // Relay 1 state stored in V3
  digitalWrite(RELAY1_PIN, pinData); // and reinstate relay state
}

// Light 2
BLYNK_WRITE(V4)  // Runs every-time switch widget is toggled - For Light 2
{
  digitalWrite(RELAY2_PIN, !digitalRead(RELAY2_PIN)); // Toggle relay 2
  Blynk.virtualWrite(V5, digitalRead(RELAY2_PIN));    // Store Light 2 relay state in V5
}

BLYNK_WRITE(V5)
{
  int pinData = param.asInt();       // Relay 2 state stored in V5
  digitalWrite(RELAY2_PIN, pinData); // and reinstate relay state
}
1 Like

thans sir i am on the way project but need some more help

my code give error like Arduino: 1.8.1 (Windows 10), Board: “NodeMCU 1.0 (ESP-12E Module), 80 MHz, 9600, 4M (3M SPIFFS)”

C:\Users\Chaitanya\Desktop_2_chanel_2_chanel.ino: In function ‘void AC_detect()’:

_2_chanel:107: error: a function-definition is not allowed here before ‘{’ token

{

^

_2_chanel:113: error: a function-definition is not allowed here before ‘{’ token

{

^

_2_chanel:120: error: a function-definition is not allowed here before ‘{’ token

{

^

_2_chanel:126: error: a function-definition is not allowed here before ‘{’ token

{

^

_2_chanel:133: error: a function-definition is not allowed here before ‘{’ token

{

^

_2_chanel:139: error: a function-definition is not allowed here before ‘{’ token

{

^

_2_chanel:146: error: a function-definition is not allowed here before ‘{’ token

{

^

_2_chanel:152: error: a function-definition is not allowed here before ‘{’ token

{

^

_2_chanel:155: error: expected ‘}’ at end of input

}

^

exit status 1
a function-definition is not allowed here before ‘{’ token

This report would have more information with
“Show verbose output during compilation”
option enabled in File -> Preferences.

like this

my sketch

//#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h> // here is the SimpleTimer library
SimpleTimer timer;

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "xxxxxxxxxxxxxxxxxxxxxxx";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "chaitanyak";
char pass[] = "9510574409";

// Lighting control pins and AC feedback
// Light 1
int RELAY1_PIN = 16;       // Relay 1 pin
int AC_Sens1_pin = 0;     // Relay 1 ac sens pin
int feedback;                   // AC Relay 1 feedback variable
int feedback1;                 // AC Realy 1 feedback1 variable
// Light 2
int RELAY2_PIN = 5;       // Relay 2 pin
int AC_Sens2_pin = 12;     // Relay 2 ac sens pin
int feedback2;                 // AC Relay 2 feedback2 variable
int feedback3;                 // AC Relay 2 feedback3 variable
// Light 3
int RELAY3_PIN = 4;       // Relay 3 pin
int AC_Sens3_pin = 13;     // Relay 3 ac sens pin
int feedback4;                 // AC Relay 3 feedback4 variable
int feedback5;                 // AC Relay 3 feedback5 variable
// Light 4ff
int RELAY4_PIN = 2;       // Relay 4 pin
int AC_Sens4_pin = 14;     // Relay 4 ac sens pin
int feedback6;                 // AC Relay 4 feedback6 variable
int feedback7;                 // AC Relay 4 feedback7 variable
            

void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
  // Setup all of the pins and default ALL relays to OFF before reinstating stored states
  //Light 1
  pinMode(RELAY1_PIN, OUTPUT);
  pinMode(AC_Sens1_pin, INPUT);
  digitalWrite(RELAY1_PIN, 0);
  //Light 2
  pinMode(RELAY2_PIN, OUTPUT);
  pinMode(AC_Sens2_pin, INPUT);
  digitalWrite(RELAY2_PIN, 0);
  //Light 3
  pinMode(RELAY3_PIN, OUTPUT);
  pinMode(AC_Sens3_pin, INPUT);
  digitalWrite(RELAY3_PIN, 0);
  //Light 4
  pinMode(RELAY4_PIN, OUTPUT);
  pinMode(AC_Sens4_pin, INPUT);
  digitalWrite(RELAY4_PIN, 0);

  //Lets sync up all the store states for the V pins and load the appropriate variables listed below
  Blynk.syncVirtual(V3);             // Light 1 Relay state
  Blynk.syncVirtual(V5);             // Light 2 Relay state

  timer.setInterval(200, AC_detect); // Check AC_detect for AC presence every 50 milliseconds
}

void loop()
{
  Blynk.run();
  timer.run();
}

void AC_detect()
{
  feedback1 = digitalRead(AC_Sens1_pin);
  feedback3 = digitalRead(AC_Sens2_pin);
  feedback5 = digitalRead(AC_Sens3_pin);
  feedback7 = digitalRead(AC_Sens4_pin);

  if (feedback != feedback1)
  { //state has changed
    Blynk.virtualWrite(V2, feedback1); // update SWITCH widget state from AC input only if it has changed
    feedback = feedback1;
  }
  if (feedback2 != feedback3)
  { //state has changed
    Blynk.virtualWrite(V4, feedback3);
    feedback2 = feedback3;
  }
  if (feedback4 != feedback5)
  { //state has changed
    Blynk.virtualWrite(V6, feedback5); 
    feedback4 = feedback5;
    }
  if (feedback6 != feedback7)
  { //state has changed
    Blynk.virtualWrite(V8, feedback7);
    feedback6 = feedback7;
        
}


// Sync up all of the virtual pin data
// Light  1
BLYNK_WRITE(V2)  // Runs every-time switch widget is toggled - For Light 1
{
  digitalWrite(RELAY1_PIN, !digitalRead(RELAY1_PIN)); // Toggle relay1
  Blynk.virtualWrite(V3, digitalRead(RELAY1_PIN));    // Store Light 1 relay state in V3
}

BLYNK_WRITE(V3)
{
  int pinData = param.asInt();       // Relay 1 state stored in V3
  digitalWrite(RELAY1_PIN, pinData); // and reinstate relay state
}

// Light 2
BLYNK_WRITE(V4)  // Runs every-time switch widget is toggled - For Light 2
{
  digitalWrite(RELAY2_PIN, !digitalRead(RELAY2_PIN)); // Toggle relay 2
  Blynk.virtualWrite(V5, digitalRead(RELAY2_PIN));    // Store Light 2 relay state in V5
}

BLYNK_WRITE(V5)
{
  int pinData = param.asInt();       // Relay 2 state stored in V5
  digitalWrite(RELAY2_PIN, pinData); // and reinstate relay state
}

// Light 3
BLYNK_WRITE(V6)  // Runs every-time switch widget is toggled - For Light 3
{
  digitalWrite(RELAY3_PIN, !digitalRead(RELAY3_PIN)); // Toggle relay 3
  Blynk.virtualWrite(V7, digitalRead(RELAY3_PIN));    // Store Light 3 relay state in V7
}

BLYNK_WRITE(V7)
{
  int pinData = param.asInt();       // Relay 3 state stored in V7
  digitalWrite(RELAY3_PIN, pinData); // and reinstate relay state
}

// Light 4
BLYNK_WRITE(V8)  // Runs every-time switch widget is toggled - For Light 4
{
  digitalWrite(RELAY4_PIN, !digitalRead(RELAY4_PIN)); // Toggle relay 4
  Blynk.virtualWrite(V9, digitalRead(RELAY4_PIN));    // Store Light 3 relay state in V7
}

BLYNK_WRITE(V9)
{
  int pinData = param.asInt();       // Relay 4 state stored in V9
  digitalWrite(RELAY4_PIN, pinData); // and reinstate relay state
}

For starters you are missing a curly bracket } after feedback6 = feedback7;

shown below here

Cheers

kev

You also need to sync your additional V pins here - you only have 2 instead of 4

Chjeers

kev

thanks sir i made it by your best guideline

here is final sketch

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h> // here is the SimpleTimer library
SimpleTimer timer;

// Lighting control pins and AC feedback
// Light 1
int RELAY1_PIN = 16;       // Relay 1 pin
int AC_Sens1_pin = 4;     // Relay 1 ac sens pin
int feedback;                   // AC Relay 1 feedback variable
int feedback1;                 // AC Realy 1 feedback1 variable
// Light 2
int RELAY2_PIN = 5;       // Relay 2 pin
int AC_Sens2_pin = 0;     // Relay 2 ac sens pin
int feedback2;                 // AC Relay 2 feedback2 variable
int feedback3;                 // AC Relay 2 feedback3 variable
// Light 3
int RELAY3_PIN = 2;       // Relay 3 pin
int AC_Sens3_pin = 14;     // Relay 3 ac sens pin
int feedback4;                 // AC Relay 3 feedback4 variable
int feedback5;                 // AC Relay 3 feedback5 variable
// Light 4
int RELAY4_PIN = 12;       // Relay 4 pin
int AC_Sens4_pin = 13;     // Relay 4 ac sens pin
int feedback6;                 // AC Relay 4 feedback6 variable
int feedback7;                 // AC Relay 4 feedback7 variable




// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "chaitanyak";
char pass[] = "9510574409";

void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
  // Setup all of the pins and default ALL relays to OFF before reinstating stored states
  //Light 1
  pinMode(RELAY1_PIN, OUTPUT);
  pinMode(AC_Sens1_pin, INPUT);
  digitalWrite(RELAY1_PIN, 0);
  //Light 2
  pinMode(RELAY2_PIN, OUTPUT);
  pinMode(AC_Sens2_pin, INPUT);
  digitalWrite(RELAY2_PIN, 0);
  //Light 3
  pinMode(RELAY3_PIN, OUTPUT);
  pinMode(AC_Sens3_pin, INPUT);
  digitalWrite(RELAY3_PIN, 0);
  //Light 4
  pinMode(RELAY4_PIN, OUTPUT);
  pinMode(AC_Sens4_pin, INPUT);
  digitalWrite(RELAY4_PIN, 0);

  //Lets sync up all the store states for the V pins and load the appropriate variables listed below
  Blynk.syncVirtual(V3);             // Light 1 Relay state
  Blynk.syncVirtual(V5);             // Light 2 Relay state
  Blynk.syncVirtual(V7);             // Light 3 Relay state
  Blynk.syncVirtual(V9);             // Light 4 Relay state

  timer.setInterval(200, AC_detect); // Check AC_detect for AC presence every 50 milliseconds
}

void loop()
{
  Blynk.run();
  timer.run();
}

void AC_detect()
{
  feedback1 = digitalRead(AC_Sens1_pin);
  feedback3 = digitalRead(AC_Sens2_pin);
  feedback5 = digitalRead(AC_Sens3_pin);
  feedback7 = digitalRead(AC_Sens4_pin);

  if (feedback != feedback1)
  { //state has changed
    Blynk.virtualWrite(V2, feedback1); // update SWITCH widget state from AC input only if it has changed
    feedback = feedback1;
  }
  if (feedback2 != feedback3)
  { //state has changed
    Blynk.virtualWrite(V4, feedback3);
    feedback2 = feedback3;
  }
    if (feedback4 != feedback5)
  { //state has changed
    Blynk.virtualWrite(V6, feedback5);
    feedback4 = feedback5;
  }
    if (feedback6 != feedback7)
    { //state has changed
    Blynk.virtualWrite(V8, feedback6);
    feedback6 = feedback7;
    }
}


// Sync up all of the virtual pin data
// Light  1
BLYNK_WRITE(V2)  // Runs every-time switch widget is toggled - For Light 1
{
  digitalWrite(RELAY1_PIN, !digitalRead(RELAY1_PIN)); // Toggle relay1
  Blynk.virtualWrite(V3, digitalRead(RELAY1_PIN));    // Store Light 1 relay state in V3
}

BLYNK_WRITE(V3)
{
  int pinData = param.asInt();       // Relay 1 state stored in V3
  digitalWrite(RELAY1_PIN, pinData); // and reinstate relay state
}

// Light 2
BLYNK_WRITE(V4)  // Runs every-time switch widget is toggled - For Light 2
{
  digitalWrite(RELAY2_PIN, !digitalRead(RELAY2_PIN)); // Toggle relay 2
  Blynk.virtualWrite(V5, digitalRead(RELAY2_PIN));    // Store Light 2 relay state in V5
}

BLYNK_WRITE(V5)
{
  int pinData = param.asInt();       // Relay 2 state stored in V5
  digitalWrite(RELAY2_PIN, pinData); // and reinstate relay state
}
// Light  3
BLYNK_WRITE(V6)  // Runs every-time switch widget is toggled - For Light 3
{
  digitalWrite(RELAY3_PIN, !digitalRead(RELAY3_PIN)); // Toggle relay3
  Blynk.virtualWrite(V7, digitalRead(RELAY3_PIN));    // Store Light 3 relay state in V7
}

BLYNK_WRITE(V7)
{
  int pinData = param.asInt();       // Relay 1 state stored in V7
  digitalWrite(RELAY3_PIN, pinData); // and reinstate relay state
}
// Light  4
BLYNK_WRITE(V8)  // Runs every-time switch widget is toggled - For Light 4
{
  digitalWrite(RELAY4_PIN, !digitalRead(RELAY4_PIN)); // Toggle relay4
  Blynk.virtualWrite(V9, digitalRead(RELAY4_PIN));    // Store Light 4 relay state in V9
  }
1 Like

may i know which board used for logic sensing kindly refer model no for ac line output sensing

read my post here it’s all in there and some very interesting discussions to.

cheers

Kev

1 Like

can anyone show the wiring diagram?