#include <Servo.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
#define button1 8
#define button2 7
#define button3 2
#define LedH 6
#define LedK 5
#define LedR 4
#define Trig 13
#define Ecc 12
Servo myservo; // create servo object to control a servo
int sensor1; // variabel untuk menyimpan kondisi button1
int sensor2; // variabel untuk menyimpan kondisi button2
int sensor3; // variabel untuk menyimpan kondisi button3
int jarak; // variabel untuk menyimpan data jarak dari sensor ultrasonik
int value; // variabel untuk menyimpan value dari button3
int temp; // variabel untuk menyimpan data temporary
int slide; // variabel untuk menyimpan data/nilai/value dari Slide Potensiometer
void setup() {
Serial.begin(115200);
myservo.attach(10); // attaches the servo on pin 10 to the servo object
pinMode(button1, INPUT_PULLUP); // setup button1 sebagai inputan
pinMode(button2, INPUT_PULLUP); // setup button2 sebagai inputan
pinMode(button3, INPUT_PULLUP); // setup button3 sebagai inputan
pinMode(LedH, OUTPUT); // setup LedH (Led Hijau) sebagai output
pinMode(LedK, OUTPUT); // setup LedK (Led Kuning) sebagai output
pinMode(LedR, OUTPUT); // setup LedR (Led Merah) sebagai output
pinMode(Trig, OUTPUT); // setup Trigger pada sensor ultrasonik sebagai output
pinMode(Ecc, INPUT); // setup Echo pada sensor ultrasonik sebagai input
pinMode(A0, INPUT); // setup untuk pin A0 (Slide Potensiometer) sebagai input
// trigger untuk memutar servo sejauh 180 derajat sebanyak satu kali //
myservo.write(180);
delay(1000);
myservo.write(0);
lcd.init();
}
void loop() {
// memulai mengirimkan gelombang ultrasonik //
digitalWrite(Trig, 1);
delayMicroseconds(10);
digitalWrite(Trig, 0);
// membaca pantulan gelombang ultrasonik //
jarak = pulseIn(Ecc, 1);
jarak = jarak/58; // rumus ketetapan konversi menjadi satuan CM
// separator //
// Fungsi biasa (tanpa delay/Realtime Meassurement) //
slide = analogRead(A0); // membaca nilai analog dari Slider Potensiometer
slide = (slide+1)/64; // Mengubah nilai potensiometer ke rentang 0-16
if (slide == 0) {
slide = 1; // Mencegah nilai potensiometer berada pada nilai 0 (n>=1)
}
sensor1 = digitalRead(button1); // pengisian nilai kedalam variabel sensor1
sensor2 = digitalRead(button2); // pengisian nilai kedalam variabel sensor2
sensor3 = digitalRead(button3); // pengisian nilai kedalam variabel sensor3
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Sensor: ");
lcd.print(jarak);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Derajat: ");
lcd.print(0);
lcd.print(" ");
// Fungsi biasa //
delay(15); // meminimalisir efek jitter
// Fungsi IF dan Else (memiliki delay) //
if (sensor1 == 0) {
digitalWrite(LedK, 1);
for (temp=0;temp<=90;temp+=slide) {
myservo.write(temp);
lcd.setCursor(0,1);
lcd.print("Derajat: ");
lcd.print(myservo.read());
lcd.print(" ");
}
delay(500);
for (temp=90;temp>=0;temp-=slide) {
myservo.write(temp);
lcd.setCursor(0,1);
lcd.print("Derajat: ");
lcd.print(myservo.read());
lcd.print(" ");
}
delay(1000);
digitalWrite(LedK, 0);
} if (sensor2 == 0) {
digitalWrite(LedH, 1);
for (temp=0;temp<=180;temp+=slide) {
myservo.write(temp);
lcd.setCursor(0,1);
lcd.print("Derajat: ");
lcd.print(myservo.read());
lcd.print(" ");
}
delay(500);
for (temp=180;temp>=0;temp-=slide) {
if (temp != 0 && temp <=16) {
temp = 0;
}
myservo.write(temp);
lcd.setCursor(0,1);
lcd.print("Derajat: ");
lcd.print(myservo.read());
lcd.print(" ");
}
delay(1000);
digitalWrite(LedH, 0);
} if (sensor3 == 0) {
value = 1;
} if (value == 1 && jarak <=100) {
digitalWrite(LedR, 1);
for (temp=0;temp<=180;temp+=slide) {
myservo.write(temp);
lcd.setCursor(0,1);
lcd.print("Derajat: ");
lcd.print(myservo.read());
lcd.print(" ");
}
delay(500);
for (temp=180;temp>=0;temp-=slide) {
myservo.write(temp);
lcd.setCursor(0,1);
lcd.print("Derajat: ");
lcd.print(myservo.read());
lcd.print(" ");
}
delay(1000);
digitalWrite(LedR, 0);
value = 0;
}
}