发新帖本帖赏金 50.00元(功能说明)我要提问
返回列表
打印
[AT32F405]

【AT-START-F405测评】2、基于RT-Thread 桌面天气站

[复制链接]
4394|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lulugl|  楼主 | 2024-4-26 20:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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的深度结合,可以轻松移植实现自己想要的功能,而且同一套代码,可以在不同芯片之间轻松移植,大大降低的写底层驱的时间,提高了工作效率。

使用特权

评论回复

打赏榜单

ArteryMCU 打赏了 50.00 元 2024-06-07
理由:[F405开发板评测活动]内容优质

发新帖 本帖赏金 50.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

715

帖子

9

粉丝