1、板载有一个SHT30温湿度传器,要好好利用一下
2、I2C要进行初始化,读取数据,再通过全局变量传递给MQTT程序,几个重要lua脚本如下:
main.lua脚本:
- --必须在这个位置定义PROJECT和VERSION变量
- --PROJECT:ascii string类型,可以随便定义,只要不使用,就行
- --VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
- PROJECT = "I2C"
- VERSION = "2.0.0"
- PRODUCT_KEY = "v32xEAKsGtiEQxtqgwCldp5aPlcnPs3K"
- Skytemp = 36.0
- -- 日志级别
- require "log"
- LOG_LEVEL = log.LOGLEVEL_TRACE
- require "sys"
- require "utils"
- require "patch"
- require "pins"
- -- 加载GSM
- require "net"
- --8秒后查询第一次csq
- net.startQueryAll(8 * 1000, 600 * 1000)
- --此处关闭RNDIS网卡功能
- --否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
- --如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
- --注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
- ril.request("AT+RNDISCALL=0,1")
- -- 控制台
- require "console"
- console.setup(2, 115200)
- --加载网络指示灯和LTE指示灯功能模块
- --根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
- --合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
- require "netLed"
- -- pmd.ldoset(2,pmd.LDO_VLCD)
- pmd.ldoset(15, pmd.LDO_VLCD)--Air820开发板需打开lcd电压域,用于i2c电平转换
- netLed.setup(true, pio.P0_1, pio.P0_4)
- --网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
- --如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
- --LTE指示灯功能模块中,配置的是注册上4G网络,灯就常亮,其余任何状态灯都会熄灭
- -- 系统工具
- require "misc"
- require "errDump"
- -- 系統指示灯
- -- require "i2c_ssd1306_lcd"
- require "sht30"
- -- require "ds3231"
- -- require "KXTJ3-1057"
- -- require "mpu6xxx"
- require "gsensor"
- require "mqttTask"
- require "ntp"
- ntp.timeSync(1, function()log.info("----------------> AutoTimeSync is Done ! <----------------") end)
- -- 启动系统框架
- sys.init(0, 0)
- sys.run()
复制代码
gsensor.lua脚本:
- module(...,package.seeall)
- local enable = true
- local i2cslaveaddr = 0x18
- local i2cid = 2
- -- 初始化i2c
- local function i2cInit()
- if i2c.setup(i2cid,i2c.SLOW) ~= i2c.SLOW then
- log.error("I2c.init","fail")
- return
- end
- end
- -- 读i2c
- local function i2cRead(addr,len)
- i2c.send(i2cid,i2cslaveaddr,addr)
- return i2c.recv(i2cid,i2cslaveaddr,len)
- end
- -- 写i2c
- local function i2cWrite(addr,...)
- return i2c.send(i2cid,i2cslaveaddr,{addr,...})
- end
- -- 初始化
- local function sensorInit()
- i2cWrite(0x1E,0x05)--打开操作权限,0x1E 寄存器写 0x05
- local sl_val = i2cRead(0x57,1) --读取 0x57 寄存器当前配置
- if #sl_val > 0 then
- log.info("sl_val", sl_val:toHex())
- sl_val = bit.bor(string.byte(sl_val),0x40) --I2C_PU 置 1
- i2cWrite(0x57,sl_val)
- --设置参数
- i2cWrite(0x20,0x37)
- i2cWrite(0x21,0x11)
- i2cWrite(0x22,0x40)
- i2cWrite(0x23,0x88)
- else
- enable = false
- end
- end
- local function update()
- if not enable then
- log.error("板载加速度计无效")
- return
- end
- local data = i2cRead(0xa8,6)
- log.info("read i2c",data:toHex())
- if #data ~= 6 then return end
- --Convert the data to 10 bits
- data = string.char(
- data:byte(1)%8,data:byte(2),
- data:byte(3)%8,data:byte(4),
- data:byte(5)%8,data:byte(6)
- )
- local _,xa,ya,za = pack.unpack(data,">HHH")
- if xa > 127 then xa = xa - 256 end
- if ya > 127 then ya = ya - 256 end
- if za > 127 then za = za - 256 end
- log.info("xyz",xa,ya,za)
- end
- sys.taskInit(function ()
- sys.wait(5000)
- i2cInit()
- sensorInit()
- while true do
- sys.wait(1000)
- update()
- end
- end)
复制代码
sht30.lua脚本:
- --- 模块功能: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.warn("这里是湿度", h) -- 打印湿度
- -- 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)
- _G.Skytemp = t / 100
- log.warn("这里是温度", t / 100 .. "." .. t % 100 .. "---" .. _G.Skytemp) -- 打印温度
- log.warn("这里是湿度", h / 100 .. "." .. h % 100) -- 打印湿度
-
- else
- log.warn("crc校验失败")
- end
- i2c.close(i2cId) -- 关闭I²C通道
- sys.wait(1000) -- task挂起一秒
- end
- end)
复制代码
mqttOutMsg.lua脚本:
- --- 模块功能:MQTT客户端数据发送处理
- -- @author openLuat
- -- @module mqtt.mqttOutMsg
- -- @license MIT
- -- @copyright openLuat
- -- @release 2018.03.28
- module(..., package.seeall)
- --数据发送的消息队列
- local msgQueue = {}
- local function insertMsg(topic, payload, qos, user)
- table.insert(msgQueue, {t = topic, p = payload, q = qos, user = user})
- sys.publish("APP_SOCKET_SEND_DATA")
- end
- local function pubQos0TestCb(result)
- log.info("mqttOutMsg.pubQos0TestCb", result)
- if result then sys.timerStart(pubQos0Test, 10000) end
- end
- function pubQos0Test()
- --insertMsg("/qos0topic","qos0data",0,{cb=pubQos0TestCb})
- insertMsg("/event0", string.format("%f", _G.Skytemp), 0, {cb = pubQos0TestCb})
- end
- local function pubQos1TestCb(result)
- log.info("mqttOutMsg.pubQos1TestCb", result)
- if result then sys.timerStart(pubQos1Test, 20000) end
- end
- function pubQos1Test()
- insertMsg("/中文qos1topic", "中文qos1data", 1, {cb = pubQos1TestCb})
- end
- --- 初始化“MQTT客户端数据发送”
- -- [url=home.php?mod=space&uid=1141835]@Return[/url] 无
- -- @usage mqttOutMsg.init()
- function init()
- pubQos0Test()
- pubQos1Test()
- end
- --- 去初始化“MQTT客户端数据发送”
- -- @return 无
- -- @usage mqttOutMsg.unInit()
- function unInit()
- sys.timerStop(pubQos0Test)
- sys.timerStop(pubQos1Test)
- while #msgQueue > 0 do
- local outMsg = table.remove(msgQueue, 1)
- if outMsg.user and outMsg.user.cb then outMsg.user.cb(false, outMsg.user.para) end
- end
- end
- --- MQTT客户端数据发送处理
- -- [url=home.php?mod=space&uid=3142012]@param[/url] mqttClient,MQTT客户端对象
- -- @return 处理成功返回true,处理出错返回false
- -- @usage mqttOutMsg.proc(mqttClient)
- function proc(mqttClient)
- while #msgQueue > 0 do
- local outMsg = table.remove(msgQueue, 1)
- local result = mqttClient:publish(outMsg.t, outMsg.p, outMsg.q)
- if outMsg.user and outMsg.user.cb then outMsg.user.cb(result, outMsg.user.para) end
- if not result then return end
- end
- return true
- end
复制代码
3、开始上传脚本:
4、查看日志输出:
|
|
|
|