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

[复制链接]
 楼主| 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的时钟源。 微信截图_20240426174104.png
从原理图中,我们可以看到LEXT为32.768的时钟源。
微信截图_20240426174230.png
3、同时我打开sht31的驱动库,sht31的配置路径为: → RT-Thread online packages → peripheral libraries and drivers → sensors drivers,如下图所示:
微信截图_20240426174628.png

4、退出后,保存,并执行pkg --update来在线更新软件包,如下图所示:
微信截图_20240426174818.png
5、升级完成后,再执行scons --target=mkd5,来重新生成工程。
  1. $ scons --target=mdk5
  2. scons: Reading SConscript files ...
  3. Keil5 project is generating...
  4. Keil Version: 0.0
  5. Keil-MDK project has generated successfully!
到此,工程基本生成,下面我将使用MDK打开工程。编译下载到开发板,查看RTC与sht30是否有驱动了。

  1. msh >list device
  2. device           type         ref count
  3. -------- -------------------- ----------
  4. rtc      RTC                  0
  5. i2c2     I2C Bus              0
  6. i2c1     I2C Bus              0
  7. uart1    Character Device     2
  8. pin      Pin Device           0
从查看结查来看,RTC已经初始化好了。
按下tab键,可以看到sht3x也是加载成功了的:
  1. msh >
  2. RT-Thread shell commands:
  3. pin              - pin [option]
  4. date             - get date and time or set (local timezone) [year month day hour min sec]
  5. reboot           - Reboot System
  6. help             - RT-Thread shell help
  7. ps               - List threads in the system
  8. free             - Show the memory usage in the system
  9. clear            - clear the terminal screen
  10. version          - show RT-Thread version information
  11. list             - list objects
  12. backtrace        - print backtrace of a thread
  13. sht3x            - sht3x sensor
  14. ssd1306_TestAll  - test ssd1306 oled driver
【初步测试sht30】
使用命令sht3x probe i2c1 来加载sht3x,加载成功后,再使用sht3x read读取数据,实验结果如下:

  1. msh >sht3x probe i2c1
  2. sht3x probed, addr:0x44
  3. msh >sht3x read
  4. sht3x humidity   : 72.7
  5. sht3x temperature: 24.8
通过上面的测试,证明sht30的连接与驱动都是正常的。
【测试RTC】,输入dater指令,可以打印出日期:
  1. msh >date
  2. [I/drv.rtc] RTC hasn't been configured, please use <date> command to config.
  3. local time: Sat Jan  1 08:00:00 2000
  4. timestamps: 946684800
  5. timezone: UTC+08:00:00
说明rtc也是正常的工作了的。只是还没有设置好初始日期。
【主程序设计】
1、添加时间显示,程序设计的思想是我每秒读取一次日期时间,然后更新到OLED屏上,实现代码如下:
  1. int main(void)
  2. {
  3.         char now_time[30] = {0};
  4.         struct tm *get_time = RT_NULL;
  5.         time_t now = 0;
  6.         
  7.     rt_uint32_t speed = 200;
  8.     /* set led2 pin mode to output */
  9.     rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);
  10.     /* set led3 pin mode to output */
  11.     rt_pin_mode(LED3_PIN, PIN_MODE_OUTPUT);
  12.     /* set led4 pin mode to output */
  13.     rt_pin_mode(LED4_PIN, PIN_MODE_OUTPUT);
  14.                 ssd1306_Init();
  15.                
  16.     while (1)
  17.     {
  18.                         now = time(RT_NULL);
  19.                         get_time = localtime(&now);
  20.                         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);
  21.                           ssd1306_Fill(Black);
  22.                                 ssd1306_SetCursor(16, 0);        
  23.                                 ssd1306_WriteString("AT32F405", Font_11x18, White);
  24.                                 ssd1306_SetCursor(8, 48);
  25.                                 ssd1306_WriteString(now_time, Font_7x10, White);
  26.                                 ssd1306_UpdateScreen();
  27.                                 rt_thread_delay(1000);
  28.     }
  29. }
因为读取出来的时间,要+1900才是正确时间,下载后效果如下图所示:
微信图片_20240426183853.jpg
设置目期,在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,代码如下:
  1.   dev = sht3x_init("i2c1", 0x44);
  2.                 if(!dev)
  3.                 {
  4.                                 rt_kprintf("sht3x probe failed, check input args\n");
  5.                 }
然后在大循环里读取温度、湿度,显示到OLED屏上,代码如下:
  1.    if (dev)
  2.                         {
  3.                                         /* read the sensor data */
  4.                                         sht3x_read_singleshot(dev);
  5.                                         rt_sprintf(now_time,"H:%d%%",(int)dev->humidity);

  6.                                         ssd1306_SetCursor(0, 24);
  7.                                   ssd1306_WriteString(now_time, Font_11x18, White);
  8.                                   rt_sprintf(now_time,"T:%d",(int)dev->temperature);
  9.                                         ssd1306_SetCursor(64, 24);
  10.                                   ssd1306_WriteString(now_time, Font_11x18, White);
  11.                                         rt_sprintf(now_time,".%d",((int)(dev->temperature*10))%10);
  12.                                         ssd1306_SetCursor(106, 30);
  13.                                   ssd1306_WriteString(now_time, Font_7x10, White);
  14.                         }
这样终合起来,就完成了整个项目的创建。实现效果如下图所示:
微信图片_20240426200458.jpg
然后动态效果图如下:
out4.gif
【总结】
rt-thread与AT32F05的深度结合,可以轻松移植实现自己想要的功能,而且同一套代码,可以在不同芯片之间轻松移植,大大降低的写底层驱的时间,提高了工作效率。

打赏榜单

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

您需要登录后才可以回帖 登录 | 注册

本版积分规则

180

主题

830

帖子

12

粉丝
快速回复 返回顶部 返回列表