#include <LiquidCrystal_I2C.h>
#include "DHTesp.h"
#include <HTTPClient.h>
#include <WiFi.h>
#include <string.h>
// khai báo chân pin
#define LED_PIN 26 // khai báo chân pin cho đèn LED
#define dht_pin 27 //khai bao chân pin của dht
#define pir_sensor 25 // khai báo chân pin của pir
// khai bao địa chỉ API
String url = "https://api.thingspeak.com/update?api_key=RF5GJM7J6HUNJY00";
// khai báo wifi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// các biến của linh kiện
DHTesp dhtSensor; // khởi tạo biến dhtsensor
LiquidCrystal_I2C lcd(0x27,20,4); // khai báo định dạng của màn hình LED
// khai bao bien dư liệu phụ
float temp; // giá trị nhiệt độ
float humid; // giá trị độ ẩm
// Lưu ý các biến phụ này được khai báo ngoài các hàm vì là biến global
// hàm setup cho vi xử lý
void setup()
{
// khai báo chân pin cho đèn LED và PIR sensor
pinMode(LED_PIN, OUTPUT);
pinMode(pir_sensor, INPUT);
Serial.begin(9600);
wifiConnect(); // gọi hàm kết nối wifi
Serial.println("WiFi connected");
dhtSensor.setup(dht_pin, DHTesp::DHT22); // khai báo cảm biến với chân pin đã nêu.
// Khai báo các task
xTaskCreate(
nhayden, // gọi hàm nhayden
"nhay den led", // tên của task
4096, // kích thước Stack size (bytes)
NULL, // Parameter to pass
3, // mức ưu tiên Task
NULL // Task handle
);
xTaskCreate(
docdulieu // gọi hàm docdulieu
, "Doc du lieu tu sensor"
, 4096
, NULL
, 1 // mức ưu tiên
, NULL);
xTaskCreate(
guidata // Gọi hàm guidata
, "Gui du lieu"
, 4096
, NULL
, 1 // mức ưu tiên
, NULL );
lcd.init(); // khới tạo biến LCD
lcd.backlight();
lcd.setCursor(1,0); // khởi tạo vị trí con trỏ trên màn hình LCD
lcd.print("Khoi tao du lieu !!"); // in dòng chữ bắt đầu từ vị trí con trỏ
}
// khai báo hàm kết nối wifi
void wifiConnect() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
// khai bao hàm nháy đèn LED
void nhayden(void *pvParameters){
for(;;){
// Turn the LED on
digitalWrite(LED_PIN, HIGH);
// Pause the task for 500ms
vTaskDelay(1000 / portTICK_PERIOD_MS);
// Turn the LED off
digitalWrite(LED_PIN, LOW);
// Pause the task again for 500ms
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
// khai bao hàm đọc dữ liệu từ cảm biến DHT22 và in ra lên LCD
void docdulieu(void *pvParameters){
for(;;){
TempAndHumidity data = dhtSensor.getTempAndHumidity(); // lấy giá trị từ cảm biến DHT
temp = data.temperature;
humid = data.humidity;
String stemp = String(temp) + (char)223+ "C"; // chuyển dữ liệu sang dạng string
String shumid = String(humid) + "%"; // chuyển dữ liệu sang dạng string
// hiển thị giá trị ra màn hình LCD
lcd.clear(); // xóa màn hình
lcd.setCursor(0,0); // con trỏ lcd trở về đầu tiên
lcd.print("Temp: "+stemp);
lcd.setCursor(0,1);
lcd.print("Humid: "+ shumid);
// doc du lieu tu cam bien PIR
int pir_value = digitalRead(pir_sensor);
if(pir_value == 1){
Serial.println("Phát hiện chuyển động !!");
delay(100);
}
delay(5000);
}
}
// khai báo hàm get dữ liệu lên API
void guidata(void *pvParameters){
for(;;){
delay(5000); // đưa hàm delay lên đầu để tránh giá trị 0, 0 của nhiệt độ và độ ẩm khi mới khởi động hệ thống
String Urlget = url + "&field1="+String(temp)+"&field2="+String(humid);
Serial.println(Urlget.c_str()); // debug url
httpGETRequest(Urlget.c_str());
//delay(5000);
}
}
// khai báo hàm http get request hàm thực hiện gửi dữ liệu lên API
String httpGETRequest(const char* Url)
{
HTTPClient http;
http.begin(Url);
int responseCode = http.GET(); // lấy response code
String responseBody = "{}";
Serial.print("responseCode:");
Serial.println(responseCode);
if(responseCode > 0)
{
responseBody = http.getString();
}
else
{
Serial.print("Error Code: ");
Serial.println(responseCode);
}
http.end();
return responseBody; // tra lại giá trị responsecode cho hàm httpgetrequest.
}
void loop() {
//
}