节流计划旨在降低物联网产品的硬件成本,本专栏将在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相关推荐

  1. vb6编写dll读取dat文件_【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)...

    寻求更好的阅读体验,请移步Mculover666的个人博客: [STM32Cube_15]使用硬件I2C读取温湿度传感器数据(SHT30)​www.mculover666.cn 本篇详细的记录了如何使 ...

  2. 【51单片机快速入门指南】4.4:I2C 读取HMC5883L / QMC5883L 磁力计

    目录 硬知识 简介 操作模式 HMC5883L 连续测量模式 单次测量模式 闲置模式 QMC5883L 连续测量模式 待命模式 主要差异 寄存器 寄存器列表 HMC5883L QMC5883L 配置寄 ...

  3. arduino i2c 如何写16位寄存器_基于STM32使用I2C读取传感器数据

    撑腰会儿:I2C通信协议介绍​zhuanlan.zhihu.com 上文介绍了I2C协议的基本结构,今天,使用STM32和LM75A温度传感器来实现I2C读取信息. 首先,为了使用I2C读取传感器测量 ...

  4. linux串口读取mpu9250数据,模拟 I2C 读取 MPU9250 数据的测试笔记

    硬件:STM32F103ZET6 + GY9250 软件:Keil MDK(v5.27)+ STM32CUBEMX(v5.2.1) 这里我在使用STM32CUBEMX最新版本(v5.5.0)生成Kei ...

  5. STM32单片机硬件I2C读取AHT10温湿度传感器数据

    STM32使用硬件IIC读取AHT10温湿度传感器的数据并显示在0.96寸OLED屏上. 我用的单片机是STM32F103C8T6,程序用的是ST标准库写的. STM32使用硬件I2C读取SHTC3温 ...

  6. STM32使用模拟I2C读取硒翔30mL流量传感器

    使用模拟I2C读取硒翔30mL/min流量传感器 该工程使用某些采样次数和时间不同会采集到的报文有问题. 我建议是可以换个次数和时间调下. 如果报文有问题的话 就修改延时就好了,延时指的是I2C每发送 ...

  7. STM32L1系列I2C读取mpu9250数据

    问题描述:I2C可以读取加速度和陀螺仪的6轴数据,不能读取到磁力计ID和数据,读取到磁力计ID为0x00或者0xFF. I2C读取9250按理应该挺简单.但是困扰了我三天,今天终于解决了.谷歌和百度有 ...

  8. 【Renesas RA6M4开发板之I2C读取mpu6050】

    [Renesas RA6M4开发板之I2C读取mpu6050] 1.0 mpu6050 1.1 mpu6050介绍 1.2 mpu6050特点 1.3 mpu6050应用 2. RT-theard配置 ...

  9. stm32软件模拟I2C读取ADXL345三轴加速度值

    最近做一个实验室里的小项目,需要用stm32来读取ADXL345三轴加速度的值,本来硬件I2C都调好了,可是后来和实验室合作的一个公司给的板子却没把硬件I2C的端口给引出来,太伤心了,我又得重新调一下 ...

最新文章

  1. Magento 头部的演示信息去除
  2. Windows 2008 R2 中 IE9无法播放HTML5视频文件的解决方法!
  3. 小师妹学JavaIO之:try with和它的底层原理
  4. 深入理解Spark 2.1 Core (十):Shuffle Map 端的原理与源码分析
  5. 一轮项目冲刺——移山小分队(6)
  6. 分区式存储管理c++_分区机要变形缝,纵横交接卫浴厨:防火阀参数的高效记忆口诀...
  7. 有哪些开源的 Python 库让你相见恨晚?
  8. Matlab Tricks(二十一)—— 软阈值函数的实现
  9. php把时间加一天,php如何在某個時間上加一天?一小時? 時間加減(轉)
  10. OCS 2007 R2 标准版部署
  11. strdup linux,内存管理 – Linux内核API kstrdup
  12. VISIO——word中插入visio图片 图片边缘空白裁剪
  13. 毕业设计之 ---- 基于大数据挖掘分析的大众点评评论文本挖掘
  14. 平面几何----笛沙格定理及其应用
  15. oracle分区表和分区索引的概念
  16. CSS3:颜色渐变和重复性渐变
  17. 开启笔记本WIFI热点功能Microsoft Virtual WiFi Miniport Adapter
  18. Java——正三角、倒三角、菱形打印
  19. 构成计算机系统物理实体的是什么,什么构成计算机的物理实体
  20. 仿elem页面学习之表单提交的动作

热门文章

  1. 【 题集 】 寒假计划——最短路
  2. Android Studio 提示:更新 TKK 失败,请检查网络连接
  3. Windows中使用cmd查看磁盘及其格式
  4. Gulp的自动化编译PostCss
  5. 运动理想型耳机是什么样子——飞利浦骨传导运动耳机A6606有料分享
  6. Android之——实现应用卸载功能
  7. 开发者模式下微信公众号按钮助手
  8. 探寻虹膜识别背后的身份密码 | 硬创公开课
  9. SOM -- 自组织特征映射网络
  10. 性别收入差距=歧视?Oaxaca-Blinder分解方法