Popis senzora teploty a vlhkosti SHT25, realizácia zapojenia, opis spôsobu komunikácie a ukážkový program pre MCU AVR.
Momentálne pracujem na meteorologickej stanici a jednou zo základných meteorologických veličín, ktoré budem merať je teplota. Pri hľadaní vhodného snímača do mojej stanice mi firma SOS electronic poskytla vzorku snímača SHT25, ktoré produkuje firma Sensirion. V tomto článku by som sa chcel venovať popisu tohto snímača, meraní teploty a vlhkosti pomocou neho a na záver ukážku programu pre mikropočítač.
Popis senzora
Senzor SHT25 umožňuje merať teplotu a relatívnu vlhkosť a ako uvádza výrobca na svojom webe, ide o najpresnejšiu verziu najmenšieho senzora vlhkosti na svete. Ide o digitálny senzor v púzdre DFN o rozmeroch 3×3 mm, ktorý je už nakalibrovaný pri výrobe. Údaj z neho stačí len prečítať a vložiť do vzorca uvedeného v dokumentácii a výsledkom je buď teplota v [°C] alebo relatívna vlhkosť v [%].
So senzorom sa komunikuje cez dvojvodičovú zbernicu i2C a umôžňuje aj kontrolu prenášaných dát pomocou CRC.
Presnosť merania teploty udáva výrobca na +-0,2°C v rozsahu 5 až 60°C pričom meraný rozsah senzora je od -40 do 125°C.
Pri meraní vlhkosti je presnoť +-1,8% RH na rozsahu 10 až 90 %. Krivky presnosti vidno na nasledujúcich obrázkoch.
Rozlíšenie merania je možné nastaviť na 12 alebo 14 bitov, od toho záleží aj časová dlžka merania danej veličiny.
Pre testovanie senzora som navrhol malú DPSku o rozmeroch 15×15 mm a vývody na i2C zbernicu a napájanie som vyviedol na 4pinovú kolíkovú lištu. Takto je možné so senzorom jednoduchšie narábať pri testovaní. Schéma zapojenia a navrhnutá DPS je na nasledujúcom obrázku a
súbory pre Eagle si môžete stiahnúť tu.
Schéma zapojenia
Osadenie DPS
Hotový výrobok
Komunikácia a spracovanie dát
Pri meraní sa používajú dva režimy:
a) Hold master mode – v tomto režime drží senzor SCL linku „blokovanú“ teda preberá nad ňou kontrolu a po ukončení merania ju povolí;
b) No-hold master mode – v tomto režime sa počas merania senzora može komunikovať s iným zariadením pripojeným na tú istú zbernicu i2C.
Spôsob merania veličiny resp. priebeh komunikácie pre No-hold master mode je zobrazený na diagrame dole. Priebeh je nasledovný: master začne komunikáciu štart podmienkou na zbernici a vysiela 7bit adresu senzora spolu s LSB bitom, ktorým sa označuje zápis (alebo čítanie) zo zbernice. Ďalej sa odosiela príkaz (napr. meranie teploty, meranie vlhkosti). Po tejto akcii začne čidlo merať požadovanú veličinu. Podľa nastaveného rozlíšenia, ktoré sa nastavuje zápisom do tzv. užívateľského registra, treba počkať určitý čas kým prebehne meranie a prevod veličiny alebo sa môže komunikovať s iným zariadením na zbernici.
Dlžky jednotlivých meraní sú zrejmé z tabuľky.
Komunikácia zo senzorom SHT25
Príkazy pre SHT25
Časovanie meraní
Po zmeraní veličiny senzorom začne master zariadenie komunikáciu s tým, že teraz nastavíme LSB bit pri vysielaní adresy pre čítanie zo zbernice, po potvrdení ACK bitom senzorom začne senzor posielať jednotlivé bajty s dátami. Celkovo sa posielajú tri a to horný a spodný bajt zmeranej veličny a CRC súčet z ktorým sa overuje správnosť prenosu dát.
Nasleduje overenie správnosti prenosu dát výpočtom CRC súčtu a porovnaním s CRC prijatým od senzora. Ak sú zhodné môže sa robiť výpočet teploty resp. vlhkosti.
Výpočet robíme použitím vzorcov z dokumentácie, ktoré sú nasledovné:
SRH a ST je 16bitový údaj prijatý zo senzora, pričom status bity (spodne dva bity) znulujeme. Takto dostaneme výslednú teplotu v °C a relatívnu vlhkosť v %. Pre zaujímavosť môžeme vypočítať aj rosný bod [2].
Na ukážku som zostavil aj program pre AVR MCU (aj keď v už spomínanej meteorologickej stanici chcem použiť mikropočítač od ST).
#include "lcd.h"
#include "i2c_master.h"
#include "sht25.h"
int main(void)
{
/* variables */
SHT25_DATA sht25_d;
char text[10];
/* init peripherals */
lcd_init();
i2c_init();
SHT25_init();
/* init */
lcd_puts("SHT25");
lcd_position(2,1); lcd_puts("Teplota: ");
lcd_position(3,1); lcd_puts("Vlhkost: ");
lcd_position(4,1); lcd_puts("Ros.bod: ");
while(1)
{
/* read values from sensor */
SHT25_read_data(&sht25_d);
/* CRC is OK ? */
if (sht25_d.temp_crc_stat != SHT25_CRC_OK) continue;
if (sht25_d.hum_crc_stat != SHT25_CRC_OK) continue;
/* show on LCD display */
sprintf(text,"%.2f C",(double)sht25_d.temp);
lcd_position(2,10); lcd_puts(text);
sprintf(text,"%.2f %%",(double)sht25_d.hum);
lcd_position(3,10); lcd_puts(text);
sprintf(text,"%.2f C",(double)SHT25_calc_dewpoint(&sht25_d));
lcd_position(4,10); lcd_puts(text);
/* delay */
_delay_ms(1000);
_delay_ms(1000);
}
return 0;
}
Chcem ešte upozorniť na jednu menšiu chybu, ktorú som si pri písaní programu nevšimol. Rosný bod sa údava v stupňoch Celzia nie v % ako to mam aj na fotografii.
V závere by som chcel vyzdvihnúť výhodné vlastnosti senzora ako je jednoduchosť práce s nim (pri programovaní), nie je potrebné ho kalibrovať keďže je kalibrovaný pri výrobe, jeho presnosť merania, nastaviteľné rozlíšenie atď. čo sa odrazilo aj na jeho cene. Ako som už spomínal v úvode, senzor chcem využiť pre meteorologickú stanicu na ktorej momentálne pracujem a chcem zkonštruovať jednu na Žilinskej univerzite a druhú na východnom Slovensku v okrese Humenné.
Použitá literatúra:
Poďakovanie:
SOS electronic – za poskytnutie vzoriek senzorov SHT25
Ondrej Závodský (zawin) – za zaspájkovanie senzora na DPS
Dražší čidlo už asi neměli …
Na obr. mas mini chybu :D. Rosny bod je v °C . V kode to mas dobre :P.
Pod obrazkom sam autor upozornuje na tuto chybu. Aspon vidno, ako pozorne si cital text 🙂
výborne to si robil ako podakovanie ja to mám tiež lenže nejako mi nezostáva priamo na toto čidlo čas robim ti s PIC