สมาร์ทฟาร์มแสดงค่าเข้า Blynk

สมาร์ทฟาร์ม โดย ESP8266 และใช้ Relay ปั้มน้ำ 5V, Power Supply 5V 1A

!! นี้คือโค้ดที่ผมใช้และปั๊มน้ำไม่ทำงาน (ปั๊มน้ำของผมจะทำงานขณะที่ความชื้นในดินแห้งครับ) !!
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include “DHT.h”
#define BLYNK_PRINT Serial

#define WateringPin 2

int analogInPin = A0;
int relay = 2;
int sensorValue = 0; // ตัวแปรค่า Analog
int outputValue = 0; // ตัวแปรสำหรับ Map เพื่อคิด %
char auth[] = “mc8ARAWp_ZkKqm-sm0_jXmEJ9_jMFJgM”;

// Your WiFi credentials.
// Set password to “” for open networks.
char ssid[] = “Sermphan_2.4GHz”;
char pass[] = “0987297146”;
#define DHTPIN 0

#define DHTTYPE DHT22
//#define DHTTYPE DHT22 // DHT 22, AM2302, AM2321
//#define DHTTYPE DHT21 // DHT 21, AM2301

DHT dht(DHTPIN, DHTTYPE);
BlynkTimer timer;
#define SENSOR_PIN 1
#define LED_PIN 2
#define LED 4 // LED on chip ESP8266

void sendSensor()
{
float h = dht.readHumidity();
float t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit

if (isnan(h) || isnan(t)) {
Serial.println(“Failed to read from DHT sensor!”);
return;
}
// You can send any value at any time.
// Please don’t send more that 10 values per second.

Blynk.virtualWrite(V0,analogRead(A0));
Blynk.virtualWrite(V5, t);
Blynk.virtualWrite(V6, h);

}
void setup()
{
// Debug console
pinMode(relay, OUTPUT);
pinMode(SENSOR_PIN, INPUT);
pinMode(WateringPin, OUTPUT);

pinMode(LED_PIN, OUTPUT);
pinMode(LED, OUTPUT);
Serial.begin(9600);
pinMode(relay, OUTPUT);
Blynk.begin(auth, ssid, pass);
// You can also specify server:
//Blynk.begin(auth, ssid, pass, “blynk-cloud.com”, 8442);
//Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8442);

dht.begin();

// Setup a function to be called every second
timer.setInterval(1000L, sendSensor);

}
void loop()
{

sensorValue = analogRead(analogInPin);
Serial.print(“Soil Moisture = “);
Serial.print(outputValue);
Serial.println(”%”);
if (outputValue <= 40 ) { //ตั้งค่า % ที่ต้องการจะรดน้ำต้นไม้
digitalWrite(relay, HIGH);
}
else {
digitalWrite(relay, LOW);
}

delay(1000);

Blynk.run();
timer.run();
}
void Sensor()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println(“Failed to read from DHT sensor!”);
digitalWrite(LED, LOW);
delay(1500);
return;
}
Serial.print("Humidity is: "); Serial.println(h, 1);
Serial.print("Temperature is: "); Serial.println(t, 1);
digitalWrite(LED, HIGH);
Blynk.virtualWrite(V0,analogRead(A0));
Blynk.virtualWrite(V5, h);
Blynk.virtualWrite(V6, t);
}

ขอคำแนะนำจากพี่ๆหน่อยน่ะครับว่าควรแก้ไขในส่วนไหนครับ
ขอบคุณคครับ

เช็คดูรึยังครับว่า ตอนมันแห้ง มันได้ค่าเท่าไหร่ กี่ % ต่ำกว่า 40 ไหม

แล้ว print ออกมาดูว่ามันวิ่งเข้า loop นี้รึป่าว

พอดีผมเขียนโค้ดใหม่น่ะครับ

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h> //เรียกใช้ไลเบอรี่
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <DHT.h>
#define DHTPIN 0 // กำหนดช่องพินของเซนเชอร์
#define DHTTYPE DHT22 // DHT 11 ชื่อ ของเซ็นเชอร์ที่ใช้
#define sensorPin A0
#define RelayPin 2
#define BLYNK_PRINT DebugSerial
int sensorValue = 0;
char auth[] = “mc8ARAWp_ZkKqm-sm0_jXmEJ9_jMFJgM”;

// Your WiFi credentials.
// Set password to “” for open networks.
char ssid[] = “Sermphan_2.4GHz”;
char pass[] = “0987297146”;
BlynkTimer timer;
DHT dht(DHTPIN, DHTTYPE);
void myTimerEvent()
{
float h = dht.readHumidity();
float t = dht.readTemperature();

if (isnan(h) || isnan(t))
{
Serial.println(“Failed to read from DHT sensor!”);
return;
}
else
{
Serial.print(“Humidity: “);
Serial.print(h);
Serial.print(” %\t”);
Serial.print("Temperature: ");
Serial.println(t);
Blynk.virtualWrite(V1, h);
Blynk.virtualWrite(V2, t);

}
}
void setup()
{
Serial.begin(9600);
pinMode(sensorPin, INPUT);
pinMode(RelayPin, OUTPUT);
digitalWrite(RelayPin, HIGH);
dht.begin();
Blynk.begin(auth, ssid, pass);
timer.setInterval(2000L, myTimerEvent);
}

void loop()
{
sensorValue = analogRead(sensorPin);
sensorValue = map(sensorValue, 350, 1023, 100, 0);
Serial.print(“Soil moisture: “);
Serial.print(sensorValue);
Serial.println(” %”);

if( sensorValue > 500 ) {
digitalWrite(RelayPin, HIGH);
}
else{
digitalWrite(RelayPin, LOW);
}
delay(500);
Serial.print("Sensor = " );
Serial.println(sensorValue);
Blynk.run();
timer.run(); // Initiates BlynkTimer
}

ตอนนี้รีเลย์ทำงานแล้วแต่ผมลองเอาวัดความชื้นในดินจุ้มน้ำแล้วปั๊มน้ำไม่ดับอ่ะครับ
ความชื้นที่วัดได้ประมาณ 10-12% ครับ
แต่ตอนผมเอาวัดตอนดินเปียก มันขึ้น 0% เลยอ่ะครับ

เซนเซอร์มันใช้การอ่านค่าประจุครับ ในดินกับในน้ำ ประจุไฟฟ้าก็ต่างกันไป เราก็ต้องปรับเกณฑ์ที่ใช้ตามความเหมาะสม ด้วยว่าเราเอาไปใช้ในดิน หรือเอาไปใช้กับน้ำ

ทำไมถึงใช้ 500 ครับ ค่า sensorValue น่าจะออกได้ไม่เกิน 100 นะ แล้วมันเทียบค่าได้ได้หรองงนะ

ผมสงสัยน่ะครับ พอดีผมไปดูๆมาจากเว็ปอื่น
ค่ามันประมาณนี้
#define sensorPin A0
#define RelayPin 2

int sensorValue = 0;

void setup()
{
Serial.begin(9600);
pinMode(sensorPin, INPUT);
pinMode(RelayPin, OUTPUT);
digitalWrite(RelayPin, HIGH);
}

void loop()
{
sensorValue = analogRead(sensorPin);

if( sensorValue > 750 ) {
digitalWrite(RelayPin, LOW);
}
else{
digitalWrite(RelayPin, HIGH);
}
delay(500);
Serial.print("Sensor = " );
Serial.println(sensorValue);
}

ผมเลยลองเทียบดูน่ะครับ
ผมก็ไม่ค่อบเข้าใจเท่าไหร่ชิ้นงานนี้ครั้งแรกด้วยครับ

เบื้องต้นปรับค่า sensorValue ให้เข้ากับ loop ที่ on high ก่อน ซึ่ง ดูค่าที่ print ได้ ตรงจุดที่เราต้องการ ให้ on แล้วเอามาเปลี่ยนตรง > 500 เพราะ 500 นี้เหมือนของเดิมยังไม่ได้แปลงรึป่าว


นี้คือค่าที่วัดออกมาตอนที่ยังไม่ได้วัดกับอะไรครับ

และนี้คือค่าที่วุดกับดินแห้งครับ

ผมควรแก้ใน loop ยังไงหรอครับ

ได้แล้วครับ ตอนนี้ถ้าไม่ได้วัดอะไรปั๊มจะไม่ทำงานต่อพอเอาจุ้มในดินแห้งปั๊มน้ำทำงานเลยครับ

void loop()
{
sensorValue = analogRead(sensorPin);
sensorValue = map(sensorValue, 0, 1023, 0, 100);
Serial.print(“Soil moisture: “);
Serial.print(sensorValue);
Serial.println(”%”);

if( sensorValue < 80 ) {
digitalWrite(RelayPin, HIGH);
}
else{
digitalWrite(RelayPin, LOW);
}

คือผมจะสร้างปุ่มBottonขึ้นมาในแอพ Blynk สั่งเปิดปิดการทำงานผมควรทำยังไงบ้างหรอครับ

ทำไมพอวัดดินเปียกแล้วรีเลย์ยังไม่ตัดหรอครับ

แอดปุ่มเพิ่มมาครับ

ตัวอย่างโค้ต

button uses 0/1 (LOW/HIGH) values. Button sends 1 (HIGH) on press and sends 0 (LOW) on release.

You can change button state from hardware side. For example, turn on button assigned to virtual pin V1 :

Blynk.virtualWrite(V1, HIGH);

You can change button labels from hardware with :

Blynk.setProperty(V1, "onLabel", "ON");
Blynk.setProperty(V1, "offLabel", "OFF");

or change color :

//#D3435C - Blynk RED 
Blynk.setProperty(V1, "color", "#D3435C");

You can also get button state from server in case your hardware was disconnected with Blynk Sync feature :

BLYNK_CONNECTED() {
  Blynk.syncVirtual(V1);
}

BLYNK_WRITE(V1) {
  int buttonState = param.asInt();
}

ตอนนั้นค่า sensorValue ได้เท่าไหร่ครับ

สูงสุดที่วัดได้1024ครับ ตอนนี้ผมทำได้แล้วครับ

ขอบคุณครับ เลือกใช้ปุ่มไหนก้ได้ ในกรอบใช้มั้ยครับ

แก้ไขได้อย่างไร แชร์กันหน่อยครับ

เลือกตามลักษณะงานครับ อยากได้ปุ่มใหญ่ เลือกบน อยากได้เล็กๆ หน่อยก็อันล่าง แต่การทำงานเหมือนกัน


ในส่วนนี้วางไว้ใน loop ใช้มั้ยครับ

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h> //เรียกใช้ไลเบอรี่
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <DHT.h>
#define DHTPIN 0   // กำหนดช่องพินของเซนเชอร์
#define DHTTYPE DHT22   // DHT 11  ชื่อ ของเซ็นเชอร์ที่ใช้
 
#define BLYNK_PRINT DebugSerial
int sensorValue = 0;
int sensorPin = A0;
int RelayPin = 2;   
char auth[] = "mc8ARAWp_ZkKqm-sm0_jXmEJ9_jMFJgM";
 
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Sermphan_2.4GHz";
char pass[] = "0987297146";
BlynkTimer timer;
DHT dht(DHTPIN, DHTTYPE);
void myTimerEvent()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) 
  {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  else
  {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.println(t);
    Blynk.virtualWrite(V1, h); 
    Blynk.virtualWrite(V4, t);
    
 
  }
}
void setup() 
{
   Serial.begin(9600);  
   pinMode(sensorPin, INPUT);  
   pinMode(RelayPin, OUTPUT);
   digitalWrite(RelayPin, HIGH);  
   dht.begin();
    Blynk.begin(auth, ssid, pass);
  timer.setInterval(2000L, myTimerEvent);
}

void loop() 
{
  sensorValue = analogRead(A0); 
 if (sensorValue >= 999 && sensorValue <= 1024)
 {
    Serial.println(sensorValue);
    digitalWrite(RelayPin, HIGH);
   Blynk.virtualWrite(V2, HIGH);
     
     
  }
  else{
    Serial.println(sensorValue);
    digitalWrite(RelayPin, LOW);
    
  }
    
  delay(1000);   
  Blynk.setProperty(V2, "onLabel", "ON");
  Blynk.setProperty(V2, "offLabel", "OFF");       
  Serial.print("Sensor = " );                       
  Serial.println(sensorValue); 

   Blynk.run();
  timer.run(); // Initiates BlynkTimer                  
}
BLYNK_CONNECTED() {
  Blynk.syncVirtual(V2);
}

BLYNK_WRITE(V2) {
  int buttonState = param.asInt();
}

ทำไมกดสั่งให้ทำงานหยุด แต่มันหยุดและเปิดการทำงานเองเลยอ่ะครับ
ผมต้องการให้กด ON เปิด กด OFF ปิด โดยการบังคับเองอ่ะครับ