Relay : green led and red led

the led problem is solved thank you very much for your help.

Could you please explain this part to me?

I tried to modify but it doesn’t work anymore

You are capturing the same widget switch value using param.asInt() and assigning it to two different variables.
Why? What’s the point in doing that?

Pete.

should I write like that

      // Toggle LED state
      relais1Sate = !relais1Sate;
      digitalWrite(relais1, relais1Sate);
      digitalWrite(ledV1, relais1Sate;);
      digitalWrite(ledR1, !relais1Sate;);

Yes.

Pete.

Synchronization with my button widget no longer works

#define BLYNK_PRINT Serial


#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#include <SPI.h>
#include <Wire.h>

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

BlynkTimer timer;

char auth[] = "xxxxxxxxxxxxx";

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

// Set your LED and physical button pins here
const int relais1 = 14;
const int btn1 = 27;
const int ledV1 = 17;
const int ledR1 = 13;


const int relais2 = 32;
const int btn2 = 26;
const int ledV2 = 5;
const int ledR2 = 2;


const int relais3 = 15;
const int btn3 = 25;
const int ledV3 = 18;
const int ledR3 = 4;

const int relais4 = 12;
const int btn4 = 33;
const int ledV4 = 19;
const int ledR4 = 16;

// one wire temperature
#define ONE_WIRE_BUS 23
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int deviceCount = 3;
float tempC;






void checkPhysicalButton1();

void temperature();


int relais1Sate = LOW;
int btn1State = HIGH;
int ledV1State = LOW;
int ledR1State = LOW;

int relais2Sate = LOW;
int btn2State = HIGH;
int ledV2State = LOW;
int ledR2State = LOW;

int relais3Sate = LOW;
int btn3State = HIGH;
int ledV3State = LOW;
int ledR3State = LOW;

int relais4Sate = LOW;
int btn4State = HIGH;
int ledV4State = LOW;
int ledR4State = LOW;

int lcd_position[] = {16, 30, 44}; // position temperature sur l'écran


BLYNK_WRITE(V1) {
  relais1Sate = param.asInt();
  digitalWrite(relais1, relais1Sate);
  ledV1State = param.asInt();
  digitalWrite(ledV1, ledV1State);
  digitalWrite(ledR1, !ledV1State);

}

BLYNK_WRITE(V2) {
  relais2Sate = param.asInt();
  digitalWrite(relais2, relais2Sate);
  ledV2State = param.asInt();
  digitalWrite(ledV2, ledV2State);
  digitalWrite(ledR2, !ledV2State);

}

BLYNK_WRITE(V3) {
  relais3Sate = param.asInt();
  digitalWrite(relais3, relais3Sate);
  ledV3State = param.asInt();
  digitalWrite(ledV3, ledV3State);
  digitalWrite(ledR3, !ledV3State);

}

BLYNK_WRITE(V4) {
  relais4Sate = param.asInt();
  digitalWrite(relais4, relais4Sate);
  ledV4State = param.asInt();
  digitalWrite(ledV4, ledV4State);
  digitalWrite(ledR4, !ledV4State);

}

void temperature()
{
  display.clearDisplay();
  display.display();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);


  display.setCursor(0, 0);
  display.println("---------------------");
  display.setCursor(0, 6);
  display.print("|    Temperature    |");
  display.setCursor(0, 12);
  display.println("---------------------");

  display.setCursor(0, 16); // position 0
  display.println(" Interieur  |");
  display.print("---------------------");
  display.display();

  display.setCursor(0, 30); // position 1
  display.println(" Exterrieur |");
  display.print("---------------------");
  display.display();

  display.setCursor(0, 44); // position 2
  display.println(" Eau        |");
  display.print("---------------------");
  display.display();




  // Send command to all the sensors for temperature conversion
  sensors.requestTemperatures();

  // Display temperature from each sensor
  for (int i = 0;  i < deviceCount;  i++)
  {

    tempC = sensors.getTempCByIndex(i);
    Blynk.virtualWrite(i + 21, tempC);
    display.setCursor(80, lcd_position[i]);
    display.print(tempC);
    display.display();

  }
}



void checkPhysicalButton1()
{
  if (digitalRead(btn1) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btn1State != LOW) {

      // Toggle LED state
      relais1Sate = !relais1Sate;
      digitalWrite(relais1, relais1Sate);
      digitalWrite(ledV1, relais1Sate);
      digitalWrite(ledR1, !relais1Sate);


      // Update Button Widget
      Blynk.virtualWrite(V1, relais1Sate);
      Blynk.virtualWrite(V1, ledV1State);


    }
    btn1State = LOW;
  } else {
    btn1State = HIGH;



  }

  if (digitalRead(btn2) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btn2State != LOW) {

      // Toggle LED state
      relais2Sate = !relais2Sate;
      digitalWrite(relais2, relais2Sate);
      digitalWrite(ledV2, relais2Sate);
      digitalWrite(ledR2, !relais2Sate);

      // Update Button Widget
      Blynk.virtualWrite(V2, relais2Sate);
      Blynk.virtualWrite(V2, ledV2State);

    }
    btn2State = LOW;
  } else {
    btn2State = HIGH;

  }

  if (digitalRead(btn3) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btn3State != LOW) {

      // Toggle LED state
      relais3Sate = !relais3Sate;
      digitalWrite(relais3, relais3Sate);
      digitalWrite(ledV3, relais3Sate);
      digitalWrite(ledR3, !relais3Sate);

      // Update Button Widget
      Blynk.virtualWrite(V3, relais3Sate);
      Blynk.virtualWrite(V3, ledV3State);

    }
    btn3State = LOW;
  } else {
    btn3State = HIGH;
  }

  if (digitalRead(btn4) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btn4State != LOW) {

      // Toggle LED state
      relais4Sate = !relais4Sate;
      digitalWrite(relais4, relais4Sate);
      digitalWrite(ledV4, relais4Sate);
      digitalWrite(ledR4, !relais4Sate);

      // Update Button Widget
      Blynk.virtualWrite(V4, relais4Sate);
      Blynk.virtualWrite(V4, ledV4State);

    }
    btn4State = LOW;
  } else {
    btn4State = HIGH;
  }
}

BLYNK_CONNECTED()
{
  Blynk.syncVirtual(V1);
  Blynk.syncVirtual(V2);
  Blynk.syncVirtual(V3);
  Blynk.syncVirtual(V4);

}



void setup()
{
  sensors.begin();  // debut de la librairie capteur de température
  // Debug console
  Serial.begin(9600);
  WiFi.begin(ssid, pass);
  //timer.setInterval(3000L, checkBlynk); // check if connected to Blynk server every 3 seconds
  Blynk.config(auth);

  pinMode(relais1, OUTPUT);
  pinMode(btn1, INPUT_PULLUP);
  digitalWrite(relais1, relais1Sate);
  pinMode(ledV1, OUTPUT);
  pinMode(ledR1, OUTPUT);

  pinMode(relais2, OUTPUT);
  pinMode(btn2, INPUT_PULLUP);
  digitalWrite(relais2, relais2Sate);
  pinMode(ledV2, OUTPUT);
  pinMode(ledR2, OUTPUT);

  pinMode(relais3, OUTPUT);
  pinMode(btn3, INPUT_PULLUP);
  digitalWrite(relais3, relais3Sate);
  pinMode(ledV3, OUTPUT);
  pinMode(ledR3, OUTPUT);

  pinMode(relais4, OUTPUT);
  pinMode(btn4, INPUT_PULLUP);
  digitalWrite(relais4, relais4Sate);
  pinMode(ledV4, OUTPUT);
  pinMode(ledR4, OUTPUT);


  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Don't proceed, loop forever
  }

  // Clear the buffer
  display.clearDisplay();
  display.display();


  timer.setInterval(100L, checkPhysicalButton1);

  timer.setInterval(10000L, temperature);

}



void loop()
{
  Blynk.run();
  timer.run();
  // You can inject your own code or combine it with other sketches.
  // Check other examples on how to communicate with Blynk. Remember
  // to avoid delay() function!
}

What exactly does that mean?

Is this your latest sketch? If so, what changes have you made since you said…

Pete.

Yes this is my last sketch

I modified

So I was talking about changes that you should make to your BLYNK_WRITE routines and you appear to have modified different parts of your code.

Pete.

here is my last sketch.
I have modified my error, but the synchronization does not work perfectly

#define BLYNK_PRINT Serial


#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#include <SPI.h>
#include <Wire.h>

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

BlynkTimer timer;

char auth[] = "xxxxxxxxxxx";

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

// Set your LED and physical button pins here
const int relais1 = 14;
const int btn1 = 27;
const int ledV1 = 17;
const int ledR1 = 13;


const int relais2 = 32;
const int btn2 = 26;
const int ledV2 = 5;
const int ledR2 = 2;


const int relais3 = 15;
const int btn3 = 25;
const int ledV3 = 18;
const int ledR3 = 4;

const int relais4 = 12;
const int btn4 = 33;
const int ledV4 = 19;
const int ledR4 = 16;

// one wire temperature
#define ONE_WIRE_BUS 23
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int deviceCount = 3;
float tempC;






void checkPhysicalButton1();

void temperature();


int relais1Sate = LOW;
int btn1State = HIGH;
int ledV1State = LOW;
int ledR1State = LOW;

int relais2Sate = LOW;
int btn2State = HIGH;
int ledV2State = LOW;
int ledR2State = LOW;

int relais3Sate = LOW;
int btn3State = HIGH;
int ledV3State = LOW;
int ledR3State = LOW;

int relais4Sate = LOW;
int btn4State = HIGH;
int ledV4State = LOW;
int ledR4State = LOW;

int lcd_position[] = {16, 30, 44}; // position temperature sur l'écran


BLYNK_WRITE(V1) {
  relais1Sate = param.asInt();
  digitalWrite(relais1, relais1Sate);
  digitalWrite(ledV1, relais1Sate);
  digitalWrite(ledR1, !relais1Sate);

}

BLYNK_WRITE(V2) {
  relais2Sate = param.asInt();
  digitalWrite(relais2, relais2Sate);
  digitalWrite(ledV2, relais2Sate);
  digitalWrite(ledR2, !relais2Sate);

}

BLYNK_WRITE(V3) {
  relais3Sate = param.asInt();
  digitalWrite(relais3, relais3Sate);
  digitalWrite(ledV3, relais3Sate);
  digitalWrite(ledR3, !relais3Sate);

}

BLYNK_WRITE(V4) {
  relais4Sate = param.asInt();
  digitalWrite(relais4, relais4Sate);
  digitalWrite(ledV4, relais4Sate);
  digitalWrite(ledR4, !relais4Sate);

}

void temperature()
{
  display.clearDisplay();
  display.display();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);


  display.setCursor(0, 0);
  display.println("---------------------");
  display.setCursor(0, 6);
  display.print("|    Temperature    |");
  display.setCursor(0, 12);
  display.println("---------------------");

  display.setCursor(0, 16); // position 0
  display.println(" Interieur  |");
  display.print("---------------------");
  display.display();

  display.setCursor(0, 30); // position 1
  display.println(" Exterrieur |");
  display.print("---------------------");
  display.display();

  display.setCursor(0, 44); // position 2
  display.println(" Eau        |");
  display.print("---------------------");
  display.display();




  // Send command to all the sensors for temperature conversion
  sensors.requestTemperatures();

  // Display temperature from each sensor
  for (int i = 0;  i < deviceCount;  i++)
  {

    tempC = sensors.getTempCByIndex(i);
    Blynk.virtualWrite(i + 21, tempC);
    display.setCursor(80, lcd_position[i]);
    display.print(tempC);
    display.display();

  }
}



void checkPhysicalButton1()
{
  if (digitalRead(btn1) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btn1State != LOW) {

      // Toggle LED state
      relais1Sate = !relais1Sate;
      digitalWrite(relais1, relais1Sate);
      ledV1State = !ledV1State;
      digitalWrite(ledV1, ledV1State);
      digitalWrite(ledR1, !ledV1State);


      // Update Button Widget
      Blynk.virtualWrite(V1, relais1Sate);
      Blynk.virtualWrite(V1, ledV1State);

    }
    btn1State = LOW;
  } else {
    btn1State = HIGH;



  }

  if (digitalRead(btn2) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btn2State != LOW) {

      // Toggle LED state
      relais2Sate = !relais2Sate;
      digitalWrite(relais2, relais2Sate);
      ledV2State = !ledV2State;
      digitalWrite(ledV2, ledV2State);
      digitalWrite(ledR2, !ledV2State);

      // Update Button Widget
      Blynk.virtualWrite(V2, relais2Sate);
      Blynk.virtualWrite(V2, ledV2State);

    }
    btn2State = LOW;
  } else {
    btn2State = HIGH;

  }

  if (digitalRead(btn3) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btn3State != LOW) {

      // Toggle LED state
      relais3Sate = !relais3Sate;
      digitalWrite(relais3, relais3Sate);
      ledV3State = !ledV3State;
      digitalWrite(ledV3, ledV3State);
      digitalWrite(ledR3, !ledV3State);

      // Update Button Widget
      Blynk.virtualWrite(V3, relais3Sate);
      Blynk.virtualWrite(V3, ledV3State);

    }
    btn3State = LOW;
  } else {
    btn3State = HIGH;
  }

  if (digitalRead(btn4) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btn4State != LOW) {

      // Toggle LED state
      relais4Sate = !relais4Sate;
      digitalWrite(relais4, relais4Sate);
      ledV4State = !ledV4State;
      digitalWrite(ledV4, ledV4State);
      digitalWrite(ledR4, !ledV4State);

      // Update Button Widget
      Blynk.virtualWrite(V4, relais4Sate);
      Blynk.virtualWrite(V4, ledV4State);

    }
    btn4State = LOW;
  } else {
    btn4State = HIGH;
  }
}

BLYNK_CONNECTED()
{
  Blynk.syncVirtual(V1);
  Blynk.syncVirtual(V2);
  Blynk.syncVirtual(V3);
  Blynk.syncVirtual(V4);

}



void setup()
{
  sensors.begin();  // debut de la librairie capteur de température
  // Debug console
  Serial.begin(9600);
  WiFi.begin(ssid, pass);
  //timer.setInterval(3000L, checkBlynk); // check if connected to Blynk server every 3 seconds
  Blynk.config(auth);

  pinMode(relais1, OUTPUT);
  pinMode(btn1, INPUT_PULLUP);
  digitalWrite(relais1, relais1Sate);
  pinMode(ledV1, OUTPUT);
  pinMode(ledR1, OUTPUT);

  pinMode(relais2, OUTPUT);
  pinMode(btn2, INPUT_PULLUP);
  digitalWrite(relais2, relais2Sate);
  pinMode(ledV2, OUTPUT);
  pinMode(ledR2, OUTPUT);

  pinMode(relais3, OUTPUT);
  pinMode(btn3, INPUT_PULLUP);
  digitalWrite(relais3, relais3Sate);
  pinMode(ledV3, OUTPUT);
  pinMode(ledR3, OUTPUT);

  pinMode(relais4, OUTPUT);
  pinMode(btn4, INPUT_PULLUP);
  digitalWrite(relais4, relais4Sate);
  pinMode(ledV4, OUTPUT);
  pinMode(ledR4, OUTPUT);


  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Don't proceed, loop forever
  }

  // Clear the buffer
  display.clearDisplay();
  display.display();


  timer.setInterval(100L, checkPhysicalButton1);

  timer.setInterval(10000L, temperature);

}



void loop()
{
  Blynk.run();
  timer.run();
  // You can inject your own code or combine it with other sketches.
  // Check other examples on how to communicate with Blynk. Remember
  // to avoid delay() function!
}

I still don’t know exactly what this means!
You need to explain, and please don’t post a video!

Pete.

If my button widget is in the ON position, and I activate the led and my relay changes state. the physical button works very well

but if my wideget button is OFF, when I press the physical button, the led and the relay change state but the synchronization does not work

You’re still using ledV1State
This variable is redundant - remember?

Pete.

I have to change it by relais1Sate

here are the last modifications that I made.

I still have a synchronization problem. I turn on my ESP 32, I press the physical buttons, the synchronization with the application works well. But when I squeeze my application to change state, when I press a button the synchronization is reversed.

Do you have an idea of the problem ?

#define BLYNK_PRINT Serial


#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#include <SPI.h>
#include <Wire.h>

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

BlynkTimer timer;

char auth[] = "xxxxxxxxxxxxxxxxxxxxx";

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

// Set your LED and physical button pins here
const int relais1 = 14;
const int btn1 = 27;
const int ledV1 = 17;
const int ledR1 = 13;


const int relais2 = 32;
const int btn2 = 26;
const int ledV2 = 5;
const int ledR2 = 2;


const int relais3 = 15;
const int btn3 = 25;
const int ledV3 = 18;
const int ledR3 = 4;

const int relais4 = 12;
const int btn4 = 33;
const int ledV4 = 19;
const int ledR4 = 16;

// one wire temperature
#define ONE_WIRE_BUS 23
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int deviceCount = 3;
float tempC;






void checkPhysicalButton1();

void temperature();


int relais1Sate = LOW;
int btn1State = HIGH;
int ledV1State = LOW;
int ledR1State = LOW;

int relais2Sate = LOW;
int btn2State = HIGH;
int ledV2State = LOW;
int ledR2State = LOW;

int relais3Sate = LOW;
int btn3State = HIGH;
int ledV3State = LOW;
int ledR3State = LOW;

int relais4Sate = LOW;
int btn4State = HIGH;
int ledV4State = LOW;
int ledR4State = LOW;

int lcd_position[] = {16, 30, 44}; // position temperature sur l'écran


BLYNK_WRITE(V1) {
  relais1Sate = param.asInt();
  digitalWrite(relais1, relais1Sate);
  digitalWrite(ledV1, relais1Sate);
  digitalWrite(ledR1, !relais1Sate);

}

BLYNK_WRITE(V2) {
  relais2Sate = param.asInt();
  digitalWrite(relais2, relais2Sate);
  digitalWrite(ledV2, relais2Sate);
  digitalWrite(ledR2, !relais2Sate);

}

BLYNK_WRITE(V3) {
  relais3Sate = param.asInt();
  digitalWrite(relais3, relais3Sate);
  digitalWrite(ledV3, relais3Sate);
  digitalWrite(ledR3, !relais3Sate);

}

BLYNK_WRITE(V4) {
  relais4Sate = param.asInt();
  digitalWrite(relais4, relais4Sate);
  digitalWrite(ledV4, relais4Sate);
  digitalWrite(ledR4, !relais4Sate);

}

void temperature()
{
  display.clearDisplay();
  display.display();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);


  display.setCursor(0, 0);
  display.println("---------------------");
  display.setCursor(0, 6);
  display.print("|    Temperature    |");
  display.setCursor(0, 12);
  display.println("---------------------");

  display.setCursor(0, 16); // position 0
  display.println(" Interieur  |");
  display.print("---------------------");
  display.display();

  display.setCursor(0, 30); // position 1
  display.println(" Exterrieur |");
  display.print("---------------------");
  display.display();

  display.setCursor(0, 44); // position 2
  display.println(" Eau        |");
  display.print("---------------------");
  display.display();




  // Send command to all the sensors for temperature conversion
  sensors.requestTemperatures();

  // Display temperature from each sensor
  for (int i = 0;  i < deviceCount;  i++)
  {

    tempC = sensors.getTempCByIndex(i);
    Blynk.virtualWrite(i + 21, tempC);
    display.setCursor(80, lcd_position[i]);
    display.print(tempC);
    display.display();

  }
}



void checkPhysicalButton1()
{
  if (digitalRead(btn1) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btn1State != LOW) {

      // Toggle LED state
      relais1Sate = !relais1Sate;
      digitalWrite(relais1, relais1Sate);
      ledV1State = !ledV1State;
      digitalWrite(ledV1, ledV1State);
      digitalWrite(ledR1, !ledV1State);


      // Update Button Widget
      Blynk.virtualWrite(V1, relais1Sate);
     

    }
    btn1State = LOW;
  } else {
    btn1State = HIGH;



  }

  if (digitalRead(btn2) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btn2State != LOW) {

      // Toggle LED state
      relais2Sate = !relais2Sate;
      digitalWrite(relais2, relais2Sate);
      ledV2State = !ledV2State;
      digitalWrite(ledV2, ledV2State);
      digitalWrite(ledR2, !ledV2State);

      // Update Button Widget
      Blynk.virtualWrite(V2, relais2Sate);
     

    }
    btn2State = LOW;
  } else {
    btn2State = HIGH;

  }

  if (digitalRead(btn3) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btn3State != LOW) {

      // Toggle LED state
      relais3Sate = !relais3Sate;
      digitalWrite(relais3, relais3Sate);
      ledV3State = !ledV3State;
      digitalWrite(ledV3, ledV3State);
      digitalWrite(ledR3, !ledV3State);

      // Update Button Widget
      Blynk.virtualWrite(V3, relais3Sate);


    }
    btn3State = LOW;
  } else {
    btn3State = HIGH;
  }

  if (digitalRead(btn4) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btn4State != LOW) {

      // Toggle LED state
      relais4Sate = !relais4Sate;
      digitalWrite(relais4, relais4Sate);
      ledV4State = !ledV4State;
      digitalWrite(ledV4, ledV4State);
      digitalWrite(ledR4, !ledV4State);

      // Update Button Widget
      Blynk.virtualWrite(V4, relais4Sate);

      

    }
    btn4State = LOW;
  } else {
    btn4State = HIGH;
  }
}

BLYNK_CONNECTED()
{
  Blynk.syncVirtual(V1);
  Blynk.syncVirtual(V2);
  Blynk.syncVirtual(V3);
  Blynk.syncVirtual(V4);

}



void setup()
{
  sensors.begin();  // debut de la librairie capteur de température
  // Debug console
  Serial.begin(9600);
  WiFi.begin(ssid, pass);
  //timer.setInterval(3000L, checkBlynk); // check if connected to Blynk server every 3 seconds
  Blynk.config(auth);

  pinMode(relais1, OUTPUT);
  pinMode(btn1, INPUT_PULLUP);
  digitalWrite(relais1, relais1Sate);
  pinMode(ledV1, OUTPUT);
  pinMode(ledR1, OUTPUT);

  pinMode(relais2, OUTPUT);
  pinMode(btn2, INPUT_PULLUP);
  digitalWrite(relais2, relais2Sate);
  pinMode(ledV2, OUTPUT);
  pinMode(ledR2, OUTPUT);

  pinMode(relais3, OUTPUT);
  pinMode(btn3, INPUT_PULLUP);
  digitalWrite(relais3, relais3Sate);
  pinMode(ledV3, OUTPUT);
  pinMode(ledR3, OUTPUT);

  pinMode(relais4, OUTPUT);
  pinMode(btn4, INPUT_PULLUP);
  digitalWrite(relais4, relais4Sate);
  pinMode(ledV4, OUTPUT);
  pinMode(ledR4, OUTPUT);


  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Don't proceed, loop forever
  }

  // Clear the buffer
  display.clearDisplay();
  display.display();


  timer.setInterval(100L, checkPhysicalButton1);

  timer.setInterval(10000L, temperature);

}



void loop()
{
  Blynk.run();
  timer.run();
  // You can inject your own code or combine it with other sketches.
  // Check other examples on how to communicate with Blynk. Remember
  // to avoid delay() function!
}

Either change your button widget settings to reverse the 0/1 output, or use the NOT operator (!) to reverse the logic levels in your sketch.

Pete.

I will try to explain to you differently

If i press the physical button

Physical button / Widget Button / LED
ON / ON / GREEN
OFF / OFF/ RED

Synchronization is good

if I press the button widget
Widget Button / Physical button / LED
ON / ON / GREEN
OFF / OFF/ RED

Synchronization is good

but if I press the physical button again, that’s where the problem appears
Physical button / Widget Button / LED
ON / OFF/ GREEN
OFF / ON/ RED

It won’t work correctly until you TOTALLY remove these ledVxState variables and replace them with the corresponding relaisxSate variables, as I told you yesterday.

Pete.

do i need to edit here too

int relais1Sate = LOW;
int btn1State = HIGH;
int ledV1State = LOW;
int ledR1State = LOW;

int relais2Sate = LOW;
int btn2State = HIGH;
int ledV2State = LOW;
int ledR2State = LOW;

int relais3Sate = LOW;
int btn3State = HIGH;
int ledV3State = LOW;
int ledR3State = LOW;

int relais4Sate = LOW;
int btn4State = HIGH;
int ledV4State = LOW;
int ledR4State = LOW;

Of course!

The ledVxState declarations need to be deleted, as the variables are redundant.

Pete.

the synchronization is still not good. I have no more ledVxState

here is the last version of my sketch

#define BLYNK_PRINT Serial


#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#include <SPI.h>
#include <Wire.h>

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

BlynkTimer timer;

char auth[] = "xxxxxx";

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

// Set your LED and physical button pins here
const int relais1 = 14;
const int btn1 = 27;
const int ledV1 = 17;
const int ledR1 = 13;


const int relais2 = 32;
const int btn2 = 26;
const int ledV2 = 5;
const int ledR2 = 2;


const int relais3 = 15;
const int btn3 = 25;
const int ledV3 = 18;
const int ledR3 = 4;

const int relais4 = 12;
const int btn4 = 33;
const int ledV4 = 19;
const int ledR4 = 16;

// one wire temperature
#define ONE_WIRE_BUS 23
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int deviceCount = 3;
float tempC;






void checkPhysicalButton1();

void temperature();


int relais1Sate = LOW;
int btn1State = HIGH;
int ledR1State = LOW;

int relais2Sate = LOW;
int btn2State = HIGH;
int ledR2State = LOW;

int relais3Sate = LOW;
int btn3State = HIGH;
int ledR3State = LOW;

int relais4Sate = LOW;
int btn4State = HIGH;
int ledR4State = LOW;

int lcd_position[] = {16, 30, 44}; // position temperature sur l'écran


BLYNK_WRITE(V1) {
  relais1Sate = param.asInt();
  digitalWrite(relais1, relais1Sate);
  digitalWrite(ledV1, relais1Sate);
  digitalWrite(ledR1, !relais1Sate);

}

BLYNK_WRITE(V2) {
  relais2Sate = param.asInt();
  digitalWrite(relais2, relais2Sate);
  digitalWrite(ledV2, relais2Sate);
  digitalWrite(ledR2, !relais2Sate);

}

BLYNK_WRITE(V3) {
  relais3Sate = param.asInt();
  digitalWrite(relais3, relais3Sate);
  digitalWrite(ledV3, relais3Sate);
  digitalWrite(ledR3, !relais3Sate);

}

BLYNK_WRITE(V4) {
  relais4Sate = param.asInt();
  digitalWrite(relais4, relais4Sate);
  digitalWrite(ledV4, relais4Sate);
  digitalWrite(ledR4, !relais4Sate);

}

void temperature()
{
  display.clearDisplay();
  display.display();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);


  display.setCursor(0, 0);
  display.println("---------------------");
  display.setCursor(0, 6);
  display.print("|    Temperature    |");
  display.setCursor(0, 12);
  display.println("---------------------");

  display.setCursor(0, 16); // position 0
  display.println(" Interieur  |");
  display.print("---------------------");
  display.display();

  display.setCursor(0, 30); // position 1
  display.println(" Exterrieur |");
  display.print("---------------------");
  display.display();

  display.setCursor(0, 44); // position 2
  display.println(" Eau        |");
  display.print("---------------------");
  display.display();




  // Send command to all the sensors for temperature conversion
  sensors.requestTemperatures();

  // Display temperature from each sensor
  for (int i = 0;  i < deviceCount;  i++)
  {

    tempC = sensors.getTempCByIndex(i);
    Blynk.virtualWrite(i + 21, tempC);
    display.setCursor(80, lcd_position[i]);
    display.print(tempC);
    display.display();

  }
}



void checkPhysicalButton1()
{
  if (digitalRead(btn1) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btn1State != LOW) {

      // Toggle LED state
      relais1Sate = !relais1Sate;
      digitalWrite(relais1, relais1Sate);
     
      digitalWrite(ledV1, relais1Sate);
      digitalWrite(ledR1, !relais1Sate);


      // Update Button Widget
      Blynk.virtualWrite(V1, !relais1Sate);
     

    }
    btn1State = LOW;
  } else {
    btn1State = HIGH;



  }

  if (digitalRead(btn2) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btn2State != LOW) {

      // Toggle LED state
      relais2Sate = !relais2Sate;
      digitalWrite(relais2, relais2Sate);

      digitalWrite(ledV2, relais2Sate);
      digitalWrite(ledR2, !relais2Sate);

      // Update Button Widget
      Blynk.virtualWrite(V2, !relais2Sate);
     

    }
    btn2State = LOW;
  } else {
    btn2State = HIGH;

  }

  if (digitalRead(btn3) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btn3State != LOW) {

      // Toggle LED state
      relais3Sate = !relais3Sate;
      digitalWrite(relais3, relais3Sate);
      
      digitalWrite(ledV3, relais3Sate);
      digitalWrite(ledR3, !relais3Sate);

      // Update Button Widget
      Blynk.virtualWrite(V3, !relais3Sate);


    }
    btn3State = LOW;
  } else {
    btn3State = HIGH;
  }

  if (digitalRead(btn4) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btn4State != LOW) {

      // Toggle LED state
      relais4Sate = !relais4Sate;
      digitalWrite(relais4, relais4Sate);
  
      digitalWrite(ledV4, relais4Sate);
      digitalWrite(ledR4, !relais4Sate);

      // Update Button Widget
      Blynk.virtualWrite(V4, !relais4Sate);

      

    }
    btn4State = LOW;
  } else {
    btn4State = HIGH;
  }
}

BLYNK_CONNECTED()
{
  Blynk.syncVirtual(V1);
  Blynk.syncVirtual(V2);
  Blynk.syncVirtual(V3);
  Blynk.syncVirtual(V4);

}



void setup()
{
  sensors.begin();  // debut de la librairie capteur de température
  // Debug console
  Serial.begin(9600);
  WiFi.begin(ssid, pass);
  //timer.setInterval(3000L, checkBlynk); // check if connected to Blynk server every 3 seconds
  Blynk.config(auth);

  pinMode(relais1, OUTPUT);
  pinMode(btn1, INPUT_PULLUP);
  digitalWrite(relais1, relais1Sate);
  pinMode(ledV1, OUTPUT);
  pinMode(ledR1, OUTPUT);

  pinMode(relais2, OUTPUT);
  pinMode(btn2, INPUT_PULLUP);
  digitalWrite(relais2, relais2Sate);
  pinMode(ledV2, OUTPUT);
  pinMode(ledR2, OUTPUT);

  pinMode(relais3, OUTPUT);
  pinMode(btn3, INPUT_PULLUP);
  digitalWrite(relais3, relais3Sate);
  pinMode(ledV3, OUTPUT);
  pinMode(ledR3, OUTPUT);

  pinMode(relais4, OUTPUT);
  pinMode(btn4, INPUT_PULLUP);
  digitalWrite(relais4, relais4Sate);
  pinMode(ledV4, OUTPUT);
  pinMode(ledR4, OUTPUT);


  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Don't proceed, loop forever
  }

  // Clear the buffer
  display.clearDisplay();
  display.display();


  timer.setInterval(100L, checkPhysicalButton1);

  timer.setInterval(10000L, temperature);

}



void loop()
{
  Blynk.run();
  timer.run();
  // You can inject your own code or combine it with other sketches.
  // Check other examples on how to communicate with Blynk. Remember
  // to avoid delay() function!
}