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

จะเปิด 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 มันทำงานแล้วนะครับ นี้คือส่วนที่น้องควรแก้ไขเข้าไป ทำความเข้าใจมันด้วยนะครับ

#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);

  }

}


เพิ่มหน้าปก

ผมลองรัน CODE อันนี้ดู แต่ไม่รู้ว่า รบกวน ด้วยครับ ว่า ผิดพลาดอะไรบ้าง

Arduino: 1.8.12 (Windows Store 1.8.33.0) (Windows 10), Board: "NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), 4MB (FS:2MB OTA:~1019KB), 2, v2 Lower Memory, Disabled, None, Only Sketch, 115200"

Multiple libraries were found for "SimpleTimer.h"
 Used: C:\Users\Windows 10\Documents\Arduino\libraries\SimpleTimer
 Not used: C:\Users\Windows 10\Documents\Arduino\libraries\SimpleTimer-master
Multiple libraries were found for "DHT.h"
 Used: C:\Users\Windows 10\Documents\Arduino\libraries\DHT-sensor-library-master
 Not used: C:\Users\Windows 10\Documents\Arduino\libraries\Grove_Temperature_And_Humidity_Sensor
 Not used: C:\Users\Windows 10\Documents\Arduino\libraries\DHT_sensor_library
In file included from C:\Users\Windows 10\Documents\Arduino\libraries\DHT-sensor-library-master\DHT_U.cpp:22:0:

C:\Users\Windows 10\Documents\Arduino\libraries\DHT-sensor-library-master\DHT_U.h:25:29: fatal error: Adafruit_Sensor.h: No such file or directory

 #include <Adafruit_Sensor.h>

                             ^

compilation terminated.

exit status 1
Error compiling for board NodeMCU 1.0 (ESP-12E Module).

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

ขอดูหน้าโปรแกรมหน่อยครับ

1 Like
#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);

  }

}

ตรงไหนเป็นโค้ต ทำไฮไลท์ไว้ด้วยครับ ดูไม่รู้เรื่องครับ

ตามไปลบโฟล์เดอร์ ที่ขีดไว้ ออกครับ ลง library ผิดที่มันซ้ำกัน