CONTATORE LIQUIDI CON MICROCONTROLLORE

Schema per Realizzare un Contatore per Liquidi in grado di Misurare il Volume e la Portata dell’Acqua con Microcontrollore…

 

 

 

 




 

INTRO

Il seguente schema  utilizza un misuratore di fluidi ad effetto hall  e un microcontrollore per misurare il volume dei liquidi e la portata. È in grado di misurare liquidi come acqua, benzina, olio ecc ecc. Viene utilizzato il misuratore di flusso YF-S201 che invia un segnale ad onda quadra con le seguenti informazioni:

Flusso (litri al minuto) = Frequenza (Hz) / 7.5

Volume liquido (litri) = Fronti di salita contati / 450

Quindi misurando la frequenza è possibile avere informazioni sul flusso mentre contando gli impulsi di clock è possibile misurare il volume, ovvero i litri.

Il codice è molto semplice, misura la frequenza e il numero di impulsi di clock e li visualizza su un display LCD, come funzione di controllo dei consumi. Questo codice può essere usato per controllare una elettrovalvola e staccare il flusso di acqua quando si raggiunge un certo valore, funzione utile ad esempio in un sistema di irrigazione automatica.
 




 

CODICE

Il codice è il seguente:

sbit LCD_RS at RB2_bit;                            //Connessione LCD
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;

unsigned short int i, Portata = 0;                //inizializzazione variabili
unsigned int Cont, litro, Vol_acqua = 0;
char txt[7];

void EXT_INT() iv 0x0008 ics ICS_AUTO {           //interrupt per la lettura contatore
  if( i==7){                                      //Se i = 7 resetta il contatore  e la variabile i
    i = 0;
    Cont = 0;
  }
  if(i == 0){                                     //Se i = 0 misura la portata
    while((PORTB.F1==1) && (Cont < 12001)){       //Misura la Portata ogni 7 impulsi
    Cont++;
    }
  }
  litro ++ ;                                      //Incrementa la variabile litro ad ogni impulso
  i++;                                            //incrementa i

  if(litro == 450){
    Vol_acqua ++;                                 //Se litro raggiunge 450 vuol dire che è il volume è un litro
    litro = 0;                                    //Incrementa il volume di acqua
  }
 INTCON3.INT1IF = 0;
}


void main() {                                      //Programma principale
  Lcd_Init();                                      //Inizializza LCD
  Lcd_Cmd(_LCD_CURSOR_OFF);                        //Spegni cursore
  Lcd_Cmd(_LCD_CLEAR);                             //pulisci LCD

  TRISB.B1 = 1;                                    //pin di ingresso
  RCON.IPEN = 0;                                   //disabilito la priorità degli interrupt
  INTCON.GIE = 1;                                  //attivo gli interrupt
  INTCON2.INTEDG1 = 1;                             //interrupt sul fronte di salita
  INTCON3.INT1IE = 1;
  
  Vol_acqua = 0;

  while(1){                                        //Ciclo infinito
    Lcd_Out(1, 1, "Litri:          ");             //Visualizza a schermo i valori dei litri
    IntToStr(Vol_acqua, txt);
    Lcd_Out(1, 7, txt);
    Portata = 12000/Cont;                          //Portata = 12000 diviso il conteggio
    Lcd_Out(2, 1, " L/min:");                      //Visualizza a schermo i valori di portata
    IntToStr(Portata, txt);
    Lcd_Out(2, 7, txt);
  }
}

Prima di tutto si vanno a definire le connessioni tra il microcontrollore e il display LCD, poi si vanno ad inizializzare le variabili per la portata, il volume dell’acqua e il testo per la visualizzazione.

Si utilizza un interrupt che si attiva ad ogni fronte di salita del segnale proveniente dal misuratore. Si è deciso di misurare la portata ogni 7 impulsi, quindi si usa la variabile i per capire quale impulso è. Se i=7 allora si azzera la variabile usata per misurare la frequenza e si azzera la variabile i. Se i=0 quindi si aspetta per tutto il periodo alto del segnale e si incrementa conta, in modo tale da misurare mezzo periodo. Poi si incrementa la variabile litri e ogni qual volta è uguale a 450 si incrementa la variabile del volume dell’acqua. Finito l’interrupt si resetta il flag dell’interrupt.

Nel programma principale si inizializza l’LCD, si inizializza l’ingresso del sensore e si inizializza l’interrupt. Nel ciclo infinito si visualizza la stringa “LITRI”, si convertono i litri in stringa e poi si visualizza il valore dei litri. Si fa la stessa cosa per la portata, solo che la portata è uguale a 12000 fratto la variabile contata.

Si utilizza una frequenza di 8MHz, se si varia il quarzo bisogna variare anche il valore 12000 e in particolare si va a moltiplicare per il valore del quarzo che si usa fratto 8, ovvero se uso un quarzo da 4MHz allora avrò 12000 x (4/8) = 6000, quindi non uso più 12000 come variabile per trovare la portata ma uso 6000 se si ha un quarzo a 4MHz.

I fuses sono così settati:


 

SCHEMA

Lo schema è il seguente:

La tensione di alimentazione è pari a 5V con tensione continua e stabilizzata, e servono almeno 50mA per il funzionamento del circuito. C3 serve per filtrare la tensione di alimentazione.  La tensione positiva giunge al microcontrollore al pin 20, al positivo del contatore, al display LCD e inoltre tramite una resistenza da 470 Ohm giunge alla retroilluminazione del diplay.

Il display è connesso alle PORTB a partire da PB2 fino a PB7, tutti gli altri pin non connessi sono messi a massa, inoltre al display è connessa una resistenza variabile per settare il contrasto.  Al pin MCLR viene messa una resistenza di pull-up per evitare che il microcontrollore si resetti e al pin 8 e 19 vi è connessa la massa.

Il misuratore invia a PB1 il segnale del conteggio mentre C1, C2 e X1 formano il circuito risuonatore per generare il clock interno al microcontrollore.

Lo schema montato su breadboard ha il seguente aspetto:

 

DOWNLOAD

Potete scaricare la simulazione del circuito con PROTEUS e i codici scritti con MIKROC al seguente LINK!!!




 

[Voti Totali: 0 Media Voti: 0]
Segui la Nostra Pagina Facebook: Facebook

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *