#define BLYNK_TEMPLATE_ID "TMPL6YVPlJOjU"
#define BLYNK_TEMPLATE_NAME "Thung rac am kho"
#define BLYNK_AUTH_TOKEN "HUNUnZVbx4Ok_zOYIE9hCgRQZHg_eZHf"
#define TRIG1 12
#define ECHO1 14
#define TRIG2 26
#define ECHO2 27
#define TRIG_DETECT 33
#define ECHO_DETECT 32
#define LED_PIN 4
#define BUZZER_PIN 5
#define SERVO_PIN 25
#define SOIL_PIN 34
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <ESP32Servo.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "IOT102Nhom1";
char pass[] = "04092005";
Servo myServo;
bool allowInput = true;
BLYNK_WRITE(V1) { // Mở ngăn rác khô
if (param.asInt()) {
myServo.write(0);
delay(1000);
myServo.write(90);
}
}
BLYNK_WRITE(V2) { // Mở ngăn rác ẩm
if (param.asInt()) {
myServo.write(180);
delay(1000);
myServo.write(90);
}
}
BLYNK_WRITE(V4) { // Khóa chức năng phân loại
allowInput = param.asInt();
}
void setup() {
pinMode(TRIG1, OUTPUT);
pinMode(ECHO1, INPUT);
pinMode(TRIG2, OUTPUT);
pinMode(ECHO2, INPUT);
pinMode(TRIG_DETECT, OUTPUT);
pinMode(ECHO_DETECT, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
myServo.attach(SERVO_PIN);
myServo.write(90);
WiFi.begin(ssid, pass);
Blynk.begin(auth, ssid, pass);
}
long readDistance(int trig, int echo) {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
return pulseIn(echo, HIGH) * 0.034 / 2;
}
void openLid(bool isDry) {
if (isDry) {
myServo.write(0); // mở ngăn khô
} else {
myServo.write(180); // mở ngăn ướt
}
delay(1000);
myServo.write(90);
delay(500);
}
long depth = 30;
String checkPercentFull(long distance) {
long percent = (depth - distance) / depth * 100;
String myStr = String(percent);
return myStr;
}
void loop() {
Blynk.run();
if (!allowInput) {
Blynk.virtualWrite(V3, "Đang khóa không cho truyền code");
return;
}
long d_detect = readDistance(TRIG_DETECT, ECHO_DETECT);
if (d_detect <= 10) {
Blynk.virtualWrite(V3, "Có rác. Đợi 2s...");
delay(2000);
int moisture = analogRead(SOIL_PIN);
bool isDry = (moisture == 4095);
openLid(isDry);
} else {
Blynk.virtualWrite(V3, "Chưa có rác.");
}
long d1 = readDistance(TRIG1, ECHO1);
long d2 = readDistance(TRIG2, ECHO2);
if (d1 < 5) {
digitalWrite(LED_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
Blynk.virtualWrite(V3, "Thùng khô đầy");
delay(1000);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_PIN, LOW);
Blynk.virtualWrite(V5, "Độ đầy thùng khô: " + checkPercentFull(d1) + "%");
return;
} else {
Blynk.virtualWrite(V3, "Thùng khô còn trống");
}
if (d2 < 5) {
digitalWrite(LED_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
Blynk.virtualWrite(V3, "Thùng ướt đầy");
delay(1000);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_PIN, LOW);
Blynk.virtualWrite(V5, "Độ đầy thùng ướt: " + checkPercentFull(d2) + "%");
return;
} else {
Blynk.virtualWrite(V3, "Thùng ướt còn trống");
}
delay(1000);
}