Zbernica i2c: SHT11: Rozdiel medzi revíziami
Zo stránky SensorWiki
| Riadok 64: | Riadok 64: | ||
'''Zdrojový kód merania teploty v vlhkosti:'''  | '''Zdrojový kód merania teploty v vlhkosti:'''  | ||
<source lang="c">  | <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);  | |||
		}  | |||
}  | |||
Verzia z 13:45, 1. február 2013
Zbernica I2C - Snímač teploty a vlhkosti SHT11
- 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.
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.
- 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: <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);
} }





