#define BLYNK_TEMPLATE_ID "TMPL6bMaJMcgr"
#define BLYNK_TEMPLATE_NAME "thungrac"
#define BLYNK_AUTH_TOKEN "h4Xje2i3Jxwm2YfeycOyh9f-uR4P_xac"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <ESP32Servo.h>
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
//Định nghĩa chân kết nối
const int ULTRASONIC_TRIGGER_PIN = 4;
const int ULTRASONIC_ECHO_PIN = 2;
const int INFRARED_SENSOR_PIN = 12;
const int SERVO_PIN = 5;
const int FULL_LED_PIN = 14;
//cổng blynk
const int REMOTE_OPEN_BUTTON_PIN = V1;
//giá trị mặc định của cảm biến, động cơ
const int SERVO_OPEN_ANGLE = 0;
const int SERVO_CLOSE_ANGLE = 90;
const int TRASH_OPEN_DURATION = 5000;
const int TRASH_CAN_HEIGHT = 100;
//tham số
Servo trashLidServo;
long ultrasonicDuration;
float trashLevelPercentage;
int button_blynk_open = 0;
unsigned long timer1 = 0;
void setup() {
Serial.begin(115200);
pinMode(ULTRASONIC_TRIGGER_PIN, OUTPUT);
pinMode(ULTRASONIC_ECHO_PIN, INPUT);
pinMode(INFRARED_SENSOR_PIN, INPUT);
pinMode(SERVO_PIN, OUTPUT);
pinMode(FULL_LED_PIN, OUTPUT);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
trashLidServo.attach(SERVO_PIN, 400, 3200);
trashLidServo.write(SERVO_CLOSE_ANGLE);
Serial.println("Khoitaoxong");
digitalWrite(FULL_LED_PIN, LOW);
}
void loop() {
Blynk.run();
unsigned long curTime = millis();
if (curTime - timer1 >= 1000) {
timer1 = millis();
measureTrashLevel();
Serial.println(timer1);
}
//check điều kiện mở thùng rác
if (digitalRead(INFRARED_SENSOR_PIN) == 1 || button_blynk_open == 1) {
openTrash();
Serial.println(digitalRead(INFRARED_SENSOR_PIN));
delay(TRASH_OPEN_DURATION);
closeTrash();
Serial.println(digitalRead(INFRARED_SENSOR_PIN));
button_blynk_open = 0;
}
}
void measureTrashLevel() {
digitalWrite(ULTRASONIC_TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(ULTRASONIC_TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(ULTRASONIC_TRIGGER_PIN, LOW);
//tính toán giá trị rác
ultrasonicDuration = pulseIn(ULTRASONIC_ECHO_PIN, HIGH);
float distance = ultrasonicDuration * 0.0343 / 2;
trashLevelPercentage = (1 - distance / TRASH_CAN_HEIGHT) * 100;
Serial.println(distance);
Serial.println(trashLevelPercentage);
Blynk.virtualWrite(V3, trashLevelPercentage);
//set mức độ đầy của thùng rác
if (trashLevelPercentage >= 80) {
digitalWrite(FULL_LED_PIN, HIGH);
Blynk.virtualWrite(V2, HIGH);
} else {
digitalWrite(FULL_LED_PIN, LOW);
Blynk.virtualWrite(V2, LOW);
}
Blynk.virtualWrite(V3, trashLevelPercentage);
}
void openTrash() {
trashLidServo.write(SERVO_OPEN_ANGLE);
Serial.println("Mở thùng rác");
}
void closeTrash() {
trashLidServo.write(SERVO_CLOSE_ANGLE);
Serial.println("Đóng thùng rác");
}
BLYNK_WRITE(V1) {
int buttonState = param.asInt();
if (buttonState == 1) {
button_blynk_open = 1;
}
}
BLYNK_CONNECTED() {
Serial.print("BLYNK SERVER CONNECTED !!!");
Blynk.syncVirtual(V1);
Blynk.syncVirtual(V2);
Blynk.syncVirtual(V3);
}