Metánový senzor: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
(24 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 15: | Riadok 19: | ||
'''Literatúra:''' | '''Literatúra:''' | ||
* | |||
*datasheet dispeja [http://goblack.de/arduino/programme/eat123a-datenblatt.pdf?fbclid=IwAR03_0H5koyMtj3CJJy7HbgZLlTx5Uw0qo8hGoI2T-DbZnNm3E-Cug8UM4c] | |||
*datasheet senzora [https://www.sparkfun.com/datasheets/Sensors/Biometric/MQ-4.pdf] | |||
__TOC__ | __TOC__ | ||
Riadok 21: | Riadok 27: | ||
== Analýza == | == Analýza == | ||
Metánový senzor je zapojený sériovo do | 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 [http://goblack.de/arduino/programme/eat123A-LCD.html?fbclid=IwAR1X5pRi-wOIgnhmt2xRVhqW5suoHZUmcmVavR1WTerP4SeTpm5D6LchUoM] | * informácie a zapojenie displeja [http://goblack.de/arduino/programme/eat123A-LCD.html?fbclid=IwAR1X5pRi-wOIgnhmt2xRVhqW5suoHZUmcmVavR1WTerP4SeTpm5D6LchUoM] | ||
Riadok 27: | Riadok 33: | ||
Priebeh signálu I2C | Priebeh signálu I2C | ||
[[Súbor:sig.jpg|center| | [[Súbor:sig.jpg|center|900px]] | ||
== Popis riešenia == | == 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 snímača''' | ||
[[Súbor: | [[Súbor:fartsen.jpg|center|500px]] | ||
'''Schéma zapojenia displeja''' | |||
[[Súbor:Zapojenie313.jpg|center|500px]] | |||
zapojenie zbernice I2C | |||
[[Súbor:I2Cfart.jpg|center|500px]] | |||
=== 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. | |||
<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 | |||
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); | |||
} | |||
} | |||
</source> | |||
Zdrojový kód: [[Médiá:PRD.c|program.c]] | |||
=== Overenie === | === 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. | |||
[[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
- Zapojte metánový "Fart" senzor a načítavajte hodnoty z neho.
- Vyhodnoťte načítanú hodnotu a vypíšte na displej.
Literatúra:
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:
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.
#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.
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.
Vypisovanie textu, keď prahová hodnota koncentrácie metánu nie je prekročená.
Vyhodnotenie prekročenia prahovej hodnoty na displeji.