#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <Keypad.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 = 51;
const int echoPin3 = 53;
const int redPin3 = 33;
const int yellowPin3 = 35;
const int greenPin3 = 37;
Servo servo3;
int lastRotatedPin3 = -1;
const int trigPin4 = 24;
const int echoPin4 = 26;
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {10, 9, 8, 7};
byte colPins[COLS] = {A3, A2, A1, A0};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Payment code (replace with your desired code)
const char correctPaymentCode[] = "555555";
void setup() {
Serial.begin(9600);
lcd.begin(16, 2); // Initialize the LCD
lcd.backlight();
servo1.attach(13);
servo1.write(0);
servo2.attach(12);
servo2.write(0);
servo3.attach(11);
servo3.write(0);
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; // Initialize lastRotatedPin3 here
}
void loop() {
char key = keypad.getKey();
if (key) {
// Handle keypad input if needed
}
int distance1 = getDistance(trigPin1, echoPin1);
int distance2 = getDistance(trigPin2, echoPin2);
int distance3 = getDistance(trigPin3, echoPin3);
int distance4 = getDistance(trigPin4, echoPin4);
Serial.print("Distance 1: ");
Serial.println(distance1);
Serial.print("Distance 2: ");
Serial.println(distance2);
Serial.print("Distance 3: ");
Serial.println(distance3);
Serial.print("Distance 4: ");
Serial.println(distance4);
setColorBasedOnDistance(distance1, servo1, redPin1, yellowPin1, greenPin1, lastRotatedPin1);
setColorBasedOnDistance(distance2, servo2, redPin2, yellowPin2, greenPin2, lastRotatedPin2);
setColorBasedOnDistance(distance3, servo3, redPin3, yellowPin3, greenPin3, lastRotatedPin3);
}
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;
Serial.print("Duration: ");
Serial.print(duration);
Serial.print(" microseconds. Distance: ");
Serial.println(distance);
return distance;
}
void delayWithMillis(int milliseconds) {
unsigned long startMillis = millis();
while (millis() - startMillis < milliseconds) {
// Do nothing, just wait
}
}
void setColorBasedOnDistance(int distance, Servo servo, int redPin, int yellowPin, int greenPin, int &lastRotatedPin) {
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(2000);
for (int angle = 90; angle >= 0; angle--) {
servo.write(angle);
delayWithMillis(10);
}
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, HIGH);
digitalWrite(greenPin, LOW);
delayWithMillis(2000);
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, HIGH);
for (int angle = 0; angle <= 90; angle++) {
servo.write(angle);
delayWithMillis(10);
}
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);
}
if (lastRotatedPin != -1) {
lastRotatedPin = -1;
servo.write(0);
delayWithMillis(10);
}
}