开发环境:
rt-thread studio
开发板:
Art-Pi
参考链接:
RT-Thread Studio入门(6)— 采集温湿度数据_Willliam_william的博客-CSDN博客
https://blog.csdn.net/qq_3811...
基于潘多拉开发应用rt-thread studio 开发应用软件包AHT10遇到.... - RT-Thread问答社区
https://club.rt-thread.org/as...
AHT10 - 立创EDA开源硬件平台
https://oshwhub.com/chenzhy/A...
Art-Pi上没有温湿度监控的传感器,须要本人增加,于是近日从某宝上购得AHT10温湿度模块,于是乎接到Art-Pi上体验一番,无奈两头还是有少许波折。通过摸索,最终还是能胜利驱动,再此记录一贴,不便小伙伴们查阅。
硬件连贯上,借用了多媒体扩展版的触摸接口I2C2。为什么选用这个I2C接口呢,一方面因为自从有了RGB屏之后,多媒体扩展屏就始终吃灰状态,这个接口临时不须要应用到;另一方面是这个接口之前在调试多媒体扩展屏的时候应用过,知根知底。说到底,就是懒。
因为应用的是AHT10模块,而不是芯片,模块上集成了3.3V的LDO,因而供电上从5V拉电过去用,而不是从3.3V拉电过去用。如果是没有LDO的状况下,则必须从3.3V拉电,因为AHT10的最大供电电压是3.6V。
实现了硬件连贯之后就是软件配置了。这里参考了下面大佬的文章之后,本人做了一番摸索。配置如下:
首先是增加AHT10的软件包,使能模仿I2C组件。
具体的配置如下:
这里的aht10配置上我选用最新版本的软件包,而且没有使能软件滤波性能。
硬件上使能I2C2,并且配置引脚,这里放弃默认配置不改变
组件上使能I2C设施驱动
保留配置,退出settings,而后编译下载。
在调试终端中list_device命令,能够看到i2c1和i2c2曾经注册胜利了。
接下来参考大佬的贴子,为程序增加aht10的应用代码。
首先是端口初始化
而后是温度采集线程入口函数
接下来是创立线程
实现之后编译通过烧录到art-pi上,竟然不行!
明明是曾经初始化胜利了啊,怎么会读取不到数据呢?再次用list_device查看一下设施。的确是有注册到设施啊,百思不得其解。
通过仔细检查一番,原来是SDA和SCL引脚接错了。把线调整好,从新上电,搞定,走你!
而后再把数据显示到lvgl上,perfect!
上面是代码,第一次在贴子中贴代码。
// 应用AHT10范例#include "sensor_asair_aht10.h"#define AHT10_I2C_BUS "i2c2"// AHT10端口初始化int rt_hw_aht10_port(void){ struct rt_sensor_config cfg; cfg.intf.dev_name = AHT10_I2C_BUS; cfg.intf.user_data = (void *)AHT10_I2C_ADDR; rt_hw_aht10_init("aht10", &cfg); return RT_EOK;}// AHT10温湿度采集#include "aht10.h"/* 定义一个温湿度采集线程句柄构造体指针 */static rt_thread_t aht10_thread = RT_NULL;float humidity, temperature;/* 温湿度采集线程入口函数*/static void aht10_thread_entry(void *parameter){ rt_err_t res; aht10_device_t dev; rt_hw_aht10_port(); dev = aht10_init(AHT10_I2C_BUS); if (dev == RT_NULL) { rt_kprintf(" The sensor initializes failure"); return 0; } else { rt_kprintf(" The sensor initializes ok!"); } while (1) { /* read humidity 采集湿度 */ humidity = aht10_read_humidity(dev); rt_kprintf("humidity : %d.%d %%\n", (int)humidity, (int) (humidity * 10) % 10); /* former is integer and behind is decimal */ /* read temperature 采集温度 */ temperature = aht10_read_temperature(dev); rt_kprintf("temperature: %d.%d \n", (int)temperature, (int)(temperature * 10) % 10); /* former is integer and behind is decimal */ rt_thread_mdelay(60000); }}static int app_aht10_init(void){ rt_err_t rt_err; /* 创立温湿度采集线程*/ aht10_thread = rt_thread_create("aht10 thread", /* 线程的名称 */ aht10_thread_entry, /* 线程入口函数 */ RT_NULL, /* 线程入口函数的参数 */ 1024, /* 线程栈大小,单位是字节 */ 25, /* 线程的优先级,数值越小优先级越高*/ 10); /* 线程的工夫片大小 */ /* 如果取得线程管制块,启动这个线程 */ if (aht10_thread != RT_NULL) rt_err = rt_thread_startup(aht10_thread); else rt_kprintf("aht10 thread create failure !!! \n"); /* 判断线程是否创立胜利 */ if( rt_err != RT_EOK) rt_kprintf("aht10 thread startup err. \n"); return RT_EOK;}INIT_APP_EXPORT(app_aht10_init);