乐趣区

关于程序员:ArtPi学习笔记8使用AHT10温湿度模块

开发环境:
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);
退出移动版