ESP8266 WiFi – Temperatuur sensor DS18B20 uitlezen (NodeMCU)
Op deze pagina vind je een voorbeeld om via de ESP-01 module een DS18B20 (Dallas 1-wire) temperatuur sensor te gebruiken via de GPIO pinnen met de firmware NodeMCU.
Hardware
De DS18B20 is nauwkeurige digitale temperatuur sensor, het is een Dallas one-wire device en werkt op 3.3v, je kan meerdere sensoren aansluiten via dezelfde pinnen en deze uitlezen.
Afwijking: ±0,5°C bij −50°C en +85°C
Specificaties:
– 1-Wire interface vereist slechts 1 pin voor communicatie
– 64-bit serial code opgeslagen in een geïntegreerde ROM
– Kan worden gevoed vanuit datalijn.
– Voeding bereik is 3,0 V tot 5,5 V
– Meet temperaturen van -55 ° C tot +125 ° C
– ± 0,5 ° C nauwkeurigheid van -10 ° C tot +85 ° C
Pinout
Pin: | Functie |
1 | GND |
2 | Digitale uitgang |
3 | Vdd (+3.3v) |
Wat heb je nodig?
1) ESPlorer IDE
Sluit de DS18B20 temperatuur sensor aan op volgens onderstaand schema:
Upload deze “library” code als ds18b20.lua
Tip: Download de code sla het op als bestand, en gebruik de “Upload…” knop in ESPlorer.
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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
-------------------------------------------------------------------------------- -- DS18B20 one wire module for NODEMCU -- NODEMCU TEAM -- LICENCE: http://opensource.org/licenses/MIT -- Vowstar <vowstar@nodemcu.com> -- 2015/02/14 sza2 <sza2trash@gmail.com> Fix for negative values -------------------------------------------------------------------------------- -- Set module name as parameter of require local modname = ... local M = {} _G[modname] = M -------------------------------------------------------------------------------- -- Local used variables -------------------------------------------------------------------------------- -- DS18B20 dq pin local pin = nil -- DS18B20 default pin local defaultPin = 9 -------------------------------------------------------------------------------- -- Local used modules -------------------------------------------------------------------------------- -- Table module local table = table -- String module local string = string -- One wire module local ow = ow -- Timer module local tmr = tmr -- Limited to local environment setfenv(1,M) -------------------------------------------------------------------------------- -- Implementation -------------------------------------------------------------------------------- C = 0 F = 1 K = 2 function setup(dq) pin = dq if(pin == nil) then pin = defaultPin end ow.setup(pin) end function addrs() setup(pin) tbl = {} ow.reset_search(pin) repeat addr = ow.search(pin) if(addr ~= nil) then table.insert(tbl, addr) end tmr.wdclr() until (addr == nil) ow.reset_search(pin) return tbl end function readNumber(addr, unit) result = nil setup(pin) flag = false if(addr == nil) then ow.reset_search(pin) count = 0 repeat count = count + 1 addr = ow.search(pin) tmr.wdclr() until((addr ~= nil) or (count > 100)) ow.reset_search(pin) end if(addr == nil) then return result end crc = ow.crc8(string.sub(addr,1,7)) if (crc == addr:byte(8)) then if ((addr:byte(1) == 0x10) or (addr:byte(1) == 0x28)) then -- print("Device is a DS18S20 family device.") ow.reset(pin) ow.select(pin, addr) ow.write(pin, 0x44, 1) -- tmr.delay(1000000) present = ow.reset(pin) ow.select(pin, addr) ow.write(pin,0xBE,1) -- print("P="..present) data = nil data = string.char(ow.read(pin)) for i = 1, 8 do data = data .. string.char(ow.read(pin)) end -- print(data:byte(1,9)) crc = ow.crc8(string.sub(data,1,8)) -- print("CRC="..crc) if (crc == data:byte(9)) then t = (data:byte(1) + data:byte(2) * 256) if (t > 32767) then t = t - 65536 end if (addr:byte(1) == 0x28) then t = t * 625 -- DS18B20, 4 fractional bits else t = t * 5000 -- DS18S20, 1 fractional bit end if(unit == nil or unit == 'C') then -- do nothing elseif(unit == 'F') then t = t * 1.8 + 320000 elseif(unit == 'K') then t = t + 2731500 else return nil end t = t / 10000 return t end tmr.wdclr() else -- print("Device family is not recognized.") end else -- print("CRC is not valid!") end return result end function read(addr, unit) t = readNumber(addr, unit) if (t == nil) then return nil else return t end end -- Return module table return M |
Gebruik de volgende code om de temperatuur en weer te geven:
(de READ code wordt 2 maal aangeroepen omdat de eerste pull niet altijd meteen de juiste waarde weergeeft!)
1 2 3 4 5 6 7 |
require('ds18b20') pin = 4 --GPIO2 ds18b20.setup(pin) t1=ds18b20.read() t1=ds18b20.read() print("Temp:"..t1.." C\n") |
Sla het bestand bijvoorbeeld op als read.lua, resultaat:
1 2 |
> dofile("read.lua") Temp:19.9375 C |