// khai báo các thư viện cho ngoại vi và thư viện ThingSpeak
#include <WiFi.h>
#include "DHTesp.h"
#include "ThingSpeak.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
DHTesp dht; // tạo một đối tượng cảm biến DHT22
//Khai báo thông số Wifi
const char* WIFI_NAME = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
//Khai báo thông số ThingSpeak
const int myChannelNumber = 2541611;
const char* myApiKey = "B4HWAKN6M6A32ZWU";
const char* server = "api.thingspeak.com";
//Khai báo chân
const byte dhtPin = 17; // chân cảm biến nhiệt độ
const byte ledlight = 2; // led tím nối với chân số 2
const byte leddht = 23; // led đỏ kết nối với chân số 2
const byte buzz = 26; // buzzer kết nối với chân số 26
const byte ldr = 34; // chân cảm biến ánh sáng
// định nghĩa các hằng số
#define MQ2 35
#define NOTE_F4 349
#define ledgas 14
// khai báo và khởi tạo một số biến
float temperature = 0.0, humidity =0.0;
WiFiClient client;
int gas;
void setup() {
Serial.begin(115200); // tốc độ màn hình serial
// đặt chế độ hoạt động của các chân GPIO trên ESP32
pinMode(ledlight,OUTPUT);
pinMode(leddht,OUTPUT);
pinMode(buzz,OUTPUT);
pinMode(ldr, INPUT);
pinMode(MQ2, INPUT);
pinMode(ledgas, OUTPUT);
digitalWrite(ledgas, LOW);
wifi_setup();
dht.setup(dhtPin,DHTesp::DHT22); //khai báo chân DHT và loại cảm biến (DHT22)
ThingSpeak.begin(client); // thiết lập kết nối với ThingSpeak
// tạo hàm để các tác vụ có thể chạy song song
xTaskCreate(thingspeak_setup,"ThingSpeak",4000, NULL,2, NULL);
xTaskCreate(Check_Connection,"Check",4000, NULL,2, NULL);
xTaskCreate(dht22,"DHT22",5000, NULL,2, NULL);
xTaskCreate(lightsensor,"Light",4000, NULL,2, NULL);
xTaskCreate(gassensor,"Gas",4000, NULL,2, NULL);
vTaskStartScheduler();
}
void loop(){
}
void thingspeak_setup(void*){
while(1){
ThingSpeak.setField(1,temperature);// field 1 sẽ được ghi dữ liệu Temperature
ThingSpeak.setField(2,humidity);// field 2 sẽ được ghi dữ liệu Humidity
ThingSpeak.setField(3, gas);// field 3 sẽ được ghi dữ liệu Gas
vTaskDelay(pdMS_TO_TICKS(5000));
}
}
void Check_Connection(void*){
while(1){
// x sẽ lưu mã trạng thái cho biết kết quả gửi dữ liệu lên ThingSpeak, nếu gửi thành công (200 OK) thì x sẽ
// có giá trị 200, so sánh và sau đó thông báo ra màn hình đã gửi thành công hoặc không
int x = ThingSpeak.writeFields(myChannelNumber,myApiKey); // gửi các field lên ThingSpeak có ID Channel với API
//key tương ứng được thiết lập ở trên
if(x == 200){
Serial.println("Data pushed successfull");
}else{
Serial.println("Push error" + String(x));
Serial.println("---");
vTaskDelay(pdMS_TO_TICKS(10000));
}
}
}
void dht22(void*){
while(1){
humidity = dht.getHumidity();
temperature = dht.getTemperature();
// in ra màn hình Serial nhiệt độ và độ ẩm, nhiệt độ có 2 số sau dấu phẩy động, độ ẩm có 1 số sau dấu phẩy động
Serial.println("Temp: " + String(temperature, 2) + "°C");
Serial.println("Humidity: " + String(humidity, 1) + "%");
// nếu nhiệt độ lớn hơn 70, đèn đỏ hoạt động đồng thời buzzer hoạt động
if(temperature>70.0) {
Serial.println("LEVEL 2 FIRE");
digitalWrite(leddht, HIGH);
vTaskDelay(pdMS_TO_TICKS(150));
tone (26 , NOTE_F4, 100);
digitalWrite(leddht, LOW);
vTaskDelay(pdMS_TO_TICKS(150));
}
else {
// nếu nhiệt độ lớn hơn 50, đèn đỏ hoạt động
if(temperature>50.0){
Serial.println("LEVEL 1 FIRE");
digitalWrite(leddht, HIGH);
vTaskDelay(pdMS_TO_TICKS(300));
digitalWrite(leddht, LOW);
vTaskDelay(pdMS_TO_TICKS(300));
}
else vTaskDelay(pdMS_TO_TICKS(800));
}
}
}
void lightsensor(void*){
while(1){
float st = analogRead(ldr);
// nếu độ sáng thấp hơn 50 lux thì đèn tím hoạt động
if(st > 2531) {
Serial.println("Room: DARK, TURN ON THE BLUE LIGHT");
digitalWrite(ledlight, HIGH);
}else{
Serial.println("Room: LIGHT, TURN OFF THE BLUE LIGHT");
digitalWrite(ledlight, LOW);
}
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
void gassensor(void*){
while(1){
gas = analogRead(MQ2);
Serial.print("Gas: "); Serial.println(gas);
// nếu khí gas lớn hơn 100 thì đèn xanh hoạt động
if(gas>100){
Serial.println("DANGER, GAS WAS DETECTED");
digitalWrite(ledgas, HIGH);
vTaskDelay(pdMS_TO_TICKS(200));
digitalWrite(ledgas, LOW);
vTaskDelay(pdMS_TO_TICKS(200));
}
vTaskDelay(pdMS_TO_TICKS(400));
}
}
void wifi_setup(){
WiFi.begin(WIFI_NAME, WIFI_PASSWORD);// khai báo thông số Wifi
// nếu không kết nối được wifi thì chạy vòng lặp và in lỗi ra màn hình
while (WiFi.status() != WL_CONNECTED){
delay(1000);
Serial.println("Wifi not connected");
}
// kết nối thành công và in ra màn hình
Serial.println("Wifi connected !");
Serial.println("Local IP: " + String(WiFi.localIP()));
/* Thiết lập wifi ở chế độ Station. Ở chế độ này, esp32 lấy id từ routerr và thiết lập 1 web server và các thiết bị có
trong mạng sẽ kết nối được với web */
WiFi.mode(WIFI_STA);
}