Operácie

Metánový senzor: Rozdiel medzi revíziami

Zo stránky SensorWiki

Riadok 53: Riadok 53:
/* A nezabudnite zdroják hojne komentovať  */
/* A nezabudnite zdroják hojne komentovať  */


int main(void) {
#include <Wire.h>             
      
#define I2CadrLCD 0x3A         
     printf("Hello, World!\n");
                   
     return(0);
//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 z 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

  1. Zapojte metánový "Fart" senzor a načítavajte hodnoty z neho.
  2. Vyhodnoťte načítanú hodnotu a vypíšte na displej.


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 prekročí určitý limit z rozsahu 0-1023 displej vypíše správu o zaregistrovaní metánu:

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

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

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


Späť na zoznam projektov...