Misuratore livello combustibile caldaia

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

Così da uno sguardo sommario:

intanto correggi la "if... else" da come l'hai scritta tu manca qualche parentesi graffa

Tuo codice:

if( duration > 38000 ) Serial.println( "fuori portata");
else { Serial.print( r ); Serial.println( "cm" );}
Nuovo codice

if( duration > 38000 )
  {
   Serial.println( "fuori portata");
  }
else 
  { 
   Serial.print( r ); 
   Serial.println( "cm" );
  }

Strano che non ti abbia segnalato errori. Qui trovi la sintassi dell' if... else

Se impari a essere più ordinato e ad usare le corrette indentazioni quando scrivi il codice, vedrai che sarà più facile anche la ricerca degli errori.

Ciao

Attilio

grazie per la tua segnalazione, anche se il codice mi si carica e gira correttamente, comunque ho provveduto a scriverlo nel modo corretto.
Ma non hai dato una risposta alla mia domanda

Intanto te l'ho sistemato un po'

#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 SENSORE ULTRASUONI
#define pin_buzzer  10    //ASSEGNAZIONE PIN BUZZER
#define triggerPort  7
#define echoPort     8
long r ;

// ASSEGNAZIONE PIN DISPLAY
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // connessione display (pin)

void setup() {
  pinMode( triggerPort, OUTPUT );
  pinMode( echoPort, INPUT );
 // pinMode( pin_buzzer, OUTPUT );
  Serial.begin( 9600 );
  lcd.begin(16, 2); // imposto il tipo di display (colonne, righe)
  Serial.println( "Sensore ultrasuoni: ");
    // CARATTERI PERSONALI TACCHE
  lcd.createChar(0, TaccaPiena);
  lcd.createChar(1, TaccaVuota);
  lcd.setCursor(0, 0);
  lcd.print("Liv.Combustibile");  // ASSEGNAZIONE SCRITTA PRIMA RIGA
}
void loop() {
  digitalWrite( triggerPort, LOW );   //porta bassa l'uscita del trigger
  digitalWrite( triggerPort, HIGH );    //invia un impulso di 10microsec su trigger
  delayMicroseconds( 10 );
  digitalWrite( triggerPort, LOW );
  long duration = pulseIn( echoPort, HIGH , 10000 ); // 10000 µS = max circa 1,7 metr1
  r = 0.034 * duration / 2;

  // COMANDI DIPLAY VIRTUALE SERIALE
  Serial.print( "durata: " );
  Serial.print( duration );
  Serial.print( " , " );
  Serial.print( "distanza: " );
  Serial.print( r );
  Serial.println( "cm" );
  if ( r > 0 ) {
    lcd.setCursor(0, 1);
    lcd.print("                ");
    int x = map(r, 12, 60, 15, 0);
    for (int i = 0 ; i <= x ; i++ ) {
      lcd.setCursor(i, 1);
      lcd.write(byte(0));
    }
    for (int i = 15 ; i > x ; i-- ) {
      lcd.setCursor(i, 1);
      lcd.write(byte(1));
    }
    if (r >= 60) {     //VARIABILE SUONO BUZZER SERVATOIO VUOTO
      for (int i = 0 ; i < 3 ; i++) {
        tone(pin_buzzer, 4000, 500); //SINTASSI SUONO BUZZER (PIN ARDUINO, FREQUENZA, DURATA)
        delay(1000);
      }
    }
  }
  else {
    lcd.setCursor(0, 1);
    lcd.print("     ERRORE     ");
  }
  delay(3000); // TEMPO LETTURA DEL SENSORE ULTRASUONI
}

Brunello:
Intanto te l'ho sistemato un po'

#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 SENSORE ULTRASUONI
#define pin_buzzer  10    //ASSEGNAZIONE PIN BUZZER
#define triggerPort  7
#define echoPort    8
long r ;

// ASSEGNAZIONE PIN DISPLAY
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // connessione display (pin)

void setup() {
  pinMode( triggerPort, OUTPUT );
  pinMode( echoPort, INPUT );
// pinMode( pin_buzzer, OUTPUT );
  Serial.begin( 9600 );
  lcd.begin(16, 2); // imposto il tipo di display (colonne, righe)
  Serial.println( "Sensore ultrasuoni: ");
    // CARATTERI PERSONALI TACCHE
  lcd.createChar(0, TaccaPiena);
  lcd.createChar(1, TaccaVuota);
  lcd.setCursor(0, 0);
  lcd.print("Liv.Combustibile");  // ASSEGNAZIONE SCRITTA PRIMA RIGA
}
void loop() {
  digitalWrite( triggerPort, LOW );  //porta bassa l'uscita del trigger
  digitalWrite( triggerPort, HIGH );    //invia un impulso di 10microsec su trigger
  delayMicroseconds( 10 );
  digitalWrite( triggerPort, LOW );
  long duration = pulseIn( echoPort, HIGH , 10000 ); // 10000 µS = max circa 1,7 metr1
  r = 0.034 * duration / 2;

// COMANDI DIPLAY VIRTUALE SERIALE
  Serial.print( "durata: " );
  Serial.print( duration );
  Serial.print( " , " );
  Serial.print( "distanza: " );
  Serial.print( r );
  Serial.println( "cm" );
  if ( r > 0 ) {
    lcd.setCursor(0, 1);
    lcd.print("                ");
    int x = map(r, 12, 60, 15, 0);
    for (int i = 0 ; i <= x ; i++ ) {
      lcd.setCursor(i, 1);
      lcd.write(byte(0));
    }
    for (int i = 15 ; i > x ; i-- ) {
      lcd.setCursor(i, 1);
      lcd.write(byte(1));
    }
    if (r >= 60) {    //VARIABILE SUONO BUZZER SERVATOIO VUOTO
      for (int i = 0 ; i < 3 ; i++) {
        tone(pin_buzzer, 4000, 500); //SINTASSI SUONO BUZZER (PIN ARDUINO, FREQUENZA, DURATA)
        delay(1000);
      }
    }
  }
  else {
    lcd.setCursor(0, 1);
    lcd.print("    ERRORE    ");
  }
  delay(3000); // TEMPO LETTURA DEL SENSORE ULTRASUONI
}

ti ringrazio, hai dato una bella ripulita al codice anche se lo hai stravolto non mi sembra più il mio, ci ho messo diverse ore per compilarlo essendo un principiante.
Saresti cosi gentile da illustrarmi oppure indicarmi dove sbaglio per il discorso buzzer, non per altro è per capire non mi piace fare semplicemente copia ed incolla, anche se sto cercando di leggere il tuo e capire le differenze con il mio

purtroppo il problema c'è ancora una volta che inizia a suonare dopo che il serbatoio è pieno non si stoppa

Strano, dovrebbe suonare solo quando >60cm

prova a modificarlo così, aggiungendo un paio di noTone

 if (r >= 60) {     //VARIABILE SUONO BUZZER SERVATOIO VUOTO
      for (int i = 0 ; i < 3 ; i++) {
        tone(pin_buzzer, 4000, 500); //SINTASSI SUONO BUZZER (PIN ARDUINO, FREQUENZA, DURATA)
        delay(1000);
      }
       noTone(pin_buzzer);
    }
    else {
      noTone(pin_buzzer);
    }
  }
  else {
    lcd.setCursor(0, 1);
    .....................

Brunello:
Strano, dovrebbe suonare solo quando >60cm

prova a modificarlo così, aggiungendo un paio di noTone

 if (r >= 60) {     //VARIABILE SUONO BUZZER SERVATOIO VUOTO

for (int i = 0 ; i < 3 ; i++) {
        tone(pin_buzzer, 4000, 500); //SINTASSI SUONO BUZZER (PIN ARDUINO, FREQUENZA, DURATA)
        delay(1000);
      }
      noTone(pin_buzzer);
    }
    else {
      noTone(pin_buzzer);
    }
  }
  else {
    lcd.setCursor(0, 1);
    .....................

niente non va mi sto impazzendo

up

finalmente sono riuscito a risolvere il problema, in pratica il buzzer nonostante ricevesse valore LOW continuava a suonare perchè c'era circolava in qualche modo ancora corrente al suo interno, quindi inserendo il valore digitalWrite (pin_buzzer, HIGH) ha funzionato. Di seguito vi allego il codice funzionante

#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 SENSORE ULTRASUONI
#define pin_buzzer  10    //ASSEGNAZIONE PIN BUZZER
#define triggerPort  7
#define echoPort     8
long r ;

// ASSEGNAZIONE PIN DISPLAY
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // connessione display (pin)

void setup() {
  pinMode( triggerPort, OUTPUT );
  pinMode( echoPort, INPUT );
  //pinMode( pin_buzzer, OUTPUT );
  Serial.begin( 9600 );
  lcd.begin(16, 2); // imposto il tipo di display (colonne, righe)
  Serial.println( "Sensore ultrasuoni: ");
    // CARATTERI PERSONALI TACCHE
  lcd.createChar(0, TaccaPiena);
  lcd.createChar(1, TaccaVuota);
  lcd.setCursor(0, 0);
  lcd.print("Liv.Combustibile");  // ASSEGNAZIONE SCRITTA PRIMA RIGA
}
void loop() {
  digitalWrite( triggerPort, LOW );   //porta bassa l'uscita del trigger
  digitalWrite( triggerPort, HIGH );    //invia un impulso di 10microsec su trigger
  delayMicroseconds( 10 );
  digitalWrite( triggerPort, LOW );
  long duration = pulseIn( echoPort, HIGH , 10000 ); // 10000 µS = max circa 1,7 metr1
  r = 0.034 * duration / 2;

  // COMANDI DIPLAY VIRTUALE SERIALE
  Serial.print( "durata: " );
  Serial.print( duration );
  Serial.print( " , " );
  Serial.print( "distanza: " );
  Serial.print( r );
  Serial.println( "cm" );
  if ( r > 0 ) {
    lcd.setCursor(0, 1);
    lcd.print("                ");
    int x = map(r, 12, 90, 15, 0);
    for (int i = 0 ; i <= x ; i++ ) {
      lcd.setCursor(i, 1);
      lcd.write(byte(0));
    }
    for (int i = 15 ; i > x ; i-- ) {
      lcd.setCursor(i, 1);
      lcd.write(byte(1));
    }
    if (r >= 90) {     //VARIABILE SUONO BUZZER SERVATOIO VUOTO
      for (int i = 0 ; i < 6 ; i++) {
        tone(pin_buzzer, 4000, 500); //SINTASSI SUONO BUZZER (PIN ARDUINO, FREQUENZA, DURATA)
        delay(1000);
      }
       //noTone(pin_buzzer);
       digitalWrite(pin_buzzer,HIGH);
    }
    else {
      //noTone(pin_buzzer);
      digitalWrite(pin_buzzer,HIGH);
    }
  }
  else {
    lcd.setCursor(0, 1);
    lcd.print("     ERRORE     ");
  }
  delay(3000); // TEMPO LETTURA DEL SENSORE ULTRASUONI
}

adesso devo capire due cose fondamentali:

  1. La variabile r è stata scritta per una temperatura di circa 20 gradi, invece nel mio locale caldaia ci sono circa 30/35 gradi quindi bisogna sicuramente modificarla.

  2. Ho ordinato dei moduli WIFI ES8266 da installare su i due arduino 1=TX ed il 2=RX, adesso devo capire come farli comunicare in modo tale che il PRIMO TX che sta nel locale caldaia manda i dati al SECONDO RX che sta la piano superiore che sono connessi a due wifi diverse ma sempre connesse allo stesso router.

Up

eddie84:
Up

Ti ho risposto su megatopic non parlare della stessa cosa su due post aperti perché viene segnalato come crossposting.
Ciao
Enzo

Allora ho configurato le due schede ESP8266 e connesse alla wifi adesso devo far in modo di inviare i dati dal arduino trasmettitore nel locale caldaia e farli ricevere dall'arduino ricevitore al piano di sopra. Consigli su come fare?

eddie84:
Allora ho configurato le due schede ESP8266 e connesse alla wifi adesso devo far in modo di inviare i dati dal arduino trasmettitore nel locale caldaia e farli ricevere dall'arduino ricevitore al piano di sopra. Consigli su come fare?

Cosa NON ti è chiaro del messaggio n'11?
Fare crossposting è proibito dal REGOLAMENTO!!!

Ci sono 2 grossi problemi:

L' elettronica (ultrasuoni) non é fatta per funzionare in un atmosfera esplosiva piena di vapori di solventi come un serbatoio.

Il secondo peroblema un sensore a ultrasuoni non funziona bene in un ambiente chiuso. Ci sono troppi echi.

Lascia stare il rogetto.
è troppo pericoloso.

Ciao Uwe

>eddie84: Enzo-- ti ha già avvertito DUE volte del cross-posting, alla prossima che posti la stessa domanda nel thread relativo all'ESP e qui (o altrove), chiudo il tuo thread.

Guglielmo

uwefed:
Ci sono 2 grossi problemi:

L' elettronica (ultrasuoni) non é fatta per funzionare in un atmosfera esplosiva piena di vapori di solventi come un serbatoio.

Il secondo peroblema un sensore a ultrasuoni non funziona bene in un ambiente chiuso. Ci sono troppi echi.

Lascia stare il rogetto.
è troppo pericoloso.

Ciao Uwe

il serbatoio è di una normale caldaia a biomassa niente di pericolo allego foto. Per quanto riguarda gli echi lo devo provare adesso è ancora in fase di progettazione. Al posto del sensore ultrasuoni che altro potrei utilizzare?

Non avevi detto che si trattava di pellet.
Allora il pericolo di vapori infiammabili aggressivi non esiste.
Ciao Uwe

uwefed:
Non avevi detto che si trattava di pellet.
Allora il pericolo di vapori infiammabili aggressivi non esiste.
Ciao Uwe

è una policombustibile

Ma dove c'è il serbatoio del pellet, che temperatura hai più o meno?
Non vorrei che il sensore ultrasuoni impazzisse e ti desse dei valori sbagliati una volta assemblato il tutto!!!