Operácie

Zbernica i2c: SHT11: Rozdiel medzi revíziami

Z SensorWiki

(Modul snímača teploty a vlhkosti)
 
(46 medziľahlých úprav od 2 ďalších používateľov nie je zobrazených)
Riadok 1: Riadok 1:
== Zbernica I2C - Snímač teploty a vlhkosti SHT11 ==
 
 
 
*Vypracoval: '''Bc. Tomáš Statečný'''
 
*Vypracoval: '''Bc. Tomáš Statečný'''
  
Riadok 10: Riadok 8:
  
 
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 snímača teploty a vlhkosti ==
Modul Sensirion SHT11(#28018) je osadený snímačom teploty a vlhkosti Parallax SHT11. Prostredníctvom I2C zbernice čip reaguje za krátky čas s vysokou presnosťou. Modul zahrňuje data-line pull-up čo ho umožňuje pripojiť priamo k programovaciemu prostrediu.
+
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ázok:SnimacVlhkostiSensirion.jpg]]
  
:::'''Obr. 1 Modul Sensirion SHT11(#28018)'''
+
:::'''Obr. 1. Modul Sensirion SHT11(#28018)'''
  
 
'''Základné špecifikácie'''
 
'''Základné špecifikácie'''
Riadok 25: Riadok 33:
 
*Presnosť absolútnej vlhkosti: +/- 3.5% RH
 
*Presnosť absolútnej vlhkosti: +/- 3.5% RH
 
*Nízka spotreba (zvyčajne 30 μW)
 
*Nízka spotreba (zvyčajne 30 μW)
 +
*Pri vysokej vlhkosti je možné zapnúť ohrievač
  
 
'''Zapojenie modulu'''
 
'''Zapojenie modulu'''
  
[[Súbor:ModulSHT11.jpg]]
+
[[Súbor:ModulSHT11.jpg]] [[Súbor:SHT zapoj.jpg]]
  
::::::::::'''Obr. 2 Zapojenie modulu Sensirion SHT11(#28018)'''
+
:::::::::::::'''Obr. 2. Zapojenie modulu Sensirion SHT11(#28018)'''
 
Poznámka: Piny 2,5,6 a 7 sa nepoužívajú.
 
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.

SnimacVlhkostiSensirion.jpg

Literatúra:


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.

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

ModulSHT11.jpg 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.

Reset start sht.jpg

Obr. 3. Reset a Start prenosu

Meranie sht1.jpg

Obr. 4. Príklad priebehu merania vlhkosti

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.

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:

/*
 * 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.

SHT 2paket.jpg 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

SHT ACK.jpg

Obr. 9. Neobdržaný ACK bit