您尚未登录。

楼主 # 2021-07-12 10:20:45

zhang235hai
会员
注册时间: 2020-04-06
已发帖子: 212
积分: 165

ESP32做的点整时钟,可以正确显示时间,怎么做出数字上下滚动的效果呢?

我的代码参考了B站一位大佬,支持手机配网,修改后如下

//必须包头文件
#include "LedControl.h"
#include "word.h"

#include <WiFi.h>
#include <Arduino.h>
#include "NTPClient.h"

WiFiUDP ntpUDP; // 创建一个WIFI UDP连接
NTPClient timeClient(ntpUDP, "ntp1.aliyun.com", 60*60*8, 30*60*1000);

byte wei0[1][8] ={};
byte wei1[1][8] ={};
byte wei2[1][8] ={};
byte wei3[1][8] ={};
byte wei4[1][8] ={};
byte wei5[1][8] ={};
byte wei6[1][8] ={};
byte wei7[1][8] ={};
byte display0[1][8] ={};
byte display1[1][8] ={};
byte display2[1][8] ={};
byte display3[1][8] ={};

void SmartConfig()
{
  WiFi.mode(WIFI_STA);
  Serial.println("\r\nWait for Smartconfig...");
  WiFi.beginSmartConfig();
  while (1)
  {
    Serial.print(".");
    delay(500);                   // wait for a second
    if (WiFi.smartConfigDone())
    {
      Serial.println("SmartConfig Success");
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
      Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      break;
    }
  }
}

bool AutoConfig()
{
    WiFi.begin();
    //如果觉得时间太长可改
    for (int i = 0; i < 20; i++)
    {
        int wstatus = WiFi.status();
        if (wstatus == WL_CONNECTED)
        {
          Serial.println("WIFI SmartConfig Success");
          Serial.printf("SSID:%s", WiFi.SSID().c_str());
          Serial.printf(", PSW:%s\r\n", WiFi.psk().c_str());
          Serial.print("LocalIP:");
          Serial.print(WiFi.localIP());
          Serial.print(" ,GateIP:");
          Serial.println(WiFi.gatewayIP());
          return true;
        }
        else
        {
          Serial.print("WIFI AutoConfig Waiting......");
          Serial.println(wstatus);
          delay(1000);
        }
    }
    Serial.println("WIFI AutoConfig Faild!" );
    return false;
}

/*
********接线方式********
  uno/2560      7219点阵模块
  5V        >>    VCC
  GND       >>    GND
  pin 12   >>    DIN
  pin 11   >>    CLK
  pin 10   >>     CS
 *************************/
LedControl lc = LedControl(12, 14, 15, 4);
/*《初始化》>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
void setup() {

  Serial.begin(115200);

  if (!AutoConfig())
  {
    SmartConfig();
  }
  /*MAX72XX开机时处于省电模式,我们必须做一个唤醒呼叫*/
  lc.shutdown(0, false);
  lc.shutdown(1, false);
  lc.shutdown(2, false);
  lc.shutdown(3, false);
  /* 设置亮度为中等值 */
  char is = 7; /* 0~15 */
  lc.setIntensity(0, is);
  lc.setIntensity(1, is);
  lc.setIntensity(2, is);
  lc.setIntensity(3, is);
  /* 清除显示 */
  lc.clearDisplay(0);
  lc.clearDisplay(1);
  lc.clearDisplay(2);
  lc.clearDisplay(3);
}
/* 《主循环》>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
void loop()
{
//  for(int i=0;i<4;i++){
//    lc.set_num(i,testnumber[i]);
//    delay(500);
//  }
//lc.set_num(2,testnumber[0]);
//lc.setLed(0,1,1,1);
//lc.setLed(0,6,6,1);

  timeClient.update();
//  Serial.println(timeClient.getFormattedTime());
  int shi_shiwei = timeClient.getFormattedTime().substring(0,1).toInt();
  int shi_gewei = timeClient.getFormattedTime().substring(1,2).toInt();
  int fen_shiwei = timeClient.getFormattedTime().substring(3,4).toInt();
  int fen_gewei = timeClient.getFormattedTime().substring(4,5).toInt();
  int miao_shiwei = timeClient.getFormattedTime().substring(6,7).toInt();
  int miao_gewei = timeClient.getFormattedTime().substring(7,-1).toInt();
  
  get_display0(miao_shiwei,miao_gewei);
  lc.set_num(0,display0[1]);
  
  get_display1(fen_shiwei,fen_gewei);
  lc.set_num(1,display1[1]);
  
  get_display2(shi_gewei,fen_shiwei);
  lc.set_num(2,display2[1]);

  get_display3(shi_shiwei,shi_gewei);
  lc.set_num(3,display3[1]);

  lc.setLed(1,2,7,1);
  lc.setLed(1,4,7,1);
  lc.setLed(2,2,3,1);
  lc.setLed(2,4,3,1);
}
//0号点阵的数据处理
void get_display0(int miao_1,int miao_0){
  for(int i=0;i<8;i++){
    wei0[1][i] = mininumber[miao_0][i] /2/2/2/2;//低位数据右移4位
    }
  for(int i=0;i<8;i++){
    wei1[1][i] = mininumber[miao_1][i];//高位数据不需要变动
    }
  for(int i=0;i<8;i++){
    display0[1][i] = wei0[1][i] | wei1[1][i];
    }
  }
//1号点阵的数据处理
void get_display1(int fen_1,int fen_0){
  for(int i=0;i<8;i++){
    wei2[1][i] = number[fen_0][i] /2;//地位数据右移1位
    }
  for(int i=0;i<8;i++){
    wei3[1][i] = number[fen_1][i] *2*2*2*2;//高位数据左移4位
    }
  for(int i=0;i<8;i++){
    display1[1][i] = wei2[1][i] | wei3[1][i];
    }
  }
//2号点阵的数据处理
void get_display2(int fen_1,int shi_0){
  for(int i=0;i<8;i++){
    wei4[1][i] = number[shi_0][i] /2/2/2/2;//地位数据右移4位
    }
  for(int i=0;i<8;i++){
    wei5[1][i] = number[fen_1][i] *2*2*2;//地位数据左移3位
    }
  for(int i=0;i<8;i++){
    display2[1][i] = wei4[1][i] | wei5[1][i];
    }
  }
//3号点阵的数据处理
void get_display3(int shi_1,int shi_0){
  for(int i=0;i<8;i++){
    wei6[1][i] = number[shi_0][i] /2/2/2/2/2;//地位数据右移5位
    }
  for(int i=0;i<8;i++){
    wei7[1][i] = number[shi_1][i] ;//高位数据不需要变动
    }
  for(int i=0;i<8;i++){
    display3[1][i] = wei6[1][i] | wei7[1][i];
    }
  }

/*《显示函数》>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/

最近编辑记录 zhang235hai (2021-07-12 10:21:39)

离线

#1 2021-07-12 12:24:05

xfdr0805
会员
注册时间: 2020-07-23
已发帖子: 312
积分: 355

Re: ESP32做的点整时钟,可以正确显示时间,怎么做出数字上下滚动的效果呢?

你需要一个缓冲区   用定时器修改缓冲区内容  可以125ms向上或下移动最后那个点阵的每一行来实现翻页

离线

楼主 #2 2021-07-23 17:30:20

zhang235hai
会员
注册时间: 2020-04-06
已发帖子: 212
积分: 165

Re: ESP32做的点整时钟,可以正确显示时间,怎么做出数字上下滚动的效果呢?

实现了滚动的效果

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn