#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_SDA 21
#define OLED_SCL 19
#define OLED_RESET -1 // Reset pin not used in this example
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET); // Create display object
#define ECHO_PIN1 15
#define TRIG_PIN1 2
#define ECHO_PIN2 5
#define TRIG_PIN2 18
#define ECHO_PIN3 26
#define TRIG_PIN3 27
int LEDPIN1 = 13;
int LEDPIN2 = 12;
int LEDPIN3 = 14;
void setup() {
Serial.begin(115200);
if (!display.begin(0x3C, OLED_SDA, OLED_SCL))
{
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.display(); // Show initialization message
delay(2000); // Pause for 2 seconds
display.clearDisplay();
display.display();
pinMode(LEDPIN1, OUTPUT);
pinMode(TRIG_PIN1, OUTPUT);
pinMode(ECHO_PIN1, INPUT);
pinMode(LEDPIN2, OUTPUT);
pinMode(TRIG_PIN2, OUTPUT);
pinMode(ECHO_PIN2, INPUT);
pinMode(LEDPIN3, OUTPUT);
pinMode(TRIG_PIN3, OUTPUT);
pinMode(ECHO_PIN3, INPUT);
}
float readDistance1CM() {
digitalWrite(TRIG_PIN1, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN1, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN1, LOW);
int duration = pulseIn(ECHO_PIN1, HIGH);
display.setCursor(0, 20);
display.print("Parking Spot 1: ");
display.println(duration * 0.034 / 2 < 200 ? "Free" : "Occupied");
display.display();
return duration * 0.034 / 2;
}
float readDistance2CM() {
digitalWrite(TRIG_PIN2, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN2, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN2, LOW);
int duration = pulseIn(ECHO_PIN2, HIGH);
display.setCursor(0, 30);
display.print("Parking Spot 2: ");
display.println(duration * 0.034 / 2 < 200 ? "Free" : "Occupied");
display.display();
return duration * 0.034 / 2;
}
float readDistance3CM() {
digitalWrite(TRIG_PIN3, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN3, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN3, LOW);
int duration = pulseIn(ECHO_PIN3, HIGH);
display.setCursor(0, 40);
display.print("Parking Spot 3: ");
display.println(duration * 0.034 / 2 < 200 ? "Free" : "Occupied");
display.display();
return duration * 0.034 / 2;
}
void loop() {
float distance1 = readDistance1CM();
float distance2 = readDistance2CM();
float distance3 = readDistance3CM();
// Check the status of parking spots and display the information
bool isOccupied1 = distance1 < 200;
bool isOccupied2 = distance2 < 200;
bool isOccupied3 = distance3 < 200;
digitalWrite(LEDPIN1, isOccupied1 ? HIGH : LOW);
digitalWrite(LEDPIN2, isOccupied2 ? HIGH : LOW);
digitalWrite(LEDPIN3, isOccupied3 ? HIGH : LOW);
// Display the status of each parking spot on the OLED screen
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.print("Parking Spot 1: ");
display.println(isOccupied1 ? "Occupied" : "Free");
display.print("Parking Spot 2: ");
display.println(isOccupied2 ? "Occupied" : "Free");
display.print("Parking Spot 3: ");
display.println(isOccupied3 ? "Occupied" : "Free");
display.display();
// You can add additional logic here to trigger alerts or notifications as needed.
delay(1000); // Adjust the delay interval as needed.
}