Intelligent Trash Bin for Smart Cities(ถังขยะอัจฉริยะสำหรับเมืองอัจฉริยะ)

ผู้เขียนบทความ : นายธนกฤต แกล้วทนงค์ 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 สืบค้นจาก

https://ieeexplore.ieee.org/document/10085313?fbclid=IwAR0nMLZg3eJ3ZagJ5fIKki9mAjRdfBz706K1082ZF-WBFKYYvWCrtJE5Ews

8.2 Servo motorr สอนใช้งาน ESP32 ES08MA Servo หมุนแบบ 0-180 องศา สืบค้นจาก

https://www.cybertice.com/article/276/%E0%B8%AA%E0%B8%AD%E0%B8%99%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B8%87%E0%B8%B2%E0%B8%99-esp32-es08ma-servo-%E0%B8%AB%E0%B8%A1%E0%B8%B8%E0%B8%99%E0%B9%81%E0%B8%9A%E0%B8%9A-0-180-%E0%B8%AD%E0%B8%87%E0%B8%A8%E0%B8%B2

8.3 LCD สอนใช้งาน ESP32 2004 LCD 20×4 โมดูลจอแสดงผล LCD พร้อม I2C Interface สืบค้นจาก

https://www.cybertice.com/article/718/%E0%B8%AA%E0%B8%AD%E0%B8%99%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B8%87%E0%B8%B2%E0%B8%99-esp32-2004-lcd-20×4-%E0%B9%82%E0%B8%A1%E0%B8%94%E0%B8%B9%E0%B8%A5%E0%B8%88%E0%B8%AD%E0%B9%81%E0%B8%AA%E0%B8%94%E0%B8%87%E0%B8%9C%E0%B8%A5-lcd-%E0%B8%9E%E0%B8%A3%E0%B9%89%E0%B8%AD%E0%B8%A1-i2c-interface

วิดีโอนำเสนอ Intelligent Trash Bin for Smart Cities(ถังขยะอัจฉริยะสำหรับเมืองอัจฉริยะ)

You may also like...

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *