Metánový senzor: Rozdiel medzi revíziami
Z SensorWiki
(→Algoritmus a program) |
(→Algoritmus a program) |
||
Riadok 53: | Riadok 53: | ||
/* A nezabudnite zdroják hojne komentovať */ | /* A nezabudnite zdroják hojne komentovať */ | ||
− | int | + | #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> | </source> |
Verzia zo dňa a času 12:50, 8. máj 2019
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 prekročí určitý limit z rozsahu 0-1023 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 Vyberte podstatné časti zdrojového kódu, použite na to prostredie source:
/* A nezabudnite zdroják hojne komentovať */
#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: serial.h a main.c
Overenie
Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí, ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje). Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji, odfotografujte ho.
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.