คอนไพล์ผ่านแต่ใช้งานไม่ได้ครับ
ไม่เชื่อมต่ออะไรเลยครับต้องแก้ไขยังไงครับ
code ที่ใช้ครับ
// *** (1) PROJECT INFO ***
#define BLYNK_PRINT Serial
// *** (2) SYSTEM CONFIGURATION ***
char auth[] = "d240db934aa4403784f9afe0722e95d8";
char ssid[] = "ABC99_2.4G";
char pass[] = "99999999";
//LINE TOKEN
#define LINE_TOKEN "WRvPbVG4sX9y7HIyX0EjBSkSgnJetLh5ZBjY22aaFCt"
//ค่าเปอร์เซ็นต์ความชื้นในดินที่ต้องการให้เร่ิมรดน้ำต้นไม้
#define TempCooling 31
#define HumFanning 79
// *** (3) LIBRARY INCLUDE ***
#include <TridentTD_LineNotify.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <time.h>
//ระบุรุ่นเซ็นเซอร์วัดความชื้นสัมพัทธ์และอุณมหภูมิเป็นรุ่น DHT22
#define DHTTYPE DHT22
// *** (4) GPIO PIN SETUP ***
#define DHTPIN 32
#define LdrSensorPIN 35
#define ButtonCoolPIN 25
#define ButtonFanPIN 33
#define LEDSensorPIN 26
#define CoolingPIN 27
#define FanningPIN 14
#define LEDWiFiPIN 2
#define LEDCoolingPIN 4
#define LEDFanningPIN 15
#define RelayCoolPIN 5
#define RelayFanPIN 18
//การกำหนดขา Vitual Pin ที่สร้างขึ้นให้กับ Widget ต่างๆ ใน Blynk Mobile APP
#define Widget_Humidity V1
#define Widget_Temperature V2
#define Widget_LightRawValue V5
#define Widget_LightLevel V6
#define Widget_CoolingButton V7
#define Widget_FanningButton V14
#define Widget_SendSensorStatus V8
#define Widget_CoolingStatus V9
#define Widget_FanningStatus V13
#define Widget_WifiSignal V10
#define Widget_WifiRawValue V11
#define Widget_Terminal V12
WidgetLED LEDSensor(Widget_SendSensorStatus);
WidgetLED LEDCooling(Widget_CoolingStatus);
WidgetLED LEDFanning(Widget_FanningStatus);
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";
//เรียกใช้การตั้งเวลาของ Blynk
BlynkTimer timer;
DHT dht(DHTPIN, DHTTYPE);
//กำหนดตัวแปรเริ่มต้น
int WifiSignal;
bool isFirstConnect = true;
byte oldtemperature;
byte oldhumidity;
int CurrentWiFiSignal;
int MapReadLightValue;
int CurrentLightValue;
int h;
int t;
// *** (8) BLYNK CONNECTED FUNCTION ***
BLYNK_CONNECTED() {
digitalWrite(LEDWiFiPIN, HIGH);
//ถ้าเป็นการเชื่อมต่อ Blynk Server ครั้งแรกหลังบอร์ดรีบูต
if(isFirstConnect) {
//ให้ซิงค์ข้อมูลทั้งหมดล่าสุดจาก Blynk Server
Blynk.syncAll();
Blynk.syncVirtual(Widget_FanningButton);
Blynk.syncVirtual(Widget_CoolingButton);
isFirstConnect = false;
}
}
// *** (9) BLYNK BUTTON FUNCTION ***
BLYNK_WRITE(Widget_CoolingButton) {
//ค่าที่ได้จาก Widget_WateringButton (V7) จะเป็น 0 และ 1 ถ้ามีการปดปุ่ม
if (param.asInt() == 1) {
if (digitalRead(RelayCoolPIN) != LOW) {
//เรียกใช้ฟังก์ชันปั้มน้ำ
digitalWrite(RelayCoolPIN, LOW);
}
}
else {
digitalWrite(RelayCoolPIN, HIGH);
}
}
BLYNK_WRITE(Widget_FanningButton) {
//ค่าที่ได้จาก Widget_WateringButton (V7) จะเป็น 0 และ 1 ถ้ามีการปดปุ่ม
if (param.asInt() == 1) {
if (digitalRead(RelayFanPIN) != LOW) {
//เรียกใช้ฟังก์ชันรดน้ำ
digitalWrite(RelayFanPIN, LOW);
}
}
else {
digitalWrite(RelayFanPIN, HIGH);
}
}
// *** (10) FUNCTION SETUP() ***
void setup() {
//เรียกใช้งาน Serial Monitor
Serial.begin(115200);
dht.begin();
//กำหนดโหมดใช้งานให้กำขา GPIO
pinMode(LEDWiFiPIN, OUTPUT);
pinMode(LEDSensorPIN, OUTPUT);
pinMode(LEDCoolingPIN, OUTPUT);
pinMode(LEDFanningPIN, OUTPUT);
pinMode(CoolingPIN, OUTPUT);
pinMode(FanningPIN, OUTPUT);
pinMode(RelayCoolPIN, OUTPUT);
pinMode(RelayFanPIN, OUTPUT);
pinMode(ButtonCoolPIN, INPUT_PULLUP);
pinMode(ButtonFanPIN, INPUT_PULLUP);
//ตั้งสถานะเริ่มต้นให้กับขา GPIO เพื่อป้องกันการทำงานเองตอนที่บอร์ด ESP32 รีบูต
digitalWrite(LEDWiFiPIN, LOW);
digitalWrite(LEDSensorPIN, LOW);
digitalWrite(LEDCoolingPIN, LOW);
digitalWrite(LEDFanningPIN, LOW);
digitalWrite(RelayCoolPIN, HIGH);
digitalWrite(RelayFanPIN, HIGH);
Serial.println("Setting IO Done.");
timer.setInterval(1000L, GetDHT22);
timer.setInterval(2000L, sendSensor);
//TASK1: ลูปเช็คค่าความชื้นดิน ถ้าต่ำกว่าที่กำหนดให้เร่ิมการรดน้ำต้นไม้
xTaskCreate(&Task1, "Task1", 2000, NULL, 9, NULL);
//(Task6 ผมก็อปมาจาก task1 แล้วสร้างเพิ่ม task6 ขึ้นมาครับ)
xTaskCreate(&Task6, "Task6", 2000, NULL, 9, NULL);
//TASK2: ลูปอ่านค่าการกดปุ่มสวิตซ์ ถ้ามีการกดปุ่มสวิตซ์ให้เริ่มการรดน้ำต้นไม้
xTaskCreate(&Task2, "Task2", 1000, NULL, 9, NULL);
//(Task7 ผมก็อปมาจาก task2 แล้วสร้างเพิ่ม task7 ขึ้นมาครับ)
xTaskCreate(&Task7, "Task7", 1000, NULL, 9, NULL);
//TASK3: ลูปให้หลอดไฟ LED กระพริบ ถ้ามีการรดน้ำต้นไม้
xTaskCreate(&Task3, "Task3", 3000, NULL, 8, NULL);
//(Task8 ผมก็อปมาจาก task3 แล้วสร้างเพิ่ม task8 ขึ้นมาครับ)
xTaskCreate(&Task8, "Task8", 3000, NULL, 8, NULL);
//TASK4: ลูปเช็คการเชื่อมต่อ WiFi และให้เชื่อมต่อใหม่เองแบบอัตโนมัติ
xTaskCreate(&Task4, "Task4", 3000, NULL, 10, NULL);
//TASK5: รดน้ำต้นไม้ตามเวลาที่กำหนด
xTaskCreate(&Task5, "Task5", 3000, NULL, 9, NULL);
//(Task9 ผมก็อปมาจาก task5 แล้วสร้างเพิ่ม task9 ขึ้นมาครับ)
xTaskCreate(&Task9, "Task9", 3000, NULL, 9, NULL);
//TASK4: ลูปเช็คการเชื่อมต่อ WiFi และให้เชื่อมต่อใหม่เองแบบอัตโนมัติ
xTaskCreate(&Task10, "Task10", 3000, NULL, 10, NULL);
//ทำการเชื่อมต่อ WiFi
Blynk.connectWiFi(ssid, pass);
//แสดงข้อความใน 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,"Blynk.jpnet.co.th",8080);
Blynk.connect();
}
// *** (11) FUNCTION LOOP() ***
void loop() {
timer.run();
Blynk.run();
}
// *** (12) FUNCTION SENDSENSOR() ***
void sendSensor() {
digitalWrite(LEDWiFiPIN, HIGH);
LEDSensor.on();
Serial.print(NowString());
Serial.println(", Send data to blynk server");
Serial.print(NowString());
Serial.print(", Wifi Signal: ");
Serial.print(WifiPercentSignal());
Serial.println("%");
Blynk.virtualWrite(Widget_Humidity, h);
Blynk.virtualWrite(Widget_Temperature, t);
Blynk.virtualWrite(Widget_LightRawValue, analogRead(LdrSensorPIN));
Blynk.virtualWrite(Widget_LightLevel, LdrPercentValue());
Blynk.virtualWrite(Widget_WifiSignal, WifiPercentSignal());
Blynk.virtualWrite(Widget_WifiRawValue, WiFi.RSSI());
Serial.print(NowString());
Serial.println(", Send DHT22 / LDR sensors / WIFIto blynk server.");
digitalWrite(LEDWiFiPIN, LOW);
LEDSensor.off();
}
// *** (17) CURRENT DATETIME ***
String NowString() {
int getcount = 1;
time_t now = time(nullptr);
struct tm* newtime = localtime(&now);
String myyear = String(newtime->tm_year + 1900);
//ถ้าปียังเป็นปี 1970 ให้ดึงค่าเวลาใหม่ พยายามสูงสุด 4 ครั้ง
while(myyear == "1970" && getcount <= 4) {
time_t now = time(nullptr);
struct tm* newtime = localtime(&now);
myyear = String(newtime->tm_year + 1900);
vTaskDelay(100 / portTICK_PERIOD_MS);
getcount++;
}
String tmpTime = "";
String tmpNow = "";
tmpNow += String(newtime->tm_year + 1900);
tmpNow += "-";
if(newtime->tm_mon < 10)
tmpNow += "0";
tmpNow += String(newtime->tm_mon + 1);
tmpNow += "-";
if(newtime->tm_mday < 10)
tmpNow += "0";
tmpNow += String(newtime->tm_mday);
tmpNow += " ";
if(newtime->tm_hour < 10)
tmpNow += "0";
tmpNow += String(newtime->tm_hour);
tmpNow += ":";
if(newtime->tm_min < 10)
tmpNow += "0";
tmpNow += String(newtime->tm_min);
tmpNow += ":";
if(newtime->tm_sec < 10)
tmpNow += "0";
tmpNow += String(newtime->tm_sec);
return tmpNow;
}
// *** (18) FUNCTION GetDHT11 ***
void GetDHT22() {
//กำหนดค่าตัวแปรอุณหภูมิ
float h = dht.readHumidity();
float t = dht.readTemperature();
int count = 1;
while(isnan(h) || isnan(t)&& count <= 4) {
Serial.print(NowString());
Serial.println(", DHT22 get failed ");
Serial.print(count);
dht.readHumidity();
dht.readTemperature();
vTaskDelay(1500/ portTICK_PERIOD_MS);
if(count == 4)
LINE.notify("DHT22 get failed 4 times.");
count++;
}
if(isnan(h))
h = oldhumidity;
if(isnan(t))
t = oldtemperature;
Serial.print(NowString());
Serial.print(", Humidity: ");
Serial.print(h);
Serial.print("% | ");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println("C");
//เก็บสำรองข้อมูล temperature & humidity
oldtemperature = t;
oldhumidity = h;
}
// *** (19) FUNCTION WifiPercentSignal ***
//หาค่าสัญญาณ RSSI ของ WIFI แล้ว MAP ให้อยู่ในรูปของเปอร์เซ็นต์
int WifiPercentSignal() {
CurrentWiFiSignal = WiFi.RSSI();
if(CurrentWiFiSignal > -40) CurrentWiFiSignal = -40;
if(CurrentWiFiSignal < -90) CurrentWiFiSignal = -90;
WifiSignal = map(CurrentWiFiSignal, -90, -40, 0, 100);
return WifiSignal;
}
// *** (21) FUNCTION LdrPercentValue ***
//อ่านค่าจากเซ็นเซอร์อนาล๊อก LDR
int LdrPercentValue() {
CurrentLightValue = analogRead(LdrSensorPIN);
if(CurrentLightValue > 4000) CurrentLightValue = 4000;
if(CurrentLightValue < 100) CurrentLightValue = 100;
MapReadLightValue = map(CurrentLightValue, 4000, 100, 0, 100);
Serial.print(NowString());
Serial.print(", Light sensor value: ");
Serial.println(MapReadLightValue);
return MapReadLightValue;
}
// TASK1: ลูปเช็คอุณหภูมิ
void Task1(void *pvParameter){
for (;;){
if(t <= TempCooling && t != 0)
digitalWrite(CoolingPIN, 0);
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
//TASK6: ลูปเช็คค่าความชื้น
void Task6(void *pvParameter){
for (;;) {
if(h >= HumFanning && h != 0)
digitalWrite(FanningPIN, 0);
}
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
// TASK2: ลูปเช็คสถานะของสวิตซ์ ถ้ามีการกดสวิตซ์จะเป็นการเปิดปั๊มคูลลิ่ง
void Task2(void *pvParameter){
for (;;) {
boolean state = 0;
boolean data;
data = digitalRead(ButtonCoolPIN);
if(data == 0) {
vTaskDelay(10 / portTICK_PERIOD_MS);
}
if(digitalRead(ButtonCoolPIN) == 0) {
digitalWrite(CoolingPIN, 0);
}
else
if(data == 1 ){
vTaskDelay(10 / portTICK_PERIOD_MS);
}
if(digitalRead(ButtonCoolPIN) == 1) {
digitalWrite(CoolingPIN, 1);
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
//TASK7: ลูปเช็คสถานะของสวิตซ์ ถ้ามีการกดสวิตซ์จะเป็นการเปิดพัดลม
void Task7(void *pvParameter){
for (;;) {
boolean state = 0;
boolean data;
data = digitalRead(ButtonFanPIN);
if(data == 0 ) {
vTaskDelay(10 / portTICK_PERIOD_MS);
}
if(digitalRead(ButtonFanPIN) == 0) {
digitalWrite(FanningPIN, 0);
}
else if
(data == 1 ) {
vTaskDelay(10 / portTICK_PERIOD_MS);
}
if(digitalRead(ButtonFanPIN) == 1) {
digitalWrite(FanningPIN, 1);
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
// TASK3: ลูปเช็คค่าขา CoolingPin ถ้าเปลี่ยนสถานะเป็น 0
void Task3(void *pvParameter){
for (;;) {
if(digitalRead(CoolingPIN) == 0)
digitalWrite(LEDCoolingPIN, HIGH);
LEDCooling.on();
vTaskDelay(500 / portTICK_PERIOD_MS);
digitalWrite(LEDCoolingPIN, LOW);
LEDCooling.off();
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
//TASK8: ลูปเช็คค่าขา FanningPin ถ้าเปลี่ยนสถานะเป็น 0
void Task8(void *pvParameter){
for (;;) {
if(digitalRead(FanningPIN) == 0)
digitalWrite(LEDFanningPIN, HIGH);
LEDFanning.on();
vTaskDelay(500 / portTICK_PERIOD_MS);
digitalWrite(LEDFanningPIN, LOW);
LEDFanning.off();
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
//TASK4: ลูปเช็คสัญญาณ wifi ถ้าติดต่อไม่ได้ให้ต่อใหม่
void Task4(void *p) {
for (;;) {
if(WiFi.status() != WL_CONNECTED) {
digitalWrite(LEDWiFiPIN, LOW);
Serial.println("WiFi Disconnected.");
WiFi.begin((char*)ssid, (char*)pass);
}
else {
digitalWrite(LEDWiFiPIN, HIGH);
}
vTaskDelay(5000 / portTICK_PERIOD_MS);
}
}
// TASK5: เปิดปั้มคูลลิ่ง
void Task5(void *pvParameter){
for (;;){
if(digitalRead(CoolingPIN) == 0) {
digitalWrite(RelayCoolPIN, LOW);
LEDCooling.on();
Blynk.virtualWrite(Widget_CoolingButton, 1);
terminal.print(NowString());
terminal.println(", Start");
Serial.print(NowString());
Serial.println(", Air running...");
LINE.notify("Air running...");
}
if (digitalRead(CoolingPIN) == 1){
digitalWrite(RelayCoolPIN, HIGH);
digitalWrite(CoolingPIN, 1);
LEDCooling.off();
Blynk.virtualWrite(Widget_CoolingButton, 0);
}
}
}
// TASK9: เปิดพัดลมระบายอากาศ
void Task9(void *pvParameter){
for (;;) {
if(digitalRead(FanningPIN) == 0){
digitalWrite(RelayFanPIN, LOW);
LEDFanning.on();
Blynk.virtualWrite(Widget_FanningButton, 1);
terminal.print(NowString());
terminal.println(", Start");
Serial.print(NowString());
Serial.println(", Ventilating...");
LINE.notify("Ventilating...");
}
if (digitalRead(FanningPIN) == 1){
digitalWrite(RelayFanPIN, HIGH);
LEDFanning.off();
Blynk.virtualWrite(Widget_FanningButton, 0);
}
}
}
void Task10(void *p) {
for(;;) {
if(!Blynk.connected()){
//แสดงข้อความบนคอนโซล
Serial.println("Not connected to Blynk server.");
Serial.println("Connecting to Blynk server...");
Blynk.disconnect();
//delay(1000);
vTaskDelay(1000 / portTICK_PERIOD_MS);
if(WiFi.status() == WL_CONNECTED){
Blynk.config(auth,"Blynk.jpnet.co.th",8080);
Blynk.connect();
}
// try to connect to server
}
vTaskDelay(10000 / portTICK_PERIOD_MS);
} //while
}
/* -------------------------------------------------*/















