基于RT-Thread OS的 迷你时钟项目
近期在自学RT-Thread OS, 这是一个国内团队开发的实时物联网操作系统,具有组件完整丰富、高度可伸缩、简易开发等优点。
RTOS官网
参考学习文档
作品演示
实现功能:
1.联网获取时间;
2.测温测湿度;
3.将天气数据实时显示在一块OLED屏幕上。
主要元件
开发板:STM32L432KC Nucleo
Wi-Fi模块:ESP8266-01S
温湿度传感器模块:SHT31
显示屏:ssd1306 (0.96英寸)
调试工具:USB-UART串口模块
其中,UART1用于串口调试,Wi-Fi模块使用UART2,传感器和屏幕分别挂载于I²C1和I²C2
代码部分
本作品开源地址:Github仓库
参考教程:桌面mini网络时钟
参考数据手册:STM32L432KC
核心部分(oled显示线程)
#include <rthw.h>
#include <rtthread.h>
#include <rtdevice.h>
#include <U8g2lib.h>
#include <stdio.h>
#include <drv_soft_i2c.h>
extern "C"
{
#include <sht3x.h>
}
extern "C"
{
sht3x_device_t sht3x_init(const char *i2c_bus_name, rt_uint8_t sht3x_addr);
rt_err_t sht3x_read_singleshot(sht3x_device_t dev);
}
#define OLED_I2C_PIN_SCL 7
#define OLED_I2C_PIN_SDA 20
static U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,\
OLED_I2C_PIN_SCL,\
OLED_I2C_PIN_SDA,\
U8X8_PIN_NONE);
#define SUN 0
#define SUN_CLOUD 1
#define CLOUD 2
#define RAIN 3
#define THUNDER 4
static void drawWeatherSymbol(u8g2_uint_t x, u8g2_uint_t y, uint8_t symbol)
{
switch(symbol)
{
case SUN:
u8g2.setFont(u8g2_font_open_iconic_weather_6x_t);
u8g2.drawGlyph(x, y, 69);
break;
case SUN_CLOUD:
u8g2.setFont(u8g2_font_open_iconic_weather_6x_t);
u8g2.drawGlyph(x, y, 65);
break;
case CLOUD:
u8g2.setFont(u8g2_font_open_iconic_weather_6x_t);
u8g2.drawGlyph(x, y, 64);
break;
case RAIN:
u8g2.setFont(u8g2_font_open_iconic_weather_6x_t);
u8g2.drawGlyph(x, y, 67);
break;
case THUNDER:
u8g2.setFont(u8g2_font_open_iconic_embedded_6x_t);
u8g2.drawGlyph(x, y, 67);
break;
}
}
static void drawWeather(uint8_t symbol, int degree)
{
drawWeatherSymbol(0, 63, symbol);
u8g2.setFont(u8g2_font_logisoso32_tf);
u8g2.setCursor(55, 63);
u8g2.print(degree);
u8g2.print("C");
}
static void drawHumidity(uint8_t symbol, int humidity)
{
drawWeatherSymbol(0, 63, symbol);
u8g2.setFont(u8g2_font_logisoso32_tf);
u8g2.setCursor(55, 63);
u8g2.print(humidity);
u8g2.print("%");
}
void oled_display()
{
u8g2.begin();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso32_tf);
u8g2.setCursor(48+3, 42);
u8g2.print("Hi~");
u8g2.setFont(u8g2_font_6x13_tr);
u8g2.drawStr(30, 60, "By Matt");
u8g2.sendBuffer();
sht3x_device_t sht3x_device;
sht3x_device = sht3x_init("i2c1", 0x44);
rt_thread_mdelay(2000);
int status = 0;
char mstr[3];
char hstr[3];
time_t now;
struct tm *p;
int min = 0, hour = 0;
int temperature = 0,humidity = 0;
while(1)
{
switch(status)
{
case 0:
now = time(RT_NULL);
p=gmtime((const time_t*) &now);
hour = p->tm_hour;
min = p->tm_min;
sprintf(mstr, "%02d", min);
sprintf(hstr, "%02d", hour);
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_logisoso42_tn);
u8g2.drawStr(0,63,hstr);
u8g2.drawStr(50,63,":");
u8g2.drawStr(67,63,mstr);
} while ( u8g2.nextPage() );
rt_thread_mdelay(5000);
status = 1;
break;
case 1:
if(RT_EOK == sht3x_read_singleshot(sht3x_device))
{
temperature = (int)sht3x_device->temperature;
}
else
{
temperature = 0;
}
u8g2.clearBuffer();
drawWeather(SUN, temperature);
u8g2.sendBuffer();
rt_thread_mdelay(5000);
status = 2;
break;
case 2:
if(RT_EOK == sht3x_read_singleshot(sht3x_device))
{
humidity = (int)sht3x_device->humidity;
}
else
{
humidity = 0;
}
u8g2.clearBuffer();
drawHumidity(RAIN, humidity);
u8g2.sendBuffer();
rt_thread_mdelay(5000);
status = 0;
break;
}
}
}
MSH_CMD_EXPORT(oled_display, oled start);
学习心得
-
RTOS的内置软件包资源非常丰富,相较于ARM mbed OS,RT软件包的数量和质量都占优势,并且中文说明能够带来很多便利;
-
RT-Thread Studio 的高度集成化,大大减少了新手在配置环境时可能会遇到的麻烦;
与Mbed Studio相比,RTT Studio功能更加丰富,个人感觉界面更加友好
-
RTT支持主流的各种STM32开发板,SDK的下载更新十分流畅(不像某绿色软件的SDK管理器:)
-
唯一的小不足是编译速度会小慢一点,不过瑕不掩瑜,能够稳定运行,提供丰富功能对于一个高集成度的开发平台来说已经非常难得,相信国产会越来越好!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)