節流計劃旨在降低物聯網產品的硬體成本,本專欄將在2021年持續更新,
節流計劃不采用STM32/STC/PIC等傳統MCU,而是充分挖掘AIR724UG芯片除4G通信外的其他功能,包含但不限于GPIO、TTS、LCD、OTA、FLASH、ADC,KEY,UART,I2C、SPI等,
著作權所有,謝絕轉載,侵權必究,承接相關物聯網專案合作,郵箱:realiot@163.com,
官方例程
1 AHT10資料讀取
sys.taskInit(
function()
local i2cid = 2
local i2cslaveaddr = 0x38
if i2c.setup(i2cid, i2c.SLOW) ~= i2c.SLOW then
log.error("AHT10", "i2c.setup fail")
return
end
while true do
if i2c.send(i2cid, i2cslaveaddr, {0xAC, 0x33, 0x00}) ~= 3 then
log.error("AHT10", "i2c.send fail")
return
end
sys.wait(100)
qryResult = i2c.recv(i2cid, i2cslaveaddr, 6)
if (nil == qryResult) or (6 ~= #qryResult) then
log.error("ATH10", "i2c.recv fail.")
return
end
log.info("ATH10", "recv", qryResult:toHex())
sys.wait(2000)
end
end
)
2 BH1750資料讀取
local i2cid = 2 --i2cid
local BH1750_ADDRESS_AD0_LOW = 0x23 -- address pin low (GND), default for InvenSense evaluation board
local BH1750_ADDRESS_AD0_HIGH = 0x24 -- address pin high (VCC)
local i2cslaveaddr = BH1750_ADDRESS_AD0_LOW
-- bh1750 registers define
local BH1750_POWER_DOWN = 0x00 -- power down
local BH1750_POWER_ON = 0x01 -- power on
local BH1750_RESET = 0x07 -- reset
local BH1750_CON_H_RES_MODE = 0x10 -- Continuously H-Resolution Mode
local BH1750_CON_H_RES_MODE2 = 0x11 -- Continuously H-Resolution Mode2
local BH1750_CON_L_RES_MODE = 0x13 -- Continuously L-Resolution Mode
local BH1750_ONE_H_RES_MODE = 0x20 -- One Time H-Resolution Mode
local BH1750_ONE_H_RES_MODE2 = 0x21 -- One Time H-Resolution Mode2
local BH1750_ONE_L_RES_MODE = 0x23 -- One Time L-Resolution Mode
local function i2c_send(data)
i2c.send(i2cid, i2cslaveaddr, data)
end
local function i2c_recv(num)
local revData = i2c.recv(i2cid, i2cslaveaddr, num)
return revData
end
local function bh1750_power_on()
i2c_send(BH1750_POWER_ON)
end
local function bh1750_power_down()
i2c_send(BH1750_POWER_DOWN)
end
local function bh1750_set_measure_mode(mode, time)
i2c_send(BH1750_RESET)
i2c_send(mode)
sys.wait(time)
end
local function bh1750_read_light()
bh1750_set_measure_mode(BH1750_CON_H_RES_MODE2, 180)
local _, light = pack.unpack(i2c_recv(2), ">h")
light = light / 1.2
return light
end
local function bh1750_test()
sys.wait(4000)
if i2c.setup(i2cid, i2c.SLOW) ~= i2c.SLOW then
log.error("I2c.init", "fail")
return
end
bh1750_power_on()
sys.wait(180)
while true do
log.info("bh1750_read_light", bh1750_read_light() * 10)
sys.wait(1000)
end
end
sys.taskInit(bh1750_test)
實測效果
1、官方代碼可以使用
2、如果AIR724UG上電時傳感器未接入,則任務會return退出,退出任務后即使再接上傳感器,讀取任務也無法繼續運行了,
改進方案
1、 將ATH10和BH1750的讀寫操作放到一個檔案里完成,分時操作不同的傳感器,避免兩個任務同時運行時在某個時間段發送沖突,如此即使沒有檢測到傳感器,整個程式能夠繼續運行,不會報錯或重啟,待傳感器接入恢復正常后,仍然能夠正常讀取傳感器的資料,
2、洗掉出現錯誤后退出任務的return陳述句,
3、I2C的初始化只能運行一次,二次初始化會造成運行錯誤,
sys.taskInit(
function()
sys.wait(5000)
if I2C_OPENED == 0 then
if i2c.setup(i2cid, i2c.SLOW) ~= i2c.SLOW then
log.error("I2C_INIT", "i2c.setup fail")
end
I2C_OPENED = 1
log.info("I2C", "I2C_INIT")
end
while true do
if i2c_slave_sta < 2 then
i2c_slave_sta = i2c_slave_sta + 1
else
i2c_slave_sta = 0
end
---[[
------------------------------------AHT10
local aht10_addr = 0x38
if i2c_slave_sta == 1 then
if i2c.send(i2cid, aht10_addr, {0xAC, 0x33, 0x00}) ~= 3 then
log.error("AHT10", "i2c.send fail")
end
sys.wait(200)
aht10_read = i2c.recv(i2cid, aht10_addr, 6)
if (nil == aht10_read) or (6 ~= #aht10_read) then
log.error("ATH10", "i2c.recv fail.")
else --正確獲取回傳值
--log.info("ATH10", "recv", aht10_read:toHex())
local humi = (aht10_read:byte(2) * 65536 + aht10_read:byte(3) * 256 + aht10_read:byte(4))
AHT10_HUMI = humi * 100 / 16 / 1024 / 1024
local temp =
(bit_and(aht10_read:byte(4), 0x0F) * 65536 + aht10_read:byte(5) * 256 + aht10_read:byte(6))
AHT10_TEMP = temp * 200 / 1024 / 1024 - 50
log.info("ATH10", "HUMI:" .. myfloor(AHT10_HUMI, 2) .. " TEMP:" .. myfloor(AHT10_TEMP, 2))
end
end
------------------------------------AHT10
--]]
---[[
-----------------------------------BH1750
if i2c_slave_sta == 2 then
local bh1750_addr_low = 0x23 -- address pin low (GND), default for InvenSense evaluation board
local bh1750_addr_high = 0x24 -- address pin high (VCC)
local bh1750_addr = bh1750_addr_high
-- bh1750 registers define
local BH1750_POWER_DOWN = 0x00 -- power down
local BH1750_POWER_ON = 0x01 -- power on
local BH1750_RESET = 0x07 -- reset
local BH1750_CON_H_RES_MODE = 0x10 -- Continuously H-Resolution Mode
local BH1750_CON_H_RES_MODE2 = 0x11 -- Continuously H-Resolution Mode2
local BH1750_CON_L_RES_MODE = 0x13 -- Continuously L-Resolution Mode
local BH1750_ONE_H_RES_MODE = 0x20 -- One Time H-Resolution Mode
local BH1750_ONE_H_RES_MODE2 = 0x21 -- One Time H-Resolution Mode2
local BH1750_ONE_L_RES_MODE = 0x23 -- One Time L-Resolution Mode
i2c.send(i2cid, bh1750_addr, BH1750_POWER_ON)
i2c.send(i2cid, bh1750_addr, BH1750_RESET)
i2c.send(i2cid, bh1750_addr, BH1750_CON_H_RES_MODE2)
sys.wait(200)
local bh1750_read = i2c.recv(i2cid, bh1750_addr, 2)
if (nil == bh1750_read) or (2 ~= #bh1750_read) then
log.error("BH1750", "i2c.recv fail.")
else --正確獲取回傳值
--log.info("BH1750", "recv", bh1750_read:toHex())
local _, light = pack.unpack(bh1750_read, ">h")
BH1750_LIGHT = light / 1.2
end
end
------------------------------BH1750
--]]
sys.wait(5000)
end
end
)
--]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295491.html
標籤:其他
上一篇:流程型生產制造人工智能,絕對不能工業互聯網,是一個危險的技術邏輯
下一篇:物聯網考試復習題