AB32VG1 DHT11错误[E/sensor.dht11] dht11 init failed

这两天在AB32VG1上做了DHT11的两个例程,一个是直接跑的demo【连接中科蓝讯AB32VG1之DHT11温湿度测量】,另一个是自己写的通过OLED显示DHT11测量的温湿度数值【连接中科蓝讯 AB32VG1 开发板DHT11温湿度采集与OLED显示实验】,程序没有多少,但是却出现了一些问题,先将问题及解决办法记录如下,以供参考,具体为何我也说不明白,欢迎讨论。

    第一个问题是:出现DHT11初始化失败的概率非常高,通过Downloader监控初始化打印信息提示[E/sensor.dht11] dht11 init failed,如下图所示

图片

这个毫无疑问应该是初始化的问题,由于初始化代码是直接从Demo源程序DHT11_SAMPLE.C文件中拷贝出来的,具体代码如下:

static int  rt_hw_dht11_port(void)
{
    struct rt_sensor_config cfg;

    cfg.intf.user_data = (void *)DHT11_DATA_PIN;
    rt_hw_dht11_init("dht11", &cfg);

    return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_dht11_port);   

   这里通过组件初始化INIT_COMPONENT_EXPORT实现DHT11的初始化的,单单跑demo的是没有任何问题,不明白,移植到main函数中,就出现了dht11 init failed。所以这里采用一般初始化的方法,在main函数中初始化,修改初始化函数为:

void  rt_hw_dht11_port(void)
{
    struct rt_sensor_config cfg;

    cfg.intf.user_data = (void *)DHT11_DATA_PIN;
    rt_hw_dht11_init("dht11", &cfg);
}

//INIT_COMPONENT_EXPORT(rt_hw_dht11_port);   同时这里要屏蔽掉。

然后编译,下载至开发板运行,通过Downloader监控初始化打印信息提示msh>[I/sensor] rt_sensor[temp_dht11] init success,即初始化成功,多次复位,也没有出现初始化失败的问题。就这样奇怪的解决了,搞不懂。

图片

    第二个问题是:DHT11初始化成功,也可以读到数据,但是数据一直输出温度值0湿度数值也为0,如下图所示

图片

    这个问题怀疑是线程优先级引起的,这里建立两个线程,线程的默认优先级都是RT_THREAD_PRIORITY_MAX/2即16,这里将OLED显示线程的优先级改为20,编译下载程序至开发板,数据读取正常。
void oled_display_thread_create()
{
    rt_thread_t oled_display_thread;
    oled_display_thread = rt_thread_create("oled_display",
                                      oled_display_entry,
                                      RT_NULL,
                                      1024,
                                      20,
                                      40);
    if (oled_display_thread != RT_NULL)
    {
        rt_thread_startup(oled_display_thread);
    }

}

图片

图片

猜你喜欢

转载自blog.csdn.net/chanchairen/article/details/121587012