VFD显示的时钟。用ESP8266控制,自动联网WiFi对时。显示效果如图:
直接上代码:
//用ESP8266控制自动联网对时的VFD时钟
//VFD型号:VFD-8-MD-06INKM
- #include <NTPClient.h>
- #include <ESP8266WiFi.h>
- #include <WiFiUdp.h>
- #include <time.h>
- #include <SPI.h>
- #define VFD_MOSI 13
- #define VFD_CLK 14
- #define VFD_CS 15
- #define VFD_RST 16
- #define VFD_DIMMING_UP 5 //亮度+
- #define VFD_DIMMING_DOWN 4 //亮度-
- //修改成需要连接的WiFi
- const char *ssid = "WiFi名称";
- const char *password = "WiFi密码";
- static char VFD_Dimming = 0x8f; //VFD默认亮度
- WiFiUDP ntpUDP;
- NTPClient timeClient(ntpUDP, "time1.aliyun.com", 28800, 60000);
- /*
- 参数说明:
- 1. udp : 创建的UDP连接
- 2. poolServerName : 服务器地址, 默认: time.nist.gov
- 3. timeOffset : 时区, 默认0, 单位秒, 北京在第8时区 3600*8
- 4. milliseconds : 刷新时间间隔, 毫秒
- */
- void VFD_DISP(char data[8]){
- for(uint8_t i=0; i<8; i++){
- digitalWrite(VFD_CS, LOW);
- SPI.transfer(0x20+i); //定位
- SPI.transfer(data[i]); //显示的数据
- digitalWrite(VFD_CS, HIGH);
- }
- digitalWrite(VFD_CS, LOW);
- SPI.transfer(0xe8); //开显示
- digitalWrite(VFD_CS, HIGH);
- }
- void VFD_SetDimming(char dimming){
- digitalWrite(VFD_CS, LOW);
- SPI.transfer(0xe4);
- SPI.transfer(dimming);
- digitalWrite(VFD_CS, HIGH);
- }
- void setup() {
- SPI.begin();
- pinMode(VFD_RST, OUTPUT);
- pinMode(VFD_CS, OUTPUT);
- pinMode(VFD_DIMMING_UP, INPUT);
- pinMode(VFD_DIMMING_DOWN, INPUT);
- //复位VFD
- digitalWrite(VFD_RST, LOW);
- delay(500);
- digitalWrite(VFD_RST, HIGH);
- //选通VFD
- digitalWrite(VFD_CS, HIGH);
- //设置SPI参数
- SPI.setBitOrder(LSBFIRST); //LSB(SPI数据格式,低位在前)
- SPI.setClockDivider(SPI_CLOCK_DIV64); //SPI时钟,2~128,(实测:64->250KHz, 128->125KHz)
- SPI.setDataMode(SPI_MODE3); //SPI模式,0~3,
- /*
- 0:空闲时时钟信号CLK为低电平,第1个边沿开始采样;
- 1:空闲时时钟信号CLK为低电平,第2个边沿开始采样;
- 2:空闲时时钟信号CLK为高电平,第1个边沿开始采样;
- 3:空闲时时钟信号CLK为高电平,第2个边沿开始采样;
- */
- //初始化VFD
- //显示设置位数
- digitalWrite(VFD_CS, LOW);
- SPI.transfer(0xe0);
- SPI.transfer(0x07); //(8位)
- digitalWrite(VFD_CS, HIGH);
- VFD_SetDimming(VFD_Dimming);
- char s[8] = {0x0d,'W','i','F','i','.','.','.'};
- WiFi.mode(WIFI_STA);
- WiFi.begin(ssid, password);
- while ( WiFi.status() != WL_CONNECTED ) {
- VFD_DISP(s);
- delay (500);
- }
- timeClient.begin();
- delay(1000);
- }
- void loop() {
- timeClient.update();
- time_t t = timeClient.getEpochTime(); //获得时间戳
- struct tm *p = gmtime(&t);
- char sDate[16], sTime[16];
- //strftime(sDate, 16, "%Y-%m-%d", p);
- strftime(sTime, 16, "%H:%M:%S", p);
- VFD_DISP(sTime);
- delay(500);
- //调整VFD亮度
- while(digitalRead(VFD_DIMMING_UP) == LOW){
- if(VFD_Dimming < 0xf0){
- VFD_Dimming++;
- VFD_SetDimming(VFD_Dimming);
- char s[8] = {0x08,'D','i','m','m','i','n','g'};
- VFD_DISP(s);
- }
- delay(50);
- }
- while(digitalRead(VFD_DIMMING_DOWN) == LOW){
- if(VFD_Dimming > 0x01){
- VFD_Dimming--;
- VFD_SetDimming(VFD_Dimming);
- char s[8] = {0x09,'D','i','m','m','i','n','g'};
- VFD_DISP(s);
- }
- delay(50);
- }
- }
复制代码
|