//Thêm các thư viện cần thiết
#include <SPI.h>
#include <Wire.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include "ThingSpeak.h" //Thư viện ThingSpeak để gửi dữ liệu lên nền tảng
const int myChannelNumber = 2346043;
const char* myApiKey = "CSR5JOFLDRANICW3";
const char* server = "api.thingspeak.com";
long Messdauer; //Biến đo thời gian
float Distanz; //Biến đo khoảng cách
const int PIN_LED_blue = 27; //Chọn chân số 27 của ESP32 cho led lam
const int PIN_LED_green = 26; //Chọn chân số 26 của ESP32 led lục
const int PIN_LED_gold = 25; //Chọn chân số 25 của ESP32 led vàng
const int PIN_LED_red = 33; //Chọn chân số 33 của ESP32 led đỏ
const int TRIG_PIN = 18; //Chọn chân số 18 của ESP32 cho chân trigger của cảm biến HC-SR04
const int ECHO_PIN = 19; //Chọn chân số 19 của ESP32 chân trigger của cảm biến HC-SR04
// Define LED
#define LED 5 //Định nghĩa chân GPIO khác để điều khiển led (chân 5)
//Định nghĩa chân cho cảm biến ánh sáng
#define Photoresistor 32
// LDR Characteristics
const float GAMMA = 0.7;
const float RL10 = 50;
//Cấu hình thông tin đăng nhập của Wifi
const char* WIFI_NAME = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
WiFiClient client;
void setup()
{
Serial.begin(9600);
pinMode(Photoresistor, INPUT);
pinMode(LED, OUTPUT);
pinMode(PIN_LED_blue, OUTPUT);
pinMode(PIN_LED_green, OUTPUT);
pinMode(PIN_LED_gold, OUTPUT);
pinMode(PIN_LED_red, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
WiFi.begin(WIFI_NAME, WIFI_PASSWORD); //Kết nối với WiFi
while (WiFi.status() != WL_CONNECTED){ //Khi chưa kết nối thành công, chờ 1s và in ra thông báo Wifi not connected)
delay(1000);
Serial.println("Wifi not connected");
}
Serial.println("Wifi connected !"); //Khi kết nối thành công, in ra thông báo tương ứng và địa chỉ IP cục bộ của thiết bị)
Serial.println("Local IP: " + String(WiFi.localIP()));
WiFi.mode(WIFI_STA); // Đặt chế độ WiFi của thiết bị là WIFI_STA (Station mode)
ThingSpeak.begin(client); //Và khởi tạo kết nối với ThingSpeak thông qua đối tượng client
}
void loop()
{
digitalWrite(TRIG_PIN, LOW); //Đặt chân gửi xung siêu âm của cảm biến thành mức thấp
delayMicroseconds(2); //Đợi trong 2 micro giây
digitalWrite(TRIG_PIN, HIGH); //Đặt chân gửi xung siêu âm lên mức cao để gửi xung siêu âm
delayMicroseconds(10); //Gửi xung siêu âm trong 10 micro giây
digitalWrite(TRIG_PIN, LOW); //Đặt chân gửi xung siêu âm xuống mức thấp để kết thúc việc gửi xung siêu âm
Messdauer = pulseIn(ECHO_PIN, HIGH); //Đo thời gian mà chân ECHO_PIN (chân nhận xung siêu âm) duy trì mức cao và lưu vào biến Messdauer
Distanz = (Messdauer * 0.034) / 2; //Tính khoảng cách thời gian nhận được dựa trên biến Messdauer
if( Distanz > 100 )
{
digitalWrite(PIN_LED_blue, HIGH); //Nếu khoảng cách lớn hơn 100 thì bật led xanh
}
else
{
digitalWrite(PIN_LED_blue, 0); //distanz nhỏ hơn 100 led xanh tắt (gán giá trị 0)
}
if(( Distanz <= 100 ) & ( Distanz > 50 ))
{
digitalWrite(PIN_LED_green, HIGH); //distanz nhỏ hơn hoặc bằng 100 lớn hơn 50, led green bật (giá trị HIGH)
}
else
{
digitalWrite(PIN_LED_green, 0); //distanz nhỏ hơn 50 hoặc lớn hơn 100 led green tắt (gán giá trị 0)
}
if(( Distanz <= 50 ) & ( Distanz > 10 ))
{
digitalWrite(PIN_LED_gold, HIGH); //distanz nhỏ hơn hoặc bằng 50 lớn hơn 10, led gold bật (giá trị HIGH)
}
else
{
digitalWrite(PIN_LED_gold, 0); //distanz nhỏ hơn 10 hoặc lớn hơn 50 led gold tắt (gán giá trị 0)
}
if( Distanz <= 10 )
{
digitalWrite(PIN_LED_red, HIGH);//distanz nhỏ hơn hoặc bằng 10 , led red bật (giá trị HIGH)
}
else
{
digitalWrite(PIN_LED_red, 0); //distanz lớn hơn 10 led red tắt (gán giá trị 0)
}
// Read Photoresistor
//đọc giá trị từ cảm biến photoresistor, được kết nối vào chân Photoresistor (chân số 32) của ESP32
//Và lưu giá trị đó vào biến analogValue.
int analogValue = analogRead(Photoresistor);
float voltage = analogValue / 4096.0 * 5; //Chuyển đổi giá trị analog thành điện áp
// bằng cách chia cho 4096 (đây là phạm vi giá trị analog của ESP32)
// và nhân với 5 (điện áp tối đa của ESP32 là 5V) , Kết quả được lưu trong biến voltage.
float resistance = 2000 * voltage / (1 - voltage / 5); //Tính trở kháng dựa trên điện áp
// Giá trị 2000 là trở kháng định trước của mạch và 5 là điện áp tối đa
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA)); //Tính độ sáng từ trở kháng
if (lux > 50) { //Độ sáng lớn hơn 50 Lux
digitalWrite(LED, LOW); //Tắt đèn
}
else { //Nếu chế độ là 1 nhưng độ sáng không đủ
digitalWrite(LED, HIGH); //Bật đèn
}
ThingSpeak.setField(1,lux);
ThingSpeak.setField(2,Distanz);
int x = ThingSpeak.writeFields(myChannelNumber,myApiKey);
Serial.print("\n");
Serial.println("Cuong do anh sang: " + String(lux));
Serial.println("Khoang cach: " + String(Distanz));
if(x == 200){
Serial.println("Data pushed successfull");
}
else{
Serial.println("Push error" + String(x));
}
Serial.println("---");
delay(1000);
}