#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include <Ultrasonic.h>
#include <WiFi.h>
#include <HTTPClient.h> // Thư viện HTTPClient cho ESP32
#define SCREEN_WIDTH 128 // Độ rộng màn hình OLED
#define SCREEN_HEIGHT 64 // Chiều cao màn hình OLED
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C // Địa chỉ I2C của màn hình OLED (thông thường là 0x3C)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define DHTPIN 15 // Định nghĩa chân kết nối với cảm biến DHT
#define DHTTYPE DHT22 // Định nghĩa loại cảm biến DHT (DHT22)
DHT dht(DHTPIN, DHTTYPE); // Khởi tạo đối tượng DHT với chân kết nối và loại cảm biến
Ultrasonic ultrasonic(13, 12); // Khởi tạo đối tượng cảm biến siêu âm với chân Trig (13) và Echo (12)
const int ledPin = 14; // LED pin
char ssid[] = "Wokwi-GUEST"; // Tên mạng WiFi
char pass[] = ""; // Mật khẩu mạng WiFi
const char* thingSpeakAPIKey = "KGK2PVM77NTKVAXJ"; // Thay thế bằng API Key của bạn
const char* thingSpeakServer = "http://api.thingspeak.com/update";
float KK, ND_C, ND_F; // Khai báo biến để lưu giá trị độ ẩm (KK), nhiệt độ Celsius (ND_C) và Fahrenheit (ND_F)
float distance_cm, distance_inch; // Khai báo biến để lưu khoảng cách (cm) và (inch)
long time_chop_cur, time_chop_pre; // Khai báo biến để lưu thời gian hiện tại và trước đó cho chức năng chop_led
void setup() {
Serial.begin(115200); // Khởi tạo giao tiếp Serial với tốc độ 115200 bps
pinMode(ledPin, OUTPUT); // Đặt chân ledPin là OUTPUT
dht.begin(); // Khởi tạo cảm biến DHT
// Khởi tạo màn hình OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Dừng chương trình nếu không thể khởi tạo màn hình
}
display.display();
delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
WiFi.begin(ssid, pass); // Kết nối WiFi
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
void loop() {
distance_cm = ultrasonic.read(); // Đọc khoảng cách từ cảm biến siêu âm
readingDHT22(); // Gọi hàm đọc giá trị từ cảm biến DHT
if (ND_C > 70) { // Kiểm tra nếu nhiệt độ lớn hơn 70 độ C
chop_led(); // Nháy LED
} else {
digitalWrite(ledPin, LOW); // Tắt LED nếu nhiệt độ <= 70
}
Serial.printf("Nhiệt độ: %.2f °C \n", ND_C); // In nhiệt độ ra Serial với đơn vị Celsius
Serial.printf("Khoảng cách: %.2f cm \n", distance_cm); // In khoảng cách ra Serial với đơn vị cm
Serial.printf("Độ ẩm: %.2f %% \n", KK); // In độ ẩm ra Serial với đơn vị %
// Hiển thị thông tin trên màn hình OLED
display.clearDisplay();
display.setCursor(0, 0);
display.println("Nguyen Phuc Hoai Nam");
display.setCursor(0, 10);
display.println("21161407");
display.setCursor(0, 20);
display.printf("Do am: %.2f %%", KK);
display.setCursor(0, 30);
display.printf("Nhiet do: %.2f C", ND_C);
display.display();
// Gửi dữ liệu lên ThingSpeak
if(WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = thingSpeakServer;
url += "?api_key=";
url += thingSpeakAPIKey;
url += "&field1=";
url += String(ND_C);
url += "&field2=";
url += String(KK);
url += "&field3=";
url += String(distance_cm);
http.begin(url);
int httpCode = http.GET();
if(httpCode > 0) {
Serial.printf("HTTP GET code: %d\n", httpCode);
} else {
Serial.printf("HTTP GET failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
} else {
Serial.println("WiFi not connected");
}
delay(10000); // Chờ 10 giây trước khi gửi lại dữ liệu
}
void readingDHT22() {
KK = dht.readHumidity(); // Đọc giá trị độ ẩm từ cảm biến DHT
ND_C = dht.readTemperature(); // Đọc giá trị nhiệt độ từ cảm biến DHT
if (isnan(ND_C) || isnan(KK)) {
Serial.println(F("Failed to read.....")); // Nếu đọc thất bại, in thông báo lỗi
return;
}
ND_F = (ND_C * 1.8) + 32; // Chuyển đổi nhiệt độ từ Celsius sang Fahrenheit nếu cần
}
void chop_led() {
time_chop_cur = millis(); // Lấy thời gian hiện tại
if (time_chop_cur - time_chop_pre >= 250) { // Nếu thời gian đã trôi qua 250ms
if (digitalRead(ledPin) == HIGH) { // Nếu LED đang bật
digitalWrite(ledPin, LOW); // Tắt LED
} else {
digitalWrite(ledPin, HIGH); // Bật LED
}
time_chop_pre = time_chop_cur; // Cập nhật thời gian trước đó
}
}