X-MagicBox官方固件基本涵盖了所有外设,但是东西太多学习起来比较吃力,一个一个模块学习才有感觉,之前一直想通过自己编程IIC时序读取SHT30温湿度,正好LuatOS把底层都实现了,有点像python的导入第三方库,使用API接口读取、配置各种参数。
刚发现gitee仓库在doc对基本的外设使用方法描述很详细,有些比社区讲的还要通俗易懂,地址附上:https://gitee.com/openLuat/X-MagicBox-820/tree/master/doc
正常情况下日志输出实在是看到眼瞎,功能调试的时候很不方便,日志输出配置可以参考:
--加载日志功能模块,并且设置日志输出等级--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可require "log"LOG_LEVEL = log.LOGLEVEL_TRACE--[[如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可]]--log.openTrace(true,1,115200)
SHT32在原理图中的位置如下,部分接口是多模块共用的
熟悉外设接口和框架使用方法之后,编写应用确实很快,这得益于所有接口底层都已经实现,用户只考虑基础学习就可以快速实现产品开发。SHT30我看了一下源码,I2C时序都给免了,我都没改啥,API获取到数据,往服务器里扔就完事了。
- --- 模块功能:SHT30温湿度传感器
- -- [url=home.php?mod=space&uid=40524]@author[/url] LALALALA
- -- [url=home.php?mod=space&uid=2811445]@Module[/url] SHT30
- -- [url=home.php?mod=space&uid=285243]@license[/url] MIT
- -- [url=home.php?mod=space&uid=855824]@copyright[/url] openLuat
- -- [url=home.php?mod=space&uid=1054466]@release[/url] 2021.6.2
- module(..., package.seeall)
- require "utils"
- require "pm"
- pm.wake("WORK") -- 模块保持唤醒
- local i2cId = 2 -- core 0025版本之前,0、1、2都表示i2c 2
- -- core 0025以及之后的版本,1、2、3分别表示i2c 1、2、3
- local function crc_8(data) -- SHT30获取温湿度结果crc校验
- local crc = 0xFF
- local len = #data
- for i = 1, len do
- crc = bit.bxor(crc, data[i])
- for j = 1, 8 do
- crc = crc * 2
- if crc > 0x100 then
- crc = bit.band(bit.bxor(crc, 0x31), 0xff)
- end
- end
- end
- return crc
- end
- sys.taskInit(function()
- sys.wait(5000)
- while true do
- local s = i2c.setup(i2cId, 1000000) -- 打开I²C通道
- local t, h -- 定义局部变量,用以保存温度值和湿度值
- local tempCrc = {} -- 定义局部表,保存获取的温度数据,便于进行crc校验
- local humiCrc = {} -- 定义局部表,保存获取的湿度数据,便于进行crc校验
- local w = i2c.send(2, 0x44, {0x2c, 0x06}) -- 发送单次采集命令
- sys.wait(10) -- 等待采集
- local r = i2c.recv(2, 0x44, 6) -- 读取数据采集结果
- -- b:温度高八位 c:温度低八位 d:b和c的crc校验值 e:湿度高八位 f:湿度低八位 g:e和f的crc校验值
- local a, b, c, d, e, f, g = pack.unpack(r, "b6")
- table.insert(tempCrc, b) -- 将温度高八位和温度低八位存入表中,稍后进行crc校验
- table.insert(tempCrc, c)
- table.insert(humiCrc, e) -- 将湿度高八位和温度低八位存入表中,稍后进行crc校验
- table.insert(humiCrc, f)
- local result1 = crc_8(tempCrc) -- 温度数据crc校验
- local result2 = crc_8(humiCrc) -- 湿度数据crc校验
- if d == result1 and g == result2 then
- t = -45 + 175 * ((b * 256 + c) / 65535) -- 根据SHT30传感器手册给的公式计算温度和湿度
- h = 100 * ((e * 256 + f) / 65535)
- log.warn("温度 ---- ", t) -- 打印温度
- log.info("n")
- log.warn("湿度 ----", h) -- 打印湿度
- log.info("n")
- else
- log.warn("crc校验失败")
- end
- -- if d == result1 and g == result2 then -- 将数据放大100倍,便于不带float的固件使用
- -- t = ((4375 * (b * 256 + c)) / 16384) - 4500 --根据SHT30传感器手册给的公式计算温度和湿度
- -- h = ((2500 * (e * 256 + f)) / 16384)
- -- log.warn("这里是温度", t / 100 .. "." .. t % 100) -- 打印温度
- -- log.warn("这里是湿度", h / 100 .. "." .. h % 100) -- 打印湿度
- -- else
- -- log.warn("crc校验失败")
- -- end
- i2c.close(i2cId) -- 关闭I²C通道
- sys.wait(1000) -- task挂起一秒
- end
- end)
复制代码
Luatools建议不要勾选USB打印log,太快了,我的天,先勾选串口吧,这样子方便查看日志。SHT30确实是王者中的王者,抗干扰要好一些,目前市场上大部分还是采用SHT20传感器,毕竟价格放在那。
|