1. 项目进度
桌面Mini时钟项目用来演示如何使用RT-Thread Stduio开发项目,整个项目的架构如下:
在上一篇博文中简单的介绍了RT-ThreadStudio一站式工具,基于STM32L431RCT6这个芯片创建工程,并修改时钟为使用外部时钟。
使用RT-Thread Studio DIY 迷你桌面时钟(一)| 基于STM32芯片创建工程:
https://blog.csdn.net/Mculover666/article/details/104146623
接下里我们开始添加I2C设备,添加SHT3x软件包,获取SHT3x温湿度传感器数据。
双击左侧 RT-Thread Setting
文件,即可打开RT-Thread图形化配置工具,软件模拟I2C这一项是灰色的,表示没有打开,单击一下即可打开软件 I2C 的驱动框架,图标变为彩色表示打开:
右击该选项可以打开更多配置,比如查看该驱动设备的依赖、查看该驱动设备的详细配置,查看该驱动设备的API文档,查看在线文档等操作:
按Ctrl+S
保存,配置生效,软件会自动添加I2C设备驱动框架到工程中:
打开了软件 I2C 的驱动框架之后,还要添加软件I2C的驱动底层实现,具体芯片的软件 I2C 驱动源码不同,本例中下载添加 STM32 系列的软件 I2C 驱动:Gitee 下载地址
链接:https://gitee.com/tyustli/tyustli/tree/master/stm32/soft-i2c
1git clone https://gitee.com/tyustli/tyustli.git
下载之后源码只有两个文件:
将这两个文件添加到项目中的drivers
文件夹中:
回到RT-Thread Studio IDE,在项目名称上右击,选择刷新,即可在目录中看到添加的文件:
软件 I2C 添加到工程中之后就可以调用软件 I2C 注册函数 rt_hw_i2c_init
来注册软件 I2C 设备了,该函数的原型如下:
1int rt_hw_i2c_init(char *name, rt_uint8_t scl, rt_uint8_t sda)
name:设备名称
scl:软件模拟I2C的SCL引脚
sda:软件模拟I2C的SDA引脚
在小熊派IoT开发板上,温湿度传感器SHT30连接在PB6(SCL)和PB7(SDA) ,所以在main.c
文件中先添加头文件:
1#include
然后在文件最后添加如下注册软件 I2C到系统中的代码:
1int register_i2c(void)
2{
3 rt_hw_i2c_init("i2c1", GET_PIN(B,6), GET_PIN(B,7));
4
5 return RT_EOK;
6}
7//注册到系统中,自动初始化设备
8INIT_BOARD_EXPORT(register_i2c);
添加完成之后点击编译,下载到开发板中运行,即可在串口终端中看到日志信息(绿色),提示I2C总线设备已注册成功:
因为main线程中循环打印对使用控制台有影响,所以将打印函数注释:
重新编译下载,在串口终端中输入命令list_device
查看系统中注册的设备吗,再次确认I2C总线设备注册成功:
RT-Thread Studio有在线软件包中心,里面有非常丰富的软件包供用户使用,点击立即添加进入:
搜索SHT
,使用的传感器型号为SHT30,所以添加SHT3x软件包:
添加之后,在项目设置中即可看到该软件包,右击可以查看软件包在线文档:
软件会自动打开该软件包的在线说明文档,在使用软件包之前,该文档必须要看:
接下来按Ctrl+S
保存项目,软件会自动添加软件包代码到工程中,其中README.md
是软件包详细使用文档,使用前必须要看:
接下来编译、下载项目到开发板中,查看串口终端输出。
大部分软件包都提供测试命令,SHT3x软件包也是一样,提供了如下命令供测试:
1- sht3x probe --挂载SHT3x设备,需要指定i2c设备名称和上下拉方式,默认下拉
2- sht3x read --阅读SHT3x温湿度
3- sht3x status --读取查看状态寄存器值
4- sht3x reset --软件复位SHT3x
5- sht3x heater --开/关heater
首先挂载SHT30温湿度传感器到之前注册的I2C总线设备上:
挂载之后可以进行查看寄存器,读取温湿度,复位,开/关heater操作,比如读取一次温度和湿度:
在使用软件包提供的命令测试设备成功之后,创建一个线程,使用SHT3x软件包提供的API获取SHT3x数据。
在Applicaition分组之下,新建一个文件sht30_ccollect.c
用于存放SHT3x获取数据的相关代码,编辑以下内容:
1/*
2 * Copyright (c) 2006-2019, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2020-02-20 Mculover666 the first version
9 */
10
11#include
12#include
13#include
14
15#define THREAD_PRIORITY 25
16#define THREAD_STACK_SIZE 512
17#define THREAD_TIMESLICE 5
18
19static rt_thread_t tid1 = RT_NULL;
20
21/* 入口函数 */
22static void sht30_collect_thread_entry(void *parameter)
23{
24 sht3x_device_t sht3x_device;
25
26 sht3x_device = sht3x_init("i2c1", 0x44);
27
28 while (1)
29 {
30 if(RT_EOK == sht3x_read_singleshot(sht3x_device))
31 {
32 rt_kprintf("sht30 humidity : %d.%d ", (int)sht3x_device->humidity, (int)(sht3x_device->humidity * 10) % 10);
33 rt_kprintf("temperature: %d.%d\n", (int)sht3x_device->temperature, (int)(sht3x_device->temperature * 10) % 10);
34 }
35 else
36 {
37 rt_kprintf("read sht3x fail.\r\n");
38 break;
39 }
40 rt_thread_mdelay(2000);
41 }
42}
43
44/* 创建线程 */
45int sht30_collect(void)
46{
47 /* 创建线程*/
48 tid1 = rt_thread_create("sht30_collect_thread",
49 sht30_collect_thread_entry, RT_NULL,
50 THREAD_STACK_SIZE,
51 THREAD_PRIORITY, THREAD_TIMESLICE);
52
53 /* 如果获得线程控制块,启动这个线程 */
54 if (tid1 != RT_NULL)
55 rt_thread_startup(tid1);
56
57 return 0;
58}
在main.c中测试该程序:
编译下载程序,在串口终端查看结果:
往期回顾
1.开源项目|RT-Thread 软件包应用作品:水墨屏桌面台历
7.“新冠”之下,如何安全返程?如何安全居家办公?
8.RT-Thread视频中心正式上线,在家也能高效学习!
你可以添加微信17775982065为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群!
RT-Thread
让物联网终端的开发变得简单、快速,芯片的价值得到最大化发挥。Apache2.0协议,可免费在商业产品中使用,不需要公布源码,无潜在商业风险。
长按二维码,关注我们
点击阅读原文,进入RT-Thread GitHub
你点的每个“在看”,我都认真当成了喜欢