Operácie

Metánový senzor

Z SensorWiki

Verzia z 08:24, 16. máj 2019, ktorú vytvoril Balogh (diskusia | príspevky)
(rozdiel) ← Staršia verzia | Aktuálna úprava (rozdiel) | Novšia verzia → (rozdiel)
Balogh: opis senzora samotného a princípu co vlastne meria úplne absentuje
        program samotný je OK, ale chýbajú komentáre v mnohých castiach programu


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.
Fart.jpg


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 koncentrácie metánu prekročí určitý limit z rozsahu 0-1023 (výstup z 10-bitového A-D prevodníka v Arduine), displej vypíše správu o zaregistrovaní metánu:

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

Priebeh signálu I2C

Sig.jpg

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

Fartsen.jpg

Schéma zapojenia displeja

Zapojenie313.jpg

zapojenie zbernice I2C

I2Cfart.jpg

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.

#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);
    }   
}

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ť vypisovaním do sériového portu.

Na použitie displeja ho treba zapojiť podla obrázka, ale potenciometer a kondenzátor môžte vynechať. Ak použijete priložený program spolu so senzorom, budete na displeji vidieť vyhodnotenie.

Na sledovanie koncentrácie metánu v okolí senzora môžeme použiť sériový zapisovať programu Arduino IDE. Pomocou neho sú vizualizované dáta prichádzajúce na sériový port do počítača pripojeného k Arduinu. Na osi Y je hodnota zo senzora a na osi X je poradie nameraného údaju.

Prahovú hodnotu hodnoty z 10-bitového prevodníka, ktorá značí koncentráciu metánu, sme stanovili na 300, pretože ju dokážeme dosiahnuť dýchaním teplého vzduchu priamo na senzor a túto hodnotu v rámci nášho pozorovania v relatívne ustálených podmienkach samovoľne údaj zo senzora neprekročil.

V prvom grafe vidíme výstup zo senzora bez aktívnej interakcie s ním (bol iba položený na stole počas cvičenia). Skokové zmeny nameranej hodnoty sú náhodné (môžu byť napr. výsledkom vydýchnutia vzduchu smerom blízko ku senzoru. Vidíme, že nameraná hodnota pozvoľne stúpa, pred koncom merania však pomerne prudko klesla, keď v miestnosti niekto otvoril okno.

Graf01.jpg

V druhom grafe vidíme výsledok aktívnej interakcie so senzorom (vydýchnutie teplého vzduchu na senzor), v grafe sú v týchto momentoch zreteľné skokové zmeny v nameranej hodnote.

Graf02.jpg

Vypisovanie textu, keď prahová hodnota koncentrácie metánu nie je prekročená.

FartOff.jpg

Vyhodnotenie prekročenia prahovej hodnoty na displeji.

FartOn.jpg

Späť na zoznam projektov...