哈喽,芯片之家的小伙伴,最近微信大改版,如果不把芯片之家设为星标,很可以错过重要的推送哦~所以赶紧按照下图方法加小星星吧!

前段时间做了一个数字变化的网络时钟,效果还不错,群里不少小伙伴直接找我买,卖给你们,那显我的多俗,也不是芯片之家社群的风格,是吧,授人以鱼不如授人以渔,于是我的好友殷工将整个制作过程在这里,分享给大家,包括源代码哦!
本次的视频效果
下面我们开工,好的设计从最原始的框图开始设计,让大家对整个项目有一个感性的认识,比较简单,STM32F411做为主控,为什么用411呢,可能他身边正好有一个411的Nucleo开发板吧,这个只是用来做Demo,大家可以移植到自己喜欢的平台;通过串口跟ESP8266通信,从NTP服务器获取最新的时间,然后通过RGB接口将数据显示在点阵屏上,简单吧!
那么,如果是小白,需要掌握以下知识:
1、RGB LED点阵全彩显示屏原理及驱动;
2、物联网操作系统RT-Thread,(包括定时器、线程间通信、AT组件及SAL层、NTP网络时间协议);
3、STM32的外设,GPIO、RTC、UART、TIM等;
4、ESP8266WIFI模块。
Demo硬件平台
1、STM32F411RE-Nucleo开发板
2、安信可ESP8266 WIFI模块ESP-01S
3、全彩RGB LED点阵显示屏64*32
全彩RGB显示屏
船名
内容
说明
像素点间距
4mm
像素间的间隔
像素构成
1R1G1B
每个像素包括RGB三色
模组分辨率
64*32
整屏64列32行
扫描方式
1/16扫描
刷新一幅图片需要一次扫描16行数据
刷新频率
1.2Khz
保证人眼观察无抖动
RGB接口
说明
RGB
信号数据,在时钟上升沿写入移位寄存器
CLK
移位寄存器时钟信号,上升沿有效
LAT
将移位寄存器内的数据送到锁存器输出,驱动LED显示
OE
亮度控制信号,显示屏消隐
ABCD
1/16行扫描控制信号
显示屏内部驱动时序图
点阵屏驱动原理
点阵式LED显示屏的原理都大同小异,无非就是将指定位置写1或写0将其点亮和熄灭,由于人类视觉的暂留现象,通过快速的刷新每一行的内容,感觉每行都是同时显示的,上文描述的屏参数的刷新频率就是指的这个,低于这个频率,人眼会观察到刷新的抖动,影响视觉效果。
在时钟的上升沿,依次将需要显示的数据移位至数据暂存器(数据的长度是由屏幕的尺寸以及是否级联屏幕决定),通过使能锁存引脚,将数据暂存器的数据输出至芯片的输出口,如果同时输出使能信号有效,即控制对应位置的LED状态。需要注意的是,输出使能信号还用于解决显示拖影问题(在显示的消隐时间内刷新数据),同时通过控制脉宽,实现显示屏亮度调节。
动态数字变换效果的实现
重点来了,这种方式的数字变化效果只有两种,一是竖条的左右移动,二是横条或竖条的补齐和消隐,同样是利用视觉暂留,通过不断的画线、画点(擦除即为画空白的线和点)实现动态效果,详见代码。
为什么是RTT+ESP8266
作者第一次接触RT-Thread是在2010年,当时的版本号还是0.6,在项目中用RTT+Lwip实现远程网络控制,真心佩服熊大(RTT作者),如今的RTT物联网操作系统RT-Thread 3.0的功能已经非常完善,绝对是拿得出手的国产操作系统,shell/msh组件方便调试,适时推出的AT组件、SAL抽象层和AT_DEVICE驱动直接支持ESP8266模组,让IoT开发者尽可能的把精力放在应用需求上,用户无需Coding WiFi模块的驱动代码就能实现联网和NTP的功能,与本教程天生绝配。
乐鑫ESP8266的芯片方案随着物联网行业的风口,已经大规模的使用,不管是性能还是可靠性都已由市场验证了,也衍生了多家模块供应商基于ESP8266的方案推出了自家的产品,出货量都非常大,关键是性价比高!
软件框架
RTT配置
1、默认已经git clone最新的rtt版本,安装scons等环境。
2、拷贝rt-thread\bsp\stm32f4xx-HAL,重命名为stm32f4xx-HAL-ledmatrix。
3、Menuconfig配置:选择Device type、时钟、shell的串口号
RT-Thread Components->Device Drivers
打开串口驱动、RTC驱动、NTP服务
RT-Thread Components->Network->SAL->protocol stack implement
打开Support AT commands statck
RT-Thread Components->Network->AT commands
配置AT组件,client模式
添加物联网组件!!!
RT-Thread online packages->IOT->AT DEVICE
添加ESP8266乐鑫模块的支持
执行指令更新的固件版本
返回到cmd界面,执行pkgs –-update和pkgs –upgrade
该过程将根据env配置的组件项,从git服务器上pull最新的版本。
固件源码位于工程目录下的packages文件夹。
时钟配置
默认的时钟初始化采用LSE和LSI作为时钟源,因为我们的应用需要RTC,对晶振精度要求较高,需要用外部的32.768K作为RTC的时钟源。
时钟初始化函数位于drivers/board.c -> SystemClock_Config(),不会修改的同学可以参考STM32CubeMX生成的初始化例子对着修改。
大家期待的主函数来了
屏幕扫描中断
利用定时器TIM5产生0.8ms间隔的中断,同时使用TIM5.OC1作为控制屏幕使能的时间间隔,用于亮度调节和消隐(去屏幕拖影)。
定时器初始化部分代码如下:
添加msh命令用于控制台调节屏幕亮度:
命令为【pwm 数值】,取值范围100-800
屏幕xy坐标系,显示数据结构,实现画点画线函数
参考直接坐标系,以左下角为坐标原点。
由于显示屏有效像素为64x32,并且每个像素有三个RGB颜色,据此定义数据结构如下,uint8_t类型的适合配合字模适用,便于显示英文字母和汉字,uint32_t类型的适合作图,通过联合体共享同一块数据内存区域。Move_buf用于存放较长内容用于移动效果显示。Color为显示颜色,共7个。
在此基础上实现画点和画线(直线),只需确定坐标位置,置位和清零对应二维数组的相应位。画线只是调用画点的函数,如下:
数字变换效果
有了以上的基础,动态效果便可很方便的实现,比如由0到1的变换,
通过画点和画线,将FE向右移动,将A和D逐点擦除,执行若干次后实现效果,代码如下。其它数字原理一样,不再详细介绍。
广告板移动效果
这里是显示万年历的移动显示的例子,只占用一排,上面或者下面一行。
显示内容二维数组,移动效果实现原理是将数组中的每个数据移位,将用于显示的其中一段拷贝到显示数据结构。
WIFI和NTP实现
广告走一波,要论操作系统哪家强,有个天才初三小妹妹告诉你:原帖在这里http://www.right.com.cn/forum/thread-337363-1-1.html
正是因为RTT丰富的外围组件,几乎不用写一行驱动代码就实现了WiFi和NTP的功能,因为组件已经提供了ESP8266的驱动、NTP服务的驱动。只需针对应用需求做相应调用就可以满足设计要求。方法见前文RTT配置一章。
目前系统联网还有问题待解决,目前每个小时与NTP服务器同步一次,每次复位后第4个同步函数开始都会报错。(容我查明原因再修正)
老样子,免费得来的都不会珍惜,本文全开转发朋友圈保留6小时以上,截图给微信karaxiaoyu获取源代码以及原理图!
顺便,建了一个交流群,讨论本时钟,100估计分分钟就满,手快有,手慢无!公众号改版,为了以后不错过最新的消息,请参考最上面动图我设置星标,谢谢!
往期好文合集
【收藏】芯片之家精选好文合集

