- Szükséges alkatrészek: -
- DS18B20 hőmérséklet-érzékelő:
- Kördiagramm:-
- Lépések vagy kódfolyamat: -
- Kód Magyarázat:
- Adatok beszerzése a DS18B20 hőmérséklet-érzékelőből:
Általában az LM35 hőmérséklet-érzékelőt mikrovezérlőkkel használják a hőmérséklet mérésére, mert olcsó és könnyen elérhető. De az LM35 analóg értékeket ad meg, és ezeket át kell alakítanunk digitálisan az ADC (Analog to Digital Converter) segítségével. De ma DS18B20 hőmérséklet-érzékelőt használunk, amelyben nincs szükségünk ADC-átalakításra a hőmérséklet megadásához. Itt a hőmérséklet méréséhez a DS18B20 készülékkel ellátott PIC mikrokontrollert használjuk.
Tehát itt egy hőmérőt építünk a következő specifikációval, a mikrochip PIC16F877A mikrovezérlő egységét használva.
- Teljes hőmérsékleti tartományt mutat -55 foktól +125 fokig.
- Csak akkor jeleníti meg a hőmérsékletet, ha a hőmérséklet + / -.2 fokot változik.
Szükséges alkatrészek: -
- Pic16F877A - PDIP40 csomag
- Kenyérlap
- Pickit-3
- 5 V-os adapter
- LCD JHD162A
- DS18b20 hőmérséklet-érzékelő
- Vezetékek a perifériák csatlakoztatásához.
- 4,7 ezer ellenállás - 2db
- 10 ezer fazék
- 20mHz kristály
- 2 db 33pF kerámia kondenzátor
DS18B20 hőmérséklet-érzékelő:
A DS18B20 kiváló érzékelő a hőmérséklet pontos érzékeléséhez. Ez az érzékelő 9–12 bit felbontást biztosít a hőmérséklet érzékelésénél. Ez az érzékelő csak egy vezetékkel kommunikál, és nincs szüksége ADC-re ahhoz, hogy analóg hőmérsékleteket szerezzen és digitálisan átalakítsa.
Az érzékelő specifikációja: -
- Méri a hőmérsékletet -55 ° C és + 125 ° C (-67 ° F és + 257 ° F) között
- ± 0,5 ° C Pontosság -10 ° C és + 85 ° C között
- Programozható felbontás 9 és 12 bit között
- Külső alkatrészek nem szükségesek
- Az érzékelő 1-Wire® interfészt használ
Ha megnézzük a fenti pinout képet az adatlapról, láthatjuk, hogy az érzékelő pontosan ugyanúgy néz ki, mint a BC547 vagy a BC557 csomag, a TO-92. Az első tű Ground, a második pin DQ vagy az adat, a harmadik pin pedig VCC.
Az alábbiakban található az adatlap elektromos specifikációja, amelyre szükségünk lesz a tervezéshez. Az érzékelő névleges tápfeszültsége + 3,0 V és 5,5 V között van. Emellett fel kell emelni a tápfeszültséget, amely megegyezik a fent megadott tápfeszültséggel.
Van még egy -0,5 Celsius fokos pontossági tartomány a -10 ° C és +85 Celsius fok közötti tartományban, és a pontosság változik a teljes tartomány margójánál, ami + -2 fok -55 ° C-tól + 125 fokos tartomány.
Ha ismét megnézzük az adatlapot, látni fogjuk az érzékelő csatlakozási specifikációját. Csatlakoztathatjuk az érzékelőt élősködő üzemmódba, ahol két vezetékre van szükség, a DATA és a GND-re, vagy csatlakoztathatjuk az érzékelőt külső tápegységgel, ahol három külön vezetékre van szükség. A második konfigurációt fogjuk használni.
Mivel már ismerjük az érzékelő teljesítményértékeit és a csatlakozással kapcsolatos területeket, most a sematikus elkészítésre koncentrálhatunk.
Kördiagramm:-
Ha látjuk a kapcsolási rajzot, látni fogjuk, hogy: -
16x2 karakteres LCD csatlakozik a PIC16F877A mikrovezérlőhöz, amelyben az RB0, RB1, RB2 az RS, R / W és E LCD csapokhoz csatlakozik. Az RB4, RB5, RB6 és RB7 pedig az LCD 4 tűs D4, D5, D6, D7. Az LCD 4 bites vagy rágcsálási módban van csatlakoztatva.
20MHz kristályoszcillátor két 33pF kerámia kondenzátorral van összekötve az OSC1 és az OSC2 érintkezőkön. Állandó 20 MHz-es órajel-frekvenciát fog biztosítani a mikrovezérlő számára.
A DS18B20 szintén a tűkonfiguráció szerint van csatlakoztatva, és egy 4,7 kb-os felhúzható ellenállással, amint azt korábban tárgyaltuk. Összekötöttem mindezt a kenyérlapon.
Ha még nem ismeri a PIC mikrokontrollert, akkor kövesse a PIC mikrokontroller oktatóanyagunkat, amely a PIC mikrokontroller használatának megkezdése című cikket tartalmazza.
Lépések vagy kódfolyamat: -
- Állítsa be a mikrokontroller konfigurációit, amelyek tartalmazzák az oszcillátor konfigurációját.
- Állítsa be a kívánt portot az LCD-hez, beleértve a TRIS regisztert.
- Minden ds18b20 érzékelővel rendelkező ciklus nullázással kezdődik, ezért visszaállítjuk a ds18b20-ot és megvárjuk a jelenléti impulzust.
- Írja meg a kaparólapot, és állítsa be az érzékelő 12bit felbontását.
- Hagyja ki a ROM olvasását, majd egy visszaállítási impulzust.
- Küldje el a hőmérséklet átalakítása parancsot.
- Olvassa le a hőmérsékletet a kaparólapról.
- Ellenőrizze, hogy a hőmérséklet értéke negatív vagy pozitív.
- Nyomtassa ki a hőmérsékletet 16x2 LCD-re.
- Várja meg a hőmérsékletváltozásokat +/-. 20 Celsius-fokig.
Kód Magyarázat:
Ennek a digitális hőmérőnek a teljes kódját az oktatóanyag végén, egy bemutató videóval adjuk meg. A program futtatásához szüksége lesz néhány fejlécfájlra, amelyek innen letölthetők.
Először be kell állítanunk a konfigurációs biteket a pic mikrovezérlőben, majd el kell kezdeni az érvénytelen fő funkcióval.
Ezután négy sort használunk a könyvtár fejlécfájljának, az lcd.h és a ds18b20.h beillesztésére . Az xc.h pedig a mikrovezérlő fejlécfájlja.
#include
Ezeket a definíciókat használjuk a parancs elküldéséhez a hőmérséklet-érzékelőhöz. A parancsok az érzékelő adatlapján vannak felsorolva.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Az érzékelő adatlapjának ez a 3. táblázata az összes parancsot bemutatja, ahol a makrók a megfelelő parancsok elküldéséhez szoktak.
A hőmérséklet csak akkor jelenik meg a képernyőn, ha a hőmérséklet +/-, 20 fokot változik. Ezt a hőmérsékletrést megváltoztathatjuk ebből a temp_gap makróból. Ha módosítja az értéket ennél a makrónál, akkor a specifikáció megváltozik.
A megjelenített hőmérsékleti adatok tárolására használt másik két úszó változó, és megkülönbözteti őket a hőmérsékleti réssel
#define temp_gap 20 float pre_val = 0, aft_val = 0;
A void main () függvényben az lcd_init () ; az LCD inicializálásának egyik funkciója. Ezt az lcd_init () függvényt az lcd.h könyvtárból hívják meg.
A TRIS regiszterek segítségével kiválasztható az I / O csapok bemenetként vagy kimenetként. Két előjel nélküli rövid változó TempL és TempH a hőmérséklet érzékelő 12 bites felbontású adatainak tárolására szolgál.
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; aláíratlan rövid TempL, TempH; előjel nélküli int t, t2; úszó különbség1 = 0, különbség2 = 0; lcd_init ();
Lássuk a while hurokot, itt apró darabokra bontjuk a while (1) hurkot.
Ezeket a vezetékeket arra használják, hogy érzékeljék, hogy a hőmérséklet-érzékelő csatlakoztatva van-e.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Kérjük, csatlakozzon"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }
A kód ezen szakaszának használatával inicializáljuk az érzékelőt, és parancsot küldünk a hőmérséklet átalakítására.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); írási_bájt (0); írási_bájt (0); write_byte (felbontás_12bit); // 12 bites felbontás ow_reset (); írási_byte (ugrás_rom); write_byte (konvertálás_temp);
Ez a kód a 12 bites hőmérsékleti adatok két előjel nélküli rövid változóban történő tárolására szolgál.
while (read_byte () == 0xff); __késleltesms (500); ow_reset (); írási_byte (ugrás_rom); write_byte (read_scratchpad); TempL = olvasási_byte (); TempH = olvasási_byte ();
Ezután, ha megnézi az alábbi teljes kódot, létrehozunk egy if-else feltételt, hogy megtudjuk, a hőmérséklet jele pozitív vagy negatív.
Az If utasítás kód használatával manipuláljuk az adatokat, és megnézzük, hogy a hőmérséklet negatív-e vagy sem, és meghatározzuk, hogy a hőmérséklet-változások +/-, 20 fokos tartományban vannak-e vagy sem. Másrészt pedig azt ellenőriztük, hogy a hőmérséklet pozitív-e vagy sem, és a hőmérséklet változásainak észlelése.
kód
Adatok beszerzése a DS18B20 hőmérséklet-érzékelőből:
Lássuk az 1-Wire® Interface időbeli különbségét. 20Mhz kristályt használunk. Ha belenézünk a ds18b20.c fájlba, meglátjuk
#define _XTAL_FREQ 20000000
Ezt a definíciót az XC8 fordító késleltetési rutinjára használják. A kristály frekvenciája 20 MHz.
Öt funkciót készítettünk
- ow_reset
- read_bit
- read_byte
- write_bit
- write_byte
Az 1-Wire ® protokollnak szigorú időzítéssel kapcsolatos résekre van szüksége a kommunikációhoz. Az adatlapon belül tökéletes időrésszel kapcsolatos információkat kapunk.
Az alábbi függvényen belül létrehoztuk a pontos időrést. Fontos megadni a pontos késleltetést az adott érzékelő portjának TRIS bitjének megtartására és feloldására, valamint vezérlésére.
aláíratlan karakter ow_reset (érvénytelen) {DQ_TRIS = 0; Tris = 0 (kimenet) DQ = 0; // a pin # értékét állítsa alacsonyra (0) __késleltetési_ (480); // 1 vezeték szükséges késleltetéshez DQ_TRIS = 1; // Tris = 1 (bemenet) __késleltetés_ (60); // 1 vezetékhez késleltetés szükséges, ha (DQ == 0) //, ha van jelenléti plusz {__delay_us (480); visszatér 0; // visszatér 0 (1-vezetékes jelenlét)} else {__delay_us (480); visszatér 1; // return 1 (1-vezeték NEM jelenlét)}} // 0 = jelenlét, 1 = nincs rész
Most, az alábbi olvasási és írási idõpont leírásnak megfelelõen, létrehoztuk az olvasási és az írási funkciót.
unsigned char read_bit (void) {unsigned char i; DQ_TRIS = 1; DQ = 0; // húzza a DQ-t alacsonyra az időrés kezdéséhez DQ_TRIS = 1; DQ = 1; // majd térjen vissza magas értékre (i = 0; i <3; i ++); // késlelteti a 15us-ot a timelot return elejétől (DQ); // a DQ sor visszatérési értéke} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // húzza a DQ-t alacsonyra az időrés megkezdéséhez if (bitval == 1) DQ = 1; // adja vissza a DQ magas értéket, ha 1-et írunk __delay_us (5); // érték tartása az időrés hátralévő részében DQ_TRIS = 1; DQ = 1; } // A késleltetés ciklusonként 16 us, plusz 24us. Ezért késleltetés (5) = 104us
Itt ellenőrizheti az összes kapcsolódó fejléc- és.c fájlt.
Tehát így használhatjuk a DS18B20 érzékelőt a hőmérséklet mérésére a PIC mikrovezérlővel.
Ha egy egyszerű digitális hőmérőt szeretne építeni az LM35-tel, akkor az alábbi mikroprocesszorokkal együtt fizessen:
- Szobahőmérséklet mérés Raspberry Pi-vel
- Digitális hőmérő Arduino és LM35 segítségével
- Digitális hőmérő az LM35 és a 8051 segítségével
- Hőmérsékletmérés LM35 és AVR mikrokontrollerrel