How to understand a code and implement it in my project

• Hardware model : ESP32 WiFi
• Android A11
• Blynk server
• Blynk Lib version : 1.0.1
• Add your sketch code. :point_up:Code should be formatted as example below.

Hello, i want to ask about a code.
How to understand this code below :

#include <SPI.h>
#include <Ethernet.h>
#include <BlynkSimpleEthernet.h>

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

// Set your LED and physical button pins here
const int ledPin = 7;
const int btnPin = 8;

BlynkTimer timer;
void checkPhysicalButton();

int ledState = LOW;
int btnState = HIGH;

// Every time we connect to the cloud...
BLYNK_CONNECTED() {
  // Request the latest state from the server
  Blynk.syncVirtual(V2);

  // Alternatively, you could override server state using:
  //Blynk.virtualWrite(V2, ledState);
}

// When App button is pushed - switch the state
BLYNK_WRITE(V2) {
  ledState = param.asInt();
  digitalWrite(ledPin, ledState);
}

void checkPhysicalButton()
{
  if (digitalRead(btnPin) == LOW) {
    // btnState is used to avoid sequential toggles
    if (btnState != LOW) {

      // Toggle LED state
      ledState = !ledState;
      digitalWrite(ledPin, ledState);

      // Update Button Widget
      Blynk.virtualWrite(V2, ledState);
    }
    btnState = LOW;
  } else {
    btnState = HIGH;
  }
}

void setup()
{
  // Debug console
  Serial.begin(9600);

  Blynk.begin(auth);

  pinMode(ledPin, OUTPUT);
  pinMode(btnPin, INPUT_PULLUP);
  digitalWrite(ledPin, ledState);

  // Setup a function to be called every 100 ms
  timer.setInterval(100L, checkPhysicalButton);
}

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

Especially in void checkPhysicalButton function. Cz when i implemented it in my project, when i switch the Mode to auto, blynk button still change the state.

Here is my code :

#define BLYNK_PRINT Serial

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <SPI.h>

char auth[] = "**";
char ssid[] = "**";
char pass[] = "**";

#define FOBtn 35
#define HOBtn 34
#define COBtn 39
#define SwMode 36
#define FOValve 13
#define HOValve 14
#define COValve 27
#define FIValve 26
#define HIValve 25
#define CIValve 33
#define HOLamp 32
#define COLamp 23
#define echo1 18
#define trig1 5
#define echo2 4
#define trig2 15
#define ONE_WIRE_BUS 3

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

LiquidCrystal_I2C lcd(0x27, 20, 4); //0x3F/0x27

//DS18B20 MAC Address
DeviceAddress sH = { 0x28, 0xFD, 0xC4, 0x79, 0xA2, 0x01, 0x03, 0xBF };
DeviceAddress sC = { 0x28, 0x53, 0x22, 0x79, 0xA2, 0x01, 0x03, 0xB6 };
DeviceAddress sF = { 0x28, 0xAA, 0x3C, 0x3C, 0x4A, 0x14, 0x01, 0xA0 };

int Mode;
int i;
float sFC;
float sHC;
float sCC;
int HotWater;
int ColdWater;

long t = 0, h = 0, ah = 0;
unsigned long previousTime = 0;
const long interval = 1000;

int relayState1 = HIGH;
int btnState1 = LOW;
int relayState2 = HIGH;
int btnState2 = LOW;
int lampState2 = HIGH;
int relayState3 = HIGH;
int btnState3 = LOW;
int lampState3 = HIGH;
//

BlynkTimer timer;

byte Degree [] {
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
};

void BlynkApp() {
  Blynk.virtualWrite(V0, relayState1);
  Blynk.virtualWrite(V1, relayState2);
  Blynk.virtualWrite(V2, relayState3);
  Blynk.virtualWrite(V3, Mode);
  Blynk.virtualWrite(V4, String(sFC, 1) + " C");
  Blynk.virtualWrite(V5, String(sHC, 1) + " C");
  Blynk.virtualWrite(V6, String(sCC, 1) + " C");
  Blynk.virtualWrite(V7, HotWater);
  Blynk.virtualWrite(V8, ColdWater);

  lcd.setCursor(2, 0);
  lcd.print("Fish Pond: ");
  lcd.setCursor(13, 0);
  lcd.print(sFC, 1);
  lcd.write(0);
  lcd.print("C");
  lcd.setCursor(2, 1);
  lcd.print("Hot Water: ");
  lcd.setCursor(13, 1);
  lcd.print(sHC, 1);
  lcd.write(0);
  lcd.print("C");
  lcd.setCursor(2, 2);
  lcd.print("Cold Water: ");
  lcd.setCursor(14, 2);
  lcd.print(sCC, 1);
  lcd.write(0);
  lcd.print("C");
  lcd.setCursor(0, 3);
  lcd.print("HWL: ");
  lcd.setCursor(5, 3);
  lcd.print(HotWater);
  lcd.print("%  ");
  lcd.setCursor(11, 3);
  lcd.print("CWL: ");
  lcd.setCursor(16, 3);
  lcd.print(ColdWater);
  lcd.print("%  ");
}

BLYNK_CONNECTED(){
  Blynk.syncAll();
}
BLYNK_WRITE(V0) {
  relayState1 = param.asInt();
  digitalWrite(FOValve, relayState1);
}
BLYNK_WRITE(V1) {
  relayState2 = param.asInt();
  lampState2 = param.asInt();
  digitalWrite(HOValve, relayState2);
  digitalWrite(HOLamp, lampState2);
}
BLYNK_WRITE(V2) {
  relayState3 = param.asInt();
  lampState3 = param.asInt();
  digitalWrite(COValve, relayState3);
  digitalWrite(COLamp, lampState3);
}

void MainControl() {
  switch (i) {
    case 0: //Manual
      if (digitalRead(FOBtn) == LOW) {
        if (btnState1 != LOW) {
          relayState1 = !relayState1;
          digitalWrite(FOValve, relayState1);
          Blynk.virtualWrite(V0, relayState1);
        }
        btnState1 = LOW;
      } else {
        btnState1 = HIGH;
        digitalWrite(FOValve, LOW);
      }

      if (digitalRead(HOBtn) == LOW) {
        if (btnState2 != LOW) {
          relayState2 = !relayState2;
          lampState2 = !lampState2;
          digitalWrite(HOValve, relayState2);
          digitalWrite(HOLamp, lampState2);
          Blynk.virtualWrite(V1, relayState2);
        }
        btnState2 = LOW;
      } else {
        btnState2 = HIGH;
        digitalWrite(HOValve, LOW);
        digitalWrite(HOLamp, LOW);
      }
      
      if (digitalRead(COBtn) == LOW) {
        if (btnState3 != LOW) {
          relayState3 = !relayState3;
          lampState3 = !lampState3;
          digitalWrite(COValve, relayState3);
          digitalWrite(COLamp, lampState3);
          Blynk.virtualWrite(V2, relayState3);
        }
        btnState3 = LOW;
      } else {
        btnState3 = HIGH;
        digitalWrite(COValve, LOW);
        digitalWrite(COLamp, LOW);
      }
      break;
      
    case 1:
      if (sFC > 26 && sFC < 28)  {
        //Filtered Water Out Valve Open
        digitalWrite(FOValve, LOW);
        //Hot Water Out Valve Close
        digitalWrite(HOValve, HIGH);
        //Hot Water Out Indicator Lamp
        digitalWrite(HOLamp, HIGH);
        //Cold Water Out Valve Close
        digitalWrite(COValve, HIGH);
        //Cold Water Out Indicator Lamp
        digitalWrite(COLamp, HIGH);
        Blynk.virtualWrite(V0, relayState1);
        Blynk.virtualWrite(V1, relayState2);
        Blynk.virtualWrite(V2, relayState3);
      }
      else if (sFC <= 26.0)  {
        //Hot Water Out Valve
        digitalWrite(HOValve, LOW);
        //Hot Water Out Indicator Lamp
        digitalWrite(HOLamp, LOW);
        //Filtered Water Out Valve Close
        digitalWrite(FOValve, HIGH);
        //Cold Water Out Valve Close
        digitalWrite(COValve, HIGH);
        //Cold Water Out Indicator Lamp
        digitalWrite(COLamp, HIGH);
        Blynk.virtualWrite(V0, relayState1);
        Blynk.virtualWrite(V1, relayState2);
        Blynk.virtualWrite(V2, relayState3);
      }
      else if (sFC >= 28.0)  {
        //Cold Water Out Valve
        digitalWrite(COValve, LOW);
        //Cold Water Out Indicator Lamp
        digitalWrite(COLamp, LOW);
        //Filtered Water Out Valve Close
        digitalWrite(FOValve, HIGH);
        //Hot Water Out Valve Close
        digitalWrite(HOValve, HIGH);
        //Hot Water Out Indicator Lamp
        digitalWrite(HOLamp, HIGH);
        Blynk.virtualWrite(V0, relayState1);
        Blynk.virtualWrite(V1, relayState2);
        Blynk.virtualWrite(V2, relayState3);
      }
      break;
  }
  //In Valve
  //InPump(); F,H,C=5,18,19
  if (HotWater <= 40) {
    //Hot Water In Pump
    digitalWrite(HIValve, LOW);
  }
  if (HotWater >= 100) {
    //Hot Water In Pump
    digitalWrite(HIValve, HIGH);
  }
  //Cold Water In Valve
  if (ColdWater <= 40) {
    //Cold Water In Pump
    digitalWrite(CIValve, LOW);
  }
  if (ColdWater >= 100) {
    //Cold Water In Pump
    digitalWrite(CIValve, HIGH);
  }
  if (HotWater >= 100 && ColdWater >= 100) {
    //Filtered Water In Pump == Off
    digitalWrite(FIValve, HIGH);
  } else {
    //Filtered Water In Pump == On
    digitalWrite(FIValve, LOW);
  }
  delay(100);
}

void Waterlvl(int trig, int echo) {
  digitalWrite(trig, LOW);
  delayMicroseconds(2);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  t = pulseIn(echo, HIGH);

  h = t / 58;
  h = h - 3.5;  // offset correction
  h = 10 - h;  // water height, 0 - 50 cm
  ah = 10 * h;  // distance in %, 0-100 %
  if (0 < ah < 100) {
    ah = ah;
  }
  if (ah >= 100) {
    ah = 100;
  }
  if (ah <= 0) {
    ah = 0;
  }
}

void sendSensors() {
  sensors.requestTemperatures();
  sensors.setResolution(12);

  sFC = (sensors.getTempC(sF) + 1);
  sHC = (sensors.getTempC(sH) + 1);
  sCC = (sensors.getTempC(sC) + 1);

  unsigned long currentTime =  millis();
  if (currentTime - previousTime >= interval) {
    Waterlvl(trig1, echo1);
    HotWater = ah;
    Waterlvl(trig2, echo2);
    ColdWater = ah;
    previousTime = currentTime;
  }
}

void setup() {
  Serial.begin(115200);

  pinMode(trig1, OUTPUT);
  pinMode(echo1, INPUT);
  pinMode(trig2, OUTPUT);
  pinMode(echo2, INPUT);

  pinMode(FOBtn, INPUT);
  pinMode(HOBtn, INPUT);
  pinMode(COBtn, INPUT);
  pinMode(SwMode, INPUT);

  pinMode(FIValve, OUTPUT);
  pinMode(HIValve, OUTPUT);
  pinMode(CIValve, OUTPUT);
  pinMode(FOValve, OUTPUT);
  pinMode(HOValve, OUTPUT);
  pinMode(COValve, OUTPUT);
  pinMode(HOLamp, OUTPUT);
  pinMode(COLamp, OUTPUT);

  digitalWrite(FOValve, HIGH);
  digitalWrite(HOValve, HIGH);
  digitalWrite(COValve, HIGH);
  digitalWrite(FIValve, HIGH);
  digitalWrite(HIValve, HIGH);
  digitalWrite(CIValve, HIGH);
  digitalWrite(HOLamp, HIGH);
  digitalWrite(COLamp, HIGH);
  delay(1000);

  sensors.begin();
  Blynk.begin(auth, ssid, pass);

  lcd.init();
  // Nyalakan backlight
  lcd.backlight();

  lcd.createChar(0, Degree);

  lcd.setCursor(1, 0);
  lcd.print("Haidar Amir Faruqi");
  lcd.setCursor(0, 1);
  lcd.print("DIII Teknik Elektro");
  lcd.setCursor(3, 2);
  lcd.print("Sekolah Vokasi");
  lcd.setCursor(3, 3);
  lcd.print("UNDIP Semarang");
  delay(2000);
  lcd.clear();

  lcd.setCursor(4, 0);
  lcd.print("Tugas Akhir");
  lcd.setCursor(2, 1);
  lcd.print("Prototipe Sistem");
  lcd.setCursor(4, 2);
  lcd.print("Kontrol Suhu");
  lcd.setCursor(4, 3);
  lcd.print("Berbasis IoT");
  delay(2000);
  lcd.clear();

  timer.setInterval(1000L, BlynkApp);
}

void loop() {
  if (digitalRead(SwMode) == HIGH) {
    i = 1;
    Mode = 1;
  }
  if (digitalRead(SwMode) == LOW) {
    i = 0;
    Mode = 0;
  }
  sendSensors();
  MainControl();
  Blynk.run();
  timer.run();
}

You should read this buddy
https://docs.blynk.io/en/legacy-platform/legacy-articles/keep-your-void-loop-clean

So, i have to move digitalRead (SwMode) in separate function too?

Yes

Ahh, okay. I’ll try it asap