• Hardware model : ESP32 WiFi
• Android A11
• Blynk server
• Blynk Lib version : 1.0.1
• Add your sketch code. 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();
}