Air724UG I2C 读取ATH10 BH1750
节流计划旨在降低物联网产品的硬件成本,本专栏将在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 = 2local i2cslaveaddr = 0x38if i2c.setup(i2cid, i2c.SLOW) ~= i2c.SLOW thenlog.error("AHT10", "i2c.setup fail")returnendwhile true doif i2c.send(i2cid, i2cslaveaddr, {0xAC, 0x33, 0x00}) ~= 3 thenlog.error("AHT10", "i2c.send fail")returnendsys.wait(100)qryResult = i2c.recv(i2cid, i2cslaveaddr, 6)if (nil == qryResult) or (6 ~= #qryResult) thenlog.error("ATH10", "i2c.recv fail.")returnendlog.info("ATH10", "recv", qryResult:toHex())sys.wait(2000)endend
)
2 BH1750数据读取
local i2cid = 2 --i2cidlocal 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 Modelocal function i2c_send(data)i2c.send(i2cid, i2cslaveaddr, data)
end
local function i2c_recv(num)local revData = i2c.recv(i2cid, i2cslaveaddr, num)return revData
endlocal function bh1750_power_on()i2c_send(BH1750_POWER_ON)
endlocal function bh1750_power_down()i2c_send(BH1750_POWER_DOWN)
endlocal function bh1750_set_measure_mode(mode, time)i2c_send(BH1750_RESET)i2c_send(mode)sys.wait(time)
endlocal 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.2return light
endlocal function bh1750_test()sys.wait(4000)if i2c.setup(i2cid, i2c.SLOW) ~= i2c.SLOW thenlog.error("I2c.init", "fail")returnendbh1750_power_on()sys.wait(180)while true dolog.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 thenif i2c.setup(i2cid, i2c.SLOW) ~= i2c.SLOW thenlog.error("I2C_INIT", "i2c.setup fail")endI2C_OPENED = 1log.info("I2C", "I2C_INIT")endwhile true doif i2c_slave_sta < 2 theni2c_slave_sta = i2c_slave_sta + 1elsei2c_slave_sta = 0end---[[------------------------------------AHT10local aht10_addr = 0x38if i2c_slave_sta == 1 thenif i2c.send(i2cid, aht10_addr, {0xAC, 0x33, 0x00}) ~= 3 thenlog.error("AHT10", "i2c.send fail")endsys.wait(200)aht10_read = i2c.recv(i2cid, aht10_addr, 6)if (nil == aht10_read) or (6 ~= #aht10_read) thenlog.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 / 1024local temp =(bit_and(aht10_read:byte(4), 0x0F) * 65536 + aht10_read:byte(5) * 256 + aht10_read:byte(6))AHT10_TEMP = temp * 200 / 1024 / 1024 - 50log.info("ATH10", "HUMI:" .. myfloor(AHT10_HUMI, 2) .. " TEMP:" .. myfloor(AHT10_TEMP, 2))endend------------------------------------AHT10--]]---[[-----------------------------------BH1750if i2c_slave_sta == 2 thenlocal bh1750_addr_low = 0x23 -- address pin low (GND), default for InvenSense evaluation boardlocal bh1750_addr_high = 0x24 -- address pin high (VCC)local bh1750_addr = bh1750_addr_high-- bh1750 registers definelocal BH1750_POWER_DOWN = 0x00 -- power downlocal BH1750_POWER_ON = 0x01 -- power onlocal BH1750_RESET = 0x07 -- resetlocal BH1750_CON_H_RES_MODE = 0x10 -- Continuously H-Resolution Modelocal BH1750_CON_H_RES_MODE2 = 0x11 -- Continuously H-Resolution Mode2local BH1750_CON_L_RES_MODE = 0x13 -- Continuously L-Resolution Modelocal BH1750_ONE_H_RES_MODE = 0x20 -- One Time H-Resolution Modelocal BH1750_ONE_H_RES_MODE2 = 0x21 -- One Time H-Resolution Mode2local BH1750_ONE_L_RES_MODE = 0x23 -- One Time L-Resolution Modei2c.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) thenlog.error("BH1750", "i2c.recv fail.")else --正确获取返回值--log.info("BH1750", "recv", bh1750_read:toHex())local _, light = pack.unpack(bh1750_read, ">h")BH1750_LIGHT = light / 1.2endend------------------------------BH1750--]]sys.wait(5000)endend
)
--]]
Air724UG I2C 读取ATH10 BH1750相关推荐
- vb6编写dll读取dat文件_【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)...
寻求更好的阅读体验,请移步Mculover666的个人博客: [STM32Cube_15]使用硬件I2C读取温湿度传感器数据(SHT30)www.mculover666.cn 本篇详细的记录了如何使 ...
- 【51单片机快速入门指南】4.4:I2C 读取HMC5883L / QMC5883L 磁力计
目录 硬知识 简介 操作模式 HMC5883L 连续测量模式 单次测量模式 闲置模式 QMC5883L 连续测量模式 待命模式 主要差异 寄存器 寄存器列表 HMC5883L QMC5883L 配置寄 ...
- arduino i2c 如何写16位寄存器_基于STM32使用I2C读取传感器数据
撑腰会儿:I2C通信协议介绍zhuanlan.zhihu.com 上文介绍了I2C协议的基本结构,今天,使用STM32和LM75A温度传感器来实现I2C读取信息. 首先,为了使用I2C读取传感器测量 ...
- linux串口读取mpu9250数据,模拟 I2C 读取 MPU9250 数据的测试笔记
硬件:STM32F103ZET6 + GY9250 软件:Keil MDK(v5.27)+ STM32CUBEMX(v5.2.1) 这里我在使用STM32CUBEMX最新版本(v5.5.0)生成Kei ...
- STM32单片机硬件I2C读取AHT10温湿度传感器数据
STM32使用硬件IIC读取AHT10温湿度传感器的数据并显示在0.96寸OLED屏上. 我用的单片机是STM32F103C8T6,程序用的是ST标准库写的. STM32使用硬件I2C读取SHTC3温 ...
- STM32使用模拟I2C读取硒翔30mL流量传感器
使用模拟I2C读取硒翔30mL/min流量传感器 该工程使用某些采样次数和时间不同会采集到的报文有问题. 我建议是可以换个次数和时间调下. 如果报文有问题的话 就修改延时就好了,延时指的是I2C每发送 ...
- STM32L1系列I2C读取mpu9250数据
问题描述:I2C可以读取加速度和陀螺仪的6轴数据,不能读取到磁力计ID和数据,读取到磁力计ID为0x00或者0xFF. I2C读取9250按理应该挺简单.但是困扰了我三天,今天终于解决了.谷歌和百度有 ...
- 【Renesas RA6M4开发板之I2C读取mpu6050】
[Renesas RA6M4开发板之I2C读取mpu6050] 1.0 mpu6050 1.1 mpu6050介绍 1.2 mpu6050特点 1.3 mpu6050应用 2. RT-theard配置 ...
- stm32软件模拟I2C读取ADXL345三轴加速度值
最近做一个实验室里的小项目,需要用stm32来读取ADXL345三轴加速度的值,本来硬件I2C都调好了,可是后来和实验室合作的一个公司给的板子却没把硬件I2C的端口给引出来,太伤心了,我又得重新调一下 ...
最新文章
- Magento 头部的演示信息去除
- Windows 2008 R2 中 IE9无法播放HTML5视频文件的解决方法!
- 小师妹学JavaIO之:try with和它的底层原理
- 深入理解Spark 2.1 Core (十):Shuffle Map 端的原理与源码分析
- 一轮项目冲刺——移山小分队(6)
- 分区式存储管理c++_分区机要变形缝,纵横交接卫浴厨:防火阀参数的高效记忆口诀...
- 有哪些开源的 Python 库让你相见恨晚?
- Matlab Tricks(二十一)—— 软阈值函数的实现
- php把时间加一天,php如何在某個時間上加一天?一小時? 時間加減(轉)
- OCS 2007 R2 标准版部署
- strdup linux,内存管理 – Linux内核API kstrdup
- VISIO——word中插入visio图片 图片边缘空白裁剪
- 毕业设计之 ---- 基于大数据挖掘分析的大众点评评论文本挖掘
- 平面几何----笛沙格定理及其应用
- oracle分区表和分区索引的概念
- CSS3:颜色渐变和重复性渐变
- 开启笔记本WIFI热点功能Microsoft Virtual WiFi Miniport Adapter
- Java——正三角、倒三角、菱形打印
- 构成计算机系统物理实体的是什么,什么构成计算机的物理实体
- 仿elem页面学习之表单提交的动作