Ciao ho creato un semplice misuratore di livello di combustibile con un sensore ultrasuoi, con le tacche sul diplay LCD ed un buzzer che avvisa dopo che le tacche sono vuote.
Ho aggiunto alla fine del codice un buzzer che deve suonare una volta che viene superata una distanza >=60 il suono dovrebbe durare per un tot tempo oppure fermarsi una volta che la distanza <= 12.
Da come ho scritto il codice, il buzzer parte quando la distanza è stata superata ma non riesco a stopparlo quando il "serbatoio è pieno" ma continua a suonare, l'unico modo è fare il reset sull'arduino.
Vi allego il codice, sicuramente sarà scritto con i piedi ma sono un principiante... GRAZIE
#include <LiquidCrystal.h>
//CREAZIONE DEI DUE CARATTERI SPECIALI: Carattere Tacca Piena e Tacca Vuota
byte TaccaPiena[8] = //RIQUADRO PIENO (TACCA PIENA)
{
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
}; // Array 8x5 bit per la definizione di un singolo carattere
byte TaccaVuota[8] = //RIQUADRO VUOTO (TACCA VUOTA)
{
B11111,
B10001,
B10001,
B10001,
B10001,
B10001,
B10001,
B11111
};
//ASSEGNAZIONE PIN BUZZER
int buzzer = 10;
// ASSEGNAZIONE PIN SENSORE ULTRASUONI
int triggerPort = 7;
int echoPort = 8;
// ASSEGNAZIONE PIN DISPLAY
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// connessione display (pin)
void setup() {
pinMode( triggerPort, OUTPUT );
pinMode( echoPort, INPUT );
Serial.begin( 9600 );
Serial.println( "Sensore ultrasuoni: ");
// CARATTERI PERSONALI TACCHE
lcd.createChar(0, TaccaPiena);
lcd.createChar(1, TaccaVuota);
lcd.begin(16, 2);
// imposto il tipo di display (colonne, righe)
// ASSEGNAZIONE SCRITTA PRIMA RIGA
lcd.print("Liv.Combustibile");
}
void loop() {
// ASSEGNAZIONE PARAMETRI SENSORE ULTRASUONI
//porta bassa l'uscita del trigger
digitalWrite( triggerPort, LOW );
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 );
digitalWrite( triggerPort, LOW );
long duration = pulseIn( echoPort, HIGH );
long r = 0.034 * duration / 2;
// COMANDI DIPLAY VIRTUALE SERIALE
Serial.print( "durata: " );
Serial.print( duration );
Serial.print( " , " );
Serial.print( "distanza: " );
if( duration > 38000 ) Serial.println( "fuori portata");
else { Serial.print( r ); Serial.println( "cm" );}
// posiziono il cursore alla colonna 12 e riga 1
// VARIABILE SE IL SERBATOIO E' AL MASSIMO
if(r <= 12){
lcd.setCursor(0, 1);
lcd.write(byte(0));
lcd.setCursor(1,1);
lcd.write(byte(0));
lcd.setCursor(2,1);
lcd.write(byte(0));
lcd.setCursor(3,1);
lcd.write(byte(0));
lcd.setCursor(4,1);
lcd.write(byte(0));
lcd.setCursor(5,1);
lcd.write(byte(0));
lcd.setCursor(6,1);
lcd.write(byte(0));
lcd.setCursor(7,1);
lcd.write(byte(0));
lcd.setCursor(8,1);
lcd.write(byte(0));
lcd.setCursor(9,1);
lcd.write(byte(0));
lcd.setCursor(10,1);
lcd.write(byte(0));
lcd.setCursor(11,1);
lcd.write(byte(0));
lcd.setCursor(12,1);
lcd.write(byte(0));
lcd.setCursor(13,1);
lcd.write(byte(0));
lcd.setCursor(14,1);
lcd.write(byte(0));
lcd.setCursor(15,1);
lcd.write(byte(0));
}
// VARIABILE SE IL SERBATOIO E' AL 50&
if(r >= 30){
lcd.setCursor(0, 1);
lcd.write(byte(0));
lcd.setCursor(1,1);
lcd.write(byte(0));
lcd.setCursor(2,1);
lcd.write(byte(0));
lcd.setCursor(3,1);
lcd.write(byte(0));
lcd.setCursor(4,1);
lcd.write(byte(0));
lcd.setCursor(5,1);
lcd.write(byte(0));
lcd.setCursor(6,1);
lcd.write(byte(0));
lcd.setCursor(7,1);
lcd.write(byte(0));
lcd.setCursor(8,1);
lcd.write(byte(1));
lcd.setCursor(9,1);
lcd.write(byte(1));
lcd.setCursor(10,1);
lcd.write(byte(1));
lcd.setCursor(11,1);
lcd.write(byte(1));
lcd.setCursor(12,1);
lcd.write(byte(1));
lcd.setCursor(13,1);
lcd.write(byte(1));
lcd.setCursor(14,1);
lcd.write(byte(1));
lcd.setCursor(15,1);
lcd.write(byte(1));
}
// VARIABILE SE IL SERBATOIO E' AL MINIMO
if(r >= 60){
lcd.setCursor(0, 1);
lcd.write(byte(1));
lcd.setCursor(1,1);
lcd.write(byte(1));
lcd.setCursor(2,1);
lcd.write(byte(1));
lcd.setCursor(3,1);
lcd.write(byte(1));
lcd.setCursor(4,1);
lcd.write(byte(1));
lcd.setCursor(5,1);
lcd.write(byte(1));
lcd.setCursor(6,1);
lcd.write(byte(1));
lcd.setCursor(7,1);
lcd.write(byte(1));
lcd.setCursor(8,1);
lcd.write(byte(1));
lcd.setCursor(9,1);
lcd.write(byte(1));
lcd.setCursor(10,1);
lcd.write(byte(1));
lcd.setCursor(11,1);
lcd.write(byte(1));
lcd.setCursor(12,1);
lcd.write(byte(1));
lcd.setCursor(13,1);
lcd.write(byte(1));
lcd.setCursor(14,1);
lcd.write(byte(1));
lcd.setCursor(15,1);
lcd.write(byte(1));
}
//VARIABILE SUONO BUZZER SERVATOIO VUOTO
if(r >= 60){
tone(10,4000,500); //SINTASSI SUONO BUZZER (PIN ARDUINO, FREQUENZA, DURATA)
delay(1000);
tone(10,4000,500); //SINTASSI SUONO BUZZER (PIN ARDUINO, FREQUENZA, DURATA)
delay(1000);
tone(10,4000,500); //SINTASSI SUONO BUZZER (PIN ARDUINO, FREQUENZA, DURATA)
delay(1000);
tone(10,4000,500); //SINTASSI SUONO BUZZER (PIN ARDUINO, FREQUENZA, DURATA)
delay(1000);
tone(10,4000,500); //SINTASSI SUONO BUZZER (PIN ARDUINO, FREQUENZA, DURATA)
delay(1000);
}
//VARIABILE SUONO BUZZER SERVATOIO VUOTO
if(r <= 12){
noTone(10);
}
// TEMPO LETTURA DEL SENSORE ULTRASUONI (DEVE STARE ALLA FINE DEL CODICE)
delay(3000);
}
--- ti rammento che, da regolamento, è permesso sollecitare risposte (fare "up") solo dopo almeno 48 ore dall'ultimo post. - gpb01