完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我有一些 1wire 温度传感器。一些 DS18B20 和一些 DS18S20
我注意到这里有用于 NODEMCU 的 DS18B20 单线模块:https://github.com/nodemcu/nodemcu-firm ... s18b20.lua适用于两种传感器类型,但是温度读数对于 DS18S20 仅为 9 位(对于 DS18B20 为 12 位)。 9 位很烦人,因为您只能获得半度精度(即 22;22.5;23;23.5;24 等),您无法获得 22.3 之类的精度。所以即使我不需要小数点后的 4 位数字,12 位分辨率也更好。 我稍微修改了 ds18b20.lua 脚本以具有此功能,这里是更改: 第 108 行: 代码:全选t = t * 5000 -- DS18S20, 1 fractional bit 替换为 6 行: 代码:全选-- 12 bits resolution. If you need 9 bits only comment the -- two following lines and un-comment the third c = (((data:byte(8)-data:byte(7))/data:byte(8)) - 0.25) * 10000 t = (t * 5000) + c -- t = t * 5000 -- DS18S20, 1 fractional bit 这是完整的脚本。希望它可以帮助别人...... 代码:全选-------------------------------------------------------------------------------- -- DS18B20 one wire module for NODEMCU -- NODEMCU TEAM -- LICENCE -- Vowstar -- 2015/02/14 sza2 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 = 'C' F = 'F' K = 'K' 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 -- 12 bits resolution. If you need 9 bits only comment the -- two following lines and un-comment the third c = (((data:byte(8)-data:byte(7))/data:byte(8)) - 0.25) * 10000 t = (t * 5000) + c -- 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 -- 跳转0 |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
423 浏览 1 评论
1280 浏览 1 评论
596浏览 6评论
491浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
478浏览 5评论
474浏览 4评论
460浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-8 23:42 , Processed in 0.725187 second(s), Total 43, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号