I need fix my code to on/off relay

The condition is press button 1 relay 1 on and wait unit till press button 1 relay 1 off. How to fix it. Thank you very much.

My code

#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiManager.h>  
ESP8266WiFiMulti wifiMulti;
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h> //Blynk
SimpleTimer timer;
#define WIFI_LED 13

char auth[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
char server[] = "XXXXXXXXXXX";
char ssid[] = "ArcHeR-OMEN";
//char ssid[] = "ArcHeR";
char pass[] = "XXXXXXXXX";
int port = 8080;

bool isFirstConnect = true;
int slider;
char Button1 = 0;
char Button2 = 9;
char Button3 = 10;
char Button4 = 14;
char Relay1 = 12;
char Relay2 = 5;
char Relay3 = 4;
char Relay4 = 15;
int buttonState1 = 0;         // variable for reading the pushbutton status
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;


BLYNK_CONNECTED() {
if (isFirstConnect) {
Blynk.syncAll();
//Blynk.notify("Device 2 Starting!!!!");
isFirstConnect = false;
Serial.println(String("แอพเริ่มทำงาน!!"));  // used for debugging
}
}






void setup()
{
  Serial.begin(115200);
  Serial.println("\n Starting");
  wifiMulti.addAP(ssid, pass);
  Serial.println("SSID1");
  Blynk.config(auth, server, port);
  Blynk.connect();   // for a local server requiring WiFi connection
  pinMode(WIFI_LED, OUTPUT);
  pinMode(Button1, INPUT);
  pinMode(Button2, INPUT);
  pinMode(Button3, INPUT);
  pinMode(Button4, INPUT);
  pinMode(Relay1, OUTPUT);
  pinMode(Relay2, OUTPUT);
  pinMode(Relay3, OUTPUT);
  pinMode(Relay4, OUTPUT);
  digitalWrite(Button1, LOW);
  digitalWrite(Button2, LOW);
  digitalWrite(Button3, LOW);
  digitalWrite(Button4, LOW);  
  digitalWrite(Relay1, LOW);
  digitalWrite(Relay2, LOW);
  digitalWrite(Relay3, LOW);
  digitalWrite(Relay4, LOW);

  Serial.println("Connecting Wifi...");
    if(wifiMulti.run() == WL_CONNECTED) {
        Serial.println("");
        Serial.println("WiFi connected");
        Serial.println("IP address: ");
        Serial.println(WiFi.localIP());
    }


  timer.setInterval(15000, reconnectBlynk); // check every 15 seconds if we are connected to the server
} 

void reconnectBlynk() // reconnect to server if disconnected, timer checks every 15 seconds
{                        
  if (!Blynk.connected()) {
    if(Blynk.connect()) {
      BLYNK_LOG("Reconnected");
      digitalWrite(WIFI_LED,LOW);
    } else {
      BLYNK_LOG("Not reconnected");
      digitalWrite(WIFI_LED,HIGH);
    }
  }
}



void loop()
{
 if (Blynk.connected()) {   // to ensure that Blynk.run() function is only called if we are still connected to the server
    Blynk.run();
} 
timer.run();
 if(wifiMulti.run() != WL_CONNECTED) {

        Serial.println("WiFi not connected!");
        delay(1000);
    }
  buttonState1 = digitalRead(Button1);
  buttonState2 = digitalRead(Button2);
  buttonState3 = digitalRead(Button3);
  buttonState4 = digitalRead(Button4);
  
    if (buttonState1 == HIGH) {
    // turn LED on:
    digitalWrite(Relay1, HIGH);
  } else {
    // turn LED off:
    digitalWrite(Relay1, LOW);
  }
     if (buttonState2 == HIGH) {
    // turn LED on:
    digitalWrite(Relay2, HIGH);
  } else {
    // turn LED off:
    digitalWrite(Relay2, LOW);
  }
    if (buttonState3 == HIGH) {
    // turn LED on:
    digitalWrite(Relay3, HIGH);
  } else {
    // turn LED off:
    digitalWrite(Relay3, LOW);
  }
       if (buttonState4 == HIGH) {
    // turn LED on:
    digitalWrite(Relay4, HIGH);
  } else {
    // turn LED off:
    digitalWrite(Relay4, LOW);
  }
}

result

Video_00345

/*************** Relays *********************/
int relay1 = 2;//D4
int relay2 = 14;//D5
int relay3 = 12;//D6
int relay4 = 13;//D7
int ON = 0;
int OFF = 1;
int RelayBTN1 = 0;
int RelayBTN2 = 0;
int RelayBTN3 = 0;
int RelayBTN4 = 0;

/*************** LEDS *********************/
WidgetLED led1(10); //virtual led
WidgetLED led2(11); //virtual led
WidgetLED led3(12); //virtual led
WidgetLED led4(13); //virtual
WidgetLED led5(14); //virtual
WidgetLED led6(15); //virtual
WidgetLED led7(16); //virtual
WidgetLED led8(17); //virtual


void setup()
{
/********** relay init *************/
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(relay4, OUTPUT);

}


/*************** buttons *********************/
BLYNK_WRITE(V1)
{
  RelayBTN1 = param.asInt();
  Serial.print("RelayBTN1 ");
  Serial.println(RelayBTN1);
  if (RelayBTN1 == true) {
    digitalWrite(relay1, ON);
    Serial.println("relay1 on");
    led1.on();
    led2.off();

  }
  else {
    digitalWrite(relay1, OFF);
    Serial.println("relay1 off");
    led1.off();
    led2.on();
  }
}
BLYNK_WRITE(V2)
{
  RelayBTN2 = param.asInt();
  if (RelayBTN2 == true) {
    digitalWrite(relay2, ON);
    Serial.println("relay2 on");
    led3.on();
    led4.off();

  }
  else {
    digitalWrite(relay2, OFF);
    Serial.println("relay2 off");
    led3.off();
    led4.on();
  }
}

BLYNK_WRITE(V3)
{
  RelayBTN3 = param.asInt();
  if (RelayBTN3 == true) {
    digitalWrite(relay3, ON);
    Serial.println("relay3 on");
    led5.on();
    led6.off();

  }
  else {
    digitalWrite(relay3, OFF);
    Serial.println("relay3 off");
    led5.off();
    led6.on();
  }
}

BLYNK_WRITE(V4)
{
  RelayBTN4 = param.asInt();
  if (RelayBTN4 == true) {
    digitalWrite(relay4, ON);
    Serial.println("relay4 on");
    led7.on();
    led8.off();
  }
  else {
    digitalWrite(relay4, OFF);
    Serial.println("relay4 off");
    led7.off();
    led8.on();
  }
}

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

I need compare button from pin 0, 9, 10, 14 case not connect internet esp8285 can press to on and off relay

From your rather poor video, it appears that if you press one of the physical buttons on the Sonoff, it will turn off again on its own after around 5 seconds - is that your problem?

What output are you getting from the serial monitor when this happens?

Your void loop is very messy and is probably either causing or contributing to your issue, but without more information it’s difficult to tell.
You should either set-up timers to scan each of your physical buttons in turn every 100ms or so, or attach interrupts to the physical buttons.

It’s not clear what the role of Blynk is in this project, but maybe you’ll be adding link button widgets to mirror the physical buttons? Understanding what your final project will look like would help us to advise you of the best way to handle the physical buttons.

Pete.

Yes. I have code for use blynk app if esp8285 connect internet it can work. But case cannot connect internet It should work with buttons. My project use for smart farm.

I still don’t have enough information to understand what’s happening, and where Blynk comes into the equation when you have internet access.

Pete.