Просмотр исходного кода

add: 添加am2320的外设驱动库及demo

Wendal Chen 2 лет назад
Родитель
Сommit
8d6ca73281
2 измененных файлов с 112 добавлено и 0 удалено
  1. 39 0
      demo/am2320/main.lua
  2. 73 0
      script/libs/am2320.lua

+ 39 - 0
demo/am2320/main.lua

@@ -0,0 +1,39 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "am2320demo"
+VERSION = "1.0.0"
+
+log.info("main", PROJECT, VERSION)
+
+-- 引入必要的库文件(lua编写), 内部库不需要require
+sys = require("sys")
+
+-- Air780E的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
+if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
+    pm.power(pm.PWK_MODE, false)
+end
+
+
+if wdt then
+    --添加硬狗防止程序卡死,在支持的设备上启用这个功能
+    wdt.init(9000)--初始化watchdog设置为9s
+    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
+end
+
+local am2320 = require "am2320"
+
+sys.taskInit(function ()
+    i2c.setup(0, i2c.FAST)
+    while 1 do
+        sys.wait(3000)
+        local t, h = am2320.read()
+        -- 若读取成功会返回2个值,否则两个值都是nil
+        -- 单位分别是摄氏度和1%相对湿度
+        log.info("am2320", "温度", t, "湿度", h)
+    end
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 73 - 0
script/libs/am2320.lua

@@ -0,0 +1,73 @@
+--[[
+@module am2320
+@summary am2320 温湿度传感器
+@version 1.0
+@date    2023.07.31
+@author  wendal
+@demo    am2320
+@usage
+-- 用法实例
+local am2320 = require "am2320"
+sys.taskInit(function()
+    local i2c_id = 0
+    i2c.setup(i2c_id, i2c.FAST)
+    while 1 do
+        local t, h = am2320.read(i2c_id)
+        log.info("am2320", "温度", t, "湿度", h)
+        sys.wait(1000)
+    end
+end)
+]]
+
+
+local am2320 = {}
+
+--[[
+读取温湿度数据
+@api am2320.read(i2c_id)
+@int i2c总线的id, 默认是0, 需要按实际接线来填, 例如0/1/2/3
+@return number 温度,单位摄氏度,若读取失败会返回nil
+@return number 相对湿度,单位1%,若读取失败会返回nil
+]]
+function am2320.read(i2c_id)
+    if not i2c_id then
+        i2c_id = 0
+    end
+    local i2cslaveaddr = 0x5C -- 8bit地址为0xb8 7bit 为0x5C
+    i2c.send(i2c_id, i2cslaveaddr, 0x03)
+    -- 查询功能码:0x03 查询的寄存器首地址:0 长度:4
+    i2c.send(i2c_id, i2cslaveaddr, {0x03, 0x00, 0x04})
+    local _, ismain = coroutine.running()
+    if ismain then
+        timer.mdelay(2)
+    else
+        sys.wait(2)
+    end
+    local data = i2c.recv(i2c_id, i2cslaveaddr, 8)
+
+    -- 传感器返回的8位数据格式:
+    --    1       2       3       4       5       6       7       8
+    --  0x03    0x04    0x03    0x39     0x01    0x15    0xE1    0XFE
+    -- 功能码  数据长度   湿度高位 湿度数据 温度高位  温度低位 CRC低  CRC高
+
+    if data == nil or #data ~= 8 then
+        return
+    end
+    -- log.info("AM2320", "buf data:", buf)
+    -- log.info("AM2320", "HEX data:", data:toHex())
+
+    local _, crc = pack.unpack(data, '<H', 7)
+    data = data:sub(1, 6)
+    if crc == crypto.crc16_modbus(data, 6) then
+        local _, hum, tmp = pack.unpack(string.sub(data, 3, -1), '>H2')
+        -- 正负温度处理
+        if tmp >= 0x8000 then
+            tmp = 0x8000 - tmp
+        end
+        tmp, hum = tmp / 10, hum / 10
+        -- log.info("AM2320", "data(tmp hum):", tmp, hum)
+        return tmp, hum
+    end
+end
+
+return am2320