ขอสอบถามหน่อยค่ะ คือตอนนี้ รับค่าจาก ค่าความชื้นในดิน เพื่อเปิด รีเลย์ ได้แล้วค่ะ แต่ปุ่ม Button มันไม่เปิดปิดตาม ต้องทำยังไงค่ะ

สมาร์ทฟาร์ม

(Tip Sr) #22

คือตอนแรกที่ทำสั่งงานแบบ Manual ได้แล้วค่ะ
แต่พอสั่งงานที่เพิ่ม Auto ได้ค่าจากความชื้น ทำให้มันสั่งเปิดแบบ Manual ไม่ได้
อยากทราบว่า สามารถทำให้สั่งงานทั้ง 2 แบบได้ไหมค่ะ


(Permpol Thanapunnamas) #23

คือ เปิดแมนนวลได้แล้วพอ ออโต้ทำงาน มันสั่งปิดก่อนไม่ได้ใช่ไหม??


(Tip Sr) #24

ใช่ค่ะ
แต่ตอน Auto ไม่ทำงาน แล้วสั่งเปิดแบบ Manual ปุ๊บ มันก็ปิดเองเลย


(Permpol Thanapunnamas) #25

กว่าจะเข้าใจตรงกันได้ โถ่ววววว


(Permpol Thanapunnamas) #26

ลองอ่านกระทู้นี้ดูก่อนครับว่าเข้าใจไหม คำตอบอยู่ในนี้แหละครับ อยากให้อ่านเพราะว่าอยากให้เข้าใจปัญหาที่เกิดขึ้น และดูการแก้ปัญหาว่าแก่ปัญหานั้นอย่างไร น้องจะได้วิเคราะห์ตาม


(Tip Sr) #27

ขอบคุณมากค่ะ นี่พึ่งทำโปรเจคครั้งแรก ก็เลยงงๆ ตั้งคำถามไม่ค่อยเป็นด้วย 555555


(Permpol Thanapunnamas) #28

อ่านเยอะๆ ครับ ไม่เข้าใจก็ถามได้เลยผม ยินดีตอบ รู้อะไรก็เอามาแชร์กันได้ครับ


(Tip Sr) #29
#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);
  }
*****************

มันต้องแก้ยังไงคะ ให้สามารถสั่งการได้ คือสั่งให้ปิด เปิด ได้ด้ด้วยอะคะ


(Permpol Thanapunnamas) #30

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


(Permpol Thanapunnamas) #31

ขอโทษครับ ผมลืมอัพรูปโถ่ววว


(Tip Sr) #32

คือตอนนี้ ระบบมันรับค่าความชื้น เปิด-ปิด แบบ auto ได้แล้วค่ะ ที่กำหนดให้รับค่า < 80 นั้นแหละ
แต่อยากจะทำให้ปุ่มใน blynk สามารถสั่งให้มันเปิด-ปิด ได้จากตัวผู้ใช้เองด้วยค่ะ


(Permpol Thanapunnamas) #33

อธิบายการทำงานตรงนี้ก่อนครับ งั้นไปต่อไม่ได้ครับ


(Tip Sr) #34
      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 ปิด
  }

(Permpol Thanapunnamas) #35

โจทย์นี้ต้องการให้ ค่า ความชื้นในดิน

  1. มากกว่า Relay On
    หรือ
  2. น้อยกว่า Relay On หรอครับ

(Tip Sr) #36

มากกว่า ให้ Relay On ค่ะ


(Permpol Thanapunnamas) #37

ถ้าอย่างนั้นเครื่องหมายของตัวดำเนินการตรงนี้ก็ผิดครับ มันสลับกันอยู่ ที่เราใช้อยู่คือ ถ้าค่าความชื้นในดิน น้อยกว่า(<) 80 ให้ Relay On ครับ

ด้วยคำสั่งนี้ digitalWrite(5,HIGH);

ถ้าบอร์ดต่อ แบบ active high รีเลย์จะ On
แต่ถ้าต่อแบบ active low รีเลย์มันจะ Off


(Tip Sr) #38

จุดนี้ได้แล้วค่ะ แต่ถ้าเวลา Relay On แบบ auto แล้วเราอยากจะสั่งปิดด้วยตัวเอง
แต่เมื่อกดปิดแล้ว มันก็กลับมาออนเหมือนเดิม


(Permpol Thanapunnamas) #39

ถ้าการทำงานเป็นจริงอย่างที่น้องว่ามา ดังนั้น
ปัญหาคือชุดนี้มันทำงานตลอดครับ

ต่อให้น้องกดปิด มันก็จะเปิดอีก เพราะมันลูป if มันเข้าเงื่อนไขตลอด การจะแก้ก็แค่เขียนให้สองคำสั่งนี้ทำงานแค่ครั้งเดียว ต่อให้วนมาอีกก็ไม่ทำอีกครั้ง ครับ


(Permpol Thanapunnamas) #40

ตัวอย่างการแก้ไข