#define BLYNK_TEMPLATE_ID "TMPL6Hs9t0Rg-"
#define BLYNK_TEMPLATE_NAME "Quickstart Template"
#define BLYNK_AUTH_TOKEN "HPYyKksBaHAb9PRMy5fivvSo2jFybeJo"
// định nghĩa cách bạn muốn ghi log ra Serial Monitor để theo dõi tình trạng hoạt động của chương trình.
#define BLYNK_PRINT Serial
#include <ESP32Firebase.h>
#include "DHT.h"
#include <WiFi.h>
#include "ThingSpeak.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <BlynkSimpleEsp32.h>
#define DATABASE_URL "https://dht22firebase-f6baf-default-rtdb.firebaseio.com/" // Url của Firebase Realtime Database
#define WIFI_SSID "Wokwi-GUEST" // Your WiFi SSID
#define WIFI_PASSWORD "" // Your WiFi Password
#define DHTTYPE DHT22 // Định nghĩa loại cảm biến DHT22
const int myChannelNumber = 2571116;
const char* myApiKey = "JET2GE1PDHOT8LD6";
const char* server = "api.thingspeak.com";
#define DHTPIN 14 // Chân GPIO kết nối cảm biến DHT
#define LED_PIN_1 12
#define LED_PIN_2 13
#define LED_PIN_3 27 // LED controlled by button
#define TRIG_PIN 26 // ESP32 pin GPIO26 connected to Ultrasonic Sensor's TRIG pin
#define ECHO_PIN 25 // ESP32 pin GPIO25 connected to Ultrasonic Sensor's ECHO pin
#define BUTTON_PIN 23 // ESP32 pin GPIO23 connected to button
float duration_us, distance_cm;
DHT dht(DHTPIN, DHTTYPE); // Khởi tạo cảm biến DHT
Firebase firebase(DATABASE_URL);
WiFiClient client;
BlynkTimer timer;
char auth[] = BLYNK_AUTH_TOKEN;
#define SCREEN_WIDTH 128 // OLED width, in pixels
#define SCREEN_HEIGHT 64 // OLED height, in pixels
// create an OLED display object connected to I2C
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// RTOS task handles
TaskHandle_t ledTaskHandle = NULL;
TaskHandle_t buttonTaskHandle = NULL;
// LED blink variables
bool ledState = false;
int blinkInterval = 500; // Initial blink interval in milliseconds
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); // Debounce delay
switch (buttonPressCount) {
case 1:
blinkInterval = 2000;
break;
case 2:
blinkInterval = 1000;
break;
case 3:
blinkInterval = 0; // Turn off LED
buttonPressCount = 0;
break;
}
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
void sendSensor()
{
// gán giá trị nhiệt độ và độ ẩm vào 2 biến h và t
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// ghi giá trị h lên v1 và t lên v0
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_1, OUTPUT);
pinMode(LED_PIN_2, OUTPUT);
pinMode(LED_PIN_3, OUTPUT);
pinMode(TRIG_PIN, OUTPUT); // config trigger pin to output mode
pinMode(ECHO_PIN, INPUT); // config echo pin to input mode
pinMode(BUTTON_PIN, INPUT_PULLUP); // Enable internal pull-up resistor for button
ThingSpeak.begin(client);
timer.setInterval(1000L, sendSensor);
// initialize OLED display with I2C address 0x3C
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("failed to start SSD1306 OLED"));
while (1);
}
// Create RTOS tasks
xTaskCreatePinnedToCore(ledTask, "LED Task", 1024, NULL, 1, &ledTaskHandle, 0);
xTaskCreatePinnedToCore(buttonTask, "Button Task", 1024, NULL, 1, &buttonTaskHandle, 0);
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.print("Nhiet do: ");
Serial.print(t);
Serial.print("ºC ");
Serial.print("Do am: ");
Serial.print(h);
Serial.println("% ");
oled.setCursor(0, 30);
oled.println("MSSV: 21161381");
oled.display();
String temperatureString = String(t) + "°C";
String humidityString = String(h) + "%";
firebase.setString("temp_humi/Nhiệt độ", temperatureString);
firebase.setString("temp_humi/Độ ẩm", humidityString);
ThingSpeak.setField(1, t);
ThingSpeak.setField(2, h);
int x = ThingSpeak.writeFields(myChannelNumber, myApiKey);
if (x == 200) {
Serial.println("Channel update successful.");
}
else {
Serial.println("Problem updating channel. HTTP error code " + String(x));
}
Blynk.run();
timer.run();
// Kiểm tra nhiệt độ và độ ẩm và cập nhật trạng thái LED
if (t > 60 ) {
digitalWrite(LED_PIN_1, HIGH); // Nháy liên tục khi nhiệt độ hoặc độ ẩm vượt quá ngưỡng
} else {
digitalWrite(LED_PIN_1, LOW); // Tắt LED khi không vượt quá ngưỡng
}
if ( h > 50) {
digitalWrite(LED_PIN_2, HIGH);
} else {
digitalWrite(LED_PIN_2, LOW);
}
// Display temperature and humidity on OLED
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();
// Code for ultrasonic sensor
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration_us = pulseIn(ECHO_PIN, HIGH);
distance_cm = 0.017 * duration_us;
String stringdis = String(distance_cm) + "cm";
Serial.print("distance (cm): ");
Serial.println(distance_cm);
oled.setCursor(0, 20);
oled.println("Dis: " + stringdis);
oled.display();
delay(5000); //
}