大数跨境

【开源】从0到1教你制作网络数字变化时钟

【开源】从0到1教你制作网络数字变化时钟 芯片之家
2018-10-08
3
导读:前段时间做了一个数字变化的网络时钟,效果还不错,全部开源给大家!

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





前段时间做了一个数字变化的网络时钟,效果还不错,群里不少小伙伴直接找我买,卖给你们,那显我的多俗,也不是芯片之家社群的风格,是吧,授人以鱼不如授人以渔,于是我的好友殷工将整个制作过程在这里,分享给大家,包括源代码哦!


本次的视频效果


下面我们开工,好的设计从最原始的框图开始设计,让大家对整个项目有一个感性的认识,比较简单,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估计分分钟就满,手快有,手慢无!公众号改版,为了以后不错过最新的消息,请参考最上面动图我设置星标,谢谢!

往期好文合集


【收藏】芯片之家精选好文合集

【声明】内容源于网络
0
0
芯片之家
1234
内容 1436
粉丝 0
芯片之家 1234
总阅读3.7k
粉丝0
内容1.4k