Verschiedenes > ESP8266

ESP8266 falsche Messwerte mit DS18b20

(1/2) > >>

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