//DHT, cb khoang cach, hien thi ten mssv lên lcd
//Nhiệt độ > 70 độ và nút đang được nhấn thì nhấp nháy led đỏ,
//Khoảng cách <10cm thì servo quay 90 độ và led xanh nhấp nháy
//cập nhật nhiệt độ, độ ẩm , kc lên firebase
#include <ESP32Firebase.h>
#include <DHT.h>
#include <WiFi.h>
#include <ESP32Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.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
#define ECHO_PIN 0
#define TRIG_PIN 2
#define BUTTON_PIN 12
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
WiFiClient client;
Servo servo;
LiquidCrystal_I2C lcd(I2C_ADDR, 16, 2);
DHT dht(DHTPIN, DHTTYPE);
Firebase firebase(REFERENCE_URL);
struct SensorData {
float temperature;
float humidity;
int distance;
};
QueueHandle_t dataQueue;
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, LOW);
digitalWrite(Rled, LOW);
servo.write(0);
Serial.begin(9600);
dht.begin();
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
WiFi.mode(WIFI_STA);
dataQueue = xQueueCreate(10, sizeof(SensorData));
xTaskCreatePinnedToCore(
sensorTask,
"SensorTask",
8192,
NULL,
1,
NULL,
1
);
xTaskCreatePinnedToCore(
updateTask,
"UpdateTask",
8192,
NULL,
1,
NULL,
0
);
}
float readDistanceCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
}
void reconnectWiFi() {
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.");
}
}
void sensorTask(void *pvParameters) {
for (;;) {
float h = dht.readHumidity();
float t = dht.readTemperature();
float distance = readDistanceCM();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
continue;
}
Serial.print("Nhiet do: ");
Serial.print(t);
Serial.print("*C ");
Serial.print("Do am: ");
Serial.print(h);
Serial.println("% ");
Serial.print("KC ");
Serial.print(distance);
Serial.println("cm");
int buttonState = digitalRead(BUTTON_PIN);
if (t > 70 && buttonState == LOW) {
digitalWrite(Rled, HIGH);
delay(100);
digitalWrite(Rled, LOW);
delay(100);
}
if (distance < 10) {
servo.write(90);
digitalWrite(Gled, HIGH);
delay(100);
digitalWrite(Gled, LOW);
delay(100);
} else {
servo.write(0);
}
SensorData data;
data.temperature = t;
data.humidity = h;
data.distance = distance;
xQueueSend(dataQueue, &data, portMAX_DELAY);
delay(200);
}
}
void updateTask(void *pvParameters) {
SensorData data;
for (;;) {
if (xQueueReceive(dataQueue, &data, portMAX_DELAY)) {
reconnectWiFi();
firebase.setFloat("Humidity", data.humidity);
firebase.setFloat("Temperature", data.temperature);
firebase.setInt("Distance", data.distance);
Serial.println("Data sent to Firebase.");
}
}
}
void loop() {
}