ตอนนี้ผมสร้าง void เพิ่มขึ้นมาครับ ไม่ได้เอาไว้ใน void loop เนื่องจากผมไม่แน่ใจว่าต้องใช้คำสั่งไหนครับ while รึป่าวครับ?
ผมกำหนดตรง timer.setInterval ขึ้นมาทำแบบนี้เรียกว่าอะไรครับ แล้วมีผลเสียไหมครับ
ตอนนี้อยากเพิ่มฟังก์ชั่น กดติด ปล่อยดับขึ้นมาแต่ไม่แน่ใจว่าควรไว้ตรงไหนดีครับ
มีข้อสงสัยอีกข้อครับ คือฟังก์ด้านล่างนี้ สั่งให้เมื่อกด Switch V7 ใน blynk ทำให้ relay ทำงานกับ led ใน blynk ติด ผลที่เห็น คือ led ใน blynk ติดประมาณ 1 วิ แล้วดับไป โดยที่ยังไม่ได้ กดปิดที่ Switch มีวิธีแก้ให้ led ติดจนกว่าเราจะกดปิดไหมครับ
ขอโทษนะครับผมถามเยอะเลย
อันนี้โค็ดปัจจุบันครับ
#define BLYNK_PRINT Serial
// *** SYSTEM CONFIGURATION ***
char auth[] = "d215d6f74aaa4659bc17575931090019";
char ssid[] = "ABC99_2.4G";
char pass[] = "99999999";
//LINE TOKEN
#define LINE_TOKEN "WRvPbVG4sX9y7HIyX0EjBSkSgnJetLh5ZBjY22aaFCt"
// *** LIBRARY INCLUDE ***
#include <TridentTD_LineNotify.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
//ระบุรุ่นเซ็นเซอร์วัดความชื้นสัมพัทธ์และอุณมหภูมิเป็นรุ่น DHT22
#define DHTTYPE DHT22
//ค่าเปอร์เซ็นต์ความชื้นในดินที่ต้องการให้เร่ิมรดน้ำต้นไม้
#define TempCooling 31
#define HumFanning 79
// *** 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);
//เรียกใช้การตั้งเวลาของ 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;
// *** BLYNK CONNECTED FUNCTION ***
BLYNK_CONNECTED() {
digitalWrite(LEDWiFiPIN, HIGH);
if(isFirstConnect) {
Blynk.syncAll();
// Blynk.syncVirtual(Widget_FanningButton);
// Blynk.syncVirtual(Widget_CoolingButton);
isFirstConnect = false;
}
}
// *** BLYNK BUTTON FUNCTION ***
BLYNK_WRITE(Widget_CoolingButton) {
if (param.asInt() == 1) {
if (digitalRead(RelayCoolPIN) != LOW) {
digitalWrite(RelayCoolPIN, LOW);
LEDCooling.on();
LINE.notify("กำลังทำความเย็น");
}
}
else if(param.asInt() == 0) {
digitalWrite(RelayCoolPIN, HIGH);
LEDCooling.off();
LINE.notify("หยุดทำความเย็น");
}
}
BLYNK_WRITE(Widget_FanningButton) {
if (param.asInt() == 1) {
if (digitalRead(RelayFanPIN) != LOW) {
digitalWrite(RelayFanPIN, LOW);
LEDFanning.on();
LINE.notify("กำลังระบายความชื้น");
}
}
else if(param.asInt() == 0) {
digitalWrite(RelayFanPIN, HIGH);
LEDFanning.off();
LINE.notify("หยุดระบายความชื้น");
}
}
// *** FUNCTION SETUP() ***
void setup() {
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(1000L, sendSensor);
timer.setInterval(100L, sendGraph);
timer.setInterval(5000L, Task3);
timer.setInterval(1000L, Task2);
timer.setInterval(1000L, Task1);
/*
xTaskCreate(&Task1, "Task1", 4096, NULL, 1, NULL);
xTaskCreate(&Task6, "Task6", 4096, NULL, 1, NULL);
xTaskCreate(&Task2, "Task2", 4096, NULL, 1, NULL);
xTaskCreate(&Task7, "Task7", 4096, NULL, 1, NULL);
xTaskCreate(&Task3, "Task3", 4096, NULL, 1, NULL);
xTaskCreate(&Task8, "Task8", 4096, NULL, 1, NULL);
xTaskCreate(&Task4, "Task4", 4096, NULL, 1, NULL);
xTaskCreate(&Task5, "Task5", 4096, NULL, 1, NULL);
xTaskCreate(&Task9, "Task9", 4096, NULL, 1, NULL);
xTaskCreate(&Task10, "Task10", 4096, NULL, 1, NULL);
*/
//ทำการเชื่อมต่อ WiFi
LINE.setToken(LINE_TOKEN);
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");
//ทำการเชื่อมต่อ BLYNK SERVER
Blynk.config(auth,"Blynk.jpnet.co.th",8080);
Blynk.connect();
}
// *** FUNCTION LOOP() ***
void loop() {
timer.run();
Blynk.run();
}
// *** FUNCTION SENDSENSOR() ***
void sendSensor() {
digitalWrite(LEDWiFiPIN, HIGH);
LEDSensor.on();
Serial.println(", Send data to blynk server");
Serial.print(", Wifi Signal: ");
Serial.print(WifiPercentSignal());
Serial.println("%");
Blynk.virtualWrite(Widget_Humidity, dht.readHumidity());
Blynk.virtualWrite(Widget_Temperature, dht.readTemperature());
Blynk.virtualWrite(Widget_LightRawValue, analogRead(LdrSensorPIN));
Blynk.virtualWrite(Widget_LightLevel, LdrPercentValue());
Blynk.virtualWrite(Widget_WifiSignal, WifiPercentSignal());
Blynk.virtualWrite(Widget_WifiRawValue, WiFi.RSSI());
Serial.println(", Send DHT22 / LDR sensors / WIFIto blynk server.");
digitalWrite(LEDWiFiPIN, LOW);
LEDSensor.off();
}
void sendGraph(){
Blynk.virtualWrite(V12, WifiPercentSignal());
Blynk.virtualWrite(V23, LdrPercentValue());
Blynk.virtualWrite(V22, dht.readTemperature());
Blynk.virtualWrite(V21, dht.readHumidity());
}
// *** FUNCTION GetDHT11 ***
void GetDHT22() {
float h = dht.readHumidity();
float t = dht.readTemperature();
int count = 1;
while(isnan(h) || isnan(t)&& count <= 4) {
Serial.println(", DHT22 get failed ");
Serial.print(count);
dht.readHumidity();
dht.readTemperature();
count++;
vTaskDelay(1500/ portTICK_PERIOD_MS);
if(count == 4)
LINE.notify("DHT22 get failed 4 times.");
}
if(isnan(h))
h = oldhumidity;
if(isnan(t))
t = oldtemperature;
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(", Light sensor value: ");
Serial.println(MapReadLightValue);
return MapReadLightValue;
}
void Task1() {
if (dht.readTemperature() >= 32 && dht.readTemperature() != 0) {
digitalWrite(CoolingPIN, 0);
digitalWrite(LEDCoolingPIN, HIGH);
LEDCooling.on();
digitalWrite(RelayCoolPIN, LOW);
Blynk.virtualWrite(Widget_CoolingButton, 1);
terminal.println(", Start");
Serial.println(", Air running...");
// LINE.notify("กำลังทำความเย็น");
} else { digitalWrite(CoolingPIN, 1);
digitalWrite(LEDCoolingPIN, LOW);
LEDCooling.off();
digitalWrite(RelayCoolPIN, HIGH);
}
}
void Task2() {
if (dht.readHumidity() >= 79 && dht.readHumidity() != 0) {
digitalWrite(LEDFanningPIN, HIGH);
LEDFanning.on();
digitalWrite(RelayFanPIN, LOW);
Blynk.virtualWrite(Widget_FanningButton, 1);
terminal.println(", Start");
Serial.println(", Ventilating...");
// LINE.notify("กำลังระบายความชื้น");
} else { digitalWrite(FanningPIN, 1);
digitalWrite(LEDFanningPIN, LOW);
LEDFanning.off();
digitalWrite(RelayFanPIN, HIGH);
}
}
void Task3() {
if(WiFi.status() != WL_CONNECTED) {
digitalWrite(LEDWiFiPIN, LOW);
Serial.println("WiFi Disconnected.");
WiFi.begin((char*)ssid, (char*)pass);
}
else {
digitalWrite(LEDWiFiPIN, HIGH);
}
}
/*
// TASK1: ลูปเช็คอุณหภูมิ
void Task1(void *pvParameter){
for (;;){
if(dht.readTemperature() <= TempCooling && dht.readTemperature() != 0) {
digitalWrite(CoolingPIN, 0);
digitalWrite(LEDCoolingPIN, HIGH);
LEDCooling.on();
digitalWrite(RelayCoolPIN, LOW);
Blynk.virtualWrite(Widget_CoolingButton, 1);
terminal.println(", Start");
Serial.println(", Air running...");
LINE.notify("Air running...");
} else { digitalWrite(CoolingPIN, 1);
digitalWrite(LEDCoolingPIN, LOW);
LEDCooling.off();
digitalWrite(RelayCoolPIN, HIGH);
Blynk.virtualWrite(Widget_CoolingButton, 0);
terminal.println(", Stop");
Serial.println(", Air Stopping...");
LINE.notify("Air Stopping...");
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
//TASK6: ลูปเช็คค่าความชื้น
void Task6(void *pvParameter){
for (;;) {
if(dht.readHumidity() >= HumFanning && dht.readHumidity() != 0) {
digitalWrite(LEDFanningPIN, HIGH);
LEDFanning.on();
digitalWrite(RelayFanPIN, LOW);
Blynk.virtualWrite(Widget_FanningButton, 1);
terminal.println(", Start");
Serial.println(", Stop Ventilating...");
LINE.notify("Stop Ventilating...");
} else { digitalWrite(FanningPIN, 1);
digitalWrite(LEDFanningPIN, LOW);
LEDFanning.off();
digitalWrite(RelayFanPIN, HIGH);
Blynk.virtualWrite(Widget_FanningButton, 0);
terminal.println(", Stop");
Serial.println(", Stop Ventilating...");
LINE.notify("Stop Ventilating...");
}
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(RelayCoolPIN, HIGH);
}
else
if(data == 1 ){
vTaskDelay(10 / portTICK_PERIOD_MS);
}
if(digitalRead(ButtonCoolPIN) == 1) {
digitalWrite(RelayCoolPIN, LOW);
}
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(RelayFanPIN, HIGH);
}
else if
(data == 1 ) {
vTaskDelay(10 / portTICK_PERIOD_MS);
}
if(digitalRead(ButtonFanPIN) == 1) {
digitalWrite(RelayFanPIN, LOW);
}
vTaskDelay(100 / 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);
}
}
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
}
/*-------------------------------------------------*/