คือตอนแรกที่ทำสั่งงานแบบ Manual ได้แล้วค่ะ
แต่พอสั่งงานที่เพิ่ม Auto ได้ค่าจากความชื้น ทำให้มันสั่งเปิดแบบ Manual ไม่ได้
อยากทราบว่า สามารถทำให้สั่งงานทั้ง 2 แบบได้ไหมค่ะ
คือ เปิดแมนนวลได้แล้วพอ ออโต้ทำงาน มันสั่งปิดก่อนไม่ได้ใช่ไหม??
ใช่ค่ะ
แต่ตอน Auto ไม่ทำงาน แล้วสั่งเปิดแบบ Manual ปุ๊บ มันก็ปิดเองเลย
กว่าจะเข้าใจตรงกันได้ โถ่ววววว
ลองอ่านกระทู้นี้ดูก่อนครับว่าเข้าใจไหม คำตอบอยู่ในนี้แหละครับ อยากให้อ่านเพราะว่าอยากให้เข้าใจปัญหาที่เกิดขึ้น และดูการแก้ปัญหาว่าแก่ปัญหานั้นอย่างไร น้องจะได้วิเคราะห์ตาม
ขอบคุณมากค่ะ นี่พึ่งทำโปรเจคครั้งแรก ก็เลยงงๆ ตั้งคำถามไม่ค่อยเป็นด้วย 555555
อ่านเยอะๆ ครับ ไม่เข้าใจก็ถามได้เลยผม ยินดีตอบ รู้อะไรก็เอามาแชร์กันได้ครับ
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h> //เรียกใช้ไลเบอรี่
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>
#include <SimpleTimer.h>
#define DHTPIN D4 // กำหนดช่องพินของเซนเชอร์
#define DHTTYPE DHT11 // DHT 11 ชื่อ ของเซ็นเชอร์ที่ใช้
#define BLYNK_PRINT DebugSerial
int sensorPin = A0;
char auth[] = "11111111111111111111111"; // token blynk
char ssid[] = "KKKKK"; // ชื่อ Wifi
char pass[] = "12345678"; // พาสเวิด
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()
{
pinMode(4, OUTPUT); //ตั้งค่าขา 4 เป็น output
pinMode(5, OUTPUT); //ตั้งค่าขา 5 เป็น output
Serial.begin(115200); // เริ่มตั้นการสื่อสารที่ 115200
dht.begin();
Blynk.begin(auth, ssid, pass);
timer.setInterval(2000L, myTimerEvent);
}
int sensorValue;
void loop()
{
sensorValue = analogRead(sensorPin);
sensorValue = map(sensorValue, 0, 1023, 0, 100);
Serial.print("Soil moisture: ");
Serial.print(sensorValue);
Serial.println(" %");
Blynk.run();
timer.run(); // Initiates BlynkTimer
delay(500); //wait for half a second, so it is easier to read
if(sensorValue <80)
{
digitalWrite(5,HIGH);
Blynk.virtualWrite(V3,1);
}else{
digitalWrite(5,LOW);
Blynk.virtualWrite(V3,0);
}
}
BLYNK_WRITE(V3)
{
if(param.asInt()==1){
digitalWrite(5,LOW);
}else{
digitalWrite(5,HIGH);
}
}
ขออนุญาต สอบถามอีกหน่อยคะ
ตอนนี้ มันทำงาน auto แล้ว แต่เมื่อกดสั่งปิด แล้ว มันยังทำงาน อยู่ใน loop
if(sensorValue <80)
{
digitalWrite(5,HIGH);
Blynk.virtualWrite(V3,1);
}else{
digitalWrite(5,LOW);
Blynk.virtualWrite(V3,0);
}
*****************
มันต้องแก้ยังไงคะ ให้สามารถสั่งการได้ คือสั่งให้ปิด เปิด ได้ด้ด้วยอะคะ
อธิบายการทำงานตรงนี้ให้ผมหน่อยครับว่าเข้าใจว่าอย่างไร ผิดถูกไม่ว่ากันครับ จะได้ปรับให้ถูกและเข้าใจตรงกันก่อน
ขอโทษครับ ผมลืมอัพรูปโถ่ววว
คือตอนนี้ ระบบมันรับค่าความชื้น เปิด-ปิด แบบ auto ได้แล้วค่ะ ที่กำหนดให้รับค่า < 80 นั้นแหละ
แต่อยากจะทำให้ปุ่มใน blynk สามารถสั่งให้มันเปิด-ปิด ได้จากตัวผู้ใช้เองด้วยค่ะ
if(sensorValue <80) //ถ้าค่าความชื่นในดิน มากกว่า 80
{
digitalWrite(5,HIGH); // ให้ pinMode 5 ทำการเปิด
Blynk.virtualWrite(V3,1); // ให้ BLYNK เขียนให้ V3 เปิด
}else{
digitalWrite(5,LOW); // ถ้าค่าน้อยกว่า 80 ให้ pinMode 5 ทำการปิด
Blynk.virtualWrite(V3,0); // ให้ BLYNK เขียนให้ V3 ปิด
}
โจทย์นี้ต้องการให้ ค่า ความชื้นในดิน
- มากกว่า Relay On
หรือ - น้อยกว่า Relay On หรอครับ
มากกว่า ให้ Relay On ค่ะ
ถ้าอย่างนั้นเครื่องหมายของตัวดำเนินการตรงนี้ก็ผิดครับ มันสลับกันอยู่ ที่เราใช้อยู่คือ ถ้าค่าความชื้นในดิน น้อยกว่า(<) 80 ให้ Relay On ครับ
ด้วยคำสั่งนี้ digitalWrite(5,HIGH);
ถ้าบอร์ดต่อ แบบ active high รีเลย์จะ On
แต่ถ้าต่อแบบ active low รีเลย์มันจะ Off
จุดนี้ได้แล้วค่ะ แต่ถ้าเวลา Relay On แบบ auto แล้วเราอยากจะสั่งปิดด้วยตัวเอง
แต่เมื่อกดปิดแล้ว มันก็กลับมาออนเหมือนเดิม
ถ้าการทำงานเป็นจริงอย่างที่น้องว่ามา ดังนั้น
ปัญหาคือชุดนี้มันทำงานตลอดครับ
ต่อให้น้องกดปิด มันก็จะเปิดอีก เพราะมันลูป if มันเข้าเงื่อนไขตลอด การจะแก้ก็แค่เขียนให้สองคำสั่งนี้ทำงานแค่ครั้งเดียว ต่อให้วนมาอีกก็ไม่ทำอีกครั้ง ครับ
ตัวอย่างการแก้ไข
ไม่ทราบว่าทำได้หรือยังครับ ผมติดตรงนี้เหมือนกัน
ผมลองทำตามคำแนะนำแล้ว คุณ @Remy_Martin ยังไม่ได้ครับ ยัง งงๆ กลับ Code อยู่