#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Servo.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Servo wiper;
int trigPins[4] = {2, 4, 6, 8};
int echoPins[4] = {3, 5, 7, 9};
int distance[4];
int ledRed = 10;
int ledGreen = 11;
int ledYellow = 12;
int buzzer = 13;
int waterSensor = A0;
int servoPin = A1;
// --------------------
long measureDistance(int trig, int echo) {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
long duration = pulseIn(echo, HIGH);
return duration * 0.034 / 2;
}
int mapDist(int d) {
if (d > 80) d = 80;
if (d < 5) d = 5;
return map(d, 5, 80, 30, 5);
}
void drawSystem() {
display.clearDisplay();
display.drawRect(54, 20, 20, 24, WHITE);
display.drawLine(64, 20, 64, 20 - mapDist(distance[0]), WHITE);
display.drawLine(64, 44, 64, 44 + mapDist(distance[1]), WHITE);
display.drawLine(74, 32, 74 + mapDist(distance[2]), 32, WHITE);
display.drawLine(54, 32, 54 - mapDist(distance[3]), 32, WHITE);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print("F:");
display.print(distance[0]);
display.setCursor(0,10);
display.print("B:");
display.print(distance[1]);
display.display();
}
void setup() {
Serial.begin(9600);
for(int i=0;i<4;i++){
pinMode(trigPins[i], OUTPUT);
pinMode(echoPins[i], INPUT);
}
pinMode(ledRed, OUTPUT);
pinMode(ledGreen, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(buzzer, OUTPUT);
wiper.attach(servoPin);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)){
Serial.println("OLED yok");
while(1);
}
display.clearDisplay();
}
void loop() {
for(int i=0;i<4;i++){
distance[i] = measureDistance(trigPins[i], echoPins[i]);
}
int minDist = distance[0];
for(int i=1;i<4;i++){
if(distance[i] < minDist){
minDist = distance[i];
}
}
if(minDist > 50){
digitalWrite(ledGreen, HIGH);
digitalWrite(ledYellow, LOW);
digitalWrite(ledRed, LOW);
noTone(buzzer);
}
else if(minDist > 20){
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, HIGH);
digitalWrite(ledRed, LOW);
tone(buzzer, 1000, 200);
}
else{
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledRed, HIGH);
tone(buzzer, 2000);
}
int waterValue = analogRead(waterSensor);
if(waterValue > 500){
wiper.write(0);
delay(200);
wiper.write(180);
delay(500);
}
drawSystem();
delay(120);
}