
A DS18B20 digitális hőmérséklet-érzékelő az egyik legnépszerűbb megoldás, ha megbízható, pontos és könnyen kezelhető eszközt keresel Arduino projektekhez. Különlegessége az egyszerű csatlakoztathatóság és az, hogy egyetlen adatvezetéken keresztül akár több érzékelőt is képes kezelni. Ez a részletes útmutató végigvezet a szükséges lépéseken, hogy könnyedén megvalósítsd saját hőmérsékletmérő projekted.
Miért érdemes a DS18B20-at választani?
A DS18B20 nemcsak egyszerű, de rendkívül sokoldalú hőmérséklet-érzékelő. Néhány fontos tulajdonsága:
- Mérési tartomány: -55°C és +125°C között.
- Pontosság: ±0,5°C a -10°C és +85°C közötti tartományban.
- 1-Wire kommunikáció: Egyetlen adatvezetéken keresztül kommunikál, így egyszerűsíti a kábelezést.
- Egyedi azonosító: Minden érzékelő gyárilag egyedi ID-vel rendelkezik, így egyszerűen használhatsz több érzékelőt egyetlen buszon.
- Energiatakarékos: Alacsony energiafogyasztása miatt ideális hosszabb távú projektekhez.
Ezek a tulajdonságok különösen alkalmassá teszik időjárás-állomásokhoz, termosztátokhoz, vagy akár egyszerű oktatási projektekhez.
Szükséges eszközök és alkatrészek
A projekt elkészítéséhez a következőkre lesz szükséged:
![]() | → Arduino Uno alaplap: Ez fogja kezelni az érzékelőt és megjeleníteni az adatokat. |
![]() | → DS18B20 érzékelő: Lehet TO-92 tokos (hasonló egy tranzisztorhoz) vagy vízálló, kábeles verzió. |
![]() | → 4,7 kOhm ellenállás: Az adatvezeték és a tápfeszültség (Vcc) közé szükséges. |
![]() | → Breadboard és jumper kábelek (anya-apa / apa-apa): A könnyű csatlakoztatáshoz. |
![]() | → DS18B20 hőmérőmodul: az ellenállást a hőmérőt készre szerelve tartalmazza egy áramköri lapon. |
A DS18B20 működésének alapjai
A DS18B20 digitális jelet ad ki, így nincs szükség analóg átalakításra. A kommunikáció az 1-Wire protokollon alapul, ami lehetővé teszi, hogy egyetlen adatvezeték kezelje az adatforgalmat, miközben több érzékelőt is csatlakoztathatsz. Az érzékelő egyedi ID-jének köszönhetően az Arduino mindig pontosan tudni fogja, melyik szenzorról kap adatot.
Kapcsolási rajz
A következő lépések segítenek a DS18B20 csatlakoztatásában:
- Tápellátás:
- A DS18B20 Vcc lábát kösd az Arduino 5V kimenetére.
- A GND lábat csatlakoztasd az Arduino földeléséhez (GND).
- Adatvezeték:
- Az adatvezeték (DQ láb) menjen az Arduino digitális 2-es lábára.
- Helyezz el egy 4,7 kOhm ellenállást a DQ és a Vcc között. Ez az ellenállás “felhúzza” az adatvonalat, ami az 1-Wire protokoll működéséhez szükséges.
Ez a kapcsolás egyszerű, és a legtöbb projektben jól működik. Ha hosszú kábelekkel dolgozol, ügyelj arra, hogy az árnyékolás megfelelő legyen, és használj minőségi kábeleket.

A képen egy DS18B20 hőmérséklet-érzékelő modul és a TO-92 tokozású DS18B20 érzékelő bekötési diagramja látható. Bal oldalon a modul szerepel, amelyen egy fekete nyomtatott áramköri lap és a csatlakozó pontok találhatók: Vcc (piros), GND (kék) és adat (sárga). Jobb oldalon a hagyományos DS18B20 érzékelő bekötése látható, ahol az adatvezetéket (sárga) egy 4,7 kOhm-os ellenállás kapcsolja a tápfeszültséghez (piros). A földelést (kék) mindkét eszközön külön jelölik.
Példakód magyarázattal
A mintaáramkör összeállítása:

A DS18B20 hőmérőhöz szükséges eljáráskönyvtár (library), ami az OneWire névre hallgat. A telepítést a bemutató cikk elérhetősége →Arduino telepítése IV. – Library telepítése.
A telepítési képernyő:

És az alábbi kód bemutatja, hogyan kérheted le a hőmérséklet adatokat és jelenítheted meg a soros monitoron. A megjegyzések segítenek megérteni minden lépést.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <OneWire.h> // A OneWire könyvtár betöltése, amely lehetővé teszi a DS18B20 érzékelővel történő kommunikációt az 1-Wire protokollon keresztül. #define ONE_WIRE_BUS A0 // Az 1-Wire adatvezeték az Arduino A0 lábára van csatlakoztatva. OneWire ds(ONE_WIRE_BUS); // Az 1-Wire busz inicializálása a megadott lábon. void setup() { Serial.begin(9600); // A soros kommunikáció indítása, hogy az adatokat megjeleníthessük a soros monitoron. Serial.println("DS18B20 hőmérséklet-érzékelő program indul..."); // Üzenet küldése a soros monitorra a program indításakor. } void loop() { byte addr[8]; // Egy tömb az érzékelő ROM-címének tárolására (8 byte hosszúságú). byte data[9]; // Egy tömb a DS18B20 érzékelő scratchpad adatainak tárolására (9 byte hosszúságú). float celsius; // A hőmérséklet Celsius-fokban tárolására szolgáló változó. ds.reset_search(); // Az 1-Wire busz keresésének újraindítása, hogy megtaláljuk az eszközt. if (!ds.search(addr)) { // Az érzékelő keresése az 1-Wire buszon. Ha nem található érzékelő: Serial.println("Hiba: Nincs érzékelő a buszon!"); // Hibaüzenet jelenik meg a soros monitoron. delay(1000); // 1 másodperc várakozás a következő próbálkozás előtt. return; // Kilép a `loop` függvényből, és újrakezdi a keresést. } ds.reset(); // Az 1-Wire busz visszaállítása, mielőtt parancsot küldünk az érzékelőnek. ds.select(addr); // Az adott ROM-című érzékelő kiválasztása a kommunikációhoz. ds.write(0x44); // Parancs a DS18B20-nak a hőmérséklet-mérés indítására (konverzió kezdése). delay(750); // 750 ms várakozás, hogy a DS18B20 befejezze a hőmérséklet mérését (12 bites felbontáshoz szükséges idő). ds.reset(); // Az 1-Wire busz visszaállítása a mérési adatok olvasása előtt. ds.select(addr); // Az adott ROM-című érzékelő újbóli kiválasztása az adatok lekéréséhez. ds.write(0xBE); // Parancs a scratchpad memória olvasására, amely a mért adatokat tartalmazza. for (int i = 0; i < 9; i++) { // A DS18B20 által visszaküldött 9 byte adat (scratchpad) olvasása. data[i] = ds.read(); // Az olvasott byte-ok eltárolása a `data` tömbben. } int16_t raw = (data[1] << 8) | data[0]; // A mért hőmérséklet nyers (raw) értékének összeállítása a scratchpad első két byte-jából. // A `data[1]` a magas byte, a `data[0]` az alacsony byte. celsius = (float)raw / 16.0; // A nyers érték átalakítása Celsius-fokba. A DS18B20 16-os osztóval számol. Serial.print("Hőmérséklet: "); // Szöveg kiírása a soros monitorra. Serial.print(celsius); // A kiszámított hőmérséklet értékének kiírása a soros monitorra. Serial.println(" °C"); // A mért hőmérséklet egységének (Celsius) kiírása a soros monitorra. delay(1000); // 1 másodperc várakozás a következő mérés előtt. } |
A kapott eredményt a keretrendszer Soros monitorján láthatjuk, 9600 bps sebességgel.
Összefoglaló a program működéséről
- Inicializálás: A program induláskor beállítja a soros kommunikációt, és megkeresi az 1-Wire buszon elérhető DS18B20 érzékelőt.
- Érzékelő keresés: Az érzékelő ROM-címét megtalálja és eltárolja a
addr
tömbben. Ha nincs érzékelő, a program hibaüzenetet küld, és újrakezdi a keresést. - Hőmérséklet-mérés: A DS18B20 konverziót végez a
0x44
paranccsal. Ezután a scratchpad memóriából kiolvassa a mért adatokat. - Hőmérséklet kiszámítása: A scratchpad első két byte-ját felhasználva kiszámítja a hőmérsékletet Celsius-fokban.
- Adatok megjelenítése: Az aktuális hőmérsékletet kiírja a soros monitorra.
- Ciklus folytatása: A program 1 másodperc várakozás után újrakezdi a mérést, és friss adatokat kér le.
Több DS18B20 érzékelő kezelése
Ha több érzékelőt szeretnénk egy buszra kötni, elég az adatvezetéket, Vcc-t és GND-t párhuzamosan bekötni – az egyetlen ellenállás elég! Az OneWire/DallasTemperature könyvtár automatikusan felismeri az érzékelőket a buszon. Az egyedi azonosítók (ID-k) alapján egyenként kérheted le az adatokat és a hőmérsékletet kiszámolhatod. Ez a programkód már tartalmazza a biztonságra törekvő CRC hibaellenőrzést is! Az alábbi kód ezeket a funkciókat demonstrálja:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | #include <OneWire.h> // A OneWire könyvtár betöltése az 1-Wire protokollal működő eszközök kezelésére, például a DS18B20 hőmérséklet-érzékelőhöz. #define ONE_WIRE_BUS 2 // Az 1-Wire adatvezeték az Arduino D2 lábára van csatlakoztatva. Szükséges egy 4.7 kOhm-os pull-up ellenállás a D2 és a Vcc (5V) között. OneWire ds(ONE_WIRE_BUS); // Inicializáljuk az 1-Wire buszt a megadott lábon. void setup() { Serial.begin(9600); // A soros kommunikáció indítása 9600 baud sebességgel. Serial.println("DS18B20 hőmérséklet-érzékelő program indul..."); // Üzenet küldése a soros monitorra, hogy a program elindult. } void loop() { byte addr[8]; // Az érzékelő ROM-címének tárolására szolgáló tömb (8 byte hosszú). byte data[9]; // Az érzékelő által visszaküldött scratchpad adatok tárolására szolgáló tömb (9 byte hosszú). float celsius, fahrenheit; // A mért hőmérséklet tárolására szolgáló változók Celsiusban és Fahrenheitben. if (!ds.search(addr)) { // Az érzékelők keresése a buszon. Ha nincs több érzékelő, a következő történik: Serial.println("Nincs több eszköz a buszon."); // Üzenet küldése a soros monitorra. Serial.println(); ds.reset_search(); // Az érzékelő keresésének újraindítása. delay(250); // Rövid késleltetés a következő keresés előtt. return; // Kilépés a `loop` függvényből, visszatérés az elejére. } Serial.print("Talált eszköz ROM: "); for (int i = 0; i < 8; i++) { Serial.print(addr[i], HEX); Serial.print(" "); } Serial.println(); // Kiírja a megtalált érzékelő ROM-címét a soros monitorra. if (OneWire::crc8(addr, 7) != addr[7]) { // Ellenőrzi a ROM-cím érvényességét CRC segítségével. Ha nem érvényes: Serial.println("Hiba: ROM CRC nem érvényes!"); // Hibaüzenet küldése a soros monitorra. return; // Kilép a `loop` függvényből. } if (addr[0] == 0x10) { Serial.println("Típus: DS18S20"); } else if (addr[0] == 0x28) { Serial.println("Típus: DS18B20"); } else if (addr[0] == 0x22) { Serial.println("Típus: DS1822"); } else { Serial.println("Ismeretlen eszköz."); return; } // Meghatározza az érzékelő típusát a ROM-cím első byte-ja alapján, és kiírja a típusát. ds.reset(); // Az 1-Wire busz visszaállítása a hőmérséklet-mérés előtt. ds.select(addr); // A kiválasztott érzékelő beállítása kommunikációra. ds.write(0x44, 1); // A hőmérséklet-mérés indítása parazita táp használatával. delay(750); // 750 ms várakozás a mérési ciklus befejezéséhez. ds.reset(); // Az 1-Wire busz visszaállítása az adatok olvasása előtt. ds.select(addr); // Az érzékelő újbóli kiválasztása az adatlekéréshez. ds.write(0xBE); // Parancs a scratchpad memória olvasására. Serial.print("Scratchpad adatok: "); for (int i = 0; i < 9; i++) { data[i] = ds.read(); // Az érzékelő által visszaküldött adatokat beolvassa a `data` tömbbe. Serial.print(data[i], HEX); Serial.print(" "); } Serial.println(); // Kiírja a scratchpad adatokat a soros monitorra. int16_t raw = (data[1] << 8) | data[0]; // A hőmérséklet nyers (raw) adatainak összeállítása a scratchpad első két byte-jából. byte cfg = (data[4] & 0x60); // A mérések felbontásának (bitszámának) ellenőrzése a scratchpad 5. byte-jából. if (cfg == 0x00) raw = raw & ~7; // 9 bites felbontás else if (cfg == 0x20) raw = raw & ~3; // 10 bites felbontás else if (cfg == 0x40) raw = raw & ~1; // 11 bites felbontás // Az alacsonyabb bit-ek levágása a mérések pontosabb értékeihez a felbontás alapján. celsius = (float)raw / 16.0; // A nyers adat átalakítása Celsius-fokra. fahrenheit = celsius * 1.8 + 32.0; // Celsius átváltása Fahrenheit-fokra. Serial.print("Hőmérséklet: "); Serial.print(celsius); Serial.print(" °C / "); Serial.print(fahrenheit); Serial.println(" °F"); // Kiírja a mért hőmérsékletet Celsiusban és Fahrenheitben a soros monitorra. Serial.println(); delay(1000); // 1 másodperc várakozás a következő mérési ciklus előtt. } |
A program összefoglalása
- A program több érzékelőt is képes kezelni egy 1-Wire buszon, és mindegyik érzékelő ROM-címét egyesével keresi fel.
- A program CRC-ellenőrzést használ, hogy érvényesítse az érzékelő címét és az adatokat.
- A mért hőmérsékletet Celsius és Fahrenheit fokban jeleníti meg.
- A hőmérséklet-mérés során figyelembe veszi a DS18B20 felbontását, és annak megfelelően számítja ki az értékeket.
- A program folyamatosan keresi az érzékelőket a buszon, és minden mérést külön lekérdezés követ.
Ez a kód ideális, ha egy Arduino projekthez több DS18B20 érzékelőt szeretnél használni megbízható kommunikációval és hőmérséklet-méréssel.
Parazita módú táplálás
A DS18B20 érzékelők egyik különleges funkciója a parazita módú táplálás. A parazita módú táplálás során az érzékelő nem kap külön tápellátást a Vcc lábon keresztül. Ehelyett az adatvezeték (DQ) biztosítja számára a működéséhez szükséges áramot, amikor a DQ vonal magas szintű feszültségen van – így két vezeték elegendő a működéshez.
Ez a működési mód különösen hasznos, ha:
- Csökkenteni szeretnéd a vezetékek számát (pl. kétvezetékes rendszerhez).
- Egyszerűbb bekötési struktúrára van szükség.
Parazita módú tápláláskor az alábbi változtatások szükségesek a bekötéshez:
- Vcc és GND láb: A DS18B20 Vcc lábát a GND-hez kell kötni, azaz rövidre zárni.
- Adatvezeték (DQ): A 4,7 kOhm-os pull-up ellenállás az adatvezeték és az Arduino 5V-ja között marad (csökkenthető 3k3-ra, de nem lehet 4k7-nél nagyobb érték!).
- Tápellátás az adatvezetéken: Az adatvezeték (DQ) biztosítja az érzékelő működéséhez szükséges áramot a kommunikáció során.

- Adatvezeték: Az adatvonalat a DQ lábhoz csatlakoztatod, ahogyan a normál módnál.
- Vcc rövidre zárása: A DS18B20 Vcc és GND lábai közvetlenül összekötésre kerülnek.
- A Vcc és a DQ közt a felhúzóellenállás is elhelyezésre kerül.
Programozás parazita módban
A parazita módú táplálást a kód is támogatja. A hőmérséklet-mérés indításánál (konverzió) a következő parancsot kell használni:
1 2 | ds.write(0x44, 1); // Az 1-es paraméter azt jelzi, hogy parazita tápellátást használunk. |
Előnyök és hátrányok
Előnyök:
- Kevesebb vezeték szükséges az érzékelő csatlakoztatásához.
- Egyszerűbb telepítés, különösen hosszabb kábelezés esetén.
Hátrányok:
- Nagyobb áramfelvétel az adatvezeték terhelése miatt.
- Kevésbé stabil működés több érzékelő esetén.
- Hosszabb kábeleknél interferencia vagy feszültségesés léphet fel.
Javaslatok a parazita táplálás stabilitásához
- Rövidebb kábelezés: A parazita mód érzékenyebb a vezeték hosszára, ezért lehetőség szerint minimalizáld a kábelhosszt.
- Jó minőségű pull-up ellenállás: Biztosítsd, hogy a 4,7 kOhm-os pull-up ellenállás pontos értékű és megbízható legyen.
- Tesztek a környezetben: Ellenőrizd a működést zajos elektromos környezetben, mivel a parazita mód érzékenyebb lehet az interferenciára.
A parazita táplálás praktikus megoldás lehet kisebb, egyszerűbb rendszerekhez, de több érzékelős vagy nagyobb rendszerek esetén javasolt a normál tápellátás használata, hogy elkerüld a potenciális hibákat. Ha stabil, hosszútávú működést szeretnél, a normál módú tápellátás megbízhatóbb választás.
Hibaelhárítás és tippek
A programnál számos hibát elkövethetünk, akár a szoftver, akár a hardware alapon. Néhány gyakori hiba:
- Nincs adat a soros monitoron: Ellenőrizd, hogy a felhúzó-ellenállás megfelelően van-e csatlakoztatva és az értéke 4k7 (2k2….4k7 közt javasolt).
- Instabil hőmérsékleti értékek, CRC hibák: Próbálj rövidebb kábeleket használni, vagy árnyékolt vezetékeket (csak a GND lehet az árnyékolás!). Csavart érpár használatát kerüld.
- Hosszú vezetékek esetén: Gondoskodj megfelelő tápellátásról és használj dedikált földelést.
- Ne használj parazita táplálást több DS18B20 használata során! Ha 3 vagy több hőmérőt használsz, a parazita módban nagyon valószínű instabilitások lesznek!