Blynk สั่งรดน้ำ ไม่ได้

สวัสดีครับ รบกวนผู้รู้ ครับ
ผมทำ project รดน้ำต้นไม่ผ่าน blynk ผมได้กำหนด widget button V0 blynk เป็น การรดน้ำต้นไม้แบบบังคับแต่กดแล้วเหมือน arduino รับค่ามาแปบเดียว ‘0’ แต่ไม่ active low ตลอด ที่ขา 13 ที่ต่อกับ relay ก๊อกน้ำ
แต่ระบบระน้ำยังทำงานปกติ ผมแก้ตรงไหนดีครับ

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define BLYNK_PRINT Serial 
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

#define D0 13
#define D1 10
 
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

char auth[] = "wTmWsMa24qdqVUfK5Qpyg_1vzijJFS0Q"; //Token key
char server[] = "oasiskit.com";
char ssid[] = "Mi 10T Pro";
char pass[] = "12345678";
int port = 8080;
char led1 = D0;
char led2 = D1;
 
const int AirValue = 790;   //you need to replace this value with Value_1
const int WaterValue = 390;  //you need to replace this value with Value_2
const int SensorPin = A0;
int soilMoistureValue = 0;
int soilmoisturepercent=0;
int ButtomState;
 
 
void setup() {
  Serial.begin(115200); // open serial port, set the baud rate to 9600 bps
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64)
  display.clearDisplay();
  pinMode(D0, OUTPUT); //กำหนดโหมด ว่าเป็น INPUT หรือ OUTPUT
  pinMode(D1, OUTPUT);
  WiFi.begin(ssid, pass); //เชื่อมต่อ WiFi
  Blynk.config(auth, server, port); //กำหนด Token key , ชื่อ Server และ port
  Blynk.connect(); //เชื่อมต่อไปยัง Blynk
}
 
BLYNK_CONNECTED() {  // ฟังก์ชันนี้ทำงานเมื่อต่อ Blynk ได้ 
  Serial.println("App Blynk ทำงาน!");
  **Blynk.syncVirtual(V0);**
}
**BLYNK_WRITE(V0){  **
**  ButtomState=param.asInt();**
}
 
void loop() 
{
Blynk.run();
if(ButtomState = 1){  
  soilMoistureValue = analogRead(SensorPin);  //put Sensor insert into soil
//  Serial.println(soilMoistureValue);
  
  Serial.println(ButtomState);
  
  soilmoisturepercent = map(soilMoistureValue, AirValue, WaterValue, 0, 100);
  delay(500); 


if(soilmoisturepercent > 100)
{
//  Serial.println("100 %");

  Serial.println(ButtomState);

  Blynk.virtualWrite(V5, "100"); 
  display.setCursor(45,0);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Soil");
  display.setCursor(20,15);  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Moisture");
  
  display.setCursor(30,40);  //oled display
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.println("100 %");
  display.display();
  
  delay(250);
  display.clearDisplay();
  digitalWrite(D0, HIGH);
}

else if(soilmoisturepercent >=50 && soilmoisturepercent <= 100)
{
//  Serial.print(soilmoisturepercent);

  Serial.println(ButtomState);
  
//  Serial.println("%");
  Blynk.virtualWrite(V5, soilmoisturepercent); 
  display.setCursor(45,0);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Soil");
  display.setCursor(20,15);  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Moisture");
  
  display.setCursor(30,40);  //oled display
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.println(soilmoisturepercent);
  display.setCursor(70,40);
  display.setTextSize(3);
  display.println(" %");
  display.display();
 
  delay(250);
  display.clearDisplay();
  digitalWrite(D0, HIGH);
}  
else if(soilmoisturepercent <50)
{
//  Serial.print(soilmoisturepercent);

  Serial.println(ButtomState);
  
 // Serial.println("%");
  Blynk.virtualWrite(V5, soilmoisturepercent); 
  display.setCursor(45,0);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Water");
  display.setCursor(0,20);  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("The Plants");
  
  display.setCursor(30,40);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println(soilmoisturepercent);
  display.setCursor(70,40);
  display.setTextSize(2);
  display.println(" %");
  display.display();
  delay(250);
  display.clearDisplay();
  digitalWrite(D0, LOW);
}

else digitalWrite(D0, LOW);
}
}`Preformatted text`

ดอกจันพวกนี้คือใส่ไว้ทำไมหรอครับ

ภาพ

Confused Dogs GIF by moodman

ไม่มีครับแต่ตอนโพสต์จะไฮไลท์ ผมเลยกด B มันเลยขึ้นดอกจัน* ครับ /ขออภัยด้วยคร้บ

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define BLYNK_PRINT Serial 
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

#define D0 13
#define D1 10
 
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

char auth[] = "wTmWsMa24qdqVUfK5Qpyg_1vzijJFS0Q"; //Token key
char server[] = "oasiskit.com";
char ssid[] = "Mi 10T Pro";
char pass[] = "12345678";
int port = 8080;
char led1 = D0;
char led2 = D1;
 
const int AirValue = 790;   //you need to replace this value with Value_1
const int WaterValue = 390;  //you need to replace this value with Value_2
const int SensorPin = A0;
int soilMoistureValue = 0;
int soilmoisturepercent=0;
int ButtomState;
 
 
void setup() {
  Serial.begin(115200); // open serial port, set the baud rate to 9600 bps
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64)
  display.clearDisplay();
  pinMode(D0, OUTPUT); //กำหนดโหมด ว่าเป็น INPUT หรือ OUTPUT
  pinMode(D1, OUTPUT);
  WiFi.begin(ssid, pass); //เชื่อมต่อ WiFi
  Blynk.config(auth, server, port); //กำหนด Token key , ชื่อ Server และ port
  Blynk.connect(); //เชื่อมต่อไปยัง Blynk
}
 
BLYNK_CONNECTED() {  // ฟังก์ชันนี้ทำงานเมื่อต่อ Blynk ได้ 
  Serial.println("App Blynk ทำงาน!");
  Blynk.syncVirtual(V0);
}
BLYNK_WRITE(V0){  
  ButtomState=param.asInt();
}
 
void loop() 
{
Blynk.run();
if(ButtomState = 1){  
  soilMoistureValue = analogRead(SensorPin);  //put Sensor insert into soil
//  Serial.println(soilMoistureValue);
  
  Serial.println(ButtomState);
  
  soilmoisturepercent = map(soilMoistureValue, AirValue, WaterValue, 0, 100);
  delay(500); 


if(soilmoisturepercent > 100)
{
//  Serial.println("100 %");

  Serial.println(ButtomState);

  Blynk.virtualWrite(V5, "100"); 
  display.setCursor(45,0);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Soil");
  display.setCursor(20,15);  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Moisture");
  
  display.setCursor(30,40);  //oled display
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.println("100 %");
  display.display();
  
  delay(250);
  display.clearDisplay();
  digitalWrite(D0, HIGH);
}

else if(soilmoisturepercent >=50 && soilmoisturepercent <= 100)
{
//  Serial.print(soilmoisturepercent);

  Serial.println(ButtomState);
  
//  Serial.println("%");
  Blynk.virtualWrite(V5, soilmoisturepercent); 
  display.setCursor(45,0);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Soil");
  display.setCursor(20,15);  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Moisture");
  
  display.setCursor(30,40);  //oled display
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.println(soilmoisturepercent);
  display.setCursor(70,40);
  display.setTextSize(3);
  display.println(" %");
  display.display();
 
  delay(250);
  display.clearDisplay();
  digitalWrite(D0, HIGH);
}  
else if(soilmoisturepercent <50)
{
//  Serial.print(soilmoisturepercent);

  Serial.println(ButtomState);
  
 // Serial.println("%");
  Blynk.virtualWrite(V5, soilmoisturepercent); 
  display.setCursor(45,0);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Water");
  display.setCursor(0,20);  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("The Plants");
  
  display.setCursor(30,40);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println(soilmoisturepercent);
  display.setCursor(70,40);
  display.setTextSize(2);
  display.println(" %");
  display.display();
  delay(250);
  display.clearDisplay();
  digitalWrite(D0, LOW);
}

else digitalWrite(D0, LOW);
}
}

อัพเดทครับ ผมลอง เช็คการสั่งงานปุ่ม V0 ผ่าน blynk โดย copy คำสั่ง Serial.println(ButtomState); มาไว้ก่อน Void loop ผลคือ ESP8266 จะเช็คค่า V0 ให้ตลอดแต่ ถ้าให้ คำสั่งนี้ไปอยู่ใน Void loop จะไม่ตอบสนองครับ


อัพเดทครับ!
ผมลองย้ายคำลั่ง Serial.println(ButtomState); ไปไว้ใน void loop เหมือนเดิม และเอาคำสั่ง if(ButttomState=1) ออก ปรากฎว่า ใน void loop จะ ตอบสนอง ค่า V0 ที่ส่งจาก Blynk ครับ

ตอนนี้ทำงานได้ตามที่ต้องการหรือยัง เรากำหนดให้ V0 เป็น push button หรือ switch

ยังครับ กำหนดให้ V0 เป็น Switch ครับ

วิธีที่ 1 เปลี่ยนจากชนิดตัวแปร int เป็น bool ครับ

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define BLYNK_PRINT Serial 
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

#define D0 13
#define D1 10
 
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

char auth[] = "wTmWsMa24qdqVUfK5Qpyg_1vzijJFS0Q"; //Token key
char server[] = "oasiskit.com";
char ssid[] = "Mi 10T Pro";
char pass[] = "12345678";
int port = 8080;
char led1 = D0;
char led2 = D1;
 
const int AirValue = 790;   //you need to replace this value with Value_1
const int WaterValue = 390;  //you need to replace this value with Value_2
const int SensorPin = A0;
int soilMoistureValue = 0;
int soilmoisturepercent=0;
bool ButtomState = false; // แก้ไข 1
 
 
void setup() {
  Serial.begin(115200); // open serial port, set the baud rate to 9600 bps
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64)
  display.clearDisplay();
  pinMode(D0, OUTPUT); //กำหนดโหมด ว่าเป็น INPUT หรือ OUTPUT
  pinMode(D1, OUTPUT);
  WiFi.begin(ssid, pass); //เชื่อมต่อ WiFi
  Blynk.config(auth, server, port); //กำหนด Token key , ชื่อ Server และ port
  Blynk.connect(); //เชื่อมต่อไปยัง Blynk
}
 
BLYNK_CONNECTED() {  // ฟังก์ชันนี้ทำงานเมื่อต่อ Blynk ได้ 
  Serial.println("App Blynk ทำงาน!");
  Blynk.syncVirtual(V0);
}
BLYNK_WRITE(V0){  
  ButtomState=param.asInt();
}
 
void loop() 
{
Blynk.run();
if(ButtomState == true){   // แก้ไข 2
  soilMoistureValue = analogRead(SensorPin);  //put Sensor insert into soil
//  Serial.println(soilMoistureValue);
  
  Serial.println(ButtomState);
  
  soilmoisturepercent = map(soilMoistureValue, AirValue, WaterValue, 0, 100);
  delay(500); 


if(soilmoisturepercent > 100)
{
//  Serial.println("100 %");

  Serial.println(ButtomState);

  Blynk.virtualWrite(V5, "100"); 
  display.setCursor(45,0);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Soil");
  display.setCursor(20,15);  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Moisture");
  
  display.setCursor(30,40);  //oled display
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.println("100 %");
  display.display();
  
  delay(250);
  display.clearDisplay();
  digitalWrite(D0, HIGH);
}

else if(soilmoisturepercent >=50 && soilmoisturepercent <= 100)
{
//  Serial.print(soilmoisturepercent);

  Serial.println(ButtomState);
  
//  Serial.println("%");
  Blynk.virtualWrite(V5, soilmoisturepercent); 
  display.setCursor(45,0);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Soil");
  display.setCursor(20,15);  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Moisture");
  
  display.setCursor(30,40);  //oled display
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.println(soilmoisturepercent);
  display.setCursor(70,40);
  display.setTextSize(3);
  display.println(" %");
  display.display();
 
  delay(250);
  display.clearDisplay();
  digitalWrite(D0, HIGH);
}  
else if(soilmoisturepercent <50)
{
//  Serial.print(soilmoisturepercent);

  Serial.println(ButtomState);
  
 // Serial.println("%");
  Blynk.virtualWrite(V5, soilmoisturepercent); 
  display.setCursor(45,0);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Water");
  display.setCursor(0,20);  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("The Plants");
  
  display.setCursor(30,40);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println(soilmoisturepercent);
  display.setCursor(70,40);
  display.setTextSize(2);
  display.println(" %");
  display.display();
  delay(250);
  display.clearDisplay();
  digitalWrite(D0, LOW);
}

else digitalWrite(D0, LOW);
}
}

วิธีที่ 2 แก้ไขจุดที่ไม่เคลียร์บนตัวดำเนินการ ใน if() ปกติเราจะใช้ if( x == 1) ไม่ใช่ if( x = 1)

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define BLYNK_PRINT Serial 
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

#define D0 13
#define D1 10
 
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

char auth[] = "wTmWsMa24qdqVUfK5Qpyg_1vzijJFS0Q"; //Token key
char server[] = "oasiskit.com";
char ssid[] = "Mi 10T Pro";
char pass[] = "12345678";
int port = 8080;
char led1 = D0;
char led2 = D1;
 
const int AirValue = 790;   //you need to replace this value with Value_1
const int WaterValue = 390;  //you need to replace this value with Value_2
const int SensorPin = A0;
int soilMoistureValue = 0;
int soilmoisturepercent=0;
int ButtomState;
 
 
void setup() {
  Serial.begin(115200); // open serial port, set the baud rate to 9600 bps
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64)
  display.clearDisplay();
  pinMode(D0, OUTPUT); //กำหนดโหมด ว่าเป็น INPUT หรือ OUTPUT
  pinMode(D1, OUTPUT);
  WiFi.begin(ssid, pass); //เชื่อมต่อ WiFi
  Blynk.config(auth, server, port); //กำหนด Token key , ชื่อ Server และ port
  Blynk.connect(); //เชื่อมต่อไปยัง Blynk
}
 
BLYNK_CONNECTED() {  // ฟังก์ชันนี้ทำงานเมื่อต่อ Blynk ได้ 
  Serial.println("App Blynk ทำงาน!");
  Blynk.syncVirtual(V0);
}
BLYNK_WRITE(V0){  
  ButtomState=param.asInt();
}
 
void loop() 
{
Blynk.run();
if(ButtomState == 1){   // แก้ไข 1
  soilMoistureValue = analogRead(SensorPin);  //put Sensor insert into soil
//  Serial.println(soilMoistureValue);
  
  Serial.println(ButtomState);
  
  soilmoisturepercent = map(soilMoistureValue, AirValue, WaterValue, 0, 100);
  delay(500); 


if(soilmoisturepercent > 100)
{
//  Serial.println("100 %");

  Serial.println(ButtomState);

  Blynk.virtualWrite(V5, "100"); 
  display.setCursor(45,0);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Soil");
  display.setCursor(20,15);  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Moisture");
  
  display.setCursor(30,40);  //oled display
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.println("100 %");
  display.display();
  
  delay(250);
  display.clearDisplay();
  digitalWrite(D0, HIGH);
}

else if(soilmoisturepercent >=50 && soilmoisturepercent <= 100)
{
//  Serial.print(soilmoisturepercent);

  Serial.println(ButtomState);
  
//  Serial.println("%");
  Blynk.virtualWrite(V5, soilmoisturepercent); 
  display.setCursor(45,0);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Soil");
  display.setCursor(20,15);  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Moisture");
  
  display.setCursor(30,40);  //oled display
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.println(soilmoisturepercent);
  display.setCursor(70,40);
  display.setTextSize(3);
  display.println(" %");
  display.display();
 
  delay(250);
  display.clearDisplay();
  digitalWrite(D0, HIGH);
}  
else if(soilmoisturepercent <50)
{
//  Serial.print(soilmoisturepercent);

  Serial.println(ButtomState);
  
 // Serial.println("%");
  Blynk.virtualWrite(V5, soilmoisturepercent); 
  display.setCursor(45,0);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Water");
  display.setCursor(0,20);  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("The Plants");
  
  display.setCursor(30,40);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println(soilmoisturepercent);
  display.setCursor(70,40);
  display.setTextSize(2);
  display.println(" %");
  display.display();
  delay(250);
  display.clearDisplay();
  digitalWrite(D0, LOW);
}

else digitalWrite(D0, LOW);
}
}

ผมอยากรู้ผลลัทธ์ทั้ง 2 วิธี ไปลองแล้วนำผลมาดูหน่อย

ครับ เดี๋ยวเอาไปแก้ ขอบคุณครับ

up date ครับ
วิธีที่ 1 และ วิธีที่2 ได้ผลเหมือนกันคือ V0 ไม่สามารถบังคับให้ รดน้ำได้ จะโชว์ status V0 เป็น 1 อย่างเดียว
แต่วิธีที่ 2 ถ้ากดปุุ่ม V0 ค้าง(on)ไว้จะทำให้ ESP82666 ทำงานค้าง ไม่วัดค่าหรือส่งค่าใดๆ

คำถามคือ soilmoisturepercent มีค่าเท่าใด ขณะนั้นที่มันไม่ทำงาน

ทุกค่าครับ 0-100

การทำงาน
ผมกำหนดใหัถ้าเกิน 50 จะหยุดรดน้ำแต่ต่ำกว่า 50 จะไป on relay ให้รดน้ำ
ปุ่ม V0 คือ force เงื่อนไขคือถึงแม้ว่าเกิน 50 หรือ ต่ำกว่าผมสามารถกดปุ่ม V0 รดน้ำได้

แต่ที่สังเกตคือถ้าเกิน 50 ESP8266 จะหยุดจ่ายนำ แต่พอกด V0 มันก็ไม่เกิดอะไรขึ้นครับ

ถ้าเช่นนั้นก็ศึกษาจาก คู่มือนี้ครับ น่าจะตรงประเด็น

ครับ เดี๋ยวผมศึกษาดู ขอบคุณมากครับ :smiley: :smiley:

ทำงานได้แล้วครับสามารถบังคับรดน้ำได้โดยไม่สนในความชื้น
โดยการรวมโค๊ดที่แอดมินแนะนำ้ให้ไปอ่าน ขอบคุณครับ

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define BLYNK_PRINT Serial 
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

#define D0 13
#define D1 10
 
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

char auth[] = "wTmWsMa24qdqVUfK5Qpyg_1vzijJFS0Q"; //Token key
char server[] = "oasiskit.com";
char ssid[] = "Mi 10T Pro";
char pass[] = "12345678";
int port = 8080;
char led1 = D0;
char led2 = D1;
 
const int AirValue = 790;   //you need to replace this value with Value_1
const int WaterValue = 390;  //you need to replace this value with Value_2
const int SensorPin = A0;
int soilMoistureValue = 0;
int soilmoisturepercent=0;
int ButtonState =0;
 
 
void setup() {
  Serial.begin(115200); // open serial port, set the baud rate to 9600 bps
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64)
  display.clearDisplay();
  pinMode(D0, OUTPUT); //กำหนดโหมด ว่าเป็น INPUT หรือ OUTPUT
  pinMode(D1, OUTPUT);
  WiFi.begin(ssid, pass); //เชื่อมต่อ WiFi
  Blynk.config(auth, server, port); //กำหนด Token key , ชื่อ Server และ port
  Blynk.connect(); //เชื่อมต่อไปยัง Blynk
}
 
BLYNK_CONNECTED() {  // ฟังก์ชันนี้ทำงานเมื่อต่อ Blynk ได้ 
  Serial.println("App Blynk ทำงาน!");
  Blynk.syncVirtual(V0);
}
BLYNK_WRITE(V0) // Button or Switch Widget
{
  ButtonState = param.asInt();
 }
void loop(){
    Blynk.run();
    if (ButtonState == 1) {
    soilMoistureValue = analogRead(SensorPin);  //put Sensor insert into soil 
    Serial.println(ButtonState);
    soilmoisturepercent = map(soilMoistureValue, AirValue, WaterValue, 0, 100);
    delay(500); 
if(soilmoisturepercent > 100)
{
  Serial.println(ButtonState);
  Blynk.virtualWrite(V5, "100"); 
  display.setCursor(45,0);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Soil");
  display.setCursor(20,15);  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Moisture");
  
  display.setCursor(30,40);  //oled display
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.println("100 %");
  display.display();
  
  delay(250);
  display.clearDisplay();
  digitalWrite(D0, HIGH);
}
else if(soilmoisturepercent >=50 && soilmoisturepercent <= 100)
{

  Serial.println(ButtonState);
  Blynk.virtualWrite(V5, soilmoisturepercent); 
  display.setCursor(45,0);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Soil");
  display.setCursor(20,15);  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Moisture");
  
  display.setCursor(30,40);  //oled display
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.println(soilmoisturepercent);
  display.setCursor(70,40);
  display.setTextSize(3);
  display.println(" %");
  display.display();
 
  delay(250);
  display.clearDisplay();
  digitalWrite(D0, HIGH);
}  
else if(soilmoisturepercent <50)
{
  Serial.println(ButtonState);
  Blynk.virtualWrite(V5, soilmoisturepercent); 
  display.setCursor(45,0);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Water");
  display.setCursor(0,20);  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("The Plants");
  
  display.setCursor(30,40);  //oled display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println(soilmoisturepercent);
  display.setCursor(70,40);
  display.setTextSize(2);
  display.println(" %");
  display.display();
  delay(250);
  display.clearDisplay();
  digitalWrite(D0, LOW);
}
 } else {
   digitalWrite(D0, LOW);
  }
}