#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#define trig 7
#define echo 6
#define red 4
#define yell 3
#define green 2
#define buzz 5
#define m1 8
#define m2 9
#define servoPin 9
LiquidCrystal_I2C lcd(0x27,16,2);
Servo gate;
void gL(){
digitalWrite(red, LOW);
digitalWrite(yell, LOW);
digitalWrite(green, HIGH);
}
void yL(){
digitalWrite(red, LOW);
digitalWrite(yell, HIGH);
digitalWrite(green, LOW);
}
void rL(){
digitalWrite(red, HIGH);
digitalWrite(yell, LOW);
digitalWrite(green, LOW);
}
void beep(){
for(int i = 0; i < 3; i++){ //beep 3 times
tone(buzz,440);
delay(100);
noTone(buzz);
delay(100);
}
}
void noTurn(){
gate.write(0);
}
void openD(){
gate.write(180);
}
void setup()
{
pinMode(trig, OUTPUT);
pinMode(red, OUTPUT);
pinMode(yell, OUTPUT);
pinMode(green, OUTPUT);
pinMode(buzz, OUTPUT);
pinMode(m1, OUTPUT);
pinMode(m2, OUTPUT);
pinMode(echo, INPUT);
gate.attach(servoPin);
Serial.begin(9600);
lcd.init();
lcd.backlight();
}
void loop()
{
//trig
digitalWrite(trig, HIGH);
delay(100);
digitalWrite(trig, LOW);
//echo
int duration = pulseIn(echo,HIGH);
int distance = (duration/2)/29.1;
//display on serial monitor
Serial.print(distance);
Serial.println("cm");
//display water level
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Nivel de Agua:");
lcd.setCursor(0,1);
lcd.print(100-distance);
//Controlling LED
if (distance > 50){
noTone(7);
noTurn();
gL();
}
else if (distance > 10 && distance < 50){
noTone(7);
noTurn();
yL();
}
else if(distance < 10){ // danger level
beep();
rL();
openD();
}
}