Operácie

Senzor CO2: Rozdiel medzi revíziami

Z SensorWiki

 
(40 medziľahlých úprav od jedného ďalšieho používateľa nie je zobrazených)
Riadok 1: Riadok 1:
 +
Balogh: pekny popis senzora, ale netreba sem tahat popis Arduina a i2c zbernice
 +
        software tiez OK, trocha mi chyba nejaky prenos do PC a vizualizacia
 +
 +
 
{|
 
{|
 
|Autor:      || '''Gabriel Križan'''  
 
|Autor:      || '''Gabriel Križan'''  
Riadok 9: Riadok 13:
  
 
= '''Zadanie''' =
 
= '''Zadanie''' =
 +
  
 
Využitím modulov '''CDM7160-C00''' a '''LCD LCM1602C V2.1''' zostavte senzor na meranie koncentrácie CO<sub>2</sub> vo vzduchu.
 
Využitím modulov '''CDM7160-C00''' a '''LCD LCM1602C V2.1''' zostavte senzor na meranie koncentrácie CO<sub>2</sub> vo vzduchu.
  
=== Úlohy ===
+
 
 +
== Úlohy ==
 
* Nájdite si k senzorom datasheet
 
* Nájdite si k senzorom datasheet
 
* Nájdite si schémy zapojenia modulov CDM7160-C00 a LCD LCM1602C V2.1
 
* Nájdite si schémy zapojenia modulov CDM7160-C00 a LCD LCM1602C V2.1
Riadok 20: Riadok 26:
  
 
= '''Komponenty''' =
 
= '''Komponenty''' =
 +
  
 
Na vypracovanie som použil nasledujúce komponenty:
 
Na vypracovanie som použil nasledujúce komponenty:
 
* 1 x CDM7160-C00 Kalibrovaný modul senzoru plynu CO<sub>2</sub>
 
* 1 x CDM7160-C00 Kalibrovaný modul senzoru plynu CO<sub>2</sub>
 
* 1 x LCD LCM1602C V2.1
 
* 1 x LCD LCM1602C V2.1
* 1 x Vývojovú dosku Arduino UNO R3
+
* 1 x Vývojovú dosku ARDUINO UNO REV3
 
* 1 x USB kábel A-B
 
* 1 x USB kábel A-B
 
* Prepojovacie kábliky
 
* Prepojovacie kábliky
 
* Software - Arduino IDE
 
* Software - Arduino IDE
  
== ''CDM7160-C00 Kalibrovaný modul senzoru plynu CO<sub>2</sub>, NDIR 300-5000ppm'' ==
 
  
 +
== CDM7160-C00 Kalibrovaný modul senzoru plynu CO<sub>2</sub>, NDIR 300-5000 ppm ==
  
[[Obrázok:cdm7160-c00.jpg |350px]]
+
 
 +
[[Obrázok:cdm7160-c00.jpg|center|350px]]
 +
::'''Obr. 1:Modul senzoru cdm7160-c00'''
  
  
Riadok 38: Riadok 47:
 
absorpcie infračerveného svetla v jednoznačnej a presne určenej vlnovej dĺžke (v prípade CO<sub>2</sub> je to 4.26 µm). Túto vlnovú dĺžku  
 
absorpcie infračerveného svetla v jednoznačnej a presne určenej vlnovej dĺžke (v prípade CO<sub>2</sub> je to 4.26 µm). Túto vlnovú dĺžku  
 
zabezpečuje presný optický filter (pásmová priepust) infračerveného svetla. Ako referenčné meranie slúži vlnová dĺžka mimo  
 
zabezpečuje presný optický filter (pásmová priepust) infračerveného svetla. Ako referenčné meranie slúži vlnová dĺžka mimo  
absorpčné pásmo (a aby nedochádzalo k interferenciám s ostatnými zložkami v ovzduší), ktoré je zabezpečené taktiež špeciálnym filtrom.  
+
absorpčné pásmo (zároveň aby nedochádzalo k interferenciám s ostatnými zložkami v ovzduší), ktoré je zabezpečené taktiež špeciálnym filtrom.  
 
Miera absorpcie infračerveného svetla je nepriamo úmerná koncentrácii CO<sub>2</sub> v ovzduší. Dlhodobú presnosť merania zabezpečuje špeciálny  
 
Miera absorpcie infračerveného svetla je nepriamo úmerná koncentrácii CO<sub>2</sub> v ovzduší. Dlhodobú presnosť merania zabezpečuje špeciálny  
 
algoritmus bežiaci na mikrokontroléri senzora, ktorý bol vyvinutý firmou FIGARO ENGINEERING.
 
algoritmus bežiaci na mikrokontroléri senzora, ktorý bol vyvinutý firmou FIGARO ENGINEERING.
Princíp fungovania je znázornený na obrázku.
+
Princíp fungovania je znázornený na obrázku č. 2.
  
  
[[Obrázok:cdm7160-c00-NDIR.jpg |350px]]
+
[[Obrázok:cdm7160-c00-NDIR.jpg|center|800px]]
 +
::::'''Obr. 2: Princíp fungovania cdm7160-c00'''
  
 
* [https://www.figaro.co.jp/en/product/feature/cdm7160.html Stránka produktu]
 
* [https://www.figaro.co.jp/en/product/feature/cdm7160.html Stránka produktu]
Riadok 51: Riadok 61:
  
  
== ''LCD LCM1602C V2.1'' ==
+
== LCD LCM1602C V2.1 ==
 +
 
 +
 
 +
LCD LCM1602C V2.1 je klasický 2 riadkový a 16 charakterový LCD displej so zabudovaným ovládačom SPLC780D (alebo ekvivalentným).
 +
 
 +
[[Obrázok:LCD LCM1602C V2.1.png|center|900px]]
 +
::::::::'''Obr. 3:Modul LCD LCM1602C V2.1'''
 +
 
 +
* [https://www.arduino.cc/documents/datasheets/LCDscreen.PDF Technická špecifikácia LCD LCM1602C V2.1]
 +
 
 +
 
 +
== ARDUINO UNO REV3 ==
 +
 
 +
Jedná sa o vývojovú dosku s mikroprocesorom ATmga328P s 32KB Flash pamäte, 1 KB EEPROM, 2KB SRAM pamäte. Dosku je možné programovať pomocou Arduino IDE.
 +
 
 +
[[Obrázok:Arduino_UNO_R3.jpg|center|800px]]
 +
:::::::::'''Obr. 4:Arduino_UNO_R3'''
 +
 
 +
* [https://store.arduino.cc/arduino-uno-rev3 Stránka produktu]
 +
* [https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf Zapojenie dosky ARDUINO UNO REV3]
 +
 
 +
 
 +
= '''Analýza''' =
 +
 
 +
 
 +
Na realizáciu meracieho zariadenia, ktorá bude merať koncentráciu CO<sub>2</sub> vo vzduchu som použil senzorový modul CDM7160-C00 a LCD displej. Na komunikáciu medzi ARDUINO UNO a CDM7160-C00 som využíval zbernicu I<sup>2</sup>C a na prerušenie pin D2.
 +
 
 +
 
 +
== Zbernica I<sup>2</sup>C ==
 +
 
 +
I<sup>2</sup>C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL (serial clock) a SDA (serial data), oba vodiče prenášajú informácie medzi pripojenými zariadeniami. Každé zariadenie je rozpoznané na základe jedinečnej adresy a preto zbernica I<sup>2</sup>C nevyžaduje signál CS (chip select). Linky SDA aj SCL sú pripojené na napájacie napätie pomocou tzv. pullup rezistorov (v mojom prípade na odporúčanie výrobcu som použil 1kΩ rezistory), ktoré zabezpečujú prácu liniek v obidvoch smeroch.
 +
 
 +
[[Obrázok:I2C-pullup.png|center|400px]]
 +
::'''Obr. 5:Zbernica I<sup>2</sup>C a pull-up rezistory'''
 +
 
 +
Komunikácia medzi zariadeniami je typu master - slave. Master je zariadenie ktoré inicializuje prenos dát po zbernici (začína a končí dátový prenos generovaním štart bitu a stop bitu), generuje časový signál, vysiela adresu podriadeného zariadenia. Slave odpovedá iba v prípade, že rozpoznal svoju adresu. Začiatok alebo koniec prenosu je definovaný prechodom dátovej linky z vysokej na nízku úroveň (štart bit) alebo z nízkej na vysokú úroveň (stop bit) kým hodinový signál je na vysokej úrovni. Po štart bite považujú všetky zariadenia zbernicu za zaneprázdnenú. Po príchode stop bitu čakajú zariadenia istý čas a potom považujú zbernicu za voľnú. Každé zariadenie má jedinečnú 7 (v mojom prípade 1101001 čo je 0x69)  alebo 10 bitovú adresu. Programovateľná časť adresy umožňuje použiť na danej zbernici viacero rovnakých zariadení.
  
[[Obrázok:LCD LCM1602C V2.1.png |1000px]]
+
[[Obrázok:I2C-startstop.png|center|400px]]
 +
::'''Obr. 6:Zbernica I<sup>2</sup>C štart - stop podmenky'''
  
= Analýza =
+
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje logickú nulu (0) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.
  
V tejto časti popíšete ako idete daný problém riešiť. Uvediete sem aj všetky potrebné technické údaje,
+
[[Obrázok:I2C-ACCK.png|center|800px]]
ktoré sú potrebné na úspešné vyriešenie projektu. Napríklad:
+
::::::::'''Obr. 7:Zbernica I<sup>2</sup>C potvrdzovací bit'''
  
* popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.)
+
V mojom projekte je doska ARDUINO UNO master a senzor CDM7160-C00 je podriadený (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.
* obrázok zapojenia vývodov použitej súčiastky
 
* odkaz na katalógový list
 
* priebehy dôležitých signálov
 
* este jedna polozka
 
  
= Popis riešenia =
+
* [https://www.nxp.com/docs/en/user-guide/UM10204.pdf Oficiálna špecifikácia I<sup>2</sup>C]
  
Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru
 
(nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.
 
  
'''Schéma zapojenia snímača'''
+
== Prerušenie ==
[[Súbor:Zapojenie.png]]
 
  
[[Súbor:Example.jpg]]
+
Väčšina mikrokontrolérov používa prerušenia. Prerušenia umožňujú reagovať na externé podnety, zatiaľ čo sa hlavná aplikácia venuje svojej činnosti. Externý podnet môže prísť napríklad ako signál na pine, že došlo ku zmene úrovne z low na high, alebo ako signál z časovača. V mojom prípade využijem skutočnosť, že počas merania koncentrácie je na pine CDM7160-C00 č. 8 signál s vysokou úrovňou. Po dokončení merania klesajúca hrana signálu vyvolá cez digitálny vstup č. 2 na doske ARDUINO UNO prerušenie a spustí sa funkcia na vyčítanie údajov zo senzora CO<sub>2</sub>.
  
Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo
 
nahrať už aspoň 10 študentov.
 
  
[[Súbor:MojObrazok.jpg|center|250px]]
+
== Rozhranie senzora CDM7160-C00 ==
 +
 
 +
[[Obrázok:cdm7160-c00-piny.png|center|800px]]
 +
::::::::'''Obr. 8:Rozhranie senzora CDM7160-C00'''
 +
 
 +
'''Parametre:'''
 +
 
 +
* Napájacie napätie: 4,75 až 5,25 V
 +
* Pracovné podmienky (teplota): -30 až +70 °C
 +
* Pracovné podmienky (vlhkosť): 0 až 85% rH
 +
* Presnosť merania koncentrácie: ± 50 ppm v rozsahu 300 až 5000 ppm
 +
* Komunikačné rozhranie: UART/I<sup>2</sup>C
 +
 
 +
'''Základné registre:'''
 +
 
 +
[[Obrázok:Cdm7160-registre.png|center|800px]]
 +
::::::::'''Obr. 9:Registre senzora CDM7160-C00'''
 +
 
 +
'''Komunikácia pomocou I<sup>2</sup>C zbernice:'''
 +
 
 +
Kedže adresa registrov s údajmi o koncentrácii CO<sub>2</sub> nie je na začiatku adresného priestoru, potrebujeme pristupovať na konkrétnu adresu (0x03 a 0x04), aby sme mohli vyčítať údaje. Postupnosť dát po zbernici I<sup>2</sup>C je na obrázku č. 10.
 +
 
 +
[[Obrázok:cdm7160-nahodny-pristup.jpg|center|800px]]
 +
::::::::'''Obr. 10:Náhodný prístup CDM7160-C00'''
 +
 
 +
Údaj o koncentrácii je uložený v dvoch bajtoch v tvare little endian, na adrese 0x03 je dolný bajt a na adrese 0x04 je horný bajt. (obr. 11)
 +
 
 +
[[Obrázok:cdm7160-registre-koncentrácie.jpg|center|800px]]
 +
::::::::'''Obr. 11:Registre cdm7160 s údajmi o koncentrácii'''
 +
 
 +
Hodnota je od 0 po 10000 (DEC) alebo 0 až 2710 (HEX). (obr. 12)
 +
 
 +
[[Obrázok:cdm7160-formát-údajov.jpg|center|800px]]
 +
::::::::'''Obr. 12:Údaje o koncentrácii v registroch'''
 +
 
 +
 
 +
= '''Popis riešenia''' =
 +
 
 +
Na základe získaných informácii o komponentoch som zapojil senzor aj LCD modul do ARDUINO UNO. (obr. 13). Napájanie je realizované pomocou USB kábla typu A-B priamo z počítača (s možnosťou sériového prenosu údajov do počítača). Napájanie je možné realizovať aj z power-banky, získame tým prenosný prístroj na meranie koncentrácie CO<sub>2</sub> vo vzduchu.
 +
 
 +
'''Schéma zapojenia snímača a skutočné vyhotovenie'''
 +
 
 +
[[Súbor:cdm7160-LCD-ARDUINO-new.jpg|center|800px]]
 +
::::::'''Obr. 13:Zapojenie snímača a LCD do dosky ARDUINO ONU'''
 +
 
  
 
== Algoritmus a program ==
 
== Algoritmus a program ==
  
Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili.
+
Samotný program pracuje nasledovne: V programe beží funkcia loop. V každom cykle vyhodnotí či došlo k meraniu koncentrácie (stav_senzora = true), ak áno (po vyvolaní prerušenia a zmene hodnoty stav_senzora z false na true), vyčíta údaje zo senzora a pošle na sériový port a zobrazí na LCD vo forme čísla a pre možnosť rýchleho vyhodnotenia v tvare bargrafu. Hodnotu stav_senzora nastaví na false a čaká na ďalší cyklus.
Je vhodné nakresliť aspoň hrubú štruktúru programu napríklad vo forme vývojového diagramu.  
 
Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov.
 
  
Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'':
 
  
 
<source lang="c">
 
<source lang="c">
/* A nezabudnite zdroják hojne komentovať  */
+
#include <LiquidCrystal.h>
 +
#include <LcdBarGraph.h>
 +
#include <stdio.h>
 +
#include <Wire.h>
  
int main(void) {
+
#define INTERRUPT_PIN 2
      
+
#define LCD_RS_PIN 12
     printf("Hello, World!\n");
+
#define LCD_ENABLE_PIN 11
     return(0);
+
#define LCD_D4_PIN 6
 +
#define LCD_D5_PIN 5
 +
#define LCD_D6_PIN 4
 +
#define LCD_D7_PIN 3
 +
#define LCD_NUM_COLS 16
 +
#define LCD_NUM_ROWS 2
 +
#define ADRESA_CDM_7160 0x69
 +
#define ADRESA_REGISTRA 0x03
 +
 
 +
LiquidCrystal lcd(LCD_RS_PIN, LCD_ENABLE_PIN, LCD_D4_PIN, LCD_D5_PIN, LCD_D6_PIN, LCD_D7_PIN);
 +
LcdBarGraph lbg(&lcd, LCD_NUM_COLS, 0, 1);
 +
 
 +
byte co2_dolnebity = 0;
 +
byte co2_hornebity = 0 ;
 +
int co2_ppm = 0;
 +
volatile bool stav_senzora = false;
 +
char string[8] = {'0', '0', '0', '0', '0', '0', '0', '0'};
 +
void setup() {
 +
  pinMode(INTERRUPT_PIN, INPUT_PULLUP);
 +
  attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), senzor_volny, FALLING );
 +
  Serial.begin(9600);
 +
  Wire.begin();
 +
  co2_dolnebity = 0;
 +
  co2_hornebity = 0;
 +
  lcd.begin(LCD_NUM_COLS, LCD_NUM_ROWS);
 +
  lcd.clear();
 +
  delay(100);
 +
}
 +
void senzor_volny() {
 +
  stav_senzora = true;
 +
}
 +
void loop() {
 +
  if (stav_senzora)
 +
  {
 +
     Wire.beginTransmission(ADRESA_CDM_7160); //adresa zariadenia
 +
     Wire.write(ADRESA_REGISTRA); // adresa registra
 +
    Wire.endTransmission();
 +
    Wire.requestFrom(ADRESA_CDM_7160, 2); //poziadavka na 2 bajty
 +
    co2_dolnebity = Wire.read(); //dolne bity
 +
    co2_hornebity = Wire.read(); //horne bity
 +
    co2_ppm = (co2_hornebity << 8) | co2_dolnebity; //dolne + horne posunute o 8 = vysledok
 +
    Serial.println(co2_ppm); //posli na serial
 +
    if (co2_ppm < 1000)
 +
    {
 +
      sprintf (string, "%d ppm ", co2_ppm);
 +
    }
 +
    else
 +
    {
 +
      sprintf (string, "%d ppm", co2_ppm);
 +
     }
 +
    lcd.setCursor(0, 0);
 +
    lcd.print(string);
 +
    lbg.drawValue((co2_ppm-400), 1200);//minimálna hladina CO2 vo vzduchu je 400 ppm
 +
  }
 +
  stav_senzora = false;
 +
  delay(200);
 
}
 
}
 
</source>
 
</source>
  
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
 
  
Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]
 
  
[[Médiá:MojProgram.c|program.c]]
+
== Overenie ==
  
 +
Po oživení a zapojení do počítača cez sériový port (USB-serial) som zobrazil hodnoty v programe SerialPlot. (Obr. 14)
 +
Na obrázku je vidieť reakcia snímača na zmenu koncentrácie CO<sub>2</sub> vo vzduchu.
  
__TOC__
+
[[Súbor:cdm7160-SerialPlot.jpg|center|600px]]
 +
:::::'''Obr. 14:Hodnoty zo snímača CO<sub>2</sub>'''
  
== Overenie ==
 
  
Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí,
+
='''Literatúra:'''=
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.
 
 
 
=''Literatúra:''=
 
  
 
* http://chillelife.com/ir-spectroscopy/
 
* http://chillelife.com/ir-spectroscopy/
Riadok 125: Riadok 256:
 
* https://www.geotherm.sk/rekuperacna-jednotka/vetranie-meranie-co2/
 
* https://www.geotherm.sk/rekuperacna-jednotka/vetranie-meranie-co2/
 
* https://www.atpjournal.sk/buxus/docs/dokumenty/kniznica_dokumentov/atp_journal_2010_obsahy_cisiel_pdf/08_2010/_08_2010_Analyza_koncentracie.pdf
 
* https://www.atpjournal.sk/buxus/docs/dokumenty/kniznica_dokumentov/atp_journal_2010_obsahy_cisiel_pdf/08_2010/_08_2010_Analyza_koncentracie.pdf
 
+
* https://sk.wikipedia.org/wiki/Arduino
 
+
* https://www.nxp.com/docs/en/user-guide/UM10204.pdf
 
+
* http://www.uamt.fei.stuba.sk/kega/data/mikroradice_KEGA/mpt_p9.pdf
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
+
* https://github.com/prampec/LcdBarGraph
 
+
* https://www.arduinoslovakia.eu/page/prerusenia
 +
* https://hackaday.io/project/5334-serialplot-realtime-plotting-software
 +
__TOC__
  
 
[[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:17, 16. máj 2019

Balogh: pekny popis senzora, ale netreba sem tahat popis Arduina a i2c zbernice
        software tiez OK, trocha mi chyba nejaky prenos do PC a vizualizacia


Autor: Gabriel Križan
Študijný odbor: Aplikovaná mechatronika 1. Ing. (2019)


Zadanie

Využitím modulov CDM7160-C00 a LCD LCM1602C V2.1 zostavte senzor na meranie koncentrácie CO2 vo vzduchu.


Úlohy

  • Nájdite si k senzorom datasheet
  • Nájdite si schémy zapojenia modulov CDM7160-C00 a LCD LCM1602C V2.1
  • Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke
  • Napíšte základný demonštračný program využívajúci vaše funkcie
  • Vymyslite a demonštrujte vhodnú aplikáciu

Komponenty

Na vypracovanie som použil nasledujúce komponenty:

  • 1 x CDM7160-C00 Kalibrovaný modul senzoru plynu CO2
  • 1 x LCD LCM1602C V2.1
  • 1 x Vývojovú dosku ARDUINO UNO REV3
  • 1 x USB kábel A-B
  • Prepojovacie kábliky
  • Software - Arduino IDE


CDM7160-C00 Kalibrovaný modul senzoru plynu CO2, NDIR 300-5000 ppm

Cdm7160-c00.jpg
Obr. 1:Modul senzoru cdm7160-c00


Senzor funguje na základe NDIR (Non-Dispersive InfraRed) spektrometrie. Meranie koncentrácie CO2 je založené na princípe absorpcie infračerveného svetla v jednoznačnej a presne určenej vlnovej dĺžke (v prípade CO2 je to 4.26 µm). Túto vlnovú dĺžku zabezpečuje presný optický filter (pásmová priepust) infračerveného svetla. Ako referenčné meranie slúži vlnová dĺžka mimo absorpčné pásmo (zároveň aby nedochádzalo k interferenciám s ostatnými zložkami v ovzduší), ktoré je zabezpečené taktiež špeciálnym filtrom. Miera absorpcie infračerveného svetla je nepriamo úmerná koncentrácii CO2 v ovzduší. Dlhodobú presnosť merania zabezpečuje špeciálny algoritmus bežiaci na mikrokontroléri senzora, ktorý bol vyvinutý firmou FIGARO ENGINEERING. Princíp fungovania je znázornený na obrázku č. 2.


Cdm7160-c00-NDIR.jpg
Obr. 2: Princíp fungovania cdm7160-c00


LCD LCM1602C V2.1

LCD LCM1602C V2.1 je klasický 2 riadkový a 16 charakterový LCD displej so zabudovaným ovládačom SPLC780D (alebo ekvivalentným).

LCD LCM1602C V2.1.png
Obr. 3:Modul LCD LCM1602C V2.1


ARDUINO UNO REV3

Jedná sa o vývojovú dosku s mikroprocesorom ATmga328P s 32KB Flash pamäte, 1 KB EEPROM, 2KB SRAM pamäte. Dosku je možné programovať pomocou Arduino IDE.

Arduino UNO R3.jpg
Obr. 4:Arduino_UNO_R3


Analýza

Na realizáciu meracieho zariadenia, ktorá bude merať koncentráciu CO2 vo vzduchu som použil senzorový modul CDM7160-C00 a LCD displej. Na komunikáciu medzi ARDUINO UNO a CDM7160-C00 som využíval zbernicu I2C a na prerušenie pin D2.


Zbernica I2C

I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL (serial clock) a SDA (serial data), oba vodiče prenášajú informácie medzi pripojenými zariadeniami. Každé zariadenie je rozpoznané na základe jedinečnej adresy a preto zbernica I2C nevyžaduje signál CS (chip select). Linky SDA aj SCL sú pripojené na napájacie napätie pomocou tzv. pullup rezistorov (v mojom prípade na odporúčanie výrobcu som použil 1kΩ rezistory), ktoré zabezpečujú prácu liniek v obidvoch smeroch.

I2C-pullup.png
Obr. 5:Zbernica I2C a pull-up rezistory

Komunikácia medzi zariadeniami je typu master - slave. Master je zariadenie ktoré inicializuje prenos dát po zbernici (začína a končí dátový prenos generovaním štart bitu a stop bitu), generuje časový signál, vysiela adresu podriadeného zariadenia. Slave odpovedá iba v prípade, že rozpoznal svoju adresu. Začiatok alebo koniec prenosu je definovaný prechodom dátovej linky z vysokej na nízku úroveň (štart bit) alebo z nízkej na vysokú úroveň (stop bit) kým hodinový signál je na vysokej úrovni. Po štart bite považujú všetky zariadenia zbernicu za zaneprázdnenú. Po príchode stop bitu čakajú zariadenia istý čas a potom považujú zbernicu za voľnú. Každé zariadenie má jedinečnú 7 (v mojom prípade 1101001 čo je 0x69) alebo 10 bitovú adresu. Programovateľná časť adresy umožňuje použiť na danej zbernici viacero rovnakých zariadení.

I2C-startstop.png
Obr. 6:Zbernica I2C štart - stop podmenky

Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje logickú nulu (0) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.

I2C-ACCK.png
Obr. 7:Zbernica I2C potvrdzovací bit

V mojom projekte je doska ARDUINO UNO master a senzor CDM7160-C00 je podriadený (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.


Prerušenie

Väčšina mikrokontrolérov používa prerušenia. Prerušenia umožňujú reagovať na externé podnety, zatiaľ čo sa hlavná aplikácia venuje svojej činnosti. Externý podnet môže prísť napríklad ako signál na pine, že došlo ku zmene úrovne z low na high, alebo ako signál z časovača. V mojom prípade využijem skutočnosť, že počas merania koncentrácie je na pine CDM7160-C00 č. 8 signál s vysokou úrovňou. Po dokončení merania klesajúca hrana signálu vyvolá cez digitálny vstup č. 2 na doske ARDUINO UNO prerušenie a spustí sa funkcia na vyčítanie údajov zo senzora CO2.


Rozhranie senzora CDM7160-C00

Cdm7160-c00-piny.png
Obr. 8:Rozhranie senzora CDM7160-C00

Parametre:

  • Napájacie napätie: 4,75 až 5,25 V
  • Pracovné podmienky (teplota): -30 až +70 °C
  • Pracovné podmienky (vlhkosť): 0 až 85% rH
  • Presnosť merania koncentrácie: ± 50 ppm v rozsahu 300 až 5000 ppm
  • Komunikačné rozhranie: UART/I2C

Základné registre:

Cdm7160-registre.png
Obr. 9:Registre senzora CDM7160-C00

Komunikácia pomocou I2C zbernice:

Kedže adresa registrov s údajmi o koncentrácii CO2 nie je na začiatku adresného priestoru, potrebujeme pristupovať na konkrétnu adresu (0x03 a 0x04), aby sme mohli vyčítať údaje. Postupnosť dát po zbernici I2C je na obrázku č. 10.

Cdm7160-nahodny-pristup.jpg
Obr. 10:Náhodný prístup CDM7160-C00

Údaj o koncentrácii je uložený v dvoch bajtoch v tvare little endian, na adrese 0x03 je dolný bajt a na adrese 0x04 je horný bajt. (obr. 11)

Cdm7160-registre-koncentrácie.jpg
Obr. 11:Registre cdm7160 s údajmi o koncentrácii

Hodnota je od 0 po 10000 (DEC) alebo 0 až 2710 (HEX). (obr. 12)

Cdm7160-formát-údajov.jpg
Obr. 12:Údaje o koncentrácii v registroch


Popis riešenia

Na základe získaných informácii o komponentoch som zapojil senzor aj LCD modul do ARDUINO UNO. (obr. 13). Napájanie je realizované pomocou USB kábla typu A-B priamo z počítača (s možnosťou sériového prenosu údajov do počítača). Napájanie je možné realizovať aj z power-banky, získame tým prenosný prístroj na meranie koncentrácie CO2 vo vzduchu.

Schéma zapojenia snímača a skutočné vyhotovenie

Cdm7160-LCD-ARDUINO-new.jpg
Obr. 13:Zapojenie snímača a LCD do dosky ARDUINO ONU


Algoritmus a program

Samotný program pracuje nasledovne: V programe beží funkcia loop. V každom cykle vyhodnotí či došlo k meraniu koncentrácie (stav_senzora = true), ak áno (po vyvolaní prerušenia a zmene hodnoty stav_senzora z false na true), vyčíta údaje zo senzora a pošle na sériový port a zobrazí na LCD vo forme čísla a pre možnosť rýchleho vyhodnotenia v tvare bargrafu. Hodnotu stav_senzora nastaví na false a čaká na ďalší cyklus.


#include <LiquidCrystal.h>
#include <LcdBarGraph.h>
#include <stdio.h>
#include <Wire.h>

#define INTERRUPT_PIN 2
#define LCD_RS_PIN 12
#define LCD_ENABLE_PIN 11
#define LCD_D4_PIN 6
#define LCD_D5_PIN 5
#define LCD_D6_PIN 4
#define LCD_D7_PIN 3
#define LCD_NUM_COLS 16
#define LCD_NUM_ROWS 2
#define ADRESA_CDM_7160 0x69
#define ADRESA_REGISTRA 0x03

LiquidCrystal lcd(LCD_RS_PIN, LCD_ENABLE_PIN, LCD_D4_PIN, LCD_D5_PIN, LCD_D6_PIN, LCD_D7_PIN);
LcdBarGraph lbg(&lcd, LCD_NUM_COLS, 0, 1);

byte co2_dolnebity = 0;
byte co2_hornebity = 0 ;
int co2_ppm = 0;
volatile bool stav_senzora = false;
char string[8] = {'0', '0', '0', '0', '0', '0', '0', '0'};
void setup() {
  pinMode(INTERRUPT_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), senzor_volny, FALLING );
  Serial.begin(9600);
  Wire.begin();
  co2_dolnebity = 0;
  co2_hornebity = 0;
  lcd.begin(LCD_NUM_COLS, LCD_NUM_ROWS);
  lcd.clear();
  delay(100);
}
void senzor_volny() {
  stav_senzora = true;
}
void loop() {
  if (stav_senzora)
  {
    Wire.beginTransmission(ADRESA_CDM_7160); //adresa zariadenia
    Wire.write(ADRESA_REGISTRA); // adresa registra
    Wire.endTransmission();
    Wire.requestFrom(ADRESA_CDM_7160, 2); //poziadavka na 2 bajty
    co2_dolnebity = Wire.read(); //dolne bity
    co2_hornebity = Wire.read(); //horne bity
    co2_ppm = (co2_hornebity << 8) | co2_dolnebity; //dolne + horne posunute o 8 = vysledok
    Serial.println(co2_ppm); //posli na serial
    if (co2_ppm < 1000)
    {
      sprintf (string, "%d ppm ", co2_ppm);
    }
    else
    {
      sprintf (string, "%d ppm", co2_ppm);
    }
    lcd.setCursor(0, 0);
    lcd.print(string);
    lbg.drawValue((co2_ppm-400), 1200);//minimálna hladina CO2 vo vzduchu je 400 ppm
  }
  stav_senzora = false;
  delay(200);
}


Overenie

Po oživení a zapojení do počítača cez sériový port (USB-serial) som zobrazil hodnoty v programe SerialPlot. (Obr. 14) Na obrázku je vidieť reakcia snímača na zmenu koncentrácie CO2 vo vzduchu.

Cdm7160-SerialPlot.jpg
Obr. 14:Hodnoty zo snímača CO2


Literatúra:


Späť na zoznam projektov...