Verschiedenes > ESP8266
ESP8266 falsche Messwerte mit DS18b20
cubiator:
Hallo zusammen,
lange lese ich hier schon mit und konnte einiges durch die vielen Threats auch lösen doch nun benötige ich Eure Hilfe.
Ich habe durch diesen Post motiviert: http://forum.fhem.de/index.php/topic,28905.msg297133.html#msg297133 einen ESP8266 mit einem DS18b20 verbunden und dieser sendet mittlerweile auch brav an mein FHEM. Leider stimmen die Werte die der DS18b20 am ESP misst nicht und zwar zeigt er nur den ersten Zehner an. Da bedeutet das aus 22° dann 2°, aus 18° wird 1°, aus -15° wird -1°, usw.
Das hat nichts mit FHEM zu tun sondern wird auch im Esplorer schon so angezeigt, der angehängte Screeshoot wurde bei ca. 22° geschossen.
Meiner Meinung nach kann es nur in der Datei ds18b20.lua liegen, mag sich die mal jemand anschauen? Leider verstehe ich davon zu wenig das ich dort einen Auslesefehler finden kann.
ds18b20.lua
--- Code: -----------------------------------------------------------------------------------
-- 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(unit == nil or unit == C) then
t = t * 625
elseif(unit == F) then
t = t * 1125 + 320000
elseif(unit == K) then
t = t * 625 + 2731500
else
return nil
end
t = t / 10000
-- print("Temperature="..t1.."."..t2.." Centigrade")
-- result = t1.."."..t2
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
--- Ende Code ---
fhem_ds18b20.lua
--- Code: -----fhem.lua
require('ds18b20')
-- ESP-01 GPIO Mapping
gpio0 =3
gpio2 =4
ds18b20.setup(gpio0)
t=ds18b20.read()
print("Temp:" .. ds18b20.read() .. " C\n")
if(t==nil) then
t=0
end
tmr.alarm(0,30000, 1, function()
t=ds18b20.read()
conn=net.createConnection(net.TCP, 0)
conn:on("receive", function(conn, payload) print(payload) end )
conn:connect(8085,"192.168.1.6")
conn:send('GET /fhem?cmd=setreading%20esp8266temp%20state%20T:%20' ..t.. '&XHR=1\r\n HTTP/1.1\r\nHost: www.local.lan\r\n".."Connection: keep-alive\r\nAccept: */*\r\n\r\n"')
end)
--- Ende Code ---
init.lua
--- Code: -----init.lua
wifi.setmode(wifi.STATION)
wifi.sta.config("meinessid","meinganzgeheimespasswort")
wifi.sta.connect()
tmr.alarm(1, 1000, 1, function()
if wifi.sta.getip()== nil then
print("IP unavaiable, Waiting...")
else
tmr.stop(1)
print("ESP8266 mode is: " .. wifi.getmode())
print("The module MAC address is: " .. wifi.ap.getmac())
print("Config done, IP is "..wifi.sta.getip())
dofile ("fhem_ds18b20.lua")
end
end)
--- Ende Code ---
Was mich wundert das diese luas bei Anderen zu funktionieren scheinen.
Danke für Eure Mühe!
Cubiator
Klaus0815:
bist Du sicher das es ein B-Typ ist, nicht evtl. ein 18S20 oder nur 1820 ? Wird Dir irgendwo die ID des Sensors angezeigt ?
cubiator:
Ohje,
meine Augen werden schlecht.
Habe eben mit einer starken Lupe noch einmal geschaut und es ist ein ds1820.
War echt überzeugt ds18b20 gekauft zu haben.
Liegt das evtl. daran? Lese mich gerade in die Unterschiede ein.
Kann ich das umstellen oder muss ich mir neue ds18b20 besorgen?
Omega-5:
Der DS1820 wird schon seit 2004 nicht mehr gefertigt. Er hat nur eine Auflösung von 9 bits. Als direkter Ersatz für ältere Designs gilt der DS18S20. Der DS18B20 hat eine einstellbare Auflösung von 9 bis 12 bits.
Du könntest ja mal testhalber in der ds18b20.lua den Teiler verkleinern.
--- Code: --- t = t / 10000
--- Ende Code ---
Gruß Friedrich
cubiator:
Hallo zusammen,
danke das Ihr Euch der Sache annehmt.
Das Ändern des Teilers bringt tatsächlich einen Teilerfolg, zwar wird keine Nachkommastelle angezeigt aber das ist erst einmal egal.
Was schade ist das die Temperatur ca. 5° abweicht, evtl. könnte ich hier noch etwas optimieren:
--- Code: ---if(unit == nil or unit == C) then
t = t * 625
--- Ende Code ---
Aber ich habe einfach einmal ds18b20 bestellt und werde schauen ob die Ergenisse dann besser sind.
Danke Cubiator
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln