PICike hőt mérünk
Szerencsénkre a PIC-el nagyon egyszerű, hőmérsékletet mérni. Több olyan digitális hőmérő van a kereskedelemben, amely minden további nélkül tud a PIC-el kommunikálni.

Hirdetés

Mi most a Dallas Semiconductor gyártmányát, a DS1821-es hőmérő IC-t fogjuk használni. Ez a tok képes hőmérő módban és termosztát módban is dolgozni. Ez utóbbival most nem foglalkozunk, hőmérő módban fogjuk foglalkoztatni.

Ez a hőmérő 1°C fok pontossággal képes mérni, -55°C-tól +125°C-ig. Ez nekünk bőségesen elegendő, bár Szibéria egyes részein már nemigen használhatnánk, remélem ennél hidegebb, soha sem lesz kis hazánkban. A kapcsolás két darab szenzort tartalmaz egyet a külső, egyet pedig a belső hőmérséklet mérésére. A DS1821 digitálisan formában küldi a PIC-nek az adatot. Ez nekünk nagyon jó, mert nem kell a PIC analóg funkcióival foglalkoznunk. Ráadásként az 1-Wire csatolófelületet használja, és ennek az időzítéseit a PicPascal elintézi helyettünk. Mindössze néhány utasítást kell kiadnunk, amelyekkel egyrészt az 1-Wire Port-ot inicializáljuk, másrészt amelyekkel, utasítást adunk a DS-nek, a folyamatos konverzióra, és az adat küldésre.

A kijelző mellett a D Port-on éppen két láb maradt üresen. Erre a két lábra tesszük a két darab DS1821 adat vezetékét. Ezen kívül, a DS1821 mindössze egy 5 Volt-os tápot, és egy GND-t igényel. Ezzel a dolog hardware részét el is intéztük. Még annyit, hogy a DS adatlapjából kiderül, hogy tipikusan 5 uA árammal hajtja az adatvonalat, tehát nem bír hatalmas távolságokat áthidalni, pár méter vezetéknél ne nagyon tegyünk rá többet. Az adatlapban nem találtam, erre adatot. Én egy régebben épített hőmérőmre kb. 6 méter vezetéket tettem, azt minden gond nélkül bírta. Valahol a neten, olvastam, azt hiszem, hogy max. 30 méter, de ebben nem vagyok biztos.

Na de lássuk a programot. A PicPascal help-je tartalmazza az 1-Wire port kezelését, és még egy mintaprogram is van DS1820-as szenzorhoz. Nekünk, nem teljesen jó, de ezért arra alkalmas, hogy néhány dolgot felhasználjunk belőle.
Többek között ez az, amit nagyon szeretek a PicPascal-ban. Ha megnézzük a DS adatlapját, van egy rakás időzítés, amit pontosan be kell tartani ahhoz, hogy a dolog működjön. Na, ezt teljes egészében a program megoldja helyettünk.


Procedure Temperature_In;
Begin
Ow_Write(PortD, 0, $EE);
Tmp := Ow_Reset(PortD, 0);
Ow_Write(PortD, 0, $AA);
TempIn := Ow_Read(PortD, 0);
TempIn_2 := Ow_Read(PortD, 0);
If TempIn_2 = $FF then
Begin
Tmp_Sign := '-';
TempIn_2 := TempIn or $FF;
TempIn := TempIn + $01;
End Else Tmp_Sign := ' ';
ByteToStr(TempIn, Text_In);
Lcd_Chr(2, 12, Tmp_sign);
Lcd_Chr(2, 13, Text_In[1]);
Lcd_Chr(2, 14, Text_In[2]);
Lcd_Chr(2, 15, 223);
Lcd_Chr(2, 16, 'C');
End;

Procedure Temperature_Out;
Begin
Ow_Write(PortD, 1, $EE);
Tmp := Ow_Reset(PortD, 1);
Ow_Write(PortD, 1, $AA);
TempOut := Ow_Read(PortD, 1);
TempOut_2 := Ow_Read(PortD, 1);
If TempOut_2 = $FF then
Begin
Tmp_SignOut := '-';
TempOut_2 := TempOut or $FF;
TempOut := TempOut + $01;
End Else Tmp_SignOut := ' ';
ByteToStr(TempOut, Text_Out);
Lcd_Chr(1, 12, tmp_sign);
Lcd_Chr(1, 13, Text_Out[1]);
Lcd_Chr(1, 14, Text_Out[2]);
Lcd_Chr(1, 15, 223);
Lcd_Chr(1, 16, 'C');
End;


A két procedúra teljesen egyforma csupán a változók mások. Értelemszerűen az IN a belső és az OUT a külső hőmérséklet mérésére szolgál.
Az első sorban folyamatos konverzióra utasítjuk a DS-t, majd kiadunk egy reset-et, és utána adatküldésre utasítjuk a szenzort, majd egy változóba beolvassuk a hőmérsékleti adatokat.
Az egymás utáni kétszeri adatbeolvasás, azért szükséges, hogy ki tudjuk maszkolni, az előjelet. Amennyiben az Else Tmp_SignOut := ' '; sorba az üres karakter helyére "+" jelet írunk akkor, folyamatosan kijelzi azt is, de véleményem szerint elég, ha a mínusz-t jelezzük.
Utána string típusra konvertáljuk a byte-os változó értékét, majd kiíratjuk az LCD kijelzőre.
A kijelzőre mindössze két karaktert iratunk ki a hőmérsékletből. Egyszerűen nincs értelme többet, hiszen akár a külső, akár a belső hőmérséklet 100 fok fölé megy, akkor kisebb gondunk is nagyobb lesz annál, minthogy a hőmérőt nézegessük.

Ezzel végeztünk is. Már csak annyi dolgunk maradt, hogy beírjuk a két Temperature procedúrát a főprogramba, hogy végre is legyen hajtva.


Begin
Pic_init;
While True Do
Begin
Speed_adj;
If Select_1 = 7 Then LatC:=$00;
Temperature_In;
Temperature_Out;
Fut;
Villog;
Fut_2;
Villog;
Night_Rider;
Villog;
Villog_2;
Villog;
End;
End.


Még valamit el kell erről mondani. Már előzőleg összefutottam azzal a problémával, hogy bekapcsoláskor nem mindíg indult el a hőmérő. Rájöttem, hogy valószínűleg, a DS hosszú időzítései okozhatják a problémát, amit a PicPascal ugyan lekezel, de valamiért mégsem ment. A Pic_Initbe, ha beírunk az 1-Wire Port-nak egy reset-et, és előzetesen beolvassuk a DS-t akkor, minden gond nélkül működik.


Procedure Pic_Init;
Begin
TrisC:=$00;
LatC:=$00;
TrisB:=$FF;
PortB := $00;
TrisD:=$03;
PortD:=$00;
Intcon2.RBPU := 0;
Loop := 0;
Bemenet := 0;
Select_1 := 1;
Speed_Fut := EEprom_read(0);
If Speed_Fut = $FF Then Speed_Fut := 70;

//--------------------------- One Wire Init ----------------------------------

Ow_Reset(PortD, 0);
Ow_Write(PortD, 0, $EE);

Ow_Reset(PortD, 1);
Ow_Write(PortD, 1, $EE);

//--------------------------- One Wire Init ----------------------------------

LCD_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1, '* FERYSERVICE * ');
Lcd_Out(2, 1, ' FUTO FENY ');
Delay_ms(3000);
Lcd_Cmd(_LCD_Clear);
Lcd_Out(1, 1, 'M:');
Lcd_Out(2, 1, 'D:');
Lcd_Out(2, 6, 'mS');
Lcd_Out(1, 9, 'O:');
Lcd_Out(2, 9, 'I:');
End;


Tudom, érdekes párosítás ez a cucc. Villogó meg hőmérő. De igazán nem is azért készült, a program, hogy feltétlenül előállítsunk egy ilyen öszvért, hanem, hogy szemléltetni lehessen, hogy mennyi mindent meglehet csinálni, a PIC-el akár egyszerre is. Ja, és mivel minden szentnek maga felé hajlik a keze, bár én aztán vagyok minden, csak szent nem. :) nekem is nagyon jó, hogy elkezdtem ezt a cikksorozatot. Nagyon sok mindennek kell utánanéznem, nehogy baromságokat írjak le. Persze tudom, hogy egy profi programozó sok mindenbe beleköthetne, sok mindent lehetne elegánsabban vagy célszerűbben megírni, de végül is működik.

Gondolom azokban, akik jártasabbak már a technológiában, felmerül a kérdés, hogy miért nem DS1820-as hőmérővel csináltam meg, mivel annál csak egy adatvezeték kell a két szenzornak.

Erről mindjárt egy vicc is eszembe jutott: Valamikor régen megkérdezték a papot, hogy miért nem harangozott egy bizonyos időben. Azt válaszolta: 12 okot tudok mondani, hogy miért nem tettem, az első mindjárt az, hogy nincs harang... A többi indok felsorolását elengedték neki...

Az első mindjárt az, hogy nincs itthon DS1820-as, rendelni meg nem akarok, mert most nemigen van rá szükségem, és a posta sem ingyen hordja. (Sajnos)
De a viccet félretéve, még annyit, hogy egyelőre annyi szabad bit-ünk van különböző Port-okon, hogy semmi értelme nem volt ezzel spórolni.

Na, a kijelzővel nincs ilyen szerencsénk...

Ott még egy apró változás van, kicsit tömörítettük, a kijelzőn megjelenő feliratokat, mivel egyre több minden szerepel a kijelzőn, egyszerűen nem fért el rendesen.
A Pic_Init-ben is, néhány paraméter megváltozik, de csak a kijelzőre írandó, sztringek pozíciója. Sajnos csak 16 karakteres kijelzőm van, de végül is ez a legolcsóbb, és legelterjedtebb típus.


Case Select_1 of
1 : Lcd_Out(1, 4, 'Sor ');
2 : Lcd_Out(1, 4, 'Vil ');
3 : Lcd_Out(1, 4, 'Vil2');
4 : Lcd_Out(1, 4, 'Fut ');
5 : Lcd_Out(1, 4, 'Fut2');
6 : Lcd_Out(1, 4, 'N.R.');
7 : Lcd_Out(1, 4, 'STOP');
End;

Lcd_Out(1, 1, 'M:');
Lcd_Out(2, 1, 'D:');
Lcd_Out(2, 6, 'mS');
Lcd_Out(1, 9, 'O:');
Lcd_Out(2, 9, 'I:');


A fejlesztő panelen össze van rakva a kapcsolás, tehát ide csak működő verzió kerül. Ezáltal rengeteget tanulok én is, ráadásul folyamatosan ismétlem az eddig tanultakat. Nagyon remélem, hogy azoknak, akik nálam is kezdőbbek, tudok segíteni, abban, hogy az első nehézségeket, kisebb akadálynak érezzék. Ha ez sikerül, akkor megérte.
Persze azért én megcsinálom a cikksorozat végén a kütyüt is, sőt arra biztatok mindenkit, hogy építse meg, hiszen aki végig követi a cikksorozatot annak így, marad valami kézzelfogható a sorozatból. Sőt, megyünk tovább. Még nagyon sok mindent lehetne megcsináltatni a PIC-el, de teljesen értelmetlen baromságot azért nem akarok. De Pl.: azt, hogy amikor a gombokat nyomkodom, akkor csipogjon egyet vagy, hogy csak akkor kapcsolja be a kijelzővilágítást amikor, állítok valamit rajta, vagy esetleg, ha már piezo csipogót is teszünk rá, jelezzen, ha a hőmérséklet egy tartomány alá, vagy fölé megy, azt minden gond nélkül meg lehet oldani. Sőt gondoltam arra is, hogy ha már, úgyis közvetlenül az ajtó mellé szereljük a kütyüt, akkor tehetünk rá egy iButton beléptetőt is, és a villogáson kívül is egy hasznos kis cucc lesz a dologból, pedig egy Port-on egy LED villogtatásával kezdtük el... Az iButtonnal még sohasem foglalkoztam, nekem is újdonság lesz.
Szóval lehetőség az van bőségesen, majd meglátjuk, mit érdemes kezdeni, még a dologgal.
Na, innen folytatjuk, és ezt vehetitek fenyegetésnek... :)


Fájlok:
FájlnévFájlméretLetöltve
A cikkhez tartozó fájlok csak bejelentkezés után tölthetőek le!

Hozzászólások
Hozzászólás csak bejelentkezés után lehetséges...
grandiloquent-yearly
grandiloquent-yearly
grandiloquent-yearly
grandiloquent-yearly