- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码 - 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等) - 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
131 lines
3.7 KiB
Lua
131 lines
3.7 KiB
Lua
--[[
|
||
@module fota
|
||
@summary 使用合宙iot平台远程升级功能模块
|
||
@version 1.0
|
||
@date 2025.09.25
|
||
@author 王城钧
|
||
@usage
|
||
SHT30获取温湿度
|
||
]]
|
||
|
||
|
||
--本文件中的主机是指I2C主机,具体指Air780EHV
|
||
--本文件中的从机是指I2C从机,具体指AirSHT30_1000配件板上的sht30温湿度传感器芯片
|
||
|
||
local AirSHT30_1000 =
|
||
{
|
||
-- i2c_id:主机的i2c id;
|
||
}
|
||
|
||
-- 从机地址为0x44
|
||
local slave_addr = 0x44
|
||
|
||
--电平设为3.3v
|
||
pm.ioVol(pm.IOVOL_ALL_GPIO, 3300)
|
||
--设置gpio2输出,给camera_sda、camera_scl引脚提供上拉
|
||
gpio.setup(2, 1)
|
||
|
||
-- 计算数据表data中所有数据元素的crc8校验值
|
||
local function crc8(data)
|
||
local crc = 0xFF
|
||
for i = 1, #data 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
|
||
|
||
|
||
--打开AirSHT30_1000;
|
||
|
||
--i2c_id:number类型;
|
||
-- 主机使用的I2C ID,用来控制AirSHT30_1000;
|
||
-- 取值范围:仅支持0和1;
|
||
-- 如果没有传入此参数,则默认为0;
|
||
|
||
--返回值:成功返回true,失败返回false
|
||
function AirSHT30_1000.open(i2c_id)
|
||
--如果i2c_id为nil,则赋值为默认值0
|
||
if i2c_id==nil then i2c_id=0 end
|
||
|
||
--检查参数的合法性
|
||
if not (i2c_id == 0 or i2c_id == 1) then
|
||
log.error("AirSHT30_1000.open", "invalid i2c_id", i2c_id)
|
||
return false
|
||
end
|
||
|
||
AirSHT30_1000.i2c_id = i2c_id
|
||
|
||
--初始化I2C
|
||
if i2c.setup(i2c_id, i2c.FAST) ~= 1 then
|
||
log.error("AirSHT30_1000.open", "i2c.setup error", i2c_id)
|
||
return false
|
||
end
|
||
|
||
return true
|
||
end
|
||
|
||
--读取温湿度数据;
|
||
|
||
--返回值:失败返回false;
|
||
-- 成功返回两个值,第一个为摄氏温度值(number类型,例如23.6表示23.6摄氏度),第二个为百分比湿度值(number类型,例如67表示67%的湿度)
|
||
function AirSHT30_1000.read()
|
||
|
||
-- 发送启动测量命令(高精度)
|
||
i2c.send(AirSHT30_1000.i2c_id, slave_addr, {0x24, 0x00})
|
||
|
||
-- 等待测量完成(SHT30高精度测量需~15ms)
|
||
sys.wait(20)
|
||
|
||
-- 读取6字节数据(温度高/低 + CRC,湿度高/低 + CRC)
|
||
local data = i2c.recv(AirSHT30_1000.i2c_id, slave_addr, 6)
|
||
|
||
-- 如果没有读取到6字节数据
|
||
if type(data)~="string" or data:len()~=6 then
|
||
log.error("AirSHT30_1000.read", "i2c.recv error")
|
||
return false
|
||
end
|
||
|
||
-- log.info("AirSHT30_1000.read", data:toHex())
|
||
|
||
--如果校验值正确
|
||
if crc8({data:byte(1), data:byte(2)}) == data:byte(3) and crc8({data:byte(4), data:byte(5)}) == data:byte(6) then
|
||
-- 提取原始温度值
|
||
local temp_raw = (data:byte(1) << 8) | data:byte(2)
|
||
-- 提取原始湿度值
|
||
local hum_raw = (data:byte(4) << 8) | data:byte(5)
|
||
|
||
-- 转换为实际值(根据SHT30数据手册公式)
|
||
local temprature = (-45 + 175 * temp_raw / 65535.0)
|
||
local humidity = (100 * hum_raw / 65535.0)
|
||
|
||
-- 打印输出结果(保留2位小数)
|
||
-- log.info("AirSHT30_1000.read", "temprature", string.format("%.2f ℃", temprature))
|
||
-- log.info("AirSHT30_1000.read", "temprature", string.format("%.2f %%RH", humidity))
|
||
|
||
return temprature, humidity
|
||
else
|
||
log.error("AirSHT30_1000.read", "crc error", i2c_id)
|
||
return false
|
||
end
|
||
end
|
||
|
||
|
||
--关闭AirSHT30_1000
|
||
|
||
--返回值:成功返回true,失败返回false
|
||
function AirSHT30_1000.close()
|
||
--close接口没有返回值,理论上不会关闭失败
|
||
i2c.close(AirSHT30_1000.i2c_id)
|
||
|
||
return true
|
||
end
|
||
|
||
|
||
return AirSHT30_1000
|