#define BLYNK_TEMPLATE_ID "TMPL6purlTr8J"
#define BLYNK_TEMPLATE_NAME "Ngaxinh"
#define BLYNK_AUTH_TOKEN "DgTM1EOLDb3l3P5KyNxYCFazRkKcxW2p"
#include <WiFi.h> // thư viện WiFi cho ESP32
#include <DHT.h> // thư viện cảm biến DHT
#include <NewPing.h> // thư viện NewPing cho cảm biến siêu âm
#include <BlynkSimpleEsp32.h>
//#include <LiquidCrystal_I2C.h> // thư viện LCD I2C
#include "ThingSpeak.h"
#include <Wire.h>
#include <ESP32Firebase.h> // thư viện Firebase cho tương tác với Firebase Realtime Database
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define REFERENCE_URL "https://bich-nga-default-rtdb.firebaseio.com/" // URL của cơ sở dữ liệu Firebase
#define FIREBASE_AUTH "jrPFRCE4Hk3C0UJ99WUn6aUqA9hNbAyWwMqjM6gI" // Mã xác thực Firebase
#define DHTPIN 32 // Chân dữ liệu của cảm biến DHT22
#define DHTTYPE DHT22 // Loại cảm biến DHT (DHT22)
#define TEMPERATURE_ALERT_THRESHOLD 70 // Ngưỡng cảnh báo nhiệt độ
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define TRIGGER_PIN 12 // Chân kích hoạt của cảm biến siêu âm
#define ECHO_PIN 14 // Chân echo của cảm biến siêu âm
#define MAX_DISTANCE 400 // Khoảng cách tối đa của cảm biến siêu âm
#define DOOR_OPEN_DISTANCE 10 // Khoảng cách mở cửa
//#define LDR 13 //chan cam bien anh sang
const int analogInputPin = A0; // Kênh ADC 0
//const int ledPin = 12; // Chân nối LED
int sensorValue = 0;
DHT dht(DHTPIN, DHTTYPE); // Khởi tạo cảm biến DHT
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Khởi tạo cảm biến siêu âm
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const char* WIFI_NAME = "Wokwi-GUEST"; // Tên mạng WiFi
const char* WIFI_PASSWORD = ""; // Mật khẩu mạng WiFi
const int myChannelNumber =2568196; // Số kênh ThingSpeak
const char* myApiKey = "NGOOZUCNKO6I98C1"; // Khóa API ThingSpeak
const char* server = "api.thingspeak.com"; // Địa chỉ máy chủ ThingSpeak
const int buzzerPin = 35; // Chân kết nối buzzer
WiFiClient client; // Đối tượng client WiFi
Firebase firebase(REFERENCE_URL); // Đối tượng FirebaseData cho việc tương tác với cơ sở dữ liệu Firebase
#define LED_PIN_RED 5 // Chân của đèn LED cảnh báo nhiệt độ
#define LED_PIN_GREEN 4 // Chân của đèn LED cho servo
//#define SERVO_PIN 27 // Chân của servo để điều khiển cửa
int nutnhan = 25; // định nghĩa chân số GIPOGIPO2 là button ( D2 )
int t=0;
//Servo doorServo; // Đối tượng servo
BlynkTimer timer;
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
void setup() {
Serial.begin(9600); // Bắt đầu giao tiếp serial
//pinMode(, OUTPUT); // Đặt chân LED đỏ làm đầu ra
//pinMode(, OUTPUT); // Đặt chân LED xanh làm đầu ra
//pinMode(BUTTON_PIN, INPUT_PULLUP); // Đặt chân nút nhấn làm đầu vào với điện trở kéo lên nội bộ
// doorServo.attach(SERVO_PIN); // Gắn servo vào chân tương ứng
// Khởi tạo chân nút nhấn
pinMode(nutnhan,INPUT);
digitalWrite(nutnhan, HIGH);
pinMode(LED_PIN_RED, OUTPUT);
pinMode(LED_PIN_GREEN, OUTPUT);
pinMode(buzzerPin, OUTPUT); // Thiết lập chân buzzer là OUTPUT
//pinMode(LDR, INPUT);
//pinMode(pirPin, INPUT); // Thiết lập chân là input
dht.begin(); // Khởi động cảm biến nhiệt độ và độ ẩm DHT22
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
WiFi.begin(WIFI_NAME, WIFI_PASSWORD); // Kết nối vào mạng WiFi
while (WiFi.status() != WL_CONNECTED) // Chờ cho đến khi kết nối WiFi được thiết lập
{
delay(1000);
Serial.println("Wifi not connected"); // In ra thông báo WiFi không được kết nối
}
Serial.println("Wifi connected !"); // In ra thông báo WiFi đã kết nối
Serial.println("Local IP: " + String(WiFi.localIP())); // In ra địa chỉ IP cục bộ
WiFi.mode(WIFI_STA); // Đặt chế độ WiFi thành Station Mode - kết nối vào một điểm truy cập (AP) đã được định trước
// Khởi tạo kết nối Firebase
ThingSpeak.begin(client); // Khởi tạo ThingSpeak
Blynk.begin(auth, ssid, pass, "blynk.cloud", 80);
timer.setInterval(2000L, sendDHTData);
}
unsigned int state_button = 0, state_temperature = 0;
void sendDHTData() {
float t = dht.readTemperature();
float h = dht.readHumidity();
sensorValue = analogRead(analogInputPin);
unsigned int k = (sonar.ping_cm())/33; // Hằng số bù cho cảm biến siêu âm
float distance = sonar.ping_cm() - k; // Đọc khoảng cách từ cảm biến siêu âm
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Blynk.virtualWrite(V0, t);
Blynk.virtualWrite(V1, h);
Blynk.virtualWrite(V2, distance);
Blynk.virtualWrite(V3, sensorValue);
}
int status1;// biến lưu các trạng thái nút nhấn
boolean chong_doi()// int char float ngoại trừ void
{
int sta =!digitalRead(nutnhan); // đọc trạng thái nút nhấn
return sta;// khi co nhan nut la true
}
void loop() {
int buttonState = digitalRead(nutnhan);
//Serial.println(buttonState);
status1 = chong_doi();
if(status1==true)
{
{
t=!t;// đảo trạng thái
}
while(status1==true){status1=chong_doi();}
}
if(t==1)
{
digitalWrite(LED_PIN_RED, HIGH);
}
else
{
digitalWrite(LED_PIN_RED, LOW);
}
Serial.println(t);
sensorValue = analogRead(analogInputPin);
float temperature = dht.readTemperature(); // Đọc nhiệt độ từ cảm biến DHT22
float humidity = dht.readHumidity(); // Đọc độ ẩm từ cảm biến DHT22
unsigned int k = (sonar.ping_cm())/33; // Hằng số bù cho cảm biến siêu âm
float distance = sonar.ping_cm() - k; // Đọc khoảng cách từ cảm biến siêu âm
//buttonState = digitalRead(BUTTON_PIN); // Đọc trạng thái của nút nhấn
// Nếu nhiệt độ > 70 và nút nhấn được nhấn, LED đỏ chớp tắt
// lưu lại trạng thái button cho lần kiểm tra tiếp theo
display.setCursor(0, 0);
display.println("Ten: Vu Bich Nga");
display.println("MSSV: 21161010");
display.print("Nhiet do: ");
display.print(temperature);
display.println(" C");
display.print("Do am: ");
display.print(humidity);
display.println(" %");
display.print("Anh sang: ");
display.print(sensorValue);
display.println(" lux");
display.display();
if((temperature > 50) && (humidity > 60 ))
{
digitalWrite(LED_PIN_GREEN, HIGH);
delay(1000);
digitalWrite(LED_PIN_GREEN, LOW);
delay(1000);
}
else
{
digitalWrite(LED_PIN_GREEN, LOW);
}
ThingSpeak.setField(1,temperature); // Đặt trường nhiệt độ trong kênh ThingSpeak
ThingSpeak.setField(2,humidity); // Đặt trường độ ẩm trong kênh ThingSpeak
ThingSpeak.setField(3,distance); // Đặt trường khoảng cách trong kênh ThingSpeak
ThingSpeak.setField(4,sensorValue); // Đặt trường khoảng cách trong kênh ThingSpeak
int status = ThingSpeak.writeFields(myChannelNumber,myApiKey); // Gửi dữ liệu lên kênh ThingSpeak
delay(500); // Đợi 5 giây
Serial.print("sensorValue: ");
Serial.println(sensorValue);
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
firebase.setFloat("Temperature", temperature); // Gửi dữ liệu nhiệt độ lên Firebase
firebase.setFloat("Humidity", humidity); // Gửi dữ liệu độ ẩm lên Firebase
firebase.setFloat("Den do", t); // Gửi dữ liệu khoảng cách lên Firebase
firebase.setFloat("sensorValue", sensorValue); // Gửi dữ liệu khoảng cách lên Firebase
sendDHTData();
delay(1000);
}