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
- Zapojte metánový "Fart" senzor a načítavajte hodnoty z neho.
- Vyhodnoťte načítanú hodnotu a vypíšte na displej.
![](/sensorwiki/images/thumb/8/84/Fart.jpg/250px-Fart.jpg)
Literatúra:
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:
Priebeh signálu I2C
![](/sensorwiki/images/thumb/e/ef/Sig.jpg/900px-Sig.jpg.png)
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
![](/sensorwiki/images/8/80/Fartsen.jpg)
Schéma zapojenia displeja
![](/sensorwiki/images/thumb/d/d8/Zapojenie313.jpg/500px-Zapojenie313.jpg)
zapojenie zbernice I2C
![](/sensorwiki/images/thumb/3/34/I2Cfart.jpg/500px-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 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.
![](/sensorwiki/images/thumb/a/a8/Graf01.jpg/500px-Graf01.jpg.png)
![](/sensorwiki/images/thumb/8/8c/Graf02.jpg/500px-Graf02.jpg.png)
Hodnoty zo sériového portu.
![](/sensorwiki/images/thumb/3/35/FartOn.jpg/500px-FartOn.jpg)
![](/sensorwiki/images/thumb/a/a1/FartOff.jpg/500px-FartOff.jpg)
Vyhodnotenie na displeji.