使用RT-Thread 系统实现DIY数字仪表(三)——RTThread系统添加传感器软件包

目录:

1.使用RT-Thread 系统实现DIY数字仪表(一)——STM32CUBMX5.6移植touchGFX4.13
2.使用RT-Thread 系统实现DIY数字仪表(二)——把TouchGFX移植到RTThread系统
3.使用RT-Thread 系统实现DIY数字仪表(三)——RTThread系统添加传感器软件包
4.使用RT-Thread 系统实现DIY数字仪表(三)——RTThread系统添加IOT软件包
5.使用RT-Thread 系统实现DIY数字仪表(四)——完善TouchGFX仪表界面
6.使用RT-Thread 系统实现DIY数字仪表(五)——开发微信小程序

实验平台:

硬件: 野火挑战者STM32F767 V1开发版和SHT30温湿度传感器
软件: TouchGFXDesigner v4.13和 STM32CubeMX v5.6.0,MDK v5.29,RT-Thread env 工具

实验前准备工作:

1.准备一套 野火挑战者STM32F767 开发版或其他核心板
2.安装 TouchGFXDesigner v4.13
3.安装STM32CubeMX v5.6.0和X_CUBE_TOUCHGFX软件包
4.安装 MDK v5.27以上版本
5.下载 RTThread源码包https://gitee.com/rtthread/rt-thread

下载:

代码持续更新中:github代码下载地址https://gitee.com/Aladdin-Wang/hellotouchGFX.git

联系作者:

加微信备注touchgfx,拉入touchgfx-rtthread技术交流群共同学习
在这里插入图片描述

1. 添加I2C设备

1.1. 打开I2C设备驱动框架

Hardware Drivers Config → On-chip Peripheral Drivers → Enable
I2C1 BUS (software simulation)

配置软件I2C的GPIO管脚,我所使用的IO口分别是SCL->PD_12 ,SDA->PD_13,
在这里插入图片描述
在这里插入图片描述

1.2 生成工程

在这里插入图片描述
打开串口调试工具,使用list_device可以看到i2c1设备。
在这里插入图片描述

2. 添加SHT3x软件包

RT-Thread online packages → peripheral libraries and drivers

在这里插入图片描述
在这里插入图片描述
选择完,保存更新软件包,重新生成工程
在这里插入图片描述
打开软件包的目录,可以看到说明文档,通过文档可以了解软件包如何使用
…\4_rtthread_TouchGFX_iot\stm32f767-fire-challenger\packages\sht3x-latest\docs

2.1 使用命令测试软件包

在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200403115314257.png

3. 获取温湿度传感器数据

在使用软件包提供的命令测试设备成功之后,创建一个线程,使用SHT3x软件包提供的API获取SHT3x数据。
在Applicaition分组之下,新建一个文件sht30_ccollect.c用于存放SHT3x获取数据的相关代码,编辑以下内容:

#include <rtthread.h>
#include <board.h>
#include <sht3x.h>

#define LOG_TAG     "sht30"
#define LOG_LVL     LOG_LVL_DBG
#include <ulog.h>
#define THREAD_PRIORITY         9
#define THREAD_STACK_SIZE       1024
#define THREAD_TIMESLICE        5

static rt_thread_t tid1 = RT_NULL;
static struct rt_mailbox sht30_mb;
static char mb_pool[16];
static sht3x_device_t  sht3x_device = RT_NULL;
sht3x_device_t  get_sht30_singleshot(void)
{
	if (rt_mb_recv(&sht30_mb, (rt_ubase_t *)&sht3x_device, RT_WAITING_FOREVER) == RT_EOK)
	{
		return sht3x_device;
	}
	else
	{
		return RT_NULL;
	}
    
}
/* 入口函数 */
static void sht30_collect_thread_entry(void *parameter)
{
    sht3x_device = sht3x_init("i2c1", 0x44);  
    rt_thread_mdelay(1000);
    while (1)
    {
        if(RT_EOK == sht3x_read_singleshot(sht3x_device))
        {
			rt_mb_send(&sht30_mb, (rt_uint32_t)sht3x_device);
            LOG_D("sht30 humidity   : %d.%d  ", (int)sht3x_device->humidity, (int)(sht3x_device->humidity * 10) % 10);
            LOG_D("temperature: %d.%d\n", (int)sht3x_device->temperature, (int)(sht3x_device->temperature * 10) % 10);
        }
        else
        {
            LOG_D("read sht3x fail.\r\n");
        }
        rt_thread_mdelay(5000);
    }
}

/* 创建线程 */
int sht30_collect(void)
{
	rt_err_t result = RT_EOK;
	/* 初始化一个 mailbox */
    result = rt_mb_init(&sht30_mb,
                        "sht30_mbt",                /* 名称是 sht30_mbt */
                        &mb_pool[0],                /* 邮箱用到的内存池是 mb_pool */
                        sizeof(mb_pool) / 4,        /* 邮箱中的邮件数目,因为一封邮件占 4 字节 */
                        RT_IPC_FLAG_FIFO);          /* 采用 FIFO 方式进行线程等待 */
    if (result != RT_EOK)
    {
        LOG_D("init mailbox failed.\n");
        return -1;
    }
    /* 创建线程*/
    tid1 = rt_thread_create("sht30",
            sht30_collect_thread_entry, RT_NULL,
                            THREAD_STACK_SIZE,
                            THREAD_PRIORITY, THREAD_TIMESLICE);

    /* 如果获得线程控制块,启动这个线程 */
    if (tid1 != RT_NULL)
        rt_thread_startup(tid1);

    return 0;
}
INIT_APP_EXPORT(sht30_collect);

编译下载测试:
在这里插入图片描述

4. 将温湿度传感器数据发送到UI

TouchGFX MVP通信架构
应用实现按照TouchGFX MVP架构来分层,使得结构清晰:
在这里插入图片描述
UI添加温湿度显示:
在这里插入图片描述
下载到板子后温湿度显示:
在这里插入图片描述

发布了31 篇原创文章 · 获赞 38 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/sinat_31039061/article/details/105288898