#include <LiquidCrystal.h>
#include <math.h>
#define ECHO_SENS1 A2 //iesire semnal senzor ultrasonic
#define TRIG_SENS1 A3 // intrare semnal senzor ultrasonic
#define ECHO_SENS2 A5 //iesire semnal senzor ultrasonic
#define TRIG_SENS2 A4 // intrare semnal senzor ultrasonic
#define W_LED_R 5 // led de functionare a aparatului
#define W_LED_G 3 // led de functinare pompa activa
#define W_LED_B 2 // led albastru
#define BUZZ 4 // pin pt buzzer
#define GLASS_ECHO_SENS 6 // iesire senzor pahar
#define GLASS_TRIG_SENS 13 //intrare senzor pahar
#define PUMP A0 // pin pompa apa
LiquidCrystal lcd(12, 11, 10, 9, 8, 7); //pentru conectarea ecranului LCD
// UNITATE DE MASURA: centimetrii
// EROARE SENZOR: 3mm = 0.3cm
long duration; // citire sezor
float distance; // distanta de la senzor la nivelul apei
int volume;// volum actual de apa in ml si vol anterior
const int bottle_height = 20; //cm inaltimea sticlei
const int bottle_width = 10; //cm latura sticlei (patrat)
const float sens_dist = 3;// cm distanta la care e amplasat senzorul
const float sens_error = 0.3; // cm, eroarea senzorului
float water_lvl; //cm de apa din sticla
void setup()
{
pinMode(TRIG_SENS1, OUTPUT);
pinMode(ECHO_SENS1, INPUT);
pinMode(TRIG_SENS2, OUTPUT);
pinMode(ECHO_SENS2, INPUT); //-> ASIGNARE PINURI
pinMode(W_LED_R, OUTPUT);
pinMode(W_LED_G, OUTPUT);
pinMode(W_LED_B, OUTPUT);
pinMode(BUZZ, OUTPUT);
pinMode(GLASS_TRIG_SENS, OUTPUT);
pinMode(GLASS_ECHO_SENS, INPUT);
pinMode(PUMP,OUTPUT);
Serial.begin(9600);
lcd.begin(16, 2); // APRINDERE ECRAN
lcd.print("CANTITATE APA: "); // AFISARE MESAJ INITIAL
}
long readUltrasonicDistance(int triggerPin, int echoPin)
{
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH); // lasam senzorul sa citeasca distanta 10 ms
delayMicroseconds(15);
digitalWrite(triggerPin, LOW);
return pulseIn(echoPin, HIGH);// returnam distanta masurata
}
void loop() {
duration = (readUltrasonicDistance(TRIG_SENS1, ECHO_SENS1) + readUltrasonicDistance(TRIG_SENS2, ECHO_SENS2)) / 2 ; // citim senzorii
distance = duration / 58; // calculam distanta
water_lvl = bottle_height - (distance - sens_dist); // cantitate actuala de apa
volume = bottle_width * bottle_width * water_lvl ;// volumul de apa in ml (convertire din cm in ml)
// volumul = aria * inaltime (cm cub = ml)
// aria = l * l;
// verificare nivel de apa
if(water_lvl <= 0)
{
lcd.setCursor(0,1);
lcd.print(" REZERVOR GOL ");
analogWrite(W_LED_R, LOW); //oprire LED ROSU
tone(BUZZ, 262, 150);
}
else if (water_lvl < bottle_height - sens_error )
{
analogWrite(W_LED_R, HIGH); //PORNIRE LED ROSU
lcd.setCursor(0,1);
lcd.print(" ");
lcd.print(volume);
lcd.print(" ml ");
}
else
{
lcd.setCursor(0,1);
lcd.print(" REZERVOR PLIN");
analogWrite(W_LED_R, HIGH); //PORNIRE LED ROSU
}
duration = readUltrasonicDistance(GLASS_TRIG_SENS, GLASS_ECHO_SENS); // citim senzorul
distance = duration / 58;
while (distance <= 3 && water_lvl > sens_error)
{
analogWrite(W_LED_R, LOW); // oprire led rosu
lcd.setCursor(0,0);
lcd.print(" ALIMENTARE ");
lcd.setCursor(0,1);
lcd.print(" RECIPIENT ");
analogWrite(W_LED_G, HIGH); // LED VERDE FUNCTIONARE POMPA
digitalWrite(PUMP, HIGH); // pornim pompa
duration = readUltrasonicDistance(TRIG_SENS1, ECHO_SENS1); //+ readUltrasonicDistance(TRIG_SENS2, ECHO_SENS2)) / 2 ; // citim senzorii
distance = duration / 58; // calculam distanta
water_lvl = bottle_height - (distance - sens_dist); // cantitate actuala de apa
duration = readUltrasonicDistance(GLASS_TRIG_SENS, GLASS_ECHO_SENS); // citim sensorul
distance = duration / 58;
}
digitalWrite(PUMP, LOW); // oprim pompa
analogWrite(W_LED_G, LOW); //oprim led
analogWrite(W_LED_R, HIGH); // PORNIM LED ROSU - APARAT FUNCTIONAL
lcd.setCursor(0,0);
delay(50);
lcd.print("CANTITATE APA: "); // resetam ecranul
}