中科蓝讯 AB32VG1 开发板DHT11温湿度采集与OLED显示实验

本实验是在上篇推文《中科蓝讯AB32VG1之DHT11温湿度测量

》项目基础上,增加OLED显示功能,将采集到的温湿度数值显示在OLED显示屏。上面文章的连接中科蓝讯AB32VG1之DHT11温湿度测量

     第一步:首先双击打开RT-Thread Settings,添加SSD1309软件包.具体步骤参照推文中科蓝讯 AB32VG1 开发板OLED显示实验,添加成功之后如下图所示。

图片

   双击软件包进入SSD1306软件包配置界面,这里驱动要打上勾号,如下图所示

图片

然后在硬件中,开启IIC功能,如下图所示

图片

按ctrl+s键保存编译,SSD1306驱动配置完成。

第二步:修改main函数。

1.首先main函数包含要以下头文件

#include "board.h"
      #include <rtdevice.h>
        #include "sensor.h"
        #include "sensor_dallas_dht11.h"//DHT11头文件
        #include "drv_gpio.h"
        #include "ssd1306.h"//包含SSD1306的头文件

2.修改DHT11的数据引脚

#define DHT11_DATA_PIN    GET_PIN(A, 5)

3.定义两个全局变量

uint8_t temp,humi;存储温度和湿度数值

4.创建DHT11读取温度线程和线程入口函数

线程入口函数:

static void read_temp_entry(void *parameter)
{
    rt_device_t dev = RT_NULL;
    struct rt_sensor_data sensor_data;
    rt_size_t res;
    rt_uint8_t get_data_freq = 1; /* 1Hz */

    dev = rt_device_find("temp_dht11");
    if (dev == RT_NULL)
    {
        return;
    }

    if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK)
    {
        rt_kprintf("open device failed!\n");
        return;
    }

    rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)(&get_data_freq));

    while (1)
    {
        res = rt_device_read(dev, 0, &sensor_data, 1);

        if (res != 1)
        {
            rt_kprintf("read data failed! result is %d\n", res);
            rt_device_close(dev);
            return;
        }
        else
        {
            if (sensor_data.data.temp >= 0)
            {
               temp = (sensor_data.data.temp & 0xffff) >> 0;      // get temp
               humi = (sensor_data.data.temp & 0xffff0000) >> 16; // get humi
               //rt_kprintf("temp:%d, humi:%d\n" ,temp, humi);
            }
        }

        rt_thread_delay(1000);
    }
}

线程创建函数:
void dht11_read_temp_sample(void)
{
    rt_thread_t dht11_thread;

    dht11_thread = rt_thread_create("dht_tem",
                                     read_temp_entry,
                                     RT_NULL,
                                     1024,
                                     RT_THREAD_PRIORITY_MAX / 2,
                                     20);
    if (dht11_thread != RT_NULL)
    {
        rt_thread_startup(dht11_thread);
    }
}
5.DHT11的初始化
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);

}

4.创建OLED显示线程和线程入口函数
线程入口函数:
static void oled_display_entry(void *parameter)
{
    char text[200];
    while(1)
    {
        rt_memset(text, 0, sizeof(text));
        rt_sprintf(text, "%d", temp);
        ssd1306_SetCursor(60, 6);//添加代码,设置显示光标位置
        ssd1306_WriteString(text, Font_11x18, White);//添加代码,设置显示内容
       // ssd1306_UpdateScreen();添加代码,更新显示屏信息

       rt_memset(text, 0, sizeof(text));
       rt_sprintf(text, "%d", humi);
       ssd1306_SetCursor(60, 40);//添加代码,设置显示光标位置
       ssd1306_WriteString(text, Font_11x18, White);//添加代码,设置显示内容
       ssd1306_UpdateScreen();添加代码,更新显示屏信息
       rt_thread_mdelay(100);
    }

}
线程创建函数:

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);
    }

}

6.最后是Main函数:main函数主要完成OLED显示的初始化,创建和启动线程,初始化DHT11。

int main(void)
{
    //OLED显示的初始化
    ssd1306_Init();//添加代码,显示屏初始化
    ssd1306_SetCursor(2, 6);//添加代码,设置显示光标位置
    ssd1306_WriteString("Temp:      ", Font_11x18, White);//添加代码,设置显示内容
    ssd1306_SetCursor(2, 40);//添加代码,设置显示光标位置
    ssd1306_WriteString("Humi:      ", Font_11x18, White);//添加代码,设置显示内容
    ssd1306_SetCursor(40, 40);//添加代码,设置显示光标位置
    ssd1306_UpdateScreen();添加代码,更新显示屏信息
    //相关线程的创建与启动
    rt_hw_dht11_port();
    dht11_read_temp_sample();
    oled_display_thread_create();
    return RT_EOK;
}

然后编译项目,没有错误,生成rtthread.dcf文件,下载文件至开发板,实际运行效果见原文视频。原文连接中科蓝讯 AB32VG1 开发板DHT11温湿度采集与OLED显示实验

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作者:zhl15893133384 一:概述 物联网作为现在一门很热门的行业,其强大之处以至于我们的额生活离不开它,随着它的发展,也衍生出来很多的行业,比如智能家居等。这使得我们的生活变得更加的精彩与智能。 在这里,本作品的温湿度数据采集系统基于STM32H75XB芯片开发并通过MQTT协议把数据传到服务器。并在网页端进行显示。同时,采集的信息也会实时的显示OLED显示器上,并且实时的显示出当前的时间,可当成一个智能的小显示器来用,本想着在显示的时候还能在上面显示天气等信息,但时间原因,暂且没加。 二:开发环境硬件:ARTPi(stm32h750xb) RT-Thread版本:v 4.03 开发工具及版本:RT-Thread Studio v1.15 三:RT-Thread使用情况概述内核部分:线程。 调度器:创建多个线程来实现不同的工作。 组件部分:I2C框架, Sensor框架 四:硬件框架五:软件框架说明六:软件模块说明main.c文件主要用于初始化,以及开启线程 dht11_sample.c用于存放DHT11相关的内容包含温湿度数据的读取以及DHT11线程的创建 MQTT_sample.c用于存放MQTT线程相关的内容,主要负责转发温湿度信息到云端。 ssd_1306.......cpp用于存放OLED显示相关内容,主要负责显示。 七:演示效果八:比赛感悟在这次比赛中,我接触到了操作系统这个东西,在之前,自己也是看过关于操作系统方面的书,但是却未曾用过,然而,这次大赛对于我来说刚好是一次锻炼,让我尝试了操作系统,并且使用了他,开始的时候觉得很难,但是RT官方给出的资料也很多,认真去看看就好,凡是用心,总会成功的。在大赛中,编辑器采用的RT Studio,不得不说,这款IDE很好用,他的舒服之处在于当你用到什么软件A包的时候直接搜索在添加进去即可,十分的方便。还有就是RT-Thread这个系统,用着真的真的很舒服,用户需要关心的东西并不多,只需要关心进程就好,还有进程间的通信。最后,谢谢电路城给的次机会,让我能学到更多的东西,愿志同道合之人一起来加油!!!!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值