Komunikace s více teplotními čidly DS18B20 na společné sběrnici 1wire
Teplotní čidla Dallas DS18B20 jsou poměrně oblíbené snímače teploty s digitálním výstupem. Jako spousta výrobků firmy Dallas umožňuje připojení více snímačů na jeden společný pin s možností adresovat libovolné zařízení na sběrnici.
S tímto teplotním čidlem jsem pracoval již dříve avšak vždy jsem každý snímač připojoval ke svému vlastnímu pinu, což je zbytečné plýtvání vývody mikroprocesoru když to jde i jinak :-) Bohužel stále se mi nedařilo rozchodit komunikaci na 1-wire sběrnici. Teď se tedy podařilo takže dalším zájemcům předkládám funkční projekt pro připojení několik teplotních čidel DS18B20 (při minimálních úpravá bude možno použít i jiné snímače).
Pro práci s čidly na sběrnici 1-wire jsou potřebné dvě sady příkazů (2knihovny):
- Knihovna pro práci s 1-wire sběrnicí obsahující základní funkce jako je čtení, zápis, reset, načtení ROM kódu
- Knihovna pro práci s konkrétním čidlem - obsahuje funkce pro práci s konkrétním typem čidla a využívá veškeré funkce knihovny pro 1-wire.
a) 1-wire rozhraní
O 1-wire rozhraní je toho všude popsána spousta, takže se na něj podíváme spíše zpohledu co pro nás znamená prakticky.
Na sběrnici 1-wire je každému zařízení přiřazeno jednoznačné 64bitové identifikační číslo - ROM Registration Number. Pro správnou práci je potřeba znát z čeho se toto číslo skládá:
![](images/ROM_code_nahled.png)
- 8bitů Family Code - udává kód konkrétního typu zařízení. Tedy v našem případe každý snímač DS18B20 bude mít toto číslo 0x28. Kódy dalších zařízení jsou snadno vyhledatelné na webu.
- 48bitů Serial Number - jednoznačné sériové číslo každého zařízení, neměly by existovat na světě 2 čidla se stejným serial number
- 8bitů CRC - kontrolní součet, používá se pro kontrolu, zda procesor načetl správně celý ROM kód
Podrobnosti celého procesu vyhledávání ROM kódů zde nebudu popisovat, jedná se složitý algoritmus, který v každém svém cyklu nalezne 1zařízení. Načtení více ROM kódů tedy může být časově velice náročné a bude výhodné již načtené kódy ukládat do EEPROM paměti procesoru aby je nebylo potřeba při každém spuštění znovu vyhledávat. Podrobnosti o vyhledávacím algoritmu je možno nastudovat z AN187.
b) Dallas DS18B20
Základní vlastnosti:
- Nastavitelné rozlišení 9 až 12bit
- Rozsah měření -55°C až 125°C s odchylkou ±0,5°C
- Možnost aktivování alarm signálu při zvolené teplotě.
- Doba převodu teploty na binární číslo při zvoleném rozlišení 12-bit = 750ms .
Po načtení identifikačního ROM čísla všech snímačů na sběrnici, je možno vyčíst teplotu naměřenou konkrétním čidlem jednoduše zasláním dotazu na danou ROM adresu. Připojený snímač pak odpoví 9B velkou zprávou s následujícím obsahem:
![](images/zprava_nahled.png)
Z diagramu je patrné že pokud nám stačí vyčíst teplotu bez nutnosti provést kontrolní součet, je z časových důvodů výhodné přečíst pouze dva první Byty udávající teplotu. Červeně vyznačený úsek je EEPROM paměť čidla, do které je možno zapsat hodnotu teploty pro alarm a nastavení konfiguračního registru (tedy rozlišení 9,10,11 nebo 12bit).
c) Praktická ukázka práce s čidlem
Pro názornou ukázku je v přílohách uložen kompletní projekt pro AVRStudio4 s funkčním hledáním 2čidel a postupného čtení teploty z obou z nich. Pro práci s čidlem DS18B20 je pro jednoduchost použita jen jediná funkce a to čtení teploty - tato je také v knihovně pro 1-wire. Jednotlivé kroky pro použití knihovny tedy jsou:
1. Nastavení knihovny
V projektu načíst přiloženou knihovnu 1wire.c (1wire.h bude načten automaticky s ní):
#include "1wire.c"
Nastavení pinu pro 1wire sběrnici - může se jednat o libovolný pin ke kterému jsou připojeny snímače (v našem případě pin PA5):
#define OWIREOUTPORT PORTA
#define OWIREOUTPIN 5
#define OWIREINPORT PINA
#define OWIREDDR DDRA
2. Inicializace sběrnice a nalezení všech snímačů:
Pro hledání snímačů existují dvě funkce:
- Funkce pro hledání prvního snímače - liší se pouze nulováním nkěterých proměnných
- Funkce pro hledání dalších snímačů
Hledání prvního snímače:
cidla = OWFirst(ROM1[0],1,0);
Do podle ROM kódů na první pozici (nultou )bude
uložen nalezený kód, návratová hodnota funkce bude rovna 1 v případě, že
bylo nalezeno čidlo. V opačném případě je návratová hodnota číslo chyby
(viz. seznam v 1wire.h)
Hledání dalších snímačů:
do
// hledani dalsich cidel
{
cidla =
OWNext(ROM1[pocet_cidel],1,0); // hledej dalsi
cidlo
if(cidla)
// pokud bylo nalezeno
pocet_cidel++;
// zvetsi pocet o jedno
}while(cidla);
// dokud byla nalezena dalsi cidla
Uvedený kód bude vyhledávat čidla
tak dlouho dokud návatová hodnota funkce pro hledání ROM kódu bude rovna
1 - tedy bylo nalezeno čidlo. Velikost pole ROM[] je nutno nastavit na
počet předpokládaných připojených čidel.
3. Čtení hodnoty teploty z určitého čidla:
Pro čtení hodnoty z konkrétního čidla, existuje jednoduchá funkce:
teplota1=DS18B20_read_temp(ROM1[0]);
Vstupním parametrem funkce je ROM kód požadovaného
čidla.
Návratová hodnota funkce odpovídá hodnotě teplota * 10 pro
lepší manipulaci s desetinnou čárkou.
Download
Funkční projekt pro práci se dvěmi čidly pro AVRStudio4