Senzor CO2: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
Riadok 33: | Riadok 33: | ||
[[Obrázok:cdm7160-c00.jpg|center|350px]] | [[Obrázok:cdm7160-c00.jpg|center|350px]] | ||
::::'''Obr. 1:Modul senzoru cdm7160-c00''' | |||
Riadok 45: | Riadok 46: | ||
[[Obrázok:cdm7160-c00-NDIR.jpg|center|800px]] | [[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 56: | Riadok 58: | ||
[[Obrázok:LCD LCM1602C V2.1.png|center|900px]] | [[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] | * [https://www.arduino.cc/documents/datasheets/LCDscreen.PDF Technická špecifikácia LCD LCM1602C V2.1] | ||
Riadok 64: | Riadok 67: | ||
[[Obrázok:Arduino_UNO_R3.jpg|center|800px]] | [[Obrázok:Arduino_UNO_R3.jpg|center|800px]] | ||
::::'''Obr. 4:Arduino_UNO_R3''' | |||
* [https://store.arduino.cc/arduino-uno-rev3 Stránka produktu] | * [https://store.arduino.cc/arduino-uno-rev3 Stránka produktu] | ||
Riadok 79: | Riadok 82: | ||
[[Obrázok:I2C-pullup.png|center|400px]] | [[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 (alebo 10) bitovú adresu. Programovateľná časť adresy umožňuje použiť na danej zbernici viacero rovnakých zariadení. | 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 (alebo 10) bitovú adresu. Programovateľná časť adresy umožňuje použiť na danej zbernici viacero rovnakých zariadení. | ||
[[Obrázok:I2C-startstop.png|center|400px]] | [[Obrázok:I2C-startstop.png|center|400px]] | ||
::::'''Obr. 6:Zbernica I<sup>2</sup>C š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 log. 0 (nulu) 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. | 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 log. 0 (nulu) 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. | ||
[[Obrázok:I2C-ACCK.png|center|800px]] | [[Obrázok:I2C-ACCK.png|center|800px]] | ||
::::'''Obr. 7:Zbernica I<sup>2</sup>C 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. | 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. | ||
Riadok 99: | Riadok 105: | ||
[[Obrázok:cdm7160-c00-piny.png|center|800px]] | [[Obrázok:cdm7160-c00-piny.png|center|800px]] | ||
::::'''Obr. 8:Rozhranie senzora CDM7160-C00''' | |||
'''Parametre:''' | '''Parametre:''' | ||
Riadok 111: | Riadok 118: | ||
[[Obrázok:Cdm7160-registre.png|center|800px]] | [[Obrázok:Cdm7160-registre.png|center|800px]] | ||
::::'''Obr. 9:Registre senzora CDM7160-C00''' | |||
= Popis riešenia = | = Popis riešenia = | ||
Riadok 118: | Riadok 126: | ||
[[Súbor:cdm7160-LCD-ARDUINO-new.jpg|center|800px]] | [[Súbor:cdm7160-LCD-ARDUINO-new.jpg|center|800px]] | ||
::::'''Obr. 10:Zapojenia snímača a LCD do dosky ARDUINO ONU''' | |||
== Algoritmus a program == | == Algoritmus a program == |
Verzia z 07:50, 11. máj 2019
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-5000ppm
- 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 (a 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.
- 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).
- 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.
- Obr. 4:Arduino_UNO_R3
Analýza
Na realizáciu meracieho zariadenia, ktorá bude merať koncentráciu CO2 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.
- 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 (alebo 10) bitovú adresu. Programovateľná časť adresy umožňuje použiť na danej zbernici viacero rovnakých zariadení.
- 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 log. 0 (nulu) 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.
- 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
- 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:
- Obr. 9:Registre senzora CDM7160-C00
Popis riešenia
Schéma zapojenia snímača a skutočné vyhotovenie
- Obr. 10:Zapojenia snímača a LCD do dosky ARDUINO ONU
Algoritmus a program
#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 byty
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
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.
Literatúra:
- http://chillelife.com/ir-spectroscopy/
- https://webbook.nist.gov
- https://www.sos.sk/products/figaro/cdm7160-c00-304480
- https://en.wikipedia.org/wiki/Nondispersive_infrared_sensor
- https://sk.wikipedia.org/wiki/Spektroskopia
- https://www.figaro.co.jp/en/product/feature/cdm7160.html
- 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://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
- https://github.com/prampec/LcdBarGraph
- https://www.arduinoslovakia.eu/page/prerusenia