#include <LiquidCrystal.h>
// Pin per il sensore ad ultrasuoni
const int trigPin = 2;
const int echoPin = 3;
// Pin per il flussometro (cambiato da 4 a 10)
const int flowMeterPin = 10;
// Pin per il buzzer (cambiato da 5 a 11)
const int buzzerPin = 11;
// Pin per il pulsante di reset
const int resetButtonPin = 12;
// Altezza dell'acqua quando il recipiente è pieno (in centimetri)
const float fullHeight = 65.0;
// Offset del sensore ad ultrasuoni (in centimetri)
const float ultrasonicOffset = 9.0;
// Capacità totale del recipiente (in litri)
const float totalCapacity = 1000.0;
// Variabile volatile per tenere traccia dello stato del flussometro
volatile int flowRate = 0;
// Inizializza il display LCD 16x2
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {
lcd.begin(16, 2);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(flowMeterPin, INPUT_PULLUP); // Flussometro con resistenza di pull-up interna
pinMode(buzzerPin, OUTPUT);
pinMode(resetButtonPin, INPUT_PULLUP); // Pulsante di reset con resistenza di pull-up interna
}
void loop() {
// Misura la distanza con il sensore ad ultrasuoni
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
float duration = pulseIn(echoPin, HIGH);
float distance = (duration / 2) * 0.0343 - ultrasonicOffset;
// Calcola la percentuale di capacità
float capacityPercent = map(distance, 0, fullHeight, 0, 100);
capacityPercent = constrain(capacityPercent, 0, 100);
// Leggi lo stato digitale del flussometro
int flowMeterState = digitalRead(flowMeterPin);
// Se il flussometro è attivo (segnale basso), imposta il flusso in ingresso
if (flowMeterState == LOW) {
flowRate = 6.6; // Valore di esempio (da adattare al tuo flussometro)
} else {
flowRate = 0.0; // Flusso nullo se il flussometro è inattivo
}
// Calcola il volume di acqua mancante
float missingVolume = (totalCapacity * (100.0 - capacityPercent)) / 100.0;
// Calcola il flusso in litri al secondo
float flowRatePerSecond = flowRate / 60.0;
// Calcola il tempo necessario in secondi
float timeInSeconds = missingVolume / flowRatePerSecond;
// Converti il tempo in minuti
float timeInMinutes = timeInSeconds / 60.0;
// Visualizza i dati sul display LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Cpt:");
lcd.print(capacityPercent);
lcd.print("%");
lcd.print("T:");
lcd.print(timeInMinutes);
lcd.print("M");
lcd.setCursor(0, 1);
lcd.print("flw:");
lcd.print(flowRatePerSecond);
// Suona il buzzer se la capacità raggiunge il 99%
if (capacityPercent >= 99) {
digitalWrite(buzzerPin, HIGH);
} else {
digitalWrite(buzzerPin, LOW);
}
// Reset del buzzer tramite il pulsante
if (digitalRead(resetButtonPin) == LOW) {
digitalWrite(buzzerPin, LOW);
}
}