// Constants for LDR
#define MAX_ADC_READING 4095
#define ADC_REF_VOLTAGE 3.3
#define REF_RESISTANCE 5030
#define LUX_CALC_SCALAR 12518931
#define LUX_CALC_EXPONENT -1.405
#define BLYNK_TEMPLATE_ID "TMPL6liFFNBKM"
#define BLYNK_TEMPLATE_NAME "micro sd"
#define BLYNK_AUTH_TOKEN "ftxo20eoYwm-tnB-_opwmVRq_Wm3pE7y"
// Libraries
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
// Blynk Auth Token
char ssid[] = "Wokwi-GUEST"; // ใส่ชื่อ Wi-Fi
char pass[] = ""; // ใส่รหัสผ่าน Wi-Fi
// Pin Definitions
const int LDR_PIN = 35; // LDR sensor pin
const int pingPin = 18; // Ultrasonic Trigger
const int echoPin = 19; // Ultrasonic Echo
const int buzzer = 26; // Buzzer pin
const int relayPin = 27; // Relay pin
// Variables
float ldrLux = 0;
long duration, cm;
// Timer
BlynkTimer timer;
void setup() {
Serial.begin(115200);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); // ใช้ BLYNK_AUTH_TOKEN
// Pin Modes
pinMode(pingPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(relayPin, OUTPUT);
// Timer for sending data to Blynk
timer.setInterval(1000L, sendSensorData); // Update every 1 second
}
void loop() {
Blynk.run();
timer.run();
}
// Function: Send Ultrasonic and LDR Data
void sendSensorData() {
// --- Read Ultrasonic Sensor ---
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(10);
digitalWrite(pingPin, LOW);
duration = pulseIn(echoPin, HIGH);
cm = duration / 29 / 2;
// --- Read LDR Sensor ---
int ldrRawData = analogRead(LDR_PIN);
float resistorVoltage = (float)ldrRawData / MAX_ADC_READING * ADC_REF_VOLTAGE;
float ldrVoltage = ADC_REF_VOLTAGE - resistorVoltage;
float ldrResistance = (resistorVoltage > 0) ? (ldrVoltage / resistorVoltage * REF_RESISTANCE) : 0;
ldrLux = LUX_CALC_SCALAR * pow(ldrResistance, LUX_CALC_EXPONENT);
// --- Send Data to Blynk Dashboard ---
Blynk.virtualWrite(V0, cm); // Ultrasonic distance on V0
Blynk.virtualWrite(V1, ldrLux); // LDR Lux value on V1
// --- Condition 1: Ultrasonic < 5 cm ---
if (cm <= 5) {
for (int i = 0; i < 2; i++) { // Beep twice
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
}
Blynk.virtualWrite(V2, 255); // LED1 ON at V2
} else {
Blynk.virtualWrite(V2, 0); // LED1 OFF
}
// --- Condition 2: LDR Lux < 300 ---
if (ldrLux < 300) {
digitalWrite(relayPin, HIGH); // Relay ON
Blynk.virtualWrite(V3, 255); // LED2 ON at V3
} else {
digitalWrite(relayPin, LOW); // Relay OFF
Blynk.virtualWrite(V3, 0); // LED2 OFF
}
// Serial Monitor Debugging
Serial.print("Distance: ");
Serial.print(cm);
Serial.println(" cm");
Serial.print("LDR Lux: ");
Serial.print(ldrLux);
Serial.println(" lux");
}