#include <Servo.h> //servo library
#include <LiquidCrystal_I2C.h> // if you don´t have I2C version of the display, use LiquidCrystal.h library instead
LiquidCrystal_I2C lcd(0x27,16,2);
Servo servo;
int trigPin = 3;
int echoPin = 4;
int servoPin = 5;
int trigPin2 = 6;
int echoPin2 = 7;
int active = 0;
long duration, dist, average;
long aver[3]; //array for average
long duration2, dist2, average2;
long aver2[3];
int percent;
byte gauge_left[8] = { B11111, B10000, B10000, B10000, B10000, B10000, B10000, B11111}; // left part of empty gauge [
byte gauge_center[8] = { B11111, B00000, B00000, B00000, B00000, B00000, B00000, B11111}; // center part of empty gauge _
byte gauge_right[8] = { B11111, B00001, B00001, B00001, B00001, B00001, B00001, B11111}; // right part of empty gauge ]
byte gauge_fill[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111}; // filled gauge
char buffer[10];
void setup() {
Serial.begin(9600);
lcd.init(); // initialize the 16x2 lcd module
lcd.createChar(0, gauge_left); // create special character on position 0, gauge left [
lcd.createChar(1, gauge_center); // create special character on position 1, gauge center _
lcd.createChar(2, gauge_right); // create special character on position 2, gauge right ]
lcd.createChar(3, gauge_fill); // create special character on position 3, gauge fill █
servo.attach(servoPin);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(echoPin2, INPUT);
pinMode(trigPin2, OUTPUT);
servo.write(0); //close cap on power on
lcd.backlight(); // enable backlight for the LCD module
lcd.setCursor(0,0);
lcd.print("INITIALIZATION");
delay(100);
servo.detach();
}
void measure() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(30);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
dist = (duration / 2) / 29.1; //obtain distance
}
void measure2() {
digitalWrite(trigPin2, LOW);
delayMicroseconds(5);
digitalWrite(trigPin2, HIGH);
delayMicroseconds(30);
digitalWrite(trigPin2, LOW);
pinMode(echoPin2, INPUT);
duration2 = pulseIn(echoPin2, HIGH);
dist2 = (duration2 / 2) / 29.1; //obtain distance
}
void loop() {
for (int i = 0; i <= 2; i++) { //average distance
measure();
aver[i] = dist;
delay(10); //delay between measurements
}
dist = (aver[0] + aver[1] + aver[2]) / 3;
if(active == 0){
for (int i = 0; i <= 2; i++) { //average distance
measure2();
aver2[i] = dist2;
delay(10); //delay between measurements
}
dist2 = (aver2[0] + aver2[1] + aver2[2]) / 3;
percent = ((float)dist2/50.0) * 100.0;
if (percent > 100)
{
percent = 100;
}
Serial.print(percent);
Serial.print("Distance: ");
Serial.println(dist2);
lcd.setCursor(0,0); // move cursor to top left
sprintf(buffer, "LVL:%3d%%", percent); // set a string as CPU: XX%, with the number always taking at least 3 character
lcd.print(buffer); // print the string on the display
// 8 characters to draw the gauge --- ████___]
float cpu_gauge_step = 100.0/8.0; // 100% is the maximum number, gauge is 8 characters wide, calculate one step
for (int i=0; i<8; i++) {
if (percent <= cpu_gauge_step*i) { // value is smaller than step*i, draw "empty" character
if (i==0) {lcd.write(0);} // [ first cell, opening bracket
else if (i==7) {lcd.write(2);} // ] last cell, closing bracket
else {lcd.write(1);} // _ any other cell, lines top and bottom
}
else { // value is bigger than step*i, draw filled character - █
lcd.write(3);
}
}
if (dist < 20) {
//Change distance as per your need
lcd.setCursor(0,1);
lcd.print("TRASH BIN OPEN");
servo.attach(servoPin);
delay(1);
servo.writeMicroseconds(1000);
delay(1000);
servo.detach();
delay(2000);
active++;
}
else if (percent >= 90)
{
lcd.setCursor(0,1);
lcd.print("TRASH BIN FULL!");
}
else
{
lcd.setCursor(0,1);
lcd.print(" AVAILABLE! ");
}
}
else if (active > 0){
if (dist >= 20){
lcd.setCursor(0,1);
lcd.print("TRASH BIN ClOSE");
servo.attach(servoPin);
delay(1);
servo.writeMicroseconds(2000);
delay(1000);
servo.detach();
active = 0;
}
}
}