本帖最后由 lulugl 于 2024-4-26 20:13 编辑
#申请原创# #有奖活动# @21小跑堂
【项目简介】
使用RT-Thread来创建一个可以实时显示时间、温湿度的桌面。AT32F405有RTC的外设,可以实时的实现RTC功能。
【开发环境】
1、RT-Thread
2、MDK5.39
【实验器材】
1、AT-START-F405开发板
2、OLED屏
3、SHT30温湿度计
【实现步骤】
1、我在前面的试用文章中,有详细的驱动OLED屏,链接如下:
【AT-START-F405测评】1、RT-Thread 驱动OLED屏实现hello world - - 21ic电子技术开**坛
2、打开工程,使用env增加RTC的配置。在RTC的配置中,我们配置为LEXT,即外置的32.768KHz的时钟源。
从原理图中,我们可以看到LEXT为32.768的时钟源。
3、同时我打开sht31的驱动库,sht31的配置路径为: → RT-Thread online packages → peripheral libraries and drivers → sensors drivers,如下图所示:
4、退出后,保存,并执行pkg --update来在线更新软件包,如下图所示:
5、升级完成后,再执行scons --target=mkd5,来重新生成工程。
$ scons --target=mdk5
scons: Reading SConscript files ...
Keil5 project is generating...
Keil Version: 0.0
Keil-MDK project has generated successfully!
到此,工程基本生成,下面我将使用MDK打开工程。编译下载到开发板,查看RTC与sht30是否有驱动了。
msh >list device
device type ref count
-------- -------------------- ----------
rtc RTC 0
i2c2 I2C Bus 0
i2c1 I2C Bus 0
uart1 Character Device 2
pin Pin Device 0
从查看结查来看,RTC已经初始化好了。
按下tab键,可以看到sht3x也是加载成功了的:
msh >
RT-Thread shell commands:
pin - pin [option]
date - get date and time or set (local timezone) [year month day hour min sec]
reboot - Reboot System
help - RT-Thread shell help
ps - List threads in the system
free - Show the memory usage in the system
clear - clear the terminal screen
version - show RT-Thread version information
list - list objects
backtrace - print backtrace of a thread
sht3x - sht3x sensor
ssd1306_TestAll - test ssd1306 oled driver
【初步测试sht30】
使用命令sht3x probe i2c1 来加载sht3x,加载成功后,再使用sht3x read读取数据,实验结果如下:
msh >sht3x probe i2c1
sht3x probed, addr:0x44
msh >sht3x read
sht3x humidity : 72.7
sht3x temperature: 24.8
通过上面的测试,证明sht30的连接与驱动都是正常的。
【测试RTC】,输入dater指令,可以打印出日期:
msh >date
[I/drv.rtc] RTC hasn't been configured, please use <date> command to config.
local time: Sat Jan 1 08:00:00 2000
timestamps: 946684800
timezone: UTC+08:00:00
说明rtc也是正常的工作了的。只是还没有设置好初始日期。
【主程序设计】
1、添加时间显示,程序设计的思想是我每秒读取一次日期时间,然后更新到OLED屏上,实现代码如下:
int main(void)
{
char now_time[30] = {0};
struct tm *get_time = RT_NULL;
time_t now = 0;
rt_uint32_t speed = 200;
/* set led2 pin mode to output */
rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);
/* set led3 pin mode to output */
rt_pin_mode(LED3_PIN, PIN_MODE_OUTPUT);
/* set led4 pin mode to output */
rt_pin_mode(LED4_PIN, PIN_MODE_OUTPUT);
ssd1306_Init();
while (1)
{
now = time(RT_NULL);
get_time = localtime(&now);
rt_sprintf(now_time, "%d-%d-%d %d:%d:%d", get_time->tm_year + 1900, get_time->tm_mon + 1, get_time->tm_mday,get_time->tm_hour, get_time->tm_min, get_time->tm_sec);
ssd1306_Fill(Black);
ssd1306_SetCursor(16, 0);
ssd1306_WriteString("AT32F405", Font_11x18, White);
ssd1306_SetCursor(8, 48);
ssd1306_WriteString(now_time, Font_7x10, White);
ssd1306_UpdateScreen();
rt_thread_delay(1000);
}
}
因为读取出来的时间,要+1900才是正确时间,下载后效果如下图所示:
设置目期,在shell终端上执行 date 年 月 日 时 分 秒就可以完成时间的设置,执行如下:
msh >date 2024 4 26 19 44 00
old: Sat Jan 1 09:32:12 2000
now: Fri Apr 26 19:44:00 2024
2、添加sht30的读取
首先要初始化sht30,代码如下:
dev = sht3x_init("i2c1", 0x44);
if(!dev)
{
rt_kprintf("sht3x probe failed, check input args\n");
}
然后在大循环里读取温度、湿度,显示到OLED屏上,代码如下:
if (dev)
{
/* read the sensor data */
sht3x_read_singleshot(dev);
rt_sprintf(now_time,"H:%d%%",(int)dev->humidity);
ssd1306_SetCursor(0, 24);
ssd1306_WriteString(now_time, Font_11x18, White);
rt_sprintf(now_time,"T:%d",(int)dev->temperature);
ssd1306_SetCursor(64, 24);
ssd1306_WriteString(now_time, Font_11x18, White);
rt_sprintf(now_time,".%d",((int)(dev->temperature*10))%10);
ssd1306_SetCursor(106, 30);
ssd1306_WriteString(now_time, Font_7x10, White);
}
这样终合起来,就完成了整个项目的创建。实现效果如下图所示:
然后动态效果图如下:
【总结】
rt-thread与AT32F05的深度结合,可以轻松移植实现自己想要的功能,而且同一套代码,可以在不同芯片之间轻松移植,大大降低的写底层驱的时间,提高了工作效率。
|