#include <ESP32Firebase.h>
#include <DHT.h>
#include <WiFi.h>
#include <ThingSpeak.h>
#include <ESP32Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define REFERENCE_URL "https://test-a25bf-default-rtdb.firebaseio.com/"
#define DHTPIN 13
#define DHTTYPE DHT22
#define Gled 16
#define Rled 5
#define servoPin 4
#define I2C_ADDR 0x27
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
unsigned long myChannelNumber = 2571533;
const char * myWriteAPIKey = "Y1G57NP7JGL2M3SB";
int sv_active = 0;
WiFiClient client;
Servo servo;
LiquidCrystal_I2C lcd(I2C_ADDR, 16, 2);
DHT dht(DHTPIN, DHTTYPE);
Firebase firebase(REFERENCE_URL);
TaskHandle_t GledTaskHandle = NULL;
TaskHandle_t RledTaskHandle = NULL;
void GledTask(void *pvParameters) {
while (1) {
digitalWrite(Gled, HIGH);
vTaskDelay(500 / portTICK_PERIOD_MS);
digitalWrite(Gled, LOW);
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
void RledTask(void *pvParameters) {
while (1) {
digitalWrite(Rled, HIGH);
vTaskDelay(500 / portTICK_PERIOD_MS);
digitalWrite(Rled, LOW);
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
void setup() {
servo.attach(servoPin, 500, 2400);
Wire.begin(21, 22);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("TRAN HONG PHUC");
lcd.setCursor(0, 1);
lcd.print("21142350");
pinMode(Gled, OUTPUT);
pinMode(Rled, OUTPUT);
digitalWrite(Gled, HIGH);
digitalWrite(Rled, LOW);
servo.write(0);
Serial.begin(9600);
delay(1000);
// Create FreeRTOS tasks
xTaskCreate(GledTask, "GledTask", 1000, NULL, 1, &GledTaskHandle);
xTaskCreate(RledTask, "RledTask", 1000, NULL, 1, &RledTaskHandle);
// Suspend tasks initially
vTaskSuspend(GledTaskHandle);
vTaskSuspend(RledTaskHandle);
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED) {
WiFi.begin(ssid, pass);
Serial.print(".");
delay(5000);
}
Serial.println("\nConnected.");
}
dht.begin();
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Nhiet do: ");
Serial.print(t);
Serial.print("*C ");
Serial.print("Do am: ");
Serial.print(h);
Serial.println("% ");
if ((t > 30) || (h > 70)) {
servo.write(90);
sv_active = 1;
vTaskResume(RledTaskHandle); // Resume Rled blinking task
vTaskSuspend(GledTaskHandle); // Suspend Gled blinking task
} else if ((t < 25) && (h < 60)) {
servo.write(0);
sv_active = 0;
vTaskResume(GledTaskHandle); // Resume Gled blinking task
vTaskSuspend(RledTaskHandle); // Suspend Rled blinking task
} else {
// Suspend both tasks if not blinking
vTaskSuspend(GledTaskHandle);
vTaskSuspend(RledTaskHandle);
}
firebase.setFloat("Humidity", h);
firebase.setFloat("Temperature", t);
if (sv_active) firebase.setInt("Servo Angle", 90);
else firebase.setInt("Servo Angle", 0);
ThingSpeak.setField(1, t);
ThingSpeak.setField(2, h);
if (sv_active) ThingSpeak.setField(3, 90);
else ThingSpeak.setField(3, 0);
int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if (x == 200) {
Serial.println("Channel update successful.");
} else {
Serial.println("Problem updating channel. HTTP error code " + String(x));
}
Serial.print("Complete Update\n");
delay(200);
}