//Stepper: Memindahkan sampah dalam rumah ke luar rumah
#include <Stepper.h>
const int stepsPerRevolution = 200;
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
//Servo Atas: Membuka tutup sampah
#include <Servo.h>
Servo myservo;
int pos = 0;
#define pinServoAtas 2
//Servo Bawah: Membuka jalur pembuangan sampah
Servo myservo2;
#define pinServoBawah 5
//Sensor Ultrasonik: Mengukur jarak tangan ketika akan membuang sampah
float cm;
float inches;
#define pinTrigAtas 3
#define pinEchoAtas 4
long readUltrasonicDistance(int triggerPin, int echoPin)
{
pinMode(triggerPin, OUTPUT); // Clear the trigger
digitalWrite(triggerPin, LOW);
delayMicroseconds(2); //mati selama 2 ms
// Sets the trigger pin to HIGH state for 10 microseconds
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10); //gelombang dikluarkan selama 10 ms
digitalWrite(triggerPin, LOW);
pinMode(echoPin, INPUT); //gelombang ditangkap, data diambil
// Reads the echo pin, and returns
// the sound wave travel time in microseconds
return pulseIn(echoPin, HIGH);
}
//Sensor Berat: Membuang sampah kalau beratnya sudah 3 kg
#include "HX711.h"
#define DT 6
#define SCK 7
HX711 scale;
float calibration_factor = 420;
//LCD
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20 //menampung 20 kolom
#define LCD_LINES 4 //4 baris
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
//LED
#define pinEmpty A3
#define pinFull A2
//Button
#define pinButton 12
bool isButtonActive = false;
void setup() {
// put your setup code here, to run once:
myStepper.setSpeed(60);
myservo.attach(pinServoAtas);
myservo2.attach(pinServoBawah);
Serial.begin(9600);
scale.begin(DT, SCK);
scale.set_scale(calibration_factor);
scale.tare(); //beratnya dibuat ke 0
lcd.init();
lcd.backlight();
pinMode(pinFull, OUTPUT);
pinMode(pinEmpty, OUTPUT);
pinMode(pinButton, INPUT_PULLUP);
}
void loop() {
// put your main code here, to run repeatedly:
cm = 0.0344/2 * readUltrasonicDistance(pinTrigAtas, pinEchoAtas); //rumus ngubah jarak ke cm
myservo.write(pos);
myservo2.write(0);
float weight = scale.get_units(); //ambil data sensor berat
lcd.setCursor(1, 0); //x n y
lcd.print("Berat:");
lcd.setCursor(1, 1);
lcd.print(weight);
lcd.setCursor(6, 1);
lcd.print("kg");
if(cm < 30) {
if(pos < 90) {
for(int x = 0; x < 90; x += 2) {
myservo.write(pos);
delay(15);
pos += 2; //kecepatan mmebuka servo
}
}
} else {
if(pos > 0) {
for(int x= 90; x > 0; x -= 2) {
myservo.write(pos);
delay(15);
pos -= 2;
}
}
if(weight > 3) {
digitalWrite(pinFull, HIGH); //lampu merah nyala karena berat lebih dari 1 kg
digitalWrite(pinEmpty, LOW); // lampu kuning mati
myservo2.write(90);
myStepper.step(-stepsPerRevolution);
myStepper.step(-stepsPerRevolution);
myStepper.step(-stepsPerRevolution);
} else if (weight > 1) {
digitalWrite(pinFull, HIGH); //lampu merah nyala = bobot sudah lebih 1 kg
digitalWrite(pinEmpty, LOW); //lampu kuning mati
isButtonActive = true;
if (isButtonActive && digitalRead(pinButton) == LOW) {
myservo2.write(90); //90 derajat supaya servonya kebuka 90 derajat
myStepper.step(-stepsPerRevolution);
myStepper.step(-stepsPerRevolution);
myStepper.step(-stepsPerRevolution); //minus - supaya arahnya ke kiri, kalo mau arahnya ke kanan diubah +
}
} else {
digitalWrite(pinEmpty, HIGH); //lampu kuning nyala = sampah dibawah 1 kg
digitalWrite(pinFull, LOW); //lampu merah mati
isButtonActive = false;
myservo2.write(0);
}
}
}
//lampu merah akan nyala terus klo berat lebih dari 1 kg
// lampu kuning akan nyala klo berat <= 1 kg