基于RT-Thread系统的迷你时钟

项目目标

通过OLED显示屏显示时间与温湿度的基本功能。

准备工作

软件

RT-Thread Studio v2.1.0
I2C设备驱动(用于读取温湿度传感器)
sht3X软件包(使用sht30进行温湿度测量)
at_device软件包(使用esp8266wifi模块进行网络连接)
netutils软件包(用于获取NTP时间)
u8g2软件包(驱动OLED显示)
cpp组件(支持u8g2软件包)

硬件

小熊派开发板
ESP8266
sht30温湿度传感器
OLED

项目开发

IIC设置

打开IIC设置

设置为与sht31传感器相连的引脚

温湿度测量

sht30使用方法:首先进行init初始化,调用sht3x_read_singleshot函数读取传感器的采集信息,其返回6字节数组
1[温度高八位]

2[温度第八位]

3[温度crc校验]

4[湿度高八位]

5[湿度第八位]

6[湿度crc校验]

以下为读取数据的函数

rt_err_t sht3x_read_singleshot(sht3x_device_t dev)
{rt_uint8_t temp[6] ;rt_err_t result;RT_ASSERT(dev);result = rt_mutex_take(dev->lock, RT_WAITING_FOREVER);if (result == RT_EOK){if( write_cmd(dev, dev->cmd_readout) == RT_EOK){// wait about 5 msrt_thread_mdelay(5);if(read_bytes(dev, temp, 6) == RT_EOK){if(crc8(temp, 2) == temp[2]){dev->temperature = -45.0 + (temp[1] | temp[0] << 8) * 175.0 / (0xFFFF - 1) ; //sensor temperature convert to realityresult = RT_EOK ;}else{result = -RT_ERROR ;}if(crc8(temp + 3, 2) == temp[5]){dev->humidity = (temp[4] | temp[3] << 8) * 0.0015259022 ; //sensor humidity convert to reality}else{result = -RT_ERROR ;}}else{result = -RT_ERROR ;}}else{result = -RT_ERROR ;}rt_mutex_release(dev->lock);}else{LOG_E("Taking mutex of SHT3x failed.");result = -RT_ERROR;}return result;
}

在终端输入以下指令即可通过串口显示温湿度值

sht3x probe i2c2 pd   //根据实际连接的引脚选择正确的iic总线
sht3x read

获取时间

打开at_device详细配置,配置如下
SSID 和密码即为所连接wifi名称与密码

我们需要手动开启lpusart1串口,在boar.h文件中添加如下定义

编译下载即可在控制台访问网络

打开软件模拟RTP和at_device详细配置,使能NTP

控制台发送指令即可获取当前时间

ntp_sync

OLED显示时间与温湿度

打开ugg2软件包详细配置,使能IIC OLED,如下图

打开ssd1306_12864_sw_i2c_example.cpp文件,修改相应的引脚

编译下载,在控制台输入ssd1306_12864_sw_i2c_example进行测试
正常显示后即可关闭该实例文件。

然后编写函数将得到的时间与温湿度数据通过OLED显示出来
application分组下创建一个用户文件oled_display.cpp文件,存放本项目中的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// PA7
#define OLED_I2C_PIN_SDA                    20// PB4static U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,\/* clock=*/ OLED_I2C_PIN_SCL,\/* data=*/ OLED_I2C_PIN_SDA,\/* reset=*/ U8X8_PIN_NONE);#define SUN 0
#define SUN_CLOUD  1
#define CLOUD 2
#define RAIN 3
#define THUNDER 4static void drawWeatherSymbol(u8g2_uint_t x, u8g2_uint_t y, uint8_t symbol)
{// fonts used:// u8g2_font_open_iconic_embedded_6x_t// u8g2_font_open_iconic_weather_6x_t// encoding values, see: https://github.com/olikraus/u8g2/wiki/fntgrpiconicswitch(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~");     // requires enableUTF8Print()u8g2.setFont(u8g2_font_6x13_tr);            // choose a suitable fontu8g2.drawStr(30, 60, "By Mculover666");   // write something to the internal memoryu8g2.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);

最后在main.c文件中调用 oled_display()函数
代码如下


int main(void)
{//获取网卡对象struct netdev* net = netdev_get_by_name("esp0");//阻塞判断当前网络是否正常连接while(netdev_is_internet_up(net) != 1){rt_thread_mdelay(200);}//NTP自动对时time_t cur_time;cur_time = ntp_sync_to_rtc(NULL);oled_display();}

结果展示


https://blog.csdn.net/Mculover666/article/details/104428132

参考文献

https://www.rt-thread.org/document/site/#/development-tools/rtthread-studio/applications/project-collection/project-collection

基于RT-Thread系统的迷你时钟相关推荐

  1. 关于RT thread系统节拍时钟的配置

    关于RT thread系统节拍时钟的配置                  -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...

  2. 基于rt thread smart构建EtherCAT主站

    我把源码开源到到了gitee,https://gitee.com/rathon/rt-thread-smart-soem 有兴趣的去可以下载下来跑一下 软件工程推荐用vscode 打开.rt thre ...

  3. rt thread系统下添加wiznet软件包后,不插网线CPU利用率100%问题

    rt thread系统下添加wiznet软件包后如果不插网线的话其他任务运行很卡,使用ps命令发现优先级低的任务很多都超时了 rt thread线程错误码 添加了一个可以查看CPU利用率的软件包CPU ...

  4. RT Thread根据开发板制作BSP方法

    之前一直不懂怎么使用RT Thread的软件包,感谢网上的大神,看了你们的博客后大概了解一些,在此做下记录.用RT Thread软件包需要RT Thread的系统,但是RT Thread和RT Thr ...

  5. stm32f407单片机rt thread 片外spi flash OTA升级配置示例

    参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...

  6. 基于STM32L432KC,通过RT-Thread Studio打造一个迷你时钟

    本文中作者基于rt-thread操作系统搭建了一个迷你时钟,用来显示时间和温湿度.rt-thread studio是一款用于rt-thread开发的软件.目前了解到的作用大概为端口设置,代码调试,引入 ...

  7. 基于RT-Thread OS的 迷你时钟项目

    基于RT-Thread OS的 迷你时钟项目 近期在自学RT-Thread OS, 这是一个国内团队开发的实时物联网操作系统,具有组件完整丰富.高度可伸缩.简易开发等优点. RTOS官网 参考学习文档 ...

  8. 基于单片机病房呼叫系统数码管显示房号设计-基于单片机工业生产现场的光照强度控制设计-基于单片机多功能智能台灯设计-基于单片机二维码LCD显示设计-基于单片机多功能时钟闹钟万年历控制系统设计【毕设分享】

    1641基于单片机病房呼叫系统数码管显示房号设计 设计思路:此设计实现的功能通过按键模拟房号,当按键按下时会将房号编号发送到数目管上进行显示,并通过声光进行提示.包含的电路有:数码管显示电路.按键电路 ...

  9. 基于数组,编写一个迷你DVD碟片租赁系统。

    功能包括: 新增DVD.删除DVD.修改DVD.查看DVD.借出DVD.归还DVD.退出系统 效果图大概如下图所示: 代码如下: package com.cx1;import java.time.Lo ...

最新文章

  1. fbx 转 gltf glb 文件
  2. 开源中国源码学习笔记
  3. collect的功能是什么?其底层如何实现的?_用Python实现定时自动化收取蚂蚁森林能量,再也不怕被偷了
  4. 一文掌握RNA seq,RNA seq课程大汇总
  5. C语言第一行为N以下N行,C语言每日小练(四)——勇者斗恶龙
  6. Linux编译安装Python3
  7. mysql解决1055-Expression#22ofSELECT list is not in GROUP BY clause and contains nonaggregated column ‘
  8. 三态门三个状态vhdl_温故知新,高阻态和三态门
  9. two.js文档阅读笔记-two.js的基本使用
  10. hdu2157:How many ways??
  11. 日志分析里面的max是什么_压测nginx出现no live upstreams while connecting to upstream的问题分析...
  12. 当一名程序员喝醉之后......
  13. python 视频转场_Python 带你高效创作短视频,视频创作秀到飞起!!!
  14. matlab对两组数据画图,matlab两列数据画图
  15. HSV空间改进的多尺度Retinex算法
  16. java gb2312中文乱码_Java中文乱码问题(转)
  17. 每日一案:“实质性相似加接触”是判定作品侵权的核心标准---摘自“成都法院网”
  18. MD5加密算法的原理
  19. 你这个视频背景太假了?
  20. IAP商品修改和数据获取,一文带你全部搞懂

热门文章

  1. su: Authentication failure问题
  2. git fetch - git merge - git pull 指令
  3. Docker--10张图带你深入理解Docker容器和镜像
  4. 广东省民营企业合作交流协会会长谭铭卓一行到访
  5. C++基础继承和多态(水上飞机)
  6. 水上运动装备的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  7. (NO.00004)iOS实现打砖块游戏(一):素材的制作
  8. 给你一个小时,怎样有序撬启Web测试?
  9. Mockito开发指南
  10. Spring Boot - Thymeleaf模板简介以及集成