#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL68P5vg2Im"
#define BLYNK_TEMPLATE_NAME "smartFarm"
#define BLYNK_AUTH_TOKEN "7PZBYcK7PwMrI933faDHB0EP67Gg7exj"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
#define s 34 //pin34 soil sensor
#define m 15 //pin15 on/off relay control motor pump
#define t 18 //pin18 ขาทริกเกอร์ ultrasonic
#define e 19 //pin19 ขาecho ultrasonic
#define Auto 1 //กำหนดให้Auto เป็นค่าคงที่มีค่าเป็น1
#define Manual 0 //กำหนดให้Manual เป็นค่าคงที่มีค่าเป็น 0
#define sw1 12
#define sw2 14
long echo; //เก็บค่าการสะท้อนสัญญาณecho
float distance; //เก็บค่าระยะห่าง
float humi; //เก็บค่าความชื้นในดิน
int mode = 0; //เก็บสถานะโหมดการทำงานปุ่ม mode
int swPump = 0; //เก็บสถานะปุ่มสวิทช์เปิดปิดปั๊มน้ำ
int setpoint = 0; //เก็บค่าที่ตั้งจากสไลบาร์
BlynkTimer timer; //ประกาศตัวแปร timer
BLYNK_CONNECTED() { //Sync widget when hardware connect
Blynk.syncAll();
}
BLYNK_WRITE(V0) //mode 0=manual 1=auto
{
mode = param.asInt();
}
BLYNK_WRITE(V1) //pump 0=off 1=on
{
swPump = param.asInt();
}
BLYNK_WRITE(V2) //setpoint
{
setpoint = param.asInt();
}
void setup() {
pinMode(t, OUTPUT);
pinMode(e, INPUT);
pinMode(m, OUTPUT);
pinMode(sw1, INPUT_PULLUP);
pinMode(sw2, INPUT_PULLUP);
digitalWrite(m, LOW);
Serial.begin(9600);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
timer.setInterval(2000L, readSensor);
}
void loop() {
Blynk.run();
bypassMode();
timer.run();
}
void readSensor() {
humi = analogRead(s) * 100.0 / 4095.0; //อ่านค่าจากเซนเซอร์ความชื้น
digitalWrite(t, LOW);
delay(10);
digitalWrite(t, HIGH);
delayMicroseconds(10);
digitalWrite(t, LOW);
echo = pulseIn(e, HIGH);
distance = (echo / 2.0) / 29.0; //คำนวณค่าระยะห่าง
Blynk.virtualWrite(V3, humi); //ส่งค่าความชื้นไปที่Blynk
Blynk.virtualWrite(V4, distance); //ส่งค่าระยะห่างไปที่Blynk
Serial.println("humi=" + String(humi) + " "); //แสดงค่าออกSerial
Serial.println("distance=" + String(distance, 1) + " ");
if (distance > 10) {
Blynk.virtualWrite(V5, 1); //ถ้ามีน้ำน้อยให้ส่ง1 ไปที่Blynk ผ่านV5
} else {
Blynk.virtualWrite(V5, 0); //ถ้ามีน้ำมากให้ส่ง0 ไปที่Blynk ผ่านV5
}
if (mode == Auto) { //ถ้าเข้าโหมดอัตโนมัติ
if (humi < setpoint) { //ถ้าความชื้นน้อยกว่าที่ตั้งไว้
digitalWrite(m, HIGH); //สั่งให้motor ทำงาน
Blynk.virtualWrite(V1, 1); //ส่ง1 ไปที่ปุ่มกดบนแดชบอร์ดผ่านV1
swPump = 1; //กำหนดให้swPumpเป็น1
} else {
digitalWrite(m, LOW); //สั่งให้motor หยุดทำงาน
Blynk.virtualWrite(V1, 0); //ส่ง0 ไปที่ปุ่มกดบนแดชบอร์ดผ่านV1
swPump = 0; //กำหนดให้swPumpเป็น0
}
} else if (mode == Manual) { //ถ้าเข้าโหมดแมนน่วล
setMotor();
}
}
void setMotor() {
if (swPump == 1) { //ถ้ามีการสั่งเปิดปั๊ม
digitalWrite(m, HIGH); //สั่งปั๊มน้ำทำงาน
Blynk.virtualWrite(V1, 1);
} else {
digitalWrite(m, LOW); //สั่งปิดปั๊มน้ำ
Blynk.virtualWrite(V1, 0);
}
}
void bypassMode() { // reset mode to manual when press sw1/sw2
if (digitalRead(sw1) == LOW) {
delay(10);
swPump = 1;
mode = Manual;
Blynk.virtualWrite(V0, 0);
setMotor();
while (digitalRead(sw1) == LOW) {
delay(2);
}
}
if (digitalRead(sw2) == LOW) {
delay(10);
swPump = 0;
mode = Manual;
Blynk.virtualWrite(V0, 0);
setMotor();
while (digitalRead(sw2) == LOW) {
delay(2);
}
}
}