#define BLYNK_TEMPLATE_ID "TMPL6Qlwnv1Rn"
#define BLYNK_TEMPLATE_NAME "Lab 2 ESP32 DHT11 LED"
#define BLYNK_AUTH_TOKEN "692LCgK5E1UsyqAN768tgjpq8rDllxKv"
#define BLYNK_PRINT Serial
#include <ESP32Firebase.h>
#include "DHT.h"
#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <BlynkSimpleEsp32.h>
#define DATABASE_URL "https://iotlab3-840c3-default-rtdb.firebaseio.com/"
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define DHTTYPE DHT22
#define DHTPIN 14
#define LED_PIN_3 27
#define BUTTON_PIN 23
DHT dht(DHTPIN, DHTTYPE);
Firebase firebase(DATABASE_URL);
WiFiClient client;
BlynkTimer timer;
char auth[] = BLYNK_AUTH_TOKEN;
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
TaskHandle_t ledTaskHandle = NULL;
TaskHandle_t buttonTaskHandle = NULL;
TaskHandle_t dhtTaskHandle = NULL;
bool ledState = false;
int blinkInterval = 500;
int buttonPressCount = 0;
void ledTask(void *pvParameters) {
while (1) {
ledState = !ledState;
digitalWrite(LED_PIN_3, ledState);
vTaskDelay(blinkInterval / portTICK_PERIOD_MS);
}
}
void buttonTask(void *pvParameters) {
while (1) {
if (digitalRead(BUTTON_PIN) == LOW) {
buttonPressCount++;
delay(300);
switch (buttonPressCount) {
case 1:
blinkInterval = 2000;
break;
case 2:
blinkInterval = 1000;
break;
case 3:
blinkInterval = 0;
buttonPressCount = 0;
break;
}
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
void dhtTask(void *pvParameters) {
while (1) {
float h = dht.readHumidity();
float t = dht.readTemperature();
// Xử lý dữ liệu nhiệt độ và độ ẩm tại đây (nếu cần)
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
void sendSensor() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Blynk.virtualWrite(V1, h);
Blynk.virtualWrite(V0, t);
}
void setup() {
Serial.begin(115200);
delay(5000);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Blynk.begin(auth, WIFI_SSID, WIFI_PASSWORD);
pinMode(LED_PIN_3, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
timer.setInterval(1000L, sendSensor);
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("failed to start SSD1306 OLED"));
while (1);
}
xTaskCreatePinnedToCore(ledTask, "LED Task", 1024, NULL, 1, &ledTaskHandle, 0);
xTaskCreatePinnedToCore(buttonTask, "Button Task", 1024, NULL, 1, &buttonTaskHandle, 0);
xTaskCreatePinnedToCore(dhtTask, "DHT Task", 1024, NULL, 1, &dhtTaskHandle, 0);
}
void loop() {
String temperatureString = String(dht.readTemperature()) + "°C";
String humidityString = String(dht.readHumidity()) + "%";
Serial.print("Nhiet do: ");
Serial.print(temperatureString);
Serial.print("Do am: ");
Serial.println(humidityString);
oled.setCursor(0, 30);
oled.println("Do Nguyen Dat");
oled.setCursor(0, 40);
oled.println("MSSv 21161295");
oled.display();
firebase.setString("temp_humi/Nhiệt độ", temperatureString);
firebase.setString("temp_humi/Độ ẩm", humidityString);
Blynk.run();
timer.run();
if (dht.readTemperature() > 50) {
digitalWrite(LED_PIN_3, HIGH);
} else {
digitalWrite(LED_PIN_3, LOW);
}
if (dht.readHumidity() < 60) {
digitalWrite(LED_PIN_3, HIGH);
}
else {
digitalWrite(LED_PIN_3, LOW);
}
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(WHITE);
oled.setCursor(0, 0);
oled.println("Temp: " + temperatureString);
oled.setCursor(0, 10);
oled.println("Humi: " + humidityString);
oled.display();
delay(5000);
}