嵌入式技术william hill官网
直播中

王凯

7年用户 1353经验值
私信 关注
[经验]

在Art-Pi开发板上使用AHT10温湿度模块

开发环境:

rt-thread studio

开发板:

Art-Pi

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 %%
", (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 
", (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 !!! 
");

/* 判断线程是否创建成功 */

if( rt_err != RT_EOK)

    rt_kprintf("aht10 thread startup err. 
");

return RT_EOK;

}

INIT_APP_EXPORT(app_aht10_init);

原作者:adaphoto

更多回帖

发帖
×
20
完善资料,
赚取积分