#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6H4OQ1nGn"
#define BLYNK_TEMPLATE_NAME "samrt tarm"
#define BLYNK_AUTH_TOKEN "eAcH9ET163slPp5KOQly3HnqI3q6ghrQ"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
//char ssid[] = "ioon_2.4G";
//char pass[] = "0835969657";
#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
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);
digitalWrite(m,LOW);
Serial.begin(9600);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
timer.setInterval(2000L,readSensor);
}
void loop() {
Blynk.run();
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){//ถ้าเข้าโหมดแมนน่วล
if(swPump==1){ //ถ้ามีการสั่งเปิดปั๊ม
digitalWrite(m,HIGH); //สั่งปั๊มน้ำทำงาน
}else{
digitalWrite(m,LOW); //สั่งปิดปั๊มน้ำ
}
}
}