Zbernica i2c: SHT11: Rozdiel medzi revíziami
Z SensorWiki
(→Zadanie) |
|||
(56 medziľahlých úprav od 2 ďalších používateľov nie je zobrazených) | |||
Riadok 1: | Riadok 1: | ||
− | |||
− | |||
*Vypracoval: '''Bc. Tomáš Statečný''' | *Vypracoval: '''Bc. Tomáš Statečný''' | ||
Riadok 6: | Riadok 4: | ||
*Ročník: '''2.Ing''' | *Ročník: '''2.Ing''' | ||
− | |||
− | |||
== Zadanie == | == Zadanie == | ||
Prečítajte zo snímača vlhkosti pripojeného na zbernicu i2c aktuálnu teplotu a vlhkosť a zobrazte na LCD. | Prečítajte zo snímača vlhkosti pripojeného na zbernicu i2c aktuálnu teplotu a vlhkosť a zobrazte na LCD. | ||
+ | |||
+ | [[Obrázok:SnimacVlhkostiSensirion.jpg]] | ||
+ | |||
+ | '''Literatúra:''' | ||
+ | * [http://www.parallax.com/StoreSearchResults/tabid/768/txtSearch/28018/List/0/SortField/4/ProductID/94/Default.aspx Product page] (parallax.com) | ||
+ | * [http://www.parallax.com/Portals/0/Downloads/docs/prod/acc/SensirionDocs.pdf Module datasheet] | ||
+ | * [http://www.parallax.com/Portals/0/Downloads/docs/prod/datast/shtx.pdf Sensor datasheet] | ||
+ | * Mitchell Kahn: ''[http://ap.urpi.fei.stuba.sk/mmp/doc/prog_i2c.pdf Programming the i2c interface].'' Dr. Dobb's Journal, June 1992. | ||
+ | * [http://www.nongnu.org/avr-libc/user-manual/group__twi__demo.html Example using the two-wire interface (TWI)]. AVRlibc demo projects. | ||
+ | |||
+ | |||
+ | == Modul snímača teploty a vlhkosti == | ||
+ | Modul Sensirion SHT11(#28018) je osadený snímačom teploty a vlhkosti Parallax SHT11, pričom prostredníctvom využívania I2C zbernice čip reaguje v krátkom čase s vysokou presnosťou. Modul zahrňuje data-line pull-up čo ho umožňuje pripojiť priamo k programovaciemu prostrediu. | ||
+ | |||
+ | [[Obrázok:SnimacVlhkostiSensirion.jpg]] | ||
+ | |||
+ | :::'''Obr. 1. Modul Sensirion SHT11(#28018)''' | ||
+ | |||
+ | '''Základné špecifikácie''' | ||
+ | |||
+ | *Rozsah merania teploty: -40 °F (-40 °C) to +254.9 °F (+123.8 °C) | ||
+ | *Presnosť merania teploty: +/- 0.5 °C @ 25 °C | ||
+ | *Rozsah merania vlhkosti: 0 to 100% RH | ||
+ | *Presnosť absolútnej vlhkosti: +/- 3.5% RH | ||
+ | *Nízka spotreba (zvyčajne 30 μW) | ||
+ | *Pri vysokej vlhkosti je možné zapnúť ohrievač | ||
+ | |||
+ | '''Zapojenie modulu''' | ||
+ | |||
+ | [[Súbor:ModulSHT11.jpg]] [[Súbor:SHT zapoj.jpg]] | ||
+ | |||
+ | :::::::::::::'''Obr. 2. Zapojenie modulu Sensirion SHT11(#28018)''' | ||
+ | Poznámka: Piny 2,5,6 a 7 sa nepoužívajú. | ||
+ | |||
+ | == Vypracovanie == | ||
+ | |||
+ | Na modul je pripojený snímač teploty a vlhkosti Sensirion SHT11. Na komunikáciu a programovanie zariadenia využívam piny SDA a SCL zbernice I2C. Spočiatku zariadenie bolo programované využívajúc protokol I2C, ale vzhľadom na to, že zariadenie porušuje predpisy I2C, musel som ho naprogramovať iným spôsobom. Hlavným problém bol v obdržaní ACK bitu, ktorý vzhľadom k SCL bol obdržaný v nepravidelných intervaloch. Program fungoval po skompilovaní a nahratí do zariadenia, zobrazilo na display aktuálnu teplotu a vlhkosť. Po opätovnom nahratí programu do zariadenia alebo kým prešiel jeden cyklus, ACK bit nebol obdržaný. | ||
+ | |||
+ | Preto je adekvátnejšie nahrávať bity SDA a SCL jednotlivo, aby dátové bity prislúchali danému časovému signálu. Priradil som vstupné a výstupné porty pre potrebné piny I2C zbernice. Vzhľadom na to, že hodinový signál menil amplitúdu v krátkom čase a nebol rozpoznateľný na osciloskope, bolo potrebné pri každej zmene amplitúdy hodinového signálu doplniť oneskorenie. Jednotlivé bity boli zadávané v poradí podľa obr. 4 a podľa výberu v tabuľke na obr. 5 sme nastavovali potrebnú funkciu snímača, pričom sme využívali len meranie teploty a vlhkosti. | ||
+ | |||
+ | [[Súbor:Reset start sht.jpg]] | ||
+ | |||
+ | ::::::::'''Obr. 3. Reset a Start prenosu''' | ||
+ | |||
+ | [[Súbor:Meranie sht1.jpg]] | ||
+ | |||
+ | ::::::::'''Obr. 4. Príklad priebehu merania vlhkosti''' | ||
+ | |||
+ | [[Súbor:Tabulka sht1.jpg]] | ||
+ | |||
+ | ::::::::'''Obr. 5. Tabuľka príkazov pre senzor SHT11''' | ||
+ | |||
+ | Namerané hodnoty teploty a vlhkosti bolo potrebné prepočítať podľa tabuľky zobrazenej na obr. 6. | ||
+ | |||
+ | [[Súbor:Tabulka sht11.jpg]] | ||
+ | |||
+ | ::::::::'''Obr. 6. Tabuľka špecifikácii senzor SHT11''' | ||
+ | |||
+ | == Zdrojový kód == | ||
+ | |||
+ | K projektu je potrebné pripojiť nasledovné súbory: [[lcd.c]], [[lcd.h]], [[I2C.c]], [[I2C.h]] | ||
+ | |||
+ | '''Zdrojový kód merania teploty v vlhkosti:''' | ||
+ | <source lang="c"> | ||
+ | /* | ||
+ | * Tep_vlh.c | ||
+ | * | ||
+ | * Created: 16.01.2013 23:52:26 | ||
+ | * Author: Tomáš Statečný | ||
+ | */ | ||
+ | |||
+ | #include <stdlib.h> | ||
+ | #include <avr/io.h> | ||
+ | #include <util/delay.h> | ||
+ | #include <util/twi.h> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | #include "I2C.h" | ||
+ | #include "lcd.h" | ||
+ | |||
+ | FILE mystdout = FDEV_SETUP_STREAM(lcdDataWrite,NULL,_FDEV_SETUP_WRITE); //Vypisovanie na display | ||
+ | |||
+ | //Zadefinovanie prikazov ovladania snimaca | ||
+ | #define TEMP 0x03 //Meranie teploty | ||
+ | #define HUMI 0x05 //Meranie vlhkosti | ||
+ | |||
+ | //Zadefinovanie konstant | ||
+ | const float t1 = -40.1; //14bit meranie teploty | ||
+ | const float t2 = 0.01; //14bit meranie teploty | ||
+ | const float h1 = -4.0; //12bit meranie vlhkosti | ||
+ | const float h2 = 0.0405; //12bit meranie vlhkosti | ||
+ | const float h3 = -0.0000028; //12bit meranie vlhkosti | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | void main() | ||
+ | { | ||
+ | i2c_init(); //Incializacia I2C | ||
+ | lcdInit4(); //Inicializacia display | ||
+ | |||
+ | stdout = &mystdout; //Odteraz funguje printf(); | ||
+ | |||
+ | //Zadefinovanie premennych | ||
+ | float temp, humi; | ||
+ | |||
+ | while(1){ | ||
+ | |||
+ | //Meranie teploty | ||
+ | temp = Measure(TEMP); //Vycitanie hodnoty teploty z SHT11 | ||
+ | temp =t1 + (temp * t2); //Prepocet vycitanej hodnoty teploty na stupne celsia | ||
+ | _delay_ms(100); | ||
+ | |||
+ | //Meranie vlhkosti | ||
+ | humi = Measure(HUMI); //Vycitanie hodnoty vlhkosti z SHT11 | ||
+ | humi = h1 + (h2 * humi) + (humi * humi * h3); //Prepocet vycitanej hodnoty vlhkosti na percenta | ||
+ | _delay_ms(100); | ||
+ | |||
+ | //Vypis na display | ||
+ | lcdControlWrite(1<<LCD_CLR); //Nastavenie kurzoru na zaciatok | ||
+ | lcdControlWrite(0x80); //Display prvy riadok | ||
+ | printf("Tep=%.2f °C",temp); //Vypis teploty v stupnoch celsia | ||
+ | |||
+ | lcdControlWrite(0x80 + 0x40); //Display druhy riadok | ||
+ | printf("Vlh=%.2f %RH",humi); //Vypis vlhkosti v percentach | ||
+ | _delay_ms(100); | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | == Vyhodnotenie == | ||
+ | |||
+ | Po nastavení a nahratí potrebných bitov cez SDA a SCL do snímača SHT11 som pre overenie správnosti posielania bitov pripojil k zariadeniu osciloskop s dvoma kanálmi. Žltý kanál zobrazoval hodinový signál (SCL) a modrý zas dátový (SDA). Po ukončení prenosu príkazov dátové bity zostanú nastavené na hodnote jedna a prebehne ešte jeden hodinový impulz, kedy sa dáta čítajú zo snímača. V tento hodinový impulz má zariadenie odoslať ACK bit na potvrdenie prenosu (SDA = 0) a po oneskorení potrebného na odmeranie teploty alebo vlhkosti majú nasledovať dva bity nameraných hodnôt. Vzhľadom na to, že zariadenie neodoslalo ACK bit, celý proces spolu s resetom a start podmienkou pred každým príkazom na meranie sa opakoval, pričom ACK bit nebol nikdy obdržaný. Z toho vyplýva, že zariadenie je chybné alebo poškodené veľkým počtom nahratí odlišných programov. | ||
+ | |||
+ | [[Súbor:SHT 2paket.jpg]] [[Súbor:SHT paket.jpg]] | ||
+ | |||
+ | '''Obr. 7. Dva pakety dátových a hodinových signálov''' '''Obr. 8. Jeden paket - žltý SCL, modrý SDA signál''' | ||
+ | |||
+ | [[Súbor:SHT ACK.jpg]] | ||
+ | |||
+ | :::'''Obr. 9. Neobdržaný ACK bit''' | ||
+ | |||
+ | |||
+ | |||
+ | [[Category:I2C]] |
Aktuálna revízia z 13:39, 15. marec 2016
- Vypracoval: Bc. Tomáš Statečný
- Študijný odbor: Aplikovaná mechatronika
- Ročník: 2.Ing
Zadanie
Prečítajte zo snímača vlhkosti pripojeného na zbernicu i2c aktuálnu teplotu a vlhkosť a zobrazte na LCD.
Literatúra:
- Product page (parallax.com)
- Module datasheet
- Sensor datasheet
- Mitchell Kahn: Programming the i2c interface. Dr. Dobb's Journal, June 1992.
- Example using the two-wire interface (TWI). AVRlibc demo projects.
Modul snímača teploty a vlhkosti
Modul Sensirion SHT11(#28018) je osadený snímačom teploty a vlhkosti Parallax SHT11, pričom prostredníctvom využívania I2C zbernice čip reaguje v krátkom čase s vysokou presnosťou. Modul zahrňuje data-line pull-up čo ho umožňuje pripojiť priamo k programovaciemu prostrediu.
- Obr. 1. Modul Sensirion SHT11(#28018)
Základné špecifikácie
- Rozsah merania teploty: -40 °F (-40 °C) to +254.9 °F (+123.8 °C)
- Presnosť merania teploty: +/- 0.5 °C @ 25 °C
- Rozsah merania vlhkosti: 0 to 100% RH
- Presnosť absolútnej vlhkosti: +/- 3.5% RH
- Nízka spotreba (zvyčajne 30 μW)
- Pri vysokej vlhkosti je možné zapnúť ohrievač
Zapojenie modulu
- Obr. 2. Zapojenie modulu Sensirion SHT11(#28018)
Poznámka: Piny 2,5,6 a 7 sa nepoužívajú.
Vypracovanie
Na modul je pripojený snímač teploty a vlhkosti Sensirion SHT11. Na komunikáciu a programovanie zariadenia využívam piny SDA a SCL zbernice I2C. Spočiatku zariadenie bolo programované využívajúc protokol I2C, ale vzhľadom na to, že zariadenie porušuje predpisy I2C, musel som ho naprogramovať iným spôsobom. Hlavným problém bol v obdržaní ACK bitu, ktorý vzhľadom k SCL bol obdržaný v nepravidelných intervaloch. Program fungoval po skompilovaní a nahratí do zariadenia, zobrazilo na display aktuálnu teplotu a vlhkosť. Po opätovnom nahratí programu do zariadenia alebo kým prešiel jeden cyklus, ACK bit nebol obdržaný.
Preto je adekvátnejšie nahrávať bity SDA a SCL jednotlivo, aby dátové bity prislúchali danému časovému signálu. Priradil som vstupné a výstupné porty pre potrebné piny I2C zbernice. Vzhľadom na to, že hodinový signál menil amplitúdu v krátkom čase a nebol rozpoznateľný na osciloskope, bolo potrebné pri každej zmene amplitúdy hodinového signálu doplniť oneskorenie. Jednotlivé bity boli zadávané v poradí podľa obr. 4 a podľa výberu v tabuľke na obr. 5 sme nastavovali potrebnú funkciu snímača, pričom sme využívali len meranie teploty a vlhkosti.
- Obr. 3. Reset a Start prenosu
- Obr. 4. Príklad priebehu merania vlhkosti
- Obr. 5. Tabuľka príkazov pre senzor SHT11
Namerané hodnoty teploty a vlhkosti bolo potrebné prepočítať podľa tabuľky zobrazenej na obr. 6.
- Obr. 6. Tabuľka špecifikácii senzor SHT11
Zdrojový kód
K projektu je potrebné pripojiť nasledovné súbory: lcd.c, lcd.h, I2C.c, I2C.h
Zdrojový kód merania teploty v vlhkosti:
/*
* Tep_vlh.c
*
* Created: 16.01.2013 23:52:26
* Author: Tomáš Statečný
*/
#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include <util/twi.h>
#include <stdio.h>
#include "I2C.h"
#include "lcd.h"
FILE mystdout = FDEV_SETUP_STREAM(lcdDataWrite,NULL,_FDEV_SETUP_WRITE); //Vypisovanie na display
//Zadefinovanie prikazov ovladania snimaca
#define TEMP 0x03 //Meranie teploty
#define HUMI 0x05 //Meranie vlhkosti
//Zadefinovanie konstant
const float t1 = -40.1; //14bit meranie teploty
const float t2 = 0.01; //14bit meranie teploty
const float h1 = -4.0; //12bit meranie vlhkosti
const float h2 = 0.0405; //12bit meranie vlhkosti
const float h3 = -0.0000028; //12bit meranie vlhkosti
void main()
{
i2c_init(); //Incializacia I2C
lcdInit4(); //Inicializacia display
stdout = &mystdout; //Odteraz funguje printf();
//Zadefinovanie premennych
float temp, humi;
while(1){
//Meranie teploty
temp = Measure(TEMP); //Vycitanie hodnoty teploty z SHT11
temp =t1 + (temp * t2); //Prepocet vycitanej hodnoty teploty na stupne celsia
_delay_ms(100);
//Meranie vlhkosti
humi = Measure(HUMI); //Vycitanie hodnoty vlhkosti z SHT11
humi = h1 + (h2 * humi) + (humi * humi * h3); //Prepocet vycitanej hodnoty vlhkosti na percenta
_delay_ms(100);
//Vypis na display
lcdControlWrite(1<<LCD_CLR); //Nastavenie kurzoru na zaciatok
lcdControlWrite(0x80); //Display prvy riadok
printf("Tep=%.2f °C",temp); //Vypis teploty v stupnoch celsia
lcdControlWrite(0x80 + 0x40); //Display druhy riadok
printf("Vlh=%.2f %RH",humi); //Vypis vlhkosti v percentach
_delay_ms(100);
}
}
Vyhodnotenie
Po nastavení a nahratí potrebných bitov cez SDA a SCL do snímača SHT11 som pre overenie správnosti posielania bitov pripojil k zariadeniu osciloskop s dvoma kanálmi. Žltý kanál zobrazoval hodinový signál (SCL) a modrý zas dátový (SDA). Po ukončení prenosu príkazov dátové bity zostanú nastavené na hodnote jedna a prebehne ešte jeden hodinový impulz, kedy sa dáta čítajú zo snímača. V tento hodinový impulz má zariadenie odoslať ACK bit na potvrdenie prenosu (SDA = 0) a po oneskorení potrebného na odmeranie teploty alebo vlhkosti majú nasledovať dva bity nameraných hodnôt. Vzhľadom na to, že zariadenie neodoslalo ACK bit, celý proces spolu s resetom a start podmienkou pred každým príkazom na meranie sa opakoval, pričom ACK bit nebol nikdy obdržaný. Z toho vyplýva, že zariadenie je chybné alebo poškodené veľkým počtom nahratí odlišných programov.
Obr. 7. Dva pakety dátových a hodinových signálov Obr. 8. Jeden paket - žltý SCL, modrý SDA signál
- Obr. 9. Neobdržaný ACK bit