ESP8266 falsche Messwerte mit DS18b20

Begonnen von cubiator, 19 Februar 2016, 17:51:35

Vorheriges Thema - Nächstes Thema

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

--------------------------------------------------------------------------------
-- 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


fhem_ds18b20.lua

--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)


init.lua

--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)

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

#3
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.
t = t / 10000

Gruß Friedrich

RaspberryPi2, nanoCUL, 3x DS18B20, FS20: 4x Funk-Schalter ST-4, LaCrosseGW,
HomeMatic: HMLAN, HM-WDS10-TH-O, HM_MYS_RelaisBoard,
I2C: HYT221 über modifiziertes Modul I2_I2C_SHT21.pm (Q&D),

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:

if(unit == nil or unit == C) then
          t = t * 625


Aber ich habe einfach einmal ds18b20 bestellt und werde schauen ob die Ergenisse dann besser sind.

Danke Cubiator

Omega-5

Du könntest in der ds18b20.lua mal einige Debugmeldungen aktivieren. Ich habe noch nicht in LUA programmiert, aber die zwei -- scheinen ja einen Kommentar einzuleiten. also mal vor einigen -- print(" ") entfernen. Vieleicht auch mal das delay aktivieren "-- tmr.delay(1000000)".

Gruß Friedrich
RaspberryPi2, nanoCUL, 3x DS18B20, FS20: 4x Funk-Schalter ST-4, LaCrosseGW,
HomeMatic: HMLAN, HM-WDS10-TH-O, HM_MYS_RelaisBoard,
I2C: HYT221 über modifiziertes Modul I2_I2C_SHT21.pm (Q&D),

BlackStone

ich habe zwar keinen ESP8266 jedoch schau dir doch mal den git an, da sind beispile für die dallasmodule.
https://github.com/nodemcu/nodemcu-firmware

cubiator

Zitat von: Omega-5 am 20 Februar 2016, 22:48:03
Du könntest in der ds18b20.lua mal einige Debugmeldungen aktivieren. Ich habe noch nicht in LUA programmiert, aber die zwei -- scheinen ja einen Kommentar einzuleiten. [...]

Das hatte ich schon einmal versucht, da scheint es aber etwas zu beachten zu geben:

PANIC: unprotected error in call to Lua API (ds18b20.lua:82: attempt to call global 'print' (a nil value))


Aber ich muss auch zugeben das ich wenig programmierkentnisse habe, ich kann zwar in Arduino LED blinken lassen aber komplexe Programme kann ich schwer nachvollziehen.