#include "DHT.h"
#include <HTTPClient.h>
#include <WiFi.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// WiFi Credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingSpeak API
String UrlThingspeak = "https://api.thingspeak.com/update?api_key=76O9Z328Q1Y6JUNP";
// Global Variables
float temperature = 0.0, humidity = 0.0; // Biến lưu dữ liệu cảm biến
int pirState = LOW; // Trạng thái của cảm biến PIR
#define DHT_PIN 15
#define DHT_TYPE DHT22
#define PIR_PIN 12 // Chân nối cảm biến PIR
DHT dht(DHT_PIN, DHT_TYPE);
// LED Pin
const int ledPin = 26;
// Task Function Declarations
void TaskBlink(void *pvParameters);
void TaskSensorRead(void *pvParameters);
void TaskSendingData(void *pvParameters);
void TaskDisplayLCD(void *pvParameters);
// HTTP GET Request
String httpGETRequest(const char* Url) {
HTTPClient http;
http.begin(Url);
int responseCode = http.GET();
String responseBody = "{}";
Serial.print("Response Code: ");
Serial.println(responseCode);
if (responseCode > 0) {
responseBody = http.getString();
} else {
Serial.print("Error Code: ");
Serial.println(responseCode);
}
http.end();
return responseBody;
}
void setup() {
// Initialize Serial and DHT
Serial.begin(9600);
dht.begin();
// Initialize LED and PIR pin
pinMode(ledPin, OUTPUT);
pinMode(PIR_PIN, INPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
delay(2000);
// Connect to WiFi
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("\nConnected to WiFi!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
// Create Tasks
xTaskCreate(TaskBlink, "Blink LED", 4096, NULL, 1, NULL);
xTaskCreate(TaskSensorRead, "Read Sensors", 4096, NULL, 2, NULL);
xTaskCreate(TaskSendingData, "Send Data", 4096, NULL, 1, NULL);
xTaskCreate(TaskDisplayLCD, "Display LCD", 4096, NULL, 1, NULL);
}
void loop() {
// FreeRTOS tasks handle the logic
}
// Task 1: Blink LED
void TaskBlink(void *pvParameters) {
for (;;) {
digitalWrite(ledPin, HIGH);
vTaskDelay(500 / portTICK_PERIOD_MS); // Delay 500ms
digitalWrite(ledPin, LOW);
vTaskDelay(500 / portTICK_PERIOD_MS); // Delay 500ms
Serial.println("LED is blinking...");
}
}
// Task 2: Read Sensor Data
void TaskSensorRead(void *pvParameters) {
for (;;) {
// Read PIR state
pirState = digitalRead(PIR_PIN);
if (pirState == HIGH) {
Serial.println("Motion detected!");
} else {
Serial.println("No motion detected.");
}
// Read DHT sensor data
humidity = dht.readHumidity();
temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
} else {
Serial.printf("Temperature: %.1f°C, Humidity: %.1f%%\n", temperature, humidity);
}
vTaskDelay(2000 / portTICK_PERIOD_MS); // Delay 2 seconds
}
}
// Task 3: Send Data to ThingSpeak
void TaskSendingData(void *pvParameters) {
for (;;) {
if (WiFi.status() == WL_CONNECTED) {
char parameters[100];
sprintf(parameters, "&field1=%.2f&field2=%.2f&field3=%d", temperature, humidity, pirState);
String Url = UrlThingspeak + String(parameters);
String response = httpGETRequest(Url.c_str());
Serial.println("Sending data to ThingSpeak...");
Serial.println("Response: " + response);
} else {
Serial.println("WiFi disconnected!");
}
vTaskDelay(5000 / portTICK_PERIOD_MS); // Delay 5 seconds
}
}
void TaskDisplayLCD(void *pvParameters) {
for (;;) {
// Xóa màn hình và hiển thị dữ liệu
lcd.clear();
// Hiển thị nhiệt độ và độ ẩm
lcd.setCursor(0, 0); // Dòng 1, cột 1
lcd.print("Temp: ");
lcd.print(temperature, 1);
lcd.print("C");
lcd.setCursor(0, 1); // Dòng 2, cột 1
lcd.print("Hum: ");
lcd.print(humidity, 1);
lcd.print("%");
// Đợi 2 giây trước khi cập nhật lại
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}