ผู้เขียนบทความ : นายธนกฤต แกล้วทนงค์ COE#15
คณะวิศวกรรมศาสตร์ สาขาวิศวกรรมคอมพิวเตอร์
วิชา : 04-513-201 การโปรแกรมคอมพิวเตอร์ขั้นสูง
1.ความเป็นมา
ในปัจจุบันปัญหาการจัดการขยะเป็นหนึ่งในปัญหาสิ่งแวดล้อมที่ต้องการการแก้ไขอย่างเร่งด่วน สามารถอ้างอิงถึงการเพิ่มขึ้นของจำนวนประชากรและการเพิ่มของระบบการบริโภคที่เป็นที่ต้องการเป็นสาเหตุของปัญหาการสะสมขยะ
โครงงานเกี่ยวกับถังขยะอัจฉริยะมีศักยภาพในการสร้างประโยชน์ทั้งในด้านสิ่งแวดล้อมและสังคมและช่วยอำนวยความสะดวกในการค้นหาถังขยะและรับรู้ถึงปริมาณในถังขยะ
โครงงาน Intelligent Trash Bin for Smart Cities สร้างมาเพื่อความอำนวยความสะดวกสบายในการทิ้งขยะ โครงงาน Intelligent Trash Bin for Smart Cities เกิดขึ้นมาช่วยให้การค้นหาถังขยะและทิ้งขยะง่ายขึ้น
2.วัตถุประสงค์
2.1เพื่อความสะดวกสบายในการทิ้งขยะ
2.2เพื่อลดปัญหาการสัมผัสเชื้อโรค
2.3เพื่อทราบปริมาณในถังขยะ
3.ขอบเขต
3.1สามารถบอกปริมาณในตัวถังขยะว่าเต็มแล้วหรือยัง
3.2มีการแสดงผลผ่านบนหน้าจอ LCD ว่าตัวถังขยะกำลังเปิดหรือปิดและเต็มแล้วหรือยัง
3.3สามรถนำไปแก้ไขปรับใช้ได้ในอนาคต
3.4 การแจ้งเตือนผ่านLine ระบบสามารถส่งข้อความและรูปภาพแจ้งเตือนไปยังแชทของผู้ใช้ใน Line
3.5จะมีเสียง Buzzer ดังออกมาเมื่อสอนตัวฝาถังนั้นเปิด
4.ประโยชน์ที่คาดว่าจะได้รับ
4.1ความสะดวกสบายในการเปิดปิดฝาถังขยะ
4.2สามาบอกตำแหน่งตัวถังขยะได้
4.3สามาบอกปริมาณในตัวถังขยะได้
4.4 สามาเปิดปิดฝาถังได้อัตโนมัติ
5.ความรู้ที่เกี่ยวข้อง
5.1TridentTD_LineNotify.h5.1TridentTD_LineNotify.h
ซึ่งเป็นไลบรารีที่ใช้ในการส่งข้อความทาง LINE Notify และ WiFi.h ซึ่งใช้ในการเชื่อมต่อกับเครือข่าย WiFi ของคุณทำให้ผู้ใช้งานสามารถเขียนโปรแกรมเพื่อสร้างบริการที่ผู้พัฒนาต้องการ ผ่านการส่งข้อความและโต้ตอบกับผู้ใช้ในลักษณะ Chatbot นั่นเอง Line Messaging API มีฟังก์ชันการทำงานมากมาย แต่ที่เราใช้ฟังก์ชันการทำงานคือ การส่งข้อความ สามารถใช้ส่งข้อความแบบข้อความธรรมดา ข้อความรูปภาพ ข้อความวิดีโอ ข้อความเสียง ฯลฯ
ในการสร้างระบบนี้ จำเป็นต้องมี Token ของ Line Messaging API ซึ่งสามารถขอได้จาก Line Developer ข้อความแจ้งเตือน
if (lastState == HIGH && currentState == LOW){
Serial.println("Bin is Full XD");
lcd.setCursor(0, 1);
lcd.print("Bin is Full XD ");
LINE.notify("เต็มแล้วโปรดเอาขยะไปทิ้ง T-T");
LINE.notify(message);
}
บรรทัดโค้ดในภาพแสดงการเรียกใช้ฟังก์ชัน LINE.notifyPicture() เพื่อส่งภาพไปยัง LINE ฟังก์ชันนี้ใช้เพื่อส่งข้อมูลภาพไปยังบัญชี LINE ของผู้ใช้
ในบรรทัดโค้ดนี้ ฟังก์ชัน LINE.notifyPicture() จะส่งการแจ้งแจ้งเตือนเมื่อถังขยะเต็มแล้วไปยังตัว Line
5.2TinyGPS++.h
เป็นเป็นไลบรารีที่ใช้เป็นไลบรารี่ที่มีความสามารถให้ตัวโมดูล GPS นั้นทำงานได้พร้อมทั้งส่งข้อมูลตัวตำแหน่งมาพร้อมกับการแจ้งเตือนว่าตัวถังขยะนั้นเต็ม
void loop() {
String message = "Location bie : " + String(gps.location.lat(), 6) +"," + String(gps.location.lng(), 6);
currentState = digitalRead(SENSOR_PIN);
}
5.3ESP32Servo.h
เป็นไลบรารีที่ใช้สำหรับควบคุมตัว Servo โดยให้มันซิงค์หรือทำงานร่วมกับตัว ESP32 ได้นั้นเอง
if (cm < trashThreshold) {
digitalWrite(BUZZER_PIN, LOW);
delay(300);
digitalWrite(BUZZER_PIN, HIGH);
delay(300);
digitalWrite(BUZZER_PIN, LOW);
delay(300);
digitalWrite(BUZZER_PIN, HIGH);
delay(300);
myservo.write(160);
delay(5000); //
myservo.write(0); //
}
else {
myservo.write(0);
}
5.4LiquidCrystal_I2C.h
เป็นไลบรารี่ที่ใช้ควบคุมตัวหน้าจอ LCD
if (cm < trashThreshold) {
Serial.print("Bin is Open ;) ");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bin is Open ;) ");
}
else {
Serial.print("Bin is Close :D");
lcd.setCursor(0, 0);
lcd.print("Bin is Close :D ");
}
if (lastState == HIGH && currentState == LOW){
Serial.println("Bin is Full XD");
lcd.setCursor(0, 1);
lcd.print("Bin is Full XD ");
}
else /*(lastState == LOW && currentState == HIGH)*/{
Serial.println("Bin is Not Full");
lcd.setCursor(0, 1);
lcd.print("Bin is Not Full");
}
5.5ultrasonic sensor
ใช้สำหรับการเปิดตรวจจับระยะ โดยการตัวจับระยะที่ตั้งไว้สำหลับการเปิดตัวถังฝาขยะนั้นคือ 25 เซนติเมตร
const int trashThreshold = 25; // ระยะทางที่ถือว่าถังขยะเต็ม (เซนติเมตร)
void setup() {
pinMode(BUZZER_PIN, OUTPUT);
}
if (cm < trashThreshold) {
digitalWrite(BUZZER_PIN, LOW);
delay(300);
digitalWrite(BUZZER_PIN, HIGH);
delay(300);
digitalWrite(BUZZER_PIN, LOW);
delay(300);
digitalWrite(BUZZER_PIN, HIGH);
delay(300);
Serial.print(“Bin is Open 😉 “);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“Bin is Open 😉 “);
myservo.write(160);
delay(5000); //
myservo.write(0); //
}
else {
Serial.print(“Bin is Close :D”);
lcd.clear(); //
lcd.setCursor(0, 0);
lcd.print(“Bin is Close 😀 “);
myservo.write(0);
}
if (lastState == HIGH && currentState == LOW){
Serial.println(“Bin is Full XD”);
lcd.setCursor(0, 1);
lcd.print(“Bin is Full XD “);
LINE.notify(“เต็มแล้วโปรดเอาขยะไปทิ้ง T-T”);
LINE.notify(message);
}
}
Serial.print(“Distance: “);
Serial.print(cm);
Serial.println(” cm”);
delay(100);
}
long microsecondsToCentimeters(long microseconds) {
return microseconds / 29 / 2;
}
6.ผลการเดินการ
Diagramของระบบ เป็นภาพรวมการทำงานของระบบ เพื่อทำให้เข้าใจการทำงานของระบบมากขึ้น
โดยการทำงานจะเริ่มต้นจากเมื่อเอามือมาบังไว้ที่ตัว Ultrasonic sensor หลังจากนั้น Servo motorr จะทำการเปิดและปิดตัวฝาถังหลังจากนั้นแสดงผลผ่านตัวหน้าจอว่ากำลังเปิดตัวฝาถังและจะมีตัว IR Infrared ทำหน้าที่ตรวจจับปริมาณในตัวถังขยะและแสดงข้อมูลผ่านตัวหน้าจอ LCD ว่าตัวถังขยะนั้นเต็มแล้ว แล้วตัวโมดูล GPS ทำหน้าที่ส่งตำแหน่งตัวถังขยะ โดย IR Infrared และ GPS นั้นจะการส่งข้อมูลและข้อความมายังตัว Line
โค้ดการทำงานเปิดปิดตัวฝาถังขยะ
if (cm < trashThreshold) {
digitalWrite(BUZZER_PIN, LOW);
delay(300);
digitalWrite(BUZZER_PIN, HIGH);
delay(300);
digitalWrite(BUZZER_ PIN, LOW);
delay(300);
digitalWrite(BUZZER_PIN, HIGH);
delay(300);
Serial.println("Power Off");
Serial.print("Bin is Open ;) ");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bin is Open ;) ");
myservo.write(160);
delay(5000); //
myservo.write(0); //
}
else {
Serial.print("Bin is Close :D");
lcd.clear(); //
lcd.setCursor(0, 0);
lcd.print("Bin is Close :D ");
myservo.write(0);
}
การทดลอง
Code การทำงานทั้งหมดของตัวถังขยะ
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
#include <WiFi.h>
#include <TinyGPS++.h>
#include <TridentTD_LineNotify.h>
#define SENSOR_PIN 18
#define BUZZER_PIN 23
#define RXPin (16)
#define TXPin (17)
const char* ssid = "Tanakrit";
const char* password = "12345678";
const char* lineToken = "4XDCtlSCdaVFoE59xpBmQpIK1UTsGlTfRtEMRYvdzYl";\
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
Servo myservo; //ประกาศตัวแปรแทน Servo
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int pingPin = 13;
const int inPin = 12;
const int trashThreshold = 25; // ระยะทางที่ถือว่าถังขยะเต็ม (เซนติเมตร)
int lastState = HIGH;
int currentState;
void setup() {
WiFi.begin(ssid, password);
LINE.setToken(lineToken);
pinMode(BUZZER_PIN, OUTPUT);
myservo.attach(33); // D22 (กำหนดขาควบคุม Servo)
Serial.begin(9600);
lcd.init(); // กำหนดให้ใช้จอ LCD
lcd.backlight(); // เปิดไฟหน้าจอ LCD
lcd.clear(); // ล้างหน้าจอ LCD
pinMode(SENSOR_PIN, INPUT);
Serial.begin(GPSBaud, SERIAL_8N1, RXPin, TXPin, false);
Serial.println(TinyGPSPlus::libraryVersion());
}
void loop() {
String message = "Location bie : " + String(gps.location.lat(), 6) +"," + String(gps.location.lng(), 6);
currentState = digitalRead(SENSOR_PIN);
long duration, cm;
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(18);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
pinMode(inPin, INPUT);
duration = pulseIn(inPin, HIGH);
cm = microsecondsToCentimeters(duration);
Serial.print("Distance: ");
Serial.print(cm);
Serial.println(" cm ");
if (cm < trashThreshold) {
digitalWrite(BUZZER_PIN, LOW);
delay(300);
digitalWrite(BUZZER_PIN, HIGH);
delay(300);
digitalWrite(BUZZER_PIN, LOW);
delay(300);
digitalWrite(BUZZER_PIN, HIGH);
delay(300);
Serial.print("Bin is Open ;) ");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bin is Open ;) ");
myservo.write(160);
delay(5000); //
myservo.write(0); //
}
else {
Serial.print("Bin is Close :D");
lcd.clear(); //
lcd.setCursor(0, 0);
lcd.print("Bin is Close :D ");
myservo.write(0);
}
if (lastState == HIGH && currentState == LOW){
Serial.println("Bin is Full XD");
lcd.setCursor(0, 1);
lcd.print("Bin is Full XD ");
LINE.notify("เต็มแล้วโปรดเอาขยะไปทิ้ง T-T");
LINE.notify(message);
}
else /*(lastState == LOW && currentState == HIGH)*/{
Serial.println("Bin is Not Full");
lcd.setCursor(0, 1);
lcd.print("Bin is Not Full");
}
Serial.print("Distance: ");
Serial.print(cm);
Serial.println(" cm");
delay(100);
}
void sendLocationToLine() {
String message = "Location bie : " + String(gps.location.lat(), 6) +"," + String(gps.location.lng(), 6);
LINE.notify(message);
}
long microsecondsToCentimeters(long microseconds) {
return microseconds / 29 / 2;
}
การทดลองส่วนที่ 1 คือ การทดลองในส่วนการแสดงผลผ่านตัวหน้าจอ LCD
ผลการทดลองที่ได้
การทดลองที่ 2 การส่งการแจ้งเตือนมายัง Line
ผลการทดลองที่ได้
7.สรุปผลการทดลองและข้อเสนอแนะ
สรุปผลการทดลอง การทำงานของตัวถังขยะแสดงผลผ่านตัวจอ LCD นั้นจะมีการแสดงข้อความ 2 อย่างคือการเปิดและปิดตัวฝาถังขยะ,เตือนว่าตัวถังขยะนั้นเต็มแล้ว แล้วก็ยังมีการส่งการแจ้งเตือนมายังตัวแอพ Line โดยจะแจ้งเตือนอยู่ 2 อย่างคือ ส่งตำแหน่งตัวถังขยะ,เตือนว่าตัวถังขยะนั้นเต็มแล้ว
ข้อเสนอะแนะ
- ควรถังให้ตัวถังขยะนั้นอยู่ในที่โล้งเพื่อได้หาตัวถังขยะนั้นได้อย่างแม่นยำ
- ควรเพิ่มลูกเล่นเป็นมิตรกับผู้ใช้งาน
8.ข้อมูลอ้างอิง
8.1 ต้นฉบับ A. Mohamed, Y. ElSayed, H. Mahasneh, WM Rohouma และ AA Otoom, “ถังขยะอัจฉริยะสำหรับเมืองอัจฉริยะ” การประชุมนานาชาติครั้งที่ 1 เรื่องนวัตกรรมขั้นสูงในเมืองอัจฉริยะ ( ICAISC) ประจำปี 2023เจดดาห์ ซาอุดีอาระเบีย 2023 สืบค้นจาก
8.2 Servo motorr สอนใช้งาน ESP32 ES08MA Servo หมุนแบบ 0-180 องศา สืบค้นจาก
8.3 LCD สอนใช้งาน ESP32 2004 LCD 20×4 โมดูลจอแสดงผล LCD พร้อม I2C Interface สืบค้นจาก