Operácie

Metánový senzor

Zo stránky SensorWiki

Autori: Bc. Martin Kudri, Bc. Róbert Moravčík
Študijný odbor: Aplikovaná mechatronika a elektromobilita 1. Ing. (2019)

Zadanie

  1. Zapojte metánový "Fart" senzor a načítavajte hodnoty z neho.
  2. Vyhodnoťte načítanú hodnotu a vypíšte na displej.


Literatúra:

  • datasheet dispeja [1]
  • datasheet senzora [2]

Analýza

Metánový senzor je zapojený sériovo do arduina displej je zapojený do arduina cez I2C zbernicu ak hodnota prekročí určitý limit z rozsahu 0-1023 displej vypíše správu o zaregistrovaní metánu:

  • informácie a zapojenie displeja [3]
  • informácie o senzore [4]

Priebeh signálu I2C

Popis riešenia

Senzor je pripojili na sériový port arduina z 10 bitového prevodníka dostávame hodnotu 0-1023 zodpovedajúcu nameranému obsahu metánu.

Schéma zapojenia snímača

Schéma zapojenia displeja

zapojenie zbernice I2C

Algoritmus a program

Algoritmus načíta hodnotu z metánového senzoru ktorú vyhodnotí a cez zbernicu I2C pošle korešpondujúcu správu na displej Vyberte podstatné časti zdrojového kódu, použite na to prostredie source:

#include <Wire.h>               
#define I2CadrLCD 0x3A          
                     
//riadkove vypisy          
String TXTstrg1 = "Iniciali-";  
String TXTstrg2 = "zujem";
String TXTstrg3 = "displej";
String TXT_nic = "Necitim nic";
String TXT_prd1 = "FUJ!";
String TXT_prd2 = "Ty si si";
String TXT_prd3 = "prdol!";

int ArduSensorValue; //analogova hodnota zo senzora
int fuj = 1; //aktivacna premenna zmeny vypisu 

void display_init () { //donastavenie disleja, pockanie kym uplne nabehne
     cursor_on(0);
     delay(2000);
}

void setup () {
   Wire.begin ();                                  
   Wire.setClock (100000L);
   init_LCD ();                                    
   clear_display ();                               
   Serial.begin(9600);
   display_init ();                                 
}

void init_LCD () { //inicializacia displeja - zaciatok komunikacie a priprava na zobrazovanie dat
   Wire.beginTransmission (I2CadrLCD);
   Wire.write (0x00);                              
   Wire.write (0x2E);                             
   Wire.write (0x0F);                             
   Wire.write (0x06);                             
   Wire.write (0x01);                             
   Wire.endTransmission ();
   delay (20);
}

void clear_display () { //zmazanie vypisaneho textu z displeja
   Wire.beginTransmission (I2CadrLCD);
   Wire.write (0x00);                              
   Wire.write (0x02);                              
   Wire.endTransmission ();
}

void print_TXT (byte z, byte s, String TXTstrg) { //funkcia na vypisanie stringu na displej do riadku z na poziciu s
   set_DDram (z,s);                                
   byte tl = 12-s+1;                               
   if (TXTstrg.length() < tl) tl=TXTstrg.length(); 
 
   Wire.beginTransmission (I2CadrLCD);
   Wire.write (0x40);                              
   for (int b=0; b < tl; b++) {
      Wire.write (0x80 + TXTstrg[b]);              
   }
   Wire.endTransmission ();
}

void set_DDram (byte z,byte s) { //obsluzna funkcia pre vypis na displej
   byte pos; z=z-1; s=s-1;                         
   if (z>2 || s>11) return;                        
 
   Wire.beginTransmission (I2CadrLCD);
   Wire.write (0x00);                              
 
   if (z == 0) pos= 0x00+s;                        
   if (z == 1) pos= 0x20+s;                        
   if (z == 2) pos= 0x40+s;                        
 
   Wire.write (0x80+pos);                          
   Wire.endTransmission ();
}

void clr_line (byte z) { //vymazanie vypisanych dat z displeja z riadku z
   byte pos; z=z-1;
   if (z>2) return;
   Wire.beginTransmission (I2CadrLCD);
   Wire.write (0x00);                              
 
   if (z == 0) pos= 0x00;                          
   if (z == 1) pos= 0x20;
   if (z == 2) pos= 0x40;
 
   Wire.write (0x80+pos);                          
   Wire.endTransmission ();
 
   Wire.beginTransmission (I2CadrLCD);
   Wire.write (0x40);                              
   for (int b=0; b < 12; b++){
      Wire.write (B10100000);                      
   }
   Wire.endTransmission ();
}

void cursor_on (byte on) { //aktivacia/deaktivacia kurzora na displeji
   if (on == 0) on = 0x0E;                         
   else           on = 0x0F;                       
   Wire.beginTransmission (I2CadrLCD);
   Wire.write (0x00);                              
   Wire.write (on);                                
   Wire.endTransmission ();
}

void loop() {
    ArduSensorValue=analogRead(0); //citanie analogovej hodnoty zo senzora
    Serial.println(ArduSensorValue, DEC); //vypisovanie hodnoty do serioveho portu (plotovanie) - mozne zakomentovat
    delay(1500); //perioda kontroly udaju zo senzora 
    if ((ArduSensorValue > 300) && (fuj == 0)) { //ak senzor zaznamena zvysenie koncentracie metanu - zmena vypisovanych udajov na upozornenie "o prde"
        fuj = 1;
        clr_line(1);
        clr_line(2);
        clr_line(3);
        print_TXT(1,5,TXT_prd1);
        delay(400);
        print_TXT(2,3,TXT_prd2);
        delay(400);
        print_TXT(3,4,TXT_prd3);
        delay(2000);
    }
    if ((ArduSensorValue <= 300) && (fuj == 1)) { //ak v predoslom kroku bola zvysena koncentracia metanu, ale uz je v norme - vypnutie upozornenia 
        fuj = 0;
        clr_line(1);
        clr_line(2);
        clr_line(3);
        print_TXT(2,1,TXT_nic);
    }   
}

Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!

Zdrojový kód: program.c

Overenie

Návod: Na použitie senzora ho stačí zapojiť podla obrázka a nahrať priložený program hodnoty sa dajú zobraziť na sériovom porte. Na použitie displeja ho treba zapojiť podla obrázka potenciometer a kondenzátor môžte vynechať ak použijete priložený program spolu so senzorom budete na displeji vidieť vyhodnotenie.

Hodnoty zo sériového portu.

Vyhodnotenie na displeji.

Späť na zoznam projektov...