ผมสนใจทำมินิโปรเจคด้วย ESP32


(Jetsadakorn Najaikong) #1

ขออนุญาตินะครับ ผมสนใจตัวโปรเจ็คนี้จะลองทำ มินิโปรเจคดู ถ้าผม Copy โค๊ดมาวางธรรมดา เเค่เเก้ไขไม่กี่ส่วน รันออกมาต้อง Error ถ้าไม่อยากได้ Google Firebase กับ Line ต้องตัดส่วนไหนออกบ้างครับเเละวิธีเเก้ไขโค๊ดส่วนต่างๆ เเละการหาไลบรารี่ต่างๆของโปรเจคตัวนี้ครับ
เเหล่งที่มา


(Permpol Thanapunnamas) #2

เบื้องต้นตัวส่วนไหนออกไปบ้าง แล้วขึ้น error มาว่าอะไรครับ


(Jetsadakorn Najaikong) #3

นี้คือส่วนที่ผมลองตัดออกครับ

// *** (2) SYSTEM CONFIGURATION ***
//LINE TOKEN
#define TokenLine "Ynzzovc8dway85pRSJKNASdkTylkPnvBPs9MUpaBWRA"
//FIREBASE CONFIG
#define FIREBASE_HOST "smartfarmingxx.firebaseio.com"
#define FIREBASE_AUTH "u7j7XhFN57gnDpmIfUrE5asdfa344RVKm3bnNHAQc"

// *** TIMER CONFIG ***
#define checkConnectionTime = 10000
//ส่งข้อมูลเข้า firebase ทุกๆ 5 นาที
#define sendFirebaseTime = 300000

// *** (3) LIBRARY INCLUDE ***
//ไลบรารี่ Firebase สำหรับ ESP32
#include <IOXhop_FirebaseESP32.h>

// *** (10) FUNCTION SETUP() ***
//ตั้งเวลาส่งข้อมูลเข้า Google Firebase
timer.setInterval(sendFirebaseTime, sendFirebase);
/* -------------------------------------------------------------- */
//ทำการเชื่อมต่อ Google Firebase
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);

// *** (14) FUNCTION SENDFIREBASE() ***
void sendFirebase() {
//อัพเดทข้อมูลไปยัง BLYNK SERVER
GetDHT11(dhtdata);
//อัพเดทข้อมูลให้ Firebase ในรูปแบบ JSON
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["temperature"] = dhtdata[1];
root["humidity"] = dhtdata[0];
root["time"] = NowString();
root["ldr"] = LdrPercentValue();
root["soil"] = SoilPercentValue();
root["wifi"] = WifiPercentSignal();
// ส่งข้อมูลใหม่เป็นเก็บใน Firebase /SmartFarm
String name = Firebase.push("SmartFarm", root);
// ถ้ามี error
if(Firebase.failed()) {
//แสดงข้อความบนคอนโซล
Serial.print(NowString());
Serial.print(", Firebase pushing /SmartFarm failed:");
Serial.println(Firebase.error());
return;
}
//แสดงข้อความบนคอนโซล
Serial.print(NowString());
Serial.println(", Firebase connected.");
Serial.print(NowString());
Serial.print(", Firebase pushed: /SmartFarm/");
Serial.println(name);
}

(Jetsadakorn Najaikong) #4
ส่วนตรงนี้คือส่วนที่ผมลองทำดูครับ

// *** (2) SYSTEM CONFIGURATION ***
//WIFI CONFIG
char ssid[] = "PC-Faster-8093";
char pass[] = "00000000";
//BLYNK TOKEN
char auth[] = "e7f4cf21602844349219dc86b5679918";
char server[] = "blynk.honey.co.th";
unsigned int port = 9443;
/* ---------------------------------------------------------------*/
// *** WATERING CONFIG ***
//ค่าเปอร์เซ็นต์ความชื้นในดินที่ต้องการให้เร่ิมรดน้ำต้นไม้
#define PercentWatering = 40
//ตั้งระยะเวลาการรดน้ำต้นไม้แต่ละครั้ง
//15000 = 15 วินาที
#define TimeWatering = 15000
//ตั้งระยะห่างของเวลาที่ต้องการเช็คความชื้นในดิน
//60000 = 6 นาที
#define TimeSoilCheck = 360000
/* ---------------------------------------------------------------*/
// *** TIMER CONFIG ***
//ตั้งเวลาส่งข้อมูลให้ BLYNK SERVER ทุกๆ 2 นาที
//120 Secounds = 120000 Milliseconds
#define sendSensorTime = 120000
//ตั้งเวลาส่งข้อมูลให้ BLYNK SERVER ทุกๆ 3 นาที
//180 Secound = 180000 Milliseconds
#define sendSensor2Time = 180000
//ตั้งเวลาให้เช็คว่า Blynk เชื่อมต่ออยู่หรือไม่ทุกๆ 10 วินาที
#define checkConnectionTime = 10000

// *** (3) LIBRARY INCLUDE ***
//ไลบรารี่เกี่ยวกับ WIFI
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
//ไลบรารี่ของ BLYNK
#include <BlynkSimpleEsp32.h>
//ไลบรารี่ของเซ็นเซอร์ DHT11
#include <SimpleDHT.h>
//ไลบรารี่ Firebase สำหรับ ESP32

// *** (4) GPIO PIN SETUP ***
//กำหนดให้เซ็นเซอร์ DHT11 ใช้ขา GPIO ที่ 32
#define DHTPin 32
//กำหนดให้เซ็นเซอร์วัดความชื้นในดิน ใช้ขา GPIO ที่ 34
#define SoilSensorPin 34
//กำหนดให้เซ็นเซอร์วัดความเข้มของแสง ใช้ขา GPIO ที่ 35
#define LdrSensorPin 35
//กำหนดให้สวิตซ์ปุ่มกด ใช้ขา GPIO ที่ 25
#define SwitchPin 25
//กำหนดให้หลอดไฟ LED แสดงสถานะการส่งข้อมูล blynk server ใช้ขา GPIO ที่ 26
#define LEDSensorPin 26
//กำหนดให้ขาอ้างอิงการสั่งรดน้ำต้นไม้ ใช้ขา GPIO ที่ 27
#define WateringPin 27
//กำหนดให้หลอดไฟ LED บนบอร์ดแสดงสถานะ WIFI ใช้ขา GPIO ที่ 2
#define LEDWiFiPin 2
//กำหนดขาอ้างอิงการรดน้ำต้นไม้ ใช้ขา GPIO ที่ 14
#define LEDWateringPin 14 
//กำหนดหให้ขาควบคุม Relay ใช้ขา GPIO ที่ 5
#define RelayPin 5

// *** (5) BLYNK PARAMETER SETUP ***
//ตั้งค่าตัวแปรระบบของ BLYNK
#define BLYNK_TIMEOUT_MS  750
#define BLYNK_HEARTBEAT   17
#define BLYNK_PRINT Serial
//การกำหนดขา Vitual Pin ที่สร้างขึ้นให้กับ Widget ต่างๆ ใน Blynk Mobile APP
#define Widget_Humidity V1
#define Widget_Temperature V2
#define Widget_SoilRawValue V3
#define Widget_SoilLevel V4
#define Widget_LightRawValue V5
#define Widget_LightLevel V6
#define Widget_WateringButton V7
#define Widget_SendSensorStatus V8
#define Widget_WateringStatus V9
#define Widget_WifiSignal V10
#define Widget_WifiRawValue V11
#define Widget_Terminal V12
WidgetLED LEDSensor(Widget_SendSensorStatus);
WidgetLED LEDWatering(Widget_WateringStatus);
WidgetTerminal terminal(Widget_Terminal);

// *** (6) NTP SERVER SETUP ***
char ntp_server1[20] = "time.navy.mi.th";
char ntp_server2[20] = "clock.nectec.or.th";
char ntp_server3[20] = "th.pool.ntp.org";

// *** (7) GENAREL SETUP ***
//ระบุรุ่นเซ็นเซอร์วัดความชื้นสัมพัทธ์และอุณมหภูมิเป็นรุ่น DHT11
SimpleDHT11 dht11;
//เรียกใช้การตั้งเวลาของ Blynk
BlynkTimer timer;
//กำหนดตัวแปรเริ่มต้น
int WifiSignal;
bool isFirstConnect = true;
byte oldtemperature;
byte oldhumidity;
int CurrentSoilValue;
int MapReadSoilValue;
int CurrentWiFiSignal;
int MapReadLightValue;
int CurrentLightValue;
int dhtdata[2];

// *** (8) BLYNK CONNECTED FUNCTION ***
BLYNK_CONNECTED() {
//ให้หลอดไฟ LED บนบอร์ดสีน้ำเงินติดเพื่อเป็นการแสดงสถานะว่าการเชื่อมต่อเสร็จสมบูรณ์
digitalWrite(LEDBUILIN, HIGH);
//ถ้าเป็นการเชื่อมต่อ Blynk Server ครั้งแรกหลังบอร์ดรีบูต
 if(isFirstConnect) {
   //ให้ซิงค์ข้อมูลทั้งหมดล่าสุดจาก Blynk Server
   Blynk.syncAll();
   //ให้ซิงค์สถานะของขา Virtual V7
   Blynk.syncVirtual(Widget_WateringButton);
   isFirstConnect = false;
 }
}

// *** (9) BLYNK BUTTON FUNCTION ***
BLYNK_WRITE(Widget_WateringButton) {
 //ค่าที่ได้จาก Widget_WateringButton (V7) จะเป็น 0 และ 1 ถ้ามีการปดปุ่ม
 if (param.asInt() == 1) {
   //ป้องกันไม่ให้กดซ้ำ
   if (digitalRead(WateringPin) != LOW) {
      //เรียกใช้ฟังก์ชันรดน้ำ
      digitalWrite(WateringPin, LOW);
   } //if
 } //if
}

// *** (10) FUNCTION SETUP() ***
void setup() {
//เรียกใช้งาน Serial Monitor
Serial.begin(115200);
/* -------------------------------------------------------------- */
//กำหนดโหมดใช้งานให้กำขา GPIO
pinMode(LEDWiFiPin, OUTPUT);
pinMode(LEDSensorPin, OUTPUT);
pinMode(LEDWateringPin, OUTPUT);
pinMode(WateringPin, OUTPUT);
pinMode(RelayPin, OUTPUT);
pinMode(SwitchPin, INPUT_PULLUP);
/* -------------------------------------------------------------- */
//ตั้งสถานะเริ่มต้นให้กับขา GPIO เพื่อป้องกันการทำงานเองตอนที่บอร์ด ESP32 รีบูต
digitalWrite(LEDWiFiPin, LOW);
digitalWrite(LEDSensorPin, LOW);
digitalWrite(LEDWateringPin, LOW);
digitalWrite(LEDWateringPin, HIGH);
digitalWrite(RelayPin, HIGH);
/* -------------------------------------------------------------- */
// สร้างมัลติทาสก์ขึ้นมาใช้งานอย่างอิสระจำนวน 5 ทาสก์
//TASK1: ลูปเช็คค่าความชื้นดิน ถ้าต่ำกว่าที่กำหนดให้เร่ิมการรดน้ำต้นไม้
xTaskCreate(&Task1, "Task1",  2000, NULL, 9, NULL);
//TASK2: ลูปอ่านค่าการกดปุ่มสวิตซ์ ถ้ามีการกดปุ่มสวิตซ์ให้เริ่มการรดน้ำต้นไม้
xTaskCreate(&Task2, "Task2", 1000, NULL, 9, NULL);
//TASK3: ลูปให้หลอดไฟ LED กระพริบ ถ้ามีการรดน้ำต้นไม้
xTaskCreate(&Task3, "Task3", 3000, NULL, 8, NULL);
//TASK4: ลูปเช็คการเชื่อมต่อ WiFi และให้เชื่อมต่อใหม่เองแบบอัตโนมัติ
xTaskCreate(&Task4, "Task4", 3000, NULL, 10, NULL);
//TASK5: รดน้ำต้นไม้ตามเวลาที่กำหนด
xTaskCreate(&Task5, "Task5", 3000, NULL, 9, NULL);
/* -------------------------------------------------------------- */
//ทำการเชื่อมต่อ WiFi
Blynk.connectWiFi(ssid, pass);
/* -------------------------------------------------------------- */
//ตั้งเวลาส่งข้อมูลให้ BLYNK SERVER
timer.setInterval(sendSensorTime, sendSensor);
//ตั้งเวลาส่งข้อมูลให้ BLYNK SERVER
timer.setInterval(sendSensor2Time, sendSensor2);
//ตั้งเวลาให้เช็คว่า Blynk เชื่อมต่ออยู่หรือไม่
timer.setInterval(checkConnectionTime, CheckConnection);
//ตั้งเวลาส่งข้อมูลเข้า Google Firebase
timer.setInterval(sendFirebaseTime, sendFirebase);
/* -------------------------------------------------------------- */
//ทำการเชื่อมต่อ Google Firebase
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
/* -------------------------------------------------------------- */
//แสดงข้อความใน Serial Monitor
Serial.println();
Serial.println("Welcom to smartfram IoT");
Serial.print("WiFi Connected: ");
Serial.println(WiFi.localIP());
Serial.print("WiFi signal RSSI: ");
Serial.print(WiFi.RSSI());
Serial.println("dBm");
/* -------------------------------------------------------------- */
//ดึงเวลาจากอินเตอร์เน็ตจาก NTP Time Server
configTime(7 * 3600, 0, ntp_server1, ntp_server2, ntp_server3);
//แสดงข้อความใน Serial Monitor
Serial.println("Waiting for time.");
while (!time(nullptr)) {
Serial.print(".");
vTaskDelay(100 / portTICK_PERIOD_MS);
}
//แสดงข้อความใน Serial Monitor
Serial.println();
Serial.println("Current time: " + NowString());
/* -------------------------------------------------------------- */
//ทำการเชื่อมต่อ BLYNK SERVER
Blynk.config(auth, server, port);
Blynk.connect();
/* -------------------------------------------------------------- */
}

// *** (11) FUNCTION LOOP() ***
void loop() {
Blynk.run();
timer.run();
}

// *** (12) FUNCTION SENDSENSOR() ***
void sendSensor() {
//ให้หลอดไฟ LED ติด
digitalWrite(LEDWiFiPin, HIGH);
//ให้หลอดไฟ LED บน BLYNK MOBILE APP ติด
LEDSensor.on();
//แสดงข้อความใน Serial Monitor
Serial.print(NowString());
Serial.println(", Send data to blynk server");
/* -------------------------------------------------------------- */

//อ่านข้อมูลเซ็นเซอร์ DHT11
GetDHT11(dhtdata);
Blynk.virtualWrite(Widget_Humidity, dhtdata[0]);
Blynk.virtualWrite(Widget_Temperature, dhtdata[1]);
Blynk.virtualWrite(Widget_SoilRawValue, analogRead(SoilSensorPin));
Blynk.virtualWrite(Widget_SoilLevel, SoilPercentValue());
/* -------------------------------------------------------------- */
//แสดงข้อความใน Serial Monitor
Serial.print(NowString());
Serial.println(", Send DHT11 / Soil sensors to blynk server.");
/* -------------------------------------------------------------- */
//ให้หลอด LED ที่แสดงสถานะดับ
digitalWrite(LEDWiFiPin, LOW);
//ให้หลอดไฟ LED บน BLYNK MOBILE APP ดับ
LEDSensor.off(); 
}

// *** (13) FUNCTION SENDSENSOR2() ***
void sendSensor2() {
//ให้หลอดไฟ LED ติด
digitalWrite(LEDWiFiPin, HIGH);
//ให้หลอดไฟ LED บน BLYNK MOBILE APP ติด
LEDSensor.on();
//แสดงข้อความใน Serial Monitor
Serial.print(NowString());
Serial.println(", Send data to blynk server");
/* -------------------------------------------------------------- */
//แสดงข้อความใน Serial Monitor
Serial.print(NowString());
Serial.print(", Wifi Signal: ");
Serial.print(WifiPercentSignal());
Serial.println("%");
/* -------------------------------------------------------------- */
//อัพเดทข้อมูลไปยัง Blynk server
Blynk.virtualWrite(Widget_LightRawValue, analogRead(LdrSensorPin));
Blynk.virtualWrite(Widget_LightLevel, LdrPercentValue());
Blynk.virtualWrite(Widget_WifiSignal, WifiPercentSignal());
Blynk.virtualWrite(Widget_WifiRawValue, WiFi.RSSI());
/* -------------------------------------------------------------- */
//แสดงข้อความใน Serial Monitor
Serial.print(NowString());
Serial.println(", Send LDR sensors / WIFI to blynk server.");
/* -------------------------------------------------------------- */
//ให้หลอด LED ที่แสดงสถานะดับ
digitalWrite(LEDWiFiPin, LOW);
//ให้หลอด LED บน app Blynk ดับ
LEDSensor.off();
}

(Jetsadakorn Najaikong) #5

รันออกมาเป็นแบบนี้ครับ


(Jetsadakorn Najaikong) #6
ส่วงนนี้คือโค๊ดที่ Copy มาครับ

// *** (2) SYSTEM CONFIGURATION ***
//WIFI CONFIG
char ssid[] = "myWiFi_SSID";
char pass[] = "wifipassword";
//BLYNK TOKEN
char auth[] = "589a20ebd2b043f5b3e57e4378ahadg6";
char server[] = "xxx.xxx.xxx.xxx";
unsigned int port = 8442;
//LINE TOKEN
#define TokenLine "Ynzzovc8dway85pRSJKNASdkTylkPnvBPs9MUpaBWRA"
//FIREBASE CONFIG
#define FIREBASE_HOST "smartfarmingxx.firebaseio.com"
#define FIREBASE_AUTH "u7j7XhFN57gnDpmIfUrE5asdfa344RVKm3bnNHAQc"
/* ---------------------------------------------------------------*/
// *** WATERING CONFIG ***
//ค่าเปอร์เซ็นต์ความชื้นในดินที่ต้องการให้เร่ิมรดน้ำต้นไม้
#define PercentWatering = 40
//ตั้งระยะเวลาการรดน้ำต้นไม้แต่ละครั้ง
//15000 = 15 วินาที
#define TimeWatering = 15000
//ตั้งระยะห่างของเวลาที่ต้องการเช็คความชื้นในดิน
//60000 = 6 นาที
#define TimeSoilCheck = 360000
/* ---------------------------------------------------------------*/
// *** TIMER CONFIG ***
//ตั้งเวลาส่งข้อมูลให้ BLYNK SERVER ทุกๆ 2 นาที
//120 Secounds = 120000 Milliseconds
#define sendSensorTime = 120000
//ตั้งเวลาส่งข้อมูลให้ BLYNK SERVER ทุกๆ 3 นาที
//180 Secound = 180000 Milliseconds
#define sendSensor2Time = 180000
//ตั้งเวลาให้เช็คว่า Blynk เชื่อมต่ออยู่หรือไม่ทุกๆ 10 วินาที
#define checkConnectionTime = 10000
//ส่งข้อมูลเข้า firebase ทุกๆ 5 นาที
#define sendFirebaseTime = 300000

// *** (3) LIBRARY INCLUDE ***
//ไลบรารี่เกี่ยวกับ WIFI
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
//ไลบรารี่ของ BLYNK
#include <BlynkSimpleEsp32.h>
//ไลบรารี่ของเซ็นเซอร์ DHT11
#include <SimpleDHT.h>
//ไลบรารี่ Firebase สำหรับ ESP32
#include <IOXhop_FirebaseESP32.h>
//ไลบรารี่สำหรับดึงเวลาจากอินเตอร์เน็ต NTP
#include <time.h>

// *** (4) GPIO PIN SETUP ***
//กำหนดให้เซ็นเซอร์ DHT11 ใช้ขา GPIO ที่ 32
#define DHTPin 32
//กำหนดให้เซ็นเซอร์วัดความชื้นในดิน ใช้ขา GPIO ที่ 34
#define SoilSensorPin 34
//กำหนดให้เซ็นเซอร์วัดความเข้มของแสง ใช้ขา GPIO ที่ 35
#define LdrSensorPin 35
//กำหนดให้สวิตซ์ปุ่มกด ใช้ขา GPIO ที่ 25
#define SwitchPin 25
//กำหนดให้หลอดไฟ LED แสดงสถานะการส่งข้อมูล blynk server ใช้ขา GPIO ที่ 26
#define LEDSensorPin 26
//กำหนดให้ขาอ้างอิงการสั่งรดน้ำต้นไม้ ใช้ขา GPIO ที่ 27
#define WateringPin 27
//กำหนดให้หลอดไฟ LED บนบอร์ดแสดงสถานะ WIFI ใช้ขา GPIO ที่ 2
#define LEDWiFiPin 2
//กำหนดขาอ้างอิงการรดน้ำต้นไม้ ใช้ขา GPIO ที่ 14
#define LEDWateringPin 14 
//กำหนดหให้ขาควบคุม Relay ใช้ขา GPIO ที่ 5
#define RelayPin 5

// *** (5) BLYNK PARAMETER SETUP ***
//ตั้งค่าตัวแปรระบบของ BLYNK
#define BLYNK_TIMEOUT_MS  750
#define BLYNK_HEARTBEAT   17
#define BLYNK_PRINT Serial
//การกำหนดขา Vitual Pin ที่สร้างขึ้นให้กับ Widget ต่างๆ ใน Blynk Mobile APP
#define Widget_Humidity V1
#define Widget_Temperature V2
#define Widget_SoilRawValue V3
#define Widget_SoilLevel V4
#define Widget_LightRawValue V5
#define Widget_LightLevel V6
#define Widget_WateringButton V7
#define Widget_SendSensorStatus V8
#define Widget_WateringStatus V9
#define Widget_WifiSignal V10
#define Widget_WifiRawValue V11
#define Widget_Terminal V12
WidgetLED LEDSensor(Widget_SendSensorStatus);
WidgetLED LEDWatering(Widget_WateringStatus);
WidgetTerminal terminal(Widget_Terminal);

// *** (6) NTP SERVER SETUP ***
char ntp_server1[20] = "time.navy.mi.th";
char ntp_server2[20] = "clock.nectec.or.th";
char ntp_server3[20] = "th.pool.ntp.org";

// *** (7) GENAREL SETUP ***
//ระบุรุ่นเซ็นเซอร์วัดความชื้นสัมพัทธ์และอุณมหภูมิเป็นรุ่น DHT11
SimpleDHT11 dht11;
//เรียกใช้การตั้งเวลาของ Blynk
BlynkTimer timer;
//กำหนดตัวแปรเริ่มต้น
int WifiSignal;
bool isFirstConnect = true;
byte oldtemperature;
byte oldhumidity;
int CurrentSoilValue;
int MapReadSoilValue;
int CurrentWiFiSignal;
int MapReadLightValue;
int CurrentLightValue;
int dhtdata[2];

// *** (8) BLYNK CONNECTED FUNCTION ***
BLYNK_CONNECTED() {
//ให้หลอดไฟ LED บนบอร์ดสีน้ำเงินติดเพื่อเป็นการแสดงสถานะว่าการเชื่อมต่อเสร็จสมบูรณ์
digitalWrite(LEDBUILIN, HIGH);
//ถ้าเป็นการเชื่อมต่อ Blynk Server ครั้งแรกหลังบอร์ดรีบูต
 if(isFirstConnect) {
   //ให้ซิงค์ข้อมูลทั้งหมดล่าสุดจาก Blynk Server
   Blynk.syncAll();
   //ให้ซิงค์สถานะของขา Virtual V7
   Blynk.syncVirtual(Widget_WateringButton);
   isFirstConnect = false;
 }
}

// *** (9) BLYNK BUTTON FUNCTION ***
BLYNK_WRITE(Widget_WateringButton) {
 //ค่าที่ได้จาก Widget_WateringButton (V7) จะเป็น 0 และ 1 ถ้ามีการปดปุ่ม
 if (param.asInt() == 1) {
   //ป้องกันไม่ให้กดซ้ำ
   if (digitalRead(WateringPin) != LOW) {
      //เรียกใช้ฟังก์ชันรดน้ำ
      digitalWrite(WateringPin, LOW);
   } //if
 } //if
}

// *** (10) FUNCTION SETUP() ***
void setup() {
//เรียกใช้งาน Serial Monitor
Serial.begin(115200);
/* -------------------------------------------------------------- */
//กำหนดโหมดใช้งานให้กำขา GPIO
pinMode(LEDWiFiPin, OUTPUT);
pinMode(LEDSensorPin, OUTPUT);
pinMode(LEDWateringPin, OUTPUT);
pinMode(WateringPin, OUTPUT);
pinMode(RelayPin, OUTPUT);
pinMode(SwitchPin, INPUT_PULLUP);
/* -------------------------------------------------------------- */
//ตั้งสถานะเริ่มต้นให้กับขา GPIO เพื่อป้องกันการทำงานเองตอนที่บอร์ด ESP32 รีบูต
digitalWrite(LEDWiFiPin, LOW);
digitalWrite(LEDSensorPin, LOW);
digitalWrite(LEDWateringPin, LOW);
digitalWrite(LEDWateringPin, HIGH);
digitalWrite(RelayPin, HIGH);
/* -------------------------------------------------------------- */
// สร้างมัลติทาสก์ขึ้นมาใช้งานอย่างอิสระจำนวน 5 ทาสก์
//TASK1: ลูปเช็คค่าความชื้นดิน ถ้าต่ำกว่าที่กำหนดให้เร่ิมการรดน้ำต้นไม้
xTaskCreate(&Task1, "Task1",  2000, NULL, 9, NULL);
//TASK2: ลูปอ่านค่าการกดปุ่มสวิตซ์ ถ้ามีการกดปุ่มสวิตซ์ให้เริ่มการรดน้ำต้นไม้
xTaskCreate(&Task2, "Task2", 1000, NULL, 9, NULL);
//TASK3: ลูปให้หลอดไฟ LED กระพริบ ถ้ามีการรดน้ำต้นไม้
xTaskCreate(&Task3, "Task3", 3000, NULL, 8, NULL);
//TASK4: ลูปเช็คการเชื่อมต่อ WiFi และให้เชื่อมต่อใหม่เองแบบอัตโนมัติ
xTaskCreate(&Task4, "Task4", 3000, NULL, 10, NULL);
//TASK5: รดน้ำต้นไม้ตามเวลาที่กำหนด
xTaskCreate(&Task5, "Task5", 3000, NULL, 9, NULL);
/* -------------------------------------------------------------- */
//ทำการเชื่อมต่อ WiFi
Blynk.connectWiFi(ssid, pass);
/* -------------------------------------------------------------- */
//ตั้งเวลาส่งข้อมูลให้ BLYNK SERVER
timer.setInterval(sendSensorTime, sendSensor);
//ตั้งเวลาส่งข้อมูลให้ BLYNK SERVER
timer.setInterval(sendSensor2Time, sendSensor2);
//ตั้งเวลาให้เช็คว่า Blynk เชื่อมต่ออยู่หรือไม่
timer.setInterval(checkConnectionTime, CheckConnection);
//ตั้งเวลาส่งข้อมูลเข้า Google Firebase
timer.setInterval(sendFirebaseTime, sendFirebase);
/* -------------------------------------------------------------- */
//ทำการเชื่อมต่อ Google Firebase
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
/* -------------------------------------------------------------- */
//แสดงข้อความใน Serial Monitor
Serial.println();
Serial.println("Welcom to smartfram IoT");
Serial.print("WiFi Connected: ");
Serial.println(WiFi.localIP());
Serial.print("WiFi signal RSSI: ");
Serial.print(WiFi.RSSI());
Serial.println("dBm");
/* -------------------------------------------------------------- */
//ดึงเวลาจากอินเตอร์เน็ตจาก NTP Time Server
configTime(7 * 3600, 0, ntp_server1, ntp_server2, ntp_server3);
//แสดงข้อความใน Serial Monitor
Serial.println("Waiting for time.");
while (!time(nullptr)) {
Serial.print(".");
vTaskDelay(100 / portTICK_PERIOD_MS);
}
//แสดงข้อความใน Serial Monitor
Serial.println();
Serial.println("Current time: " + NowString());
/* -------------------------------------------------------------- */
//ทำการเชื่อมต่อ BLYNK SERVER
Blynk.config(auth, server, port);
Blynk.connect();
/* -------------------------------------------------------------- */
}

// *** (11) FUNCTION LOOP() ***
void loop() {
Blynk.run();
timer.run();
}

// *** (12) FUNCTION SENDSENSOR() ***
void sendSensor() {
//ให้หลอดไฟ LED ติด
digitalWrite(LEDWiFiPin, HIGH);
//ให้หลอดไฟ LED บน BLYNK MOBILE APP ติด
LEDSensor.on();
//แสดงข้อความใน Serial Monitor
Serial.print(NowString());
Serial.println(", Send data to blynk server");
/* -------------------------------------------------------------- */

//อ่านข้อมูลเซ็นเซอร์ DHT11
GetDHT11(dhtdata);
Blynk.virtualWrite(Widget_Humidity, dhtdata[0]);
Blynk.virtualWrite(Widget_Temperature, dhtdata[1]);
Blynk.virtualWrite(Widget_SoilRawValue, analogRead(SoilSensorPin));
Blynk.virtualWrite(Widget_SoilLevel, SoilPercentValue());
/* -------------------------------------------------------------- */
//แสดงข้อความใน Serial Monitor
Serial.print(NowString());
Serial.println(", Send DHT11 / Soil sensors to blynk server.");
/* -------------------------------------------------------------- */
//ให้หลอด LED ที่แสดงสถานะดับ
digitalWrite(LEDWiFiPin, LOW);
//ให้หลอดไฟ LED บน BLYNK MOBILE APP ดับ
LEDSensor.off(); 
}

// *** (13) FUNCTION SENDSENSOR2() ***
void sendSensor2() {
//ให้หลอดไฟ LED ติด
digitalWrite(LEDWiFiPin, HIGH);
//ให้หลอดไฟ LED บน BLYNK MOBILE APP ติด
LEDSensor.on();
//แสดงข้อความใน Serial Monitor
Serial.print(NowString());
Serial.println(", Send data to blynk server");
/* -------------------------------------------------------------- */
//แสดงข้อความใน Serial Monitor
Serial.print(NowString());
Serial.print(", Wifi Signal: ");
Serial.print(WifiPercentSignal());
Serial.println("%");
/* -------------------------------------------------------------- */
//อัพเดทข้อมูลไปยัง Blynk server
Blynk.virtualWrite(Widget_LightRawValue, analogRead(LdrSensorPin));
Blynk.virtualWrite(Widget_LightLevel, LdrPercentValue());
Blynk.virtualWrite(Widget_WifiSignal, WifiPercentSignal());
Blynk.virtualWrite(Widget_WifiRawValue, WiFi.RSSI());
/* -------------------------------------------------------------- */
//แสดงข้อความใน Serial Monitor
Serial.print(NowString());
Serial.println(", Send LDR sensors / WIFI to blynk server.");
/* -------------------------------------------------------------- */
//ให้หลอด LED ที่แสดงสถานะดับ
digitalWrite(LEDWiFiPin, LOW);
//ให้หลอด LED บน app Blynk ดับ
LEDSensor.off();
}

(Permpol Thanapunnamas) #7

เวลาเอาโค้ตมาวางทำให้เป็นฟอร์มด้วยนะครับ จะได้ดูง่ายขึ้น


(Jetsadakorn Najaikong) #8

ครับผม :joy:


(Permpol Thanapunnamas) #9

ในนี้มีฟังก์ชันที่ซ้ำกันอยู่อะครับ หาให้เจอแล้วตัดออก


(Jetsadakorn Najaikong) #10

ผมดูไม่เป็นครับ น่าจะเป็นส่วนนี้หรือเปล่าครับ


(Permpol Thanapunnamas) #11

ถ้าจะเล่นพวกนี้ต้องหัดครับ ที่วงคือ ตัวอย่าง 1 ใน ฟังก์ชัน ในหลายๆ ฟังก์ชัน ข้อสังเกตุง่าย มันมักจะมีคำว่า void ขึ้นหน้า ตามด้วยชื่อของ ฟังก์ชัน จะเป็นตัวสีฟ้าในโปรแกรมครับ ตอนนี้มันมีชื่อที่ซ้ำกันอยู่ เทียบแล้วหาให้เจอครับ


(Jetsadakorn Najaikong) #12

ตามความเข้าใจครับ ส่วน **// *** (14) FUNCTION SENDFIREBASE() ***** ผมตัดออกครับ


(Permpol Thanapunnamas) #13

ก็เกือบถูกแล้วครับ แต่จะเห็นได้ว่าชื่อ ฟังก์ชัน 4 ตัวนี้ไม่เหมือนกันเลยเห็นไหมครับ แสดงว่ามันไม่ซ้ำกันครับ หาอีกมีอีกครับไล่ดูอีกทีว่ามีอีกไหม

อีกเรื่องคือ ฟังก์ชัน จะมีคำว่า void ตามด้วยชื่อ ต่อท้ายด้วยปีกกาเสมอแบบนี้

void name() {

// คำสั่งต่างๆ

}

(Jetsadakorn Najaikong) #14

ผมเติม } ใส่ท้ายของ void sendSensor() { ครับไม่รู้ถูกไหมนอกนั้นดูไม่ออกครับ

Untitled


(Permpol Thanapunnamas) #15

ใช่ครับ นั้นคือ 1 จุดที่ผิดเวลาตัดโค้ตออกเรามักจะพลาดตัด { } ออกไปด้วย ต้องเช็คเป็นอันดับแรก

ต่อมาถ้าดูไม่ออกอีกก็ง่ายๆ ครับ เช็ค ชื่อฟังก์ชันทั้งหมดในโค้ตชุดนี้มาให้ผมดูหน่อย ย้ำนะครับว่า ทั้งหมด มีกี่ฟังก์ชัน ??


(Jetsadakorn Najaikong) #16

ผมนับได้ 55 ฟังก์ชั่นครับไม่รู้นับถูกไหม ผมนับตามหัวข้อครับ ผมไม่นับหัวข้อที่เป็น ไลบรารี่ กำหนดขา เเละตัวเเปรครับ

// *** (2) SYSTEM CONFIGURATION ***

//WIFI CONFIG
char ssid[] = "PC-Faster-8093";
char pass[] = "00000000";

//BLYNK TOKEN
char auth[] = "e7f4cf21602844349219dc86b5679918";
char server[] = "blynk.honey.co.th";
unsigned int port = 9443;

/* ---------------------------------------------------------------*/

// *** WATERING CONFIG ***

//ค่าเปอร์เซ็นต์ความชื้นในดินที่ต้องการให้เริ่มรดน้ำต้นไม้
#define PercentWatering = 40

//ตั้งระยะเวลาการรดน้ำต้นไม้แต่ละครั้ง
//15000 = 15 วินาที
#define TimeWatering = 15000

//ตั้งระยะห่างของเวลาที่ต้องการเช็คความชื้นในดิน
//60000 = 6 นาที
#define TimeSoilCheck = 360000

/* ---------------------------------------------------------------*/

// *** TIMER CONFIG ***

//ตั้งเวลาส่งข้อมูลให้ BLYNK SERVER ทุกๆ 2 นาที
//120 Secounds = 120000 Milliseconds
#define sendSensorTime = 120000

//ตั้งเวลาส่งข้อมูลให้ BLYNK SERVER ทุกๆ 3 นาที
//180 Secound = 180000 Milliseconds
#define sendSensor2Time = 180000

//ตั้งเวลาให้เช็คว่า Blynk เชื่อมต่ออยู่หรือไม่ทุกๆ 10 วินาที
#define checkConnectionTime = 10000

// *** (3) LIBRARY INCLUDE ***

//ไลบรารี่เกี่ยวกับ WIFI
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>

//ไลบรารี่ของ BLYNK
#include <BlynkSimpleEsp32.h>

//ไลบรารี่ของเซ็นเซอร์ DHT11
#include <SimpleDHT.h>

//ไลบรารี่สำหรับดึงเวลาจากอินเตอร์เน็ต NTP
#include <time.h>

// *** (4) GPIO PIN SETUP ***

//กำหนดให้เซ็นเซอร์ DHT11 ใช้ขา GPIO ที่ 32
#define DHTPin 32

//กำหนดให้เซ็นเซอร์วัดความชื้นในดิน ใช้ขา GPIO ที่ 34
#define SoilSensorPin 34

//กำหนดให้เซ็นเซอร์วัดความเข้มของแสง ใช้ขา GPIO ที่ 35
#define LdrSensorPin 35

//กำหนดให้สวิตซ์ปุ่มกด ใช้ขา GPIO ที่ 25
#define SwitchPin 25

//กำหนดให้หลอดไฟ LED แสดงสถานะการส่งข้อมูล blynk server ใช้ขา GPIO ที่ 26
#define LEDSensorPin 26

//กำหนดให้ขาอ้างอิงการสั่งรดน้ำต้นไม้ ใช้ขา GPIO ที่ 27
#define WateringPin 27

//กำหนดให้หลอดไฟ LED บนบอร์ดแสดงสถานะ WIFI ใช้ขา GPIO ที่ 2
#define LEDWiFiPin 2

//กำหนดขาอ้างอิงการรดน้ำต้นไม้ ใช้ขา GPIO ที่ 14
#define LEDWateringPin 14 

//กำหนดหให้ขาควบคุม Relay ใช้ขา GPIO ที่ 5
#define RelayPin 5

// *** (5) BLYNK PARAMETER SETUP ***

//ตั้งค่าตัวแปรระบบของ BLYNK
#define BLYNK_TIMEOUT_MS  750
#define BLYNK_HEARTBEAT   17
#define BLYNK_PRINT Serial

//การกำหนดขา Vitual Pin ที่สร้างขึ้นให้กับ Widget ต่างๆ ใน Blynk Mobile APP
#define Widget_Humidity V1
#define Widget_Temperature V2
#define Widget_SoilRawValue V3
#define Widget_SoilLevel V4
#define Widget_LightRawValue V5
#define Widget_LightLevel V6
#define Widget_WateringButton V7
#define Widget_SendSensorStatus V8
#define Widget_WateringStatus V9
#define Widget_WifiSignal V10
#define Widget_WifiRawValue V11
#define Widget_Terminal V12

WidgetLED LEDSensor(Widget_SendSensorStatus);
WidgetLED LEDWatering(Widget_WateringStatus);
WidgetTerminal terminal(Widget_Terminal);

// *** (6) NTP SERVER SETUP ***

char ntp_server1[20] = "time.navy.mi.th";
char ntp_server2[20] = "clock.nectec.or.th";
char ntp_server3[20] = "th.pool.ntp.org";

// *** (7) GENAREL SETUP ***

//ระบุรุ่นเซ็นเซอร์วัดความชื้นสัมพัทธ์และอุณมหภูมิเป็นรุ่น DHT11
SimpleDHT11 dht11;

//เรียกใช้การตั้งเวลาของ Blynk
BlynkTimer timer;

//กำหนดตัวแปรเริ่มต้น
int WifiSignal;
bool isFirstConnect = true;
byte oldtemperature;
byte oldhumidity;
int CurrentSoilValue;
int MapReadSoilValue;
int CurrentWiFiSignal;
int MapReadLightValue;
int CurrentLightValue;
int dhtdata[2];

// *** (8) BLYNK CONNECTED FUNCTION ***

BLYNK_CONNECTED() {
  
//ให้หลอดไฟ LED บนบอร์ดสีน้ำเงินติดเพื่อเป็นการแสดงสถานะว่าการเชื่อมต่อเสร็จสมบูรณ์
digitalWrite(LEDBUILIN, HIGH);

//ถ้าเป็นการเชื่อมต่อ Blynk Server ครั้งแรกหลังบอร์ดรีบูต
 if(isFirstConnect) {
  
   //ให้ซิงค์ข้อมูลทั้งหมดล่าสุดจาก Blynk Server
   Blynk.syncAll();
   
   //ให้ซิงค์สถานะของขา Virtual V7
   Blynk.syncVirtual(Widget_WateringButton);
   
   isFirstConnect = false;
   
 }
}

// *** (9) BLYNK BUTTON FUNCTION ***

BLYNK_WRITE(Widget_WateringButton) {
  
 //ค่าที่ได้จาก Widget_WateringButton (V7) จะเป็น 0 และ 1 ถ้ามีการปดปุ่ม
 if (param.asInt() == 1) {
  
   //ป้องกันไม่ให้กดซ้ำ
   if (digitalRead(WateringPin) != LOW) {
    
      //เรียกใช้ฟังก์ชันรดน้ำ
      digitalWrite(WateringPin, LOW);

   } //if
 } //if
}

// *** (10) FUNCTION SETUP() ***

void setup() {
  
//เรียกใช้งาน Serial Monitor
Serial.begin(115200);

/* -------------------------------------------------------------- */

//กำหนดโหมดใช้งานให้กำขา GPIO
pinMode(LEDWiFiPin, OUTPUT);
pinMode(LEDSensorPin, OUTPUT);
pinMode(LEDWateringPin, OUTPUT);
pinMode(WateringPin, OUTPUT);
pinMode(RelayPin, OUTPUT);
pinMode(SwitchPin, INPUT_PULLUP);

/* -------------------------------------------------------------- */

//ตั้งสถานะเริ่มต้นให้กับขา GPIO เพื่อป้องกันการทำงานเองตอนที่บอร์ด ESP32 รีบูต
digitalWrite(LEDWiFiPin, LOW);
digitalWrite(LEDSensorPin, LOW);
digitalWrite(LEDWateringPin, LOW);
digitalWrite(LEDWateringPin, HIGH);
digitalWrite(RelayPin, HIGH);

/* -------------------------------------------------------------- */

// สร้างมัลติทาสก์ขึ้นมาใช้งานอย่างอิสระจำนวน 5 ทาสก์
//TASK1: ลูปเช็คค่าความชื้นดิน ถ้าต่ำกว่าที่กำหนดให้เร่ิมการรดน้ำต้นไม้
xTaskCreate(&Task1, "Task1",  2000, NULL, 9, NULL);

//TASK2: ลูปอ่านค่าการกดปุ่มสวิตซ์ ถ้ามีการกดปุ่มสวิตซ์ให้เริ่มการรดน้ำต้นไม้
xTaskCreate(&Task2, "Task2", 1000, NULL, 9, NULL);

//TASK3: ลูปให้หลอดไฟ LED กระพริบ ถ้ามีการรดน้ำต้นไม้
xTaskCreate(&Task3, "Task3", 3000, NULL, 8, NULL);

//TASK4: ลูปเช็คการเชื่อมต่อ WiFi และให้เชื่อมต่อใหม่เองแบบอัตโนมัติ
xTaskCreate(&Task4, "Task4", 3000, NULL, 10, NULL);

//TASK5: รดน้ำต้นไม้ตามเวลาที่กำหนด
xTaskCreate(&Task5, "Task5", 3000, NULL, 9, NULL);

/* -------------------------------------------------------------- */

//ทำการเชื่อมต่อ WiFi

Blynk.connectWiFi(ssid, pass);

/* -------------------------------------------------------------- */

//ตั้งเวลาส่งข้อมูลให้ BLYNK SERVER
timer.setInterval(sendSensorTime, sendSensor);

//ตั้งเวลาส่งข้อมูลให้ BLYNK SERVER
timer.setInterval(sendSensor2Time, sendSensor2);

//ตั้งเวลาให้เช็คว่า Blynk เชื่อมต่ออยู่หรือไม่
timer.setInterval(checkConnectionTime, CheckConnection);

/* -------------------------------------------------------------- */

//แสดงข้อความใน Serial Monitor
Serial.println();
Serial.println("Welcom to smartfram IoT");
Serial.print("WiFi Connected: ");
Serial.println(WiFi.localIP());
Serial.print("WiFi signal RSSI: ");
Serial.print(WiFi.RSSI());
Serial.println("dBm");

/* -------------------------------------------------------------- */

//ดึงเวลาจากอินเตอร์เน็ตจาก NTP Time Server
configTime(7 * 3600, 0, ntp_server1, ntp_server2, ntp_server3);

//แสดงข้อความใน Serial Monitor
Serial.println("Waiting for time.");

while (!time(nullptr)) {
  
Serial.print(".");
vTaskDelay(100 / portTICK_PERIOD_MS);

}

//แสดงข้อความใน Serial Monitor
Serial.println();
Serial.println("Current time: " + NowString());

/* -------------------------------------------------------------- */

//ทำการเชื่อมต่อ BLYNK SERVER
Blynk.config(auth, server, port);
Blynk.connect();

/* -------------------------------------------------------------- */

}

// *** (11) FUNCTION LOOP() ***

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

}

// *** (12) FUNCTION SENDSENSOR() ***

void sendSensor() {
  
//ให้หลอดไฟ LED ติด
digitalWrite(LEDWiFiPin, HIGH);

//ให้หลอดไฟ LED บน BLYNK MOBILE APP ติด
LEDSensor.on();

//แสดงข้อความใน Serial Monitor
Serial.print(NowString());
Serial.println(", Send data to blynk server");

/* -------------------------------------------------------------- */

//อ่านข้อมูลเซ็นเซอร์ DHT11
GetDHT11(dhtdata);

Blynk.virtualWrite(Widget_Humidity, dhtdata[0]);
Blynk.virtualWrite(Widget_Temperature, dhtdata[1]);
Blynk.virtualWrite(Widget_SoilRawValue, analogRead(SoilSensorPin));
Blynk.virtualWrite(Widget_SoilLevel, SoilPercentValue());

/* -------------------------------------------------------------- */

//แสดงข้อความใน Serial Monitor
Serial.print(NowString());
Serial.println(", Send DHT11 / Soil sensors to blynk server.");

/* -------------------------------------------------------------- */

//ให้หลอด LED ที่แสดงสถานะดับ
digitalWrite(LEDWiFiPin, LOW);

//ให้หลอดไฟ LED บน BLYNK MOBILE APP ดับ
LEDSensor.off(); 

}

// *** (13) FUNCTION SENDSENSOR2() ***

void sendSensor2() {
  
//ให้หลอดไฟ LED ติด
digitalWrite(LEDWiFiPin, HIGH);

//ให้หลอดไฟ LED บน BLYNK MOBILE APP ติด
LEDSensor.on();

//แสดงข้อความใน Serial Monitor
Serial.print(NowString());
Serial.println(", Send data to blynk server");

/* -------------------------------------------------------------- */

//แสดงข้อความใน Serial Monitor
Serial.print(NowString());
Serial.print(", Wifi Signal: ");
Serial.print(WifiPercentSignal());
Serial.println("%");

/* -------------------------------------------------------------- */

//อัพเดทข้อมูลไปยัง Blynk server

Blynk.virtualWrite(Widget_LightRawValue, analogRead(LdrSensorPin));
Blynk.virtualWrite(Widget_LightLevel, LdrPercentValue());
Blynk.virtualWrite(Widget_WifiSignal, WifiPercentSignal());
Blynk.virtualWrite(Widget_WifiRawValue, WiFi.RSSI());

/* -------------------------------------------------------------- */

//แสดงข้อความใน Serial Monitor
Serial.print(NowString());
Serial.println(", Send LDR sensors / WIFI to blynk server.");

/* -------------------------------------------------------------- */

//ให้หลอด LED ที่แสดงสถานะดับ
digitalWrite(LEDWiFiPin, LOW);

//ให้หลอด LED บน app Blynk ดับ
LEDSensor.off();
}
}

(Permpol Thanapunnamas) #17

ง่ะจากโค้ตล่าสุด ฟังก์ชันที่ซ้ำถูกเอาออกไปแล้วนิครับ นับดีๆ ตอนนี้มีแค่ 4 ฟังก์ชัน แค่นั้น และมี ปีกกา เกินมา 1 ข้าง


(Jetsadakorn Najaikong) #18

ถูกไหมครับผมเเก้ตรงนี้ เเละ 4 ฟังก์ชั่นที่ว่ามันคืออันไหนครับขอโทษนะครับพื้นฐานในการดูโค๊ดผมยังไม่เก่ง
โค๊ดที่ผมส่งไปนั้นผมเอาส่วน Google Firebase กับ Line ออกหมดเเล้วใช่ไหมครับ เเล้วเหลืออะไรบ้างครับอุปกรณ์ผมซื้อมารอทำเเล้วครับ

Untitled


(Permpol Thanapunnamas) #19

ไม่รู้ก็ถามครับ

4 หังก์ชันก็ที่วงให้ดูหน่ะครับ

ลองคอมไฟรดูว่าได้ไหม


(Permpol Thanapunnamas) #20

เท่าที่ดูก็ไม่มีส่วนไหนเกี่ยวกับ Google Firebase แล้วครับ