#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <string.h>
#include <NewPing.h>
const int trigPin1 = 41;
const int echoPin1 = 43;
const int redPin1 = 6;
const int yellowPin1 = 5;
const int greenPin1 = 4;
Servo servo1;
int lastRotatedPin1 = -1;
const int trigPin2 = 47;
const int echoPin2 = 49;
const int redPin2 = 25;
const int yellowPin2 = 27;
const int greenPin2 = 29;
Servo servo2;
int lastRotatedPin2 = -1;
const int trigPin3 = 33;
const int echoPin3 = 35;
const int redPin3 = 37;
const int yellowPin3 = 51;
const int greenPin3 = 53;
Servo servo3;
int lastRotatedPin3 = -1;
const int trigPin4 = 23;
const int echoPin4 = 26;
LiquidCrystal_I2C lcd(0x27, 16, 2);
char expectedPaymentCode[] = "123456"; // Gantilah dengan kode pembayaran yang diinginkan
int checkPassword(char *inputPassword, char *correctPassword) {
return strcmp(inputPassword, correctPassword) == 0;
}
void configureSystem() {
// Setup for Servo 1
servo1.attach(11);
servo1.write(0);
// Setup for Servo 2
servo2.attach(12);
servo2.write(0);
// Setup for Servo 3
servo3.attach(13);
servo3.write(0);
// Setup for LCD
lcd.begin(16, 2);
lcd.print("System Ready");
delay(2000);
lcd.clear();
}
void setup() {
Serial.begin(9600);
configureSystem();
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(redPin1, OUTPUT);
pinMode(yellowPin1, OUTPUT);
pinMode(greenPin1, OUTPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
pinMode(redPin2, OUTPUT);
pinMode(yellowPin2, OUTPUT);
pinMode(greenPin2, OUTPUT);
pinMode(trigPin3, OUTPUT);
pinMode(echoPin3, INPUT);
pinMode(redPin3, OUTPUT);
pinMode(yellowPin3, OUTPUT);
pinMode(greenPin3, OUTPUT);
pinMode(trigPin4, OUTPUT);
pinMode(echoPin4, INPUT);
lastRotatedPin3 = -1;
lcd.backlight();
}
void loop() {
int distance4 = getDistance(trigPin4, echoPin4);
// Menampilkan jarak dari sensor ultrasonik 4 ke terminal
Serial.print("Jarak Anda: ");
Serial.print(distance4);
Serial.println(" cm");
// Memunculkan pesan di terminal untuk memasukkan kode pembayaran
Serial.println("Masukkan kode pembayaran:");
handlePasswordInput();
int distance1 = getDistance(trigPin1, echoPin1);
int distance2 = getDistance(trigPin2, echoPin2);
int distance3 = getDistance(trigPin3, echoPin3);
setColorBasedOnDistance(distance1, servo1, redPin1, yellowPin1, greenPin1, lastRotatedPin1);
setColorBasedOnDistance(distance2, servo2, redPin2, yellowPin2, greenPin2, lastRotatedPin2);
setColorBasedOnDistance(distance3, servo3, redPin3, yellowPin3, greenPin3, lastRotatedPin3);
lcd.backlight();
}
void handlePasswordInput() {
char password[20]; // Array untuk menyimpan password yang dimasukkan
char correctPassword[] = "123456"; // Gantilah dengan password yang diinginkan
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Masukan Kode :");
unsigned long startMillis = millis();
int charCount = 0;
while (millis() - startMillis < 2000) {
// Baca password dari terminal jika tersedia
if (Serial.available() > 0) {
char inputChar = Serial.read();
// Cek jika karakter yang dimasukkan adalah newline (Enter)
if (inputChar == '\n') {
password[charCount] = '\0'; // Akhiri string dengan null terminator
break;
} else {
// Masukkan karakter ke dalam array password
password[charCount] = inputChar;
charCount++;
// Jika melebihi panjang maksimal, batalkan input
if (charCount >= sizeof(password) - 1) {
Serial.println("Panjang kode pembayaran melebihi batas!");
return;
}
}
}
}
// Periksa password
if (checkPassword(password, correctPassword)) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Akses diberikan");
delay(2000);
lcd.clear();
return; // Keluar dari fungsi setelah akses diberikan
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Akses ditolak");
delay(2000);
lcd.clear();
}
}
int getDistance(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
int distance = duration * 0.034 / 2;
return distance;
}
void setColorBasedOnDistance(int distance, Servo servo, int redPin, int yellowPin, int greenPin, int &lastRotatedPin) {
if (distance > 3) {
if (lastRotatedPin != servo.read()) {
digitalWrite(redPin, HIGH);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
for (int angle = 0; angle <= 90; angle++) {
servo.write(angle);
delay(10);
}
delay(1000);
for (int angle = 90; angle >= 0; angle--) {
servo.write(angle);
delay(10);
}
lastRotatedPin = servo.read();
}
} else {
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, HIGH);
digitalWrite(greenPin, LOW);
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, HIGH);
for (int angle = 0; angle <= 90; angle++) {
servo.write(angle);
delay(10);
}
delay(1000);
for (int angle = 90; angle >= 0; angle--) {
servo.write(angle);
delay(10);
}
delay(1000);
if (lastRotatedPin != -1) {
lastRotatedPin = -1;
servo.write(0);
delay(10);
}
}
}