Operácie

Metánový senzor: Rozdiel medzi revíziami

Z SensorWiki

(Analýza)
 
(29 medziľahlých úprav od jedného ďalšieho používateľa nie je zobrazených)
Riadok 1: Riadok 1:
 +
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'''  
 
|Autori:      || '''Bc. Martin Kudri, Bc. Róbert Moravčík'''  
Riadok 10: Riadok 14:
 
# Vyhodnoťte načítanú hodnotu a vypíšte na displej.
 
# Vyhodnoťte načítanú hodnotu a vypíšte na displej.
  
[http://www.example.com link title]
+
[[Súbor:fart.jpg|center|250px]]
  
[[Súbor:MojObrazok2.jpg|center|300px]]
 
  
[[Médiá:MojZdrojak.c]]
 
  
 +
'''Literatúra:'''
  
'''Literatúra:'''
+
*datasheet dispeja [http://goblack.de/arduino/programme/eat123a-datenblatt.pdf?fbclid=IwAR03_0H5koyMtj3CJJy7HbgZLlTx5Uw0qo8hGoI2T-DbZnNm3E-Cug8UM4c]
* Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.
+
*datasheet senzora [https://www.sparkfun.com/datasheets/Sensors/Biometric/MQ-4.pdf]
  
 
__TOC__
 
__TOC__
Riadok 24: Riadok 27:
 
== Analýza ==
 
== 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:
+
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  
+
* informácie a zapojenie displeja [http://goblack.de/arduino/programme/eat123A-LCD.html?fbclid=IwAR1X5pRi-wOIgnhmt2xRVhqW5suoHZUmcmVavR1WTerP4SeTpm5D6LchUoM]
* obrázok zapojenia vývodov použitej súčiastky
+
* informácie o senzore [https://components101.com/sensors/mq-4-methane-gas-sensor-pinout-datasheet]
* odkaz na katalógový list
+
 
* priebehy dôležitých signálov
+
Priebeh signálu I2C
* este jedna polozka
+
[[Súbor:sig.jpg|center|900px]]
  
 
== Popis riešenia ==
 
== Popis riešenia ==
  
Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru
+
Senzor je pripojili na sériový port Arduina, z 10 bitového prevodníka dostávame hodnotu 0-1023
(nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.  
+
zodpovedajúcu nameranému obsahu metánu.  
  
 
'''Schéma zapojenia snímača'''
 
'''Schéma zapojenia snímača'''
[[Súbor:Zapojenie.png]]
+
[[Súbor:fartsen.jpg|center|500px]]
 +
'''Schéma zapojenia displeja'''
 +
[[Súbor:Zapojenie313.jpg|center|500px]]
  
[[Súbor:Zapojenie313.jpg]]
+
zapojenie zbernice I2C
 +
[[Súbor:I2Cfart.jpg|center|500px]]
  
Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo
+
=== Algoritmus a program ===
nahrať už aspoň 10 študentov.
 
  
[[Súbor:MojObrazok.jpg|center|250px]]
+
Algoritmus načíta hodnotu z metánového senzoru, ktorú vyhodnotí a cez zbernicu
 +
I2C pošle korešpondujúcu správu na displej.
  
=== Algoritmus a program ===
+
<source lang="c">
 +
 
 +
 
 +
#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
  
Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili.
+
void display_init () { //donastavenie disleja, pockanie kym uplne nabehne
Je vhodné nakresliť aspoň hrubú štruktúru programu napríklad vo forme vývojového diagramu.
+
    cursor_on(0);
Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov.
+
    delay(2000);
 +
}
  
Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'':
+
void setup () {
 +
  Wire.begin ();                                 
 +
  Wire.setClock (100000L);
 +
  init_LCD ();                                   
 +
  clear_display ();                             
 +
  Serial.begin(9600);
 +
  display_init ();                               
 +
}
  
<source lang="c">
+
void init_LCD () { //inicializacia displeja - zaciatok komunikacie a priprava na zobrazovanie dat
/* A nezabudnite zdroják hojne komentovať  */
+
  Wire.beginTransmission (I2CadrLCD);
 +
  Wire.write (0x00);                             
 +
  Wire.write (0x2E);                           
 +
  Wire.write (0x0F);                           
 +
  Wire.write (0x06);                           
 +
  Wire.write (0x01);                           
 +
  Wire.endTransmission ();
 +
  delay (20);
 +
}
  
int main(void) {
+
void clear_display () { //zmazanie vypisaneho textu z displeja
   
+
  Wire.beginTransmission (I2CadrLCD);
    printf("Hello, World!\n");
+
  Wire.write (0x00);                             
    return(0);
+
  Wire.write (0x02);                            
 +
  Wire.endTransmission ();
 
}
 
}
</source>
 
  
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
+
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 ();
 +
}
  
Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]
+
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 ();
 +
}
  
[[Médiá:MojProgram.c|program.c]]
+
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);
 +
    } 
 +
}
 +
</source>
  
 +
Zdrojový kód: [[Médiá:PRD.c|program.c]]
  
 
=== Overenie ===
 
=== Overenie ===
  
Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí,  
+
Návod:
ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje).
+
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.
Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji,  
+
 
odfotografujte ho.  
+
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.
  
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
+
[[Súbor:graf01.jpg|center|500px]]
  
 +
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.
 +
 +
[[Súbor:graf02.jpg|center|500px]]
 +
Vypisovanie textu, keď prahová hodnota koncentrácie metánu nie je prekročená.
 +
[[Súbor:fartOff.jpg|center|500px]]
 +
Vyhodnotenie prekročenia prahovej hodnoty na displeji.
 +
[[Súbor:fartOn.jpg|center|500px]]
  
 
[[MEMS_projekty#Projekty_2019|Späť na zoznam projektov...]]
 
[[MEMS_projekty#Projekty_2019|Späť na zoznam projektov...]]
  
 
[[Category:MEMS2019]] [[Category:AVR]]
 
[[Category:MEMS2019]] [[Category:AVR]]

Aktuálna revízia z 08:24, 16. máj 2019

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