#include <WiFi.h> // Thư viện WiFi cho ESP32
#include "DHTesp.h" // Thư viện cho cảm biến DHT
#include "ThingSpeak.h" // Thư viện ThingSpeak cho gửi dữ liệu lên cloud
const int trigPin = 5;
const int echoPin = 18;
//define sound speed in cm/uS
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701
long duration;
float distanceCm;
float distanceInch;
#define button 2
const int DHT_PIN = 15; // Chân kết nối của cảm biến DHT22
const int LED_PIN_RED = 13; // Chân kết nối của đèn LED
const int LED_PIN_GREEN = 12;
const char* WIFI_NAME = "Wokwi-GUEST"; // Tên mạng Wi-Fi
const char* WIFI_PASS = ""; // Mật khẩu mạng Wi-Fi
const int CHANNEL_NUM = 2376003; // Số kênh ThingSpeak
const char* API_KEY = "WJB6C4LP9AKRHYN0"; // Khóa API của kênh
DHTesp dht; // Đối tượng cảm biến DHT
WiFiClient client; // Đối tượng WiFiClient
void setup() {
pinMode(button, INPUT);
Serial.begin(115200); // Bắt đầu giao tiếp serial với baud rate 115200.
dht.setup(DHT_PIN, DHTesp::DHT22); // Cài đặt cảm biến DHT22 trên chân DHT_PIN và loại cảm biến là DHT22.
pinMode(LED_PIN_RED, OUTPUT); // Cấu hình chân LED_PIN là chân OUTPUT.
pinMode(LED_PIN_GREEN, OUTPUT);
WiFi.begin(WIFI_NAME, WIFI_PASS); // Kết nối WiFi sử dụng tên và mật khẩu mạng đã định nghĩa.
while (WiFi.status() != WL_CONNECTED) { // Chờ cho đến khi kết nối WiFi thành công.
delay(1000);
Serial.println("WiFi not connected");
}
Serial.println("WiFi connected!"); // In ra thông báo khi WiFi đã kết nối thành công.
Serial.println("Local IP: " + String(WiFi.localIP())); // In ra địa chỉ IP cục bộ.
WiFi.mode(WIFI_STA); // Đặt chế độ là STATION (kết nối mạng không phát sóng).
ThingSpeak.begin(client); // Cấu hình ThingSpeak để bắt đầu gửi dữ liệu.
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
}
void loop() {
TempAndHumidity data = dht.getTempAndHumidity(); // Đọc dữ liệu nhiệt độ và độ ẩm từ cảm biến DHT22.
ThingSpeak.setField(1, data.temperature); // Đặt giá trị của trường 1 cho nhiệt độ.
ThingSpeak.setField(3, data.humidity); // Đặt giá trị của trường 2 cho độ ẩm.
int nhan = digitalRead(button);
if(nhan==1)
{
while(1){
digitalWrite(LED_PIN_RED, HIGH);
delay(250);
digitalWrite(LED_PIN_RED, LOW);
delay(250);
}
}
// Kiểm tra nếu nhiệt độ nằm ngoài khoảng giá trị mong muốn, bật đèn LED.
digitalWrite(LED_PIN_RED, (data.temperature > 40 && data.temperature < 80 ) ? HIGH : LOW);
digitalWrite(LED_PIN_GREEN, (data.temperature < 40 ) ? HIGH : LOW);
int response = ThingSpeak.writeFields(CHANNEL_NUM, API_KEY); // Gửi dữ liệu lên ThingSpeak và lưu kết quả trong biến response.
Serial.println("Temp: " + String(data.temperature, 2) + "°C"); // In ra giá trị nhiệt độ với 2 chữ số thập phân và độ C.
Serial.println("Humidity: " + String(data.humidity, 1) + "%"); // In ra giá trị độ ẩm với 1 chữ số thập phân và %.
Serial.println(response == 200 ? "Data pushed successfully" : "Push error " + String(response)); // Kiểm tra kết quả gửi dữ liệu và in ra thông báo tương ứng.
Serial.println("---"); // In ra dấu gạch ngang để phân tách dữ liệu trong các lần lặp.
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculate the distance
distanceCm = duration * SOUND_SPEED/2;
// Convert to inches
distanceInch = distanceCm * CM_TO_INCH;
ThingSpeak.setField(2, distanceCm);
// Prints the distance in the Serial Monitor
Serial.print("Distance (cm): ");
Serial.println(distanceCm);
Serial.print("Distance (inch): ");
Serial.println(distanceInch);
delay(2000);
}