Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
OLED显示屏
u8g2
ART-Pi_LoRa开发套件
基于RT-Thread与STM32L4的单色图形库u8g2与OLED应用笔记
发布于 2021-05-20 23:14:27 浏览:3779
订阅该版
[tocm] # 1 前言 本文主要描述了基于【[ART-Pi LoRa开发套件](http://wsn.lierda.com/index.php/Home/product/detail/id/113.html)】LSD4RF-TEST2002[STM32L4]硬件平台与RT-Thread Studio软件平台,如何使用单色图形库u8g2软件包驱动1.3英寸OLED屏幕,并实现oled屏动态rtc时间显示。 详细示例代码可查看[sdk-bsp-stm32l476-lsd4rf-test2002-v2\\projects\\oled_sh1106_u8g2](https://gitee.com/forest-rain/sdk-bsp-stm32l476-lsd4rf-test2002/tree/master/projects/oled_sh1106_u8g2)。 本文主要包含如下内容: - u8g2单色图形库与oled知识简介 - OLED驱动移植 - U8G2显示时钟应用示例 ## 1.1 准备工作 - 硬件开发平台 - [ART-Pi LoRa开发套件](http://wsn.lierda.com/index.php/Home/product/detail/id/113.html) - RF评估板(LSD4RF-TEST2002 V2[STM32L4] ) 的J5位号 + OLED屏幕扩展板(LSD4RF-TEST200B V3) - 软件开发平台 - [RT-Thread Studio 2.1.0版本](https://www.rt-thread.org/page/studio.html) - RF评估板(LSD4RF-TEST2002[STM32L4])开发板资源包 - sdk-bsp-stm32l476-lsd4rf-test2002-v2 ## 1.2 背景知识 ### 1.2.1 U8G2单色图形库简介 u8g2 是目前 Arduino 平台上使用最广泛的单色图形库(单色屏驱动)之一,u8g2具有如下主要特色: - u8g2 库平台支持性好,基本上支持绝大部分 Arduino 开发板; - U8g2 支持单色 OLED 和 LCD,基本上主流的显示控制器都支持。u8g2 支持近 200 种单色屏,同样的代码可以直接运行在不同的屏幕上 - u8g2 库 API 众多,支持中文,支持不同字体。 > u8g2 githu开源仓库:[https://github.com/olikraus/u8g2](https://github.com/olikraus/u8g2) #### 1.2.1.1 RT-Thread u8g2 单色驱动屏软件包 u8g2 单色驱动屏软件包是基于RT-Thread移植实现的u8g2单色图形库。 > - u8g2 rt-thread软件包开源仓库: [https://github.com/wuhanstudio/rt-u8g2](https://github.com/wuhanstudio/rt-u8g2) ### 1.2.2 OLED简介 OLED(Organic Light-Emitting Diode)即有机发光二极管,则可以通过有机材料的性质实现自身发光。OLED采用非常薄的有机材料图层和玻璃基板制成,当有电流通过时,有机材料会发光。 - 由于OLED自发光,不需背光源,单个像素点可独立启动等特点,OLED屏幕具备如下优点: - 分辨率高,对比度高,可视角度大 - 厚度更轻薄 - 反应速度快,温度范围广,制造及制程简单 - 节省电能 - OLED主要缺点: - 成本较高,尺寸难以大型化(成本随尺寸几何倍数增长) # 2 OLED 接口电路 - 硬件平台:RF评估板(LSD4RF-TEST2002 V2) 的J5位号 + OLED屏幕扩展板(LSD4RF-TEST200B V3) - OLED屏:采用1.3英寸,驱动芯片SH1106 - 接口:IIC、RESET、DC ![image01.png](https://oss-club.rt-thread.org/uploads/20210520/955bb79e49657a735959ed55d053f738.png) # 3 u8g2软件包使用 基于LSD4RF-TEST2002驱动OLED屏幕,采用了u8g2软件包,IIC驱动采用RT-Thread内核的I2C设备驱动(软I2C)。完整测试示例可参考 sdk-bsp-stm32l476-lsd4rf-test2002-v2\projects\oled_sh1106_u8g2。 ## 3.1 使能u8g2软件包 在“RT-Thread Settings”中,使能u8g2软件包。 - 点击“+Add”-> 搜索"u8g2" -> "+添加" - 或者点击“更多配置”->“软件包”-> “peripheral libraries and drivers”-> "U8G2:a monochrome graphic library" ![image02.png](https://oss-club.rt-thread.org/uploads/20210520/5af52a8c6df0789ffe3056090bf33e1a.png) - "U8G2:a monochrome graphic library" - 使能 Use hardware i2c(这里指的是使用RT Thread I2C设备(软IIC) - i2c device name 因为是软IIC,可以任意定义 - 这里选择c语言版本 c-latest ![image03.png](https://oss-club.rt-thread.org/uploads/20210520/5ee6e99b50077de4244f78bb848369c7.png) ## 3.2 OLED驱动移植 ### 3.2.1 使能RT-Thread IIC设备驱动 “RT-Thread Settings”->“更多配置”->“Hardware Device Config”-> 勾选 “Enable I2C BUS”。LSD4RF-TEST2002 OLED i2c设备当前默认定义使用i2c1。 ![image04.png](https://oss-club.rt-thread.org/uploads/20210520/b98a5484decacec71d67e6be1405b46c.png) shell命令窗口输入list_device,查看i2c1设备是否正确加载 ![image05.png](https://oss-club.rt-thread.org/uploads/20210520/82e4cb6194f4e2e9bc31abbe693012ef.png) ### 3.2.2 初始化u8g2_port.c OLED关联引脚 ```c 修改 u8g2_port.c 如下代码 uint8_t u8x8_rt_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { //.... case U8X8_MSG_GPIO_AND_DELAY_INIT: rt_pin_mode(u8x8->pins[U8X8_PIN_RESET],PIN_MODE_OUTPUT); rt_pin_mode(u8x8->pins[U8X8_PIN_DC],PIN_MODE_OUTPUT); rt_pin_write(u8x8->pins[U8X8_PIN_RESET],1); rt_pin_write(u8x8->pins[U8X8_PIN_DC],0); break } ``` ### 3.2.3 初始化u8g2与功能测试 ```c #define OLED_PIN_RESET GET_PIN(D,12) #define OLED_PIN_DC GET_PIN(D,11) int u8g2_oled_sh1106_init(void) { // Initialization u8g2_Setup_sh1106_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_rt_hw_i2c, u8x8_rt_gpio_and_delay); u8x8_SetPin(u8g2_GetU8x8(&u8g2), U8X8_PIN_RESET, OLED_PIN_RESET); u8x8_SetPin(u8g2_GetU8x8(&u8g2), U8X8_PIN_DC, OLED_PIN_DC); u8g2_InitDisplay(&u8g2); u8g2_SetPowerSave(&u8g2, 0); /* Test U8G2 OLED function */ /* full buffer example, setup procedure ends in _f */ u8g2_ClearBuffer(&u8g2); u8g2_SetFont(&u8g2, u8g2_font_logisoso16_tf); u8g2_DrawStr(&u8g2, 25, 42, "Loading..."); u8g2_SendBuffer(&u8g2); rt_thread_mdelay(500); /* full buffer example, setup procedure ends in _f */ u8g2_ClearBuffer(&u8g2); u8g2_SetFont(&u8g2, u8g2_font_ncenB08_tr); u8g2_DrawStr(&u8g2, 1, 18, "U8g2 on RT-Thread"); u8g2_SendBuffer(&u8g2); // Draw Graphics u8g2_SetFont(&u8g2, u8g2_font_unifont_t_symbols); u8g2_DrawGlyph(&u8g2, 112, 56, 0x2603 ); u8g2_SendBuffer(&u8g2); /* End of Test U8G2 OLED function */ return 0; } INIT_APP_EXPORT(u8g2_oled_sh1106_init); ``` ## 3.3 u8g2显示时钟示例 如下示例实现使用u8g2提供api功能,动态更新RTC时间到OLED屏幕。 ### 3.3.1 使能“软件模拟RTC” 在“RT-Thread Settings”->使能“软件模拟RTC” ![image06.png](https://oss-club.rt-thread.org/uploads/20210520/86b18b2c0da087543c0b751ea5c24539.png) shell命令窗口 - 输入 date 命令查看当前rtc时间。 - 输入 date [year month day hour min sec]修改当前rtc时间,比如 date 2021 4 25 14 23 01 ![image07.png](https://oss-club.rt-thread.org/uploads/20210520/f929c5fa8dbf177b86440aec8d70a14b.png) ### 3.3.2 添加oled实时时间显示 使用u8g2更新oled RTC实时时间示例代码如下 ```c void u8g2_oled_rtc_info_update(void) { time_t now; int sec = 0, min = 0, hour = 0; int day = 0, month = 0, year = 0; char sec_str[3]; char min_str[3]; char hour_str[3]; char day_str[3]; char mon_str[3]; char year_str[3]; struct tm *p; now = time(RT_NULL); p=gmtime((const time_t*) &now); year = p->tm_year + 1900; month = p->tm_mon + 1; day = p->tm_mday; hour = p->tm_hour; min = p->tm_min; sec = p->tm_sec; rt_sprintf(year_str, "%02d",year % 100); rt_sprintf(mon_str, "%02d", month); rt_sprintf(day_str, "%02d", day); rt_sprintf(hour_str, "%02d", hour); rt_sprintf(min_str, "%02d", min); rt_sprintf(sec_str, "%02d", sec); //u8g2_ClearBuffer(&u8g2); u8g2_SetFont(&u8g2, u8g2_font_6x10_tr); u8g2_DrawStr(&u8g2, 20, 35, year_str); u8g2_DrawStr(&u8g2, 30,35,"-"); u8g2_DrawStr(&u8g2, 35, 35, mon_str); u8g2_DrawStr(&u8g2, 45,35,"-"); u8g2_DrawStr(&u8g2, 50, 35, day_str); u8g2_DrawStr(&u8g2, 60,35," "); u8g2_DrawStr(&u8g2, 73, 35, hour_str); u8g2_DrawStr(&u8g2, 83,35,":"); u8g2_DrawStr(&u8g2, 88, 35, min_str); u8g2_DrawStr(&u8g2, 98,35,":"); u8g2_DrawStr(&u8g2, 103, 35, sec_str); u8g2_SendBuffer(&u8g2); } void oled_update_thread_entry(void *parameter) { while(1) { u8g2_oled_rtc_info_update(); rt_thread_mdelay(1000); } } ``` 基于RF评估板(LSD4RF-TEST2002[STM32L4])实际运行效果如下 ![08_oled_sh1106_u8g2_demo_rtc.png](https://oss-club.rt-thread.org/uploads/20210520/ed778b5beb6989d1c06e9d486b01e29c.png) # 4 参考 - [ART-Pi LoRa开发套件](http://wsn.lierda.com/index.php/Home/product/detail/id/113.html) - u8g2 rt-thread软件包 - [https://github.com/wuhanstudio/rt-u8g2](https://github.com/wuhanstudio/rt-u8g2) - u8g2 github开源仓库 - [https://github.com/olikraus/u8g2](https://github.com/olikraus/u8g2)
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
ForestRain
这家伙很懒,什么也没写!
文章
12
回答
12
被采纳
5
关注TA
发私信
相关文章
1
u8g2 如何设置闪烁 ?
2
RT-Thread Studio 使用U8G2 编译成功下载到板子终端没有反应
3
u8g2软件包使用问题
4
U8G2_SH1107_128X128_SPI_msh运行hard fault
5
调用OLED包显示紊乱
6
U8G2使用c库,怎样显示数字?用哪个函数呢?
7
u8g2软件spi没有问题,移植硬件spi出错,请求协助
8
u8g2可以同时驱动两个屏不
9
u8g2 驱动1.3寸oled乱码
10
RTThread_Studio u8g2 C库一直问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
SFUD
msh
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
549
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部