//kotak sampah otomatis
// https://www.youtube.com/@hendrykurniawan
#include <Servo.h>
#define ECHO_PIN 8
#define TRIG_PIN 9
#define PIN_SERVO A0
Servo myservo;
float distance;
void setup()
{
myservo.attach(PIN_SERVO);
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
myservo.write(0);
delay(500);
}
void loop()
{
//Tutup terbuka cepat, tunda beberapa saat, lalu tutup tertutup dengan lambat
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
Serial.print("Jarak: ");
Serial.print(distance);
Serial.println(" cm");
if(distance<=30)
{
//servoSpeed(Servo servo, int sudut, uint8_t Speed)
servoSpeed(myservo, 110, 255); //100 derajat, speed full 255
Serial.println("Kondisi Kotak Sampah Terbuka");
delay(3000);
servoSpeed(myservo, 0, 100); //0 derajat, speeed lambat 100
Serial.println("Kondisi Kotak Sampah Tertutup1");
servoSpeed(myservo, 0, 0); //stop
Serial.println("standbye1");
delay(500);
}
else
{
servoSpeed(myservo, 0, 0); //Stop
Serial.println("standbye2");
delay(500);
}
}
void servoSpeed(Servo servo, int sudut, uint8_t Speed)
{
if(Speed == 0)
{
return;
}
int posisiSekarang = servo.read();
for (int i = posisiSekarang; i != sudut; (posisiSekarang > sudut) ? i-- : i++)
{
servo.write(i);
if (Speed > 174)
{
delayMicroseconds((256 - Speed) * 200);//0.12 detik/60 derajat
}
else
{
delay((uint16_t)(256 - Speed) * 0.2f);//0.12 detik/60 derajat
}
}
servo.write(sudut);
}