#include <Wire.h>
#include <Servo.h>
#include <string.h>
#include <NewPing.h>
#include <LiquidCrystal_I2C.h>
const int trigPin = 41;
const int echoPin = 43;
const int redPin = 7;
const int yellowPin = 6;
const int greenPin = 5;
Servo servo;
int lastRotatedPin = -1;
LiquidCrystal_I2C lcd(0x27, 16, 2);
unsigned long previousMillis = 0;
const long interval = 5000; // Interval delay dalam milidetik (ms)
char expectedPaymentCode[] = "123456"; // Gantilah dengan kode pembayaran yang diinginkan
int checkPassword(char *inputPassword, char *correctPassword) {
return strcmp(inputPassword, correctPassword) == 0;
}
// Function prototype
int getDistance(int trigPin, int echoPin);
void setColorBasedOnDistance(int distance, Servo servo, int redPin, int yellowPin, int greenPin, int &lastRotatedPin);
void delayWithMillis(unsigned long duration);
void configureSystem();
void handlePasswordInput();
void setup() {
Serial.begin(9600);
configureSystem();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
lastRotatedPin = -1;
}
void loop() {
unsigned long currentMillis = millis();
int distance1 = getDistance(trigPin, echoPin);
setColorBasedOnDistance(distance1, servo, redPin, yellowPin, greenPin, lastRotatedPin);
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// Memunculkan pesan di terminal untuk memasukkan kode pembayaran
Serial.println("Masukkan kode pembayaran:");
handlePasswordInput();
}
}
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) {
Serial.print("Distance: ");
Serial.println(distance);
if (distance > 7) {
if (lastRotatedPin != servo.read()) {
digitalWrite(redPin, HIGH);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
delayWithMillis(2000);
for (int angle = 0; angle <= 90; angle++) {
servo.write(angle);
delayWithMillis(10);
}
delayWithMillis(1000);
for (int angle = 90; angle >= 0; angle--) {
servo.write(angle);
delayWithMillis(10);
}
delayWithMillis(2000);
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, HIGH);
digitalWrite(greenPin, LOW);
delayWithMillis(2000);
lastRotatedPin = servo.read();
}
} else {
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, HIGH);
delayWithMillis(2000);
for (int angle = 0; angle <= 90; angle++) {
servo.write(angle);
delayWithMillis(10);
}
delayWithMillis(2000);
for (int angle = 90; angle >= 0; angle--) {
servo.write(angle);
delayWithMillis(10);
}
delayWithMillis(1000);
if (lastRotatedPin != -1) {
lastRotatedPin = -1;
servo.write(0);
delayWithMillis(10);
}
}
}
void delayWithMillis(unsigned long duration) {
unsigned long startTime = millis();
while (millis() - startTime < duration) {
// Tidak ada operasi yang dilakukan, program non-blocking
}
}
void configureSystem() {
// Setup for Servo 1
servo.attach(13);
servo.write(0);
// Setup for LCD
lcd.begin(16, 2);
lcd.print("System Ready");
delay(2000);
lcd.clear();
}
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 < 5000) {
// 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();
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Akses ditolak");
delay(2000);
lcd.clear();
}
}