อยากให้ เซนเซอร์วัดความชื้นดิน ทำงานอัตโนมัติครับ โดยใช้ Blynk ร่วมกับ NodeMCU V3

เช็คตรงนี้ดีๆ ครับ มันต้องเป็น input นะไม่ใช่ output

1 Likes

ถ้าจะเปิด A ก็ต้องกดปิด M ด้วยใช่ป่ะครับ

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

ส่วนนี้แก้ไขใช้งานได้แล้วครับ แต่ on V3 ไว้มันไม่ทำงานอัตโนมัติครับ

ตอนมันไม่ทำงาน M on หรือ off ครับ

จะเปิด auto ปกติจะกดอะไรก่อน ขอสเตปการกดหน่อย

ตอนไม่ทำงาน m ปิดอยู่ครับ
เปิด auto แค่จ่ายไฟเข้าวงจรก็สามารถสั่งเปิดปิดได้เลยครับ

ขอ qr clone มาหน่อยครับ เดียวคงต้องซิมเทสดูก่อน

เอาตรงนี้มาครับ นั้นมันสำหรับแชร์

84183484_507794470140605_8651371036857597952_n
QR Code แบบ Clone สำหรับโครงงานนี้ครับ

#define BLYNK_PRINT Serial
#define DHTPIN D2
#define DHTTYPE DHT11

#include <SPI.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <DHT.h>

int sensorPin = A0;
int sensorValue = 0;
int Relay = D3;
SimpleTimer timer;

DHT dht(DHTPIN, DHTTYPE);
WidgetLCD lcd(V6);

char auth[] = "auth";
char ssid[] = "ssid";
char pass[] = "passwords";

BLYNK_CONNECTED() {
  Blynk.syncAll();
  }

BLYNK_WRITE(V4) {
  if (param.asInt() == 1) {
    digitalWrite(Relay,HIGH);
    lcd.clear();
    lcd.print(0,0,"PUMP: ON");
    lcd.print(0,1,"STATS: Manual On");
    delay(500);
    Blynk.virtualWrite(V3,LOW);
  }
  if (param.asInt() == 0) {
    digitalWrite(Relay,LOW);
    lcd.clear();
    lcd.print(0,0,"PUMP: OFF");
    lcd.print(0,1,"STATS: ManualOff");
    delay(500);
  }
}

void sendTemp() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  Blynk.virtualWrite(V1, t);
  Blynk.virtualWrite(V2, h);
}

void sendSoilValue() {
  sensorValue = analogRead(sensorPin);
  sensorValue = map(sensorValue, 0, 1023, 0, 100);
  Blynk.virtualWrite(V5, sensorValue);
}
void setup() {
  pinMode(Relay,OUTPUT);
  pinMode(sensorPin,INPUT);
  pinMode(DHTPIN,INPUT);
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
  dht.begin();
  lcd.clear();
  lcd.print(4,0,"SMART");
  lcd.print(0,1,"Watering System");
  delay(2000);
  lcd.clear();
  lcd.print(0,0,"Please Wait");
  delay(1000);
  lcd.print(0,0,"Please Wait.");
  delay(1000);
  lcd.print(0,0,"Please Wait..");
  delay(1000);
  lcd.print(0,0,"Please Wait...");
  delay(1000);
  lcd.print(0,0,"Please Wait....");
  delay(1000);
  lcd.clear();
  timer.setInterval(1000L, sendTemp);
  timer.setInterval(1000L, sendSoilValue);
}

void loop() {
  Blynk.run();
  timer.run();
}

BLYNK_WRITE(V3) {
  sensorValue = analogRead(sensorPin);
  sensorValue = map(sensorValue, 0, 1023, 0, 100);
  if (param.asInt() == 1) {
    if (sensorValue >30 && sensorValue <85) {
      digitalWrite(Relay,HIGH);
      lcd.clear();
      lcd.print(0,0,"PUMP: ON");
      lcd.print(0,1,"STATS: Dry Soil");
      delay(500);
    }
    else if (sensorValue <30) {
      digitalWrite(Relay,LOW);
      lcd.clear();
      lcd.print(0,0,"PUMP: OFF");
      lcd.print(0,1,"STATS: Water");
      delay(500);
    }
    else if (sensorValue >85) {
      digitalWrite(Relay,LOW);
      lcd.clear();
      lcd.print(0,0,"PUMP: OFF");
      lcd.print(0,1,"STATS: Air");
      delay(500);
    }
    Blynk.virtualWrite(V4,LOW);
  }
  if (param.asInt() == 0) {
      digitalWrite(Relay,LOW);
      lcd.clear();
      lcd.print(0,0,"PUMP: OFF");
      lcd.print(0,1,"STATS: AutoOff");
      delay(500);
  }
}

ตอนนี้เหมือนเดิมครับ ยังใช้งานแบบ Auto ไม่ได้ครับ
ผมลองเอาส่วนใน v3 ไปลองใส่ใน void loop แล้ว แต่เวลาอัพลงจะไม่สามารถใช้สวิตช์ Manual ได้ครับ
ผมไม่ทราบว่าจะทำให้ BLYNK_WRITE V3 เป็น loop ได้ต้องทำยังไงครับ

จากโค้ตตอนนี้ติดอะไรครับ

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

ขอปิดประเด็นนี้สักหน่อย ไม่รู้ว่าได้ยังนะครับ

อันนี้คือปัญหาสินะ

ตอนนี้สามารถ Clone app ออกมาได้แล้วเดียวจะทดสอบดูว่า On V3(AUTOMATIC) แลัวจะทำงานได้ไหม

เนื่องจากผม ขี้เกียจต่อเซ็นเซอร์ให้ยุ่งยาก ผมจะใช้วิธี ป้อนอินพุตให้กับตัวแปรที่ผมสนใจนะครับ เพื่อความงานในการวิเคราะห์ปัญหา

ใส่ 35 ให้ auto V3 on

จะเห็นว่ามันเข้าไปทำงานแล้ว

พอปรับไปที่ 20 น่าแปลกที่ มันควรจะทำงานกลับไม่ทำงาน

แต่พอ on/off ใหม่ มันกลับมาทำงานถูกต้อง แบบนี้

ดังนั้นแสดงว่า โปรแกรมมันวิ่งเข้ามาทำงานที่ V3 แค่ครั้งเดียวจังหวะที่กดเท่านั้นครับ ดังนั้นวิธีแก้คือ ย้ายโพรเซสการทำงานไปไว้ที่ void loop

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

onAoffB_3

#define BLYNK_PRINT Serial

#define DHTPIN D2

#define DHTTYPE DHT11

#include <SPI.h>

#include <ESP8266WiFi.h>

#include <BlynkSimpleEsp8266.h>

#include <SimpleTimer.h>

#include <DHT.h>

int sensorPin = A0;

int sensorValue = 0;

int Relay = D3;

bool auto_on = false;

SimpleTimer timer;

DHT dht(DHTPIN, DHTTYPE);

WidgetLCD lcd(V6);

char auth[] = "auth";

char ssid[] = "ssid";

char pass[] = "passwords";

BLYNK_CONNECTED() {

  Blynk.syncAll();

  }

BLYNK_WRITE(V4) {

  if (param.asInt() == 1) {

    digitalWrite(Relay,HIGH);

    lcd.clear();

    lcd.print(0,0,"PUMP: ON");

    lcd.print(0,1,"STATS: Manual On");

    delay(500);

    Blynk.virtualWrite(V3,LOW);

  }

  if (param.asInt() == 0) {

    digitalWrite(Relay,LOW);

    lcd.clear();

    lcd.print(0,0,"PUMP: OFF");

    lcd.print(0,1,"STATS: ManualOff");

    delay(500);

  }

}

void sendTemp() {

  float h = dht.readHumidity();

  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {

    Serial.println("Failed to read from DHT sensor!");

    return;

  }

  Blynk.virtualWrite(V1, t);

  Blynk.virtualWrite(V2, h);

}

void sendSoilValue() {

  sensorValue = analogRead(sensorPin);

  sensorValue = map(sensorValue, 0, 1023, 0, 100);

  Blynk.virtualWrite(V5, sensorValue);

}

void setup() {

  pinMode(Relay,OUTPUT);

  pinMode(sensorPin,INPUT);

  pinMode(DHTPIN,INPUT);

  Serial.begin(9600);

  Blynk.begin(auth, ssid, pass);

  dht.begin();

  lcd.clear();

  lcd.print(4,0,"SMART");

  lcd.print(0,1,"Watering System");

  delay(2000);

  lcd.clear();

  lcd.print(0,0,"Please Wait");

  delay(1000);

  lcd.print(0,0,"Please Wait.");

  delay(1000);

  lcd.print(0,0,"Please Wait..");

  delay(1000);

  lcd.print(0,0,"Please Wait...");

  delay(1000);

  lcd.print(0,0,"Please Wait....");

  delay(1000);

  lcd.clear();

  timer.setInterval(1000L, sendTemp);

  timer.setInterval(1000L, sendSoilValue);

}

void loop() {

  Blynk.run();

  timer.run();

  if(auto_on == true){

  if (sensorValue >30 && sensorValue <85) {

      digitalWrite(Relay,HIGH);

      lcd.clear();

      lcd.print(0,0,"PUMP: ON");

      lcd.print(0,1,"STATS: Dry Soil");

      delay(500);

    }

    else if (sensorValue <30) {

      digitalWrite(Relay,LOW);

      lcd.clear();

      lcd.print(0,0,"PUMP: OFF");

      lcd.print(0,1,"STATS: Water");

      delay(500);

    }

    else if (sensorValue >85) {

      digitalWrite(Relay,LOW);

      lcd.clear();

      lcd.print(0,0,"PUMP: OFF");

      lcd.print(0,1,"STATS: Air");

      delay(500);

    }

}

}

BLYNK_WRITE(V3) {

  //sensorValue = analogRead(sensorPin);

  //sensorValue = map(sensorValue, 0, 1023, 0, 100);

  if (param.asInt() == 1) {

    auto_on = true;

    Blynk.virtualWrite(V4,LOW);

  }else{

    auto_on = false;

    digitalWrite(Relay,LOW);

    lcd.clear();

    lcd.print(0,0,"PUMP: OFF");

    lcd.print(0,1,"STATS: AutoOff");

    delay(500);

  }

}


เพิ่มหน้าปก