数码之家

 找回密码
 立即注册
搜索
查看: 6092|回复: 8

[Arduino] 基于esp8266控制8*32的led点阵时钟,WiFi自动对时

[复制链接]
发表于 2020-2-21 16:26:33 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
参考连接https://www.mydigit.cn/forum.php?mod=viewthread&tid=111420前提是你的esp8266模块提前用AT命令连接上网络,程序里面没有发现联网的选项,另外,OTA升级我也没弄明白,希望有懂的大神能教教我。
原文是利用6块8*8点阵的led做的,我手里只有4块8*8点阵的led点阵,所以,研究了很久,终于改的能用了,也比较舒服了。
硬件接线图按照上个链接的方法连接。
模块和esp8266的连接
VCC - 5V
  GND - GND
  CS  - D8
  DIN - D7
  CLK - D5
  光敏电阻和esp8266的连接,原文是100k电阻,因为用的光敏电阻不一样,所以,我接的是一个10k的电阻。
  VCC - 3.3V
  GND - GND
  OUT - A0
WiFi指示灯与esp8266的连接。
  D3--|<|---[1K]--3.3v


先上图
开机显示hello,完美适配4块8*8点阵模块,后面会写这么改这个东西。
2.jpg
WiFi标志,(这个也是改过的)表示正在连接,我设置的等待时间是2500毫秒,差不多,等led指示灯亮,这个等待时间也就到了,就会显示实时的时间了。


1.jpg
时间界面

3.jpg
星期的显示方式,可以在3个字符的位置,随意更改,后面有方法。
4.jpg
完美滚动,1分钟一次

8e364da3fafb108a1c0ec13d32473d0b.gif


代码如下



  1. //MatrixClock
  2. //OTA,WiFiManager
  3. //without RTC
  4. //LDR-A0,自动亮度
  5. //开机LOGO

  6. /*
  7.   ===================
  8.   MAX7219 to ESP8266
  9.   ===================
  10.   VCC - 5V
  11.   GND - GND
  12.   CS  - D8
  13.   DIN - D7
  14.   CLK - D5
  15.   ===========================================
  16.   LDR light sensor module to ESP8266
  17.   ============================================
  18.   VCC - 3.3V
  19.   GND - GND
  20.   OUT - A0
  21.   ========================================================
  22.   WiFi led to ESP8266
  23.   ========================================================
  24.   D3--|<|---[1K]--3.3v

  25. */

  26. #include <SPI.h>
  27. #include <Ticker.h>
  28. #include <ArduinoOTA.h>
  29. #include <DNSServer.h>
  30. #include <ESP8266WiFi.h>
  31. #include <ESP8266WebServer.h>
  32. #include <WiFiManager.h>
  33. #include <WiFiUdp.h>
  34. #include <Wire.h>
  35. #include <NTPClient.h>   //更新get year, month, day

  36. //Beijin time define
  37. #define NTP_OFFSET     8*3600                    //+8h,北京时间
  38. #define NTP_INTERVAL   12*60*60*1000             //12*60*60*1000  12 hours 更新
  39. #define NTP_ADDRESS  "ntp1.aliyun.com"
  40. //#define NTP_ADDRESS    "time1.cloud.tencent.com"

  41. /*************************************************************************************************
  42.   time.pool.aliyun.com
  43.   time1.aliyun.com
  44.   time2.aliyun.com
  45.   time3.aliyun.com
  46.   time4.aliyun.com
  47.   time5.aliyun.com
  48.   time6.aliyun.com
  49.   time7.aliyun.com

  50.   time1.cloud.tencent.com
  51.   time2.cloud.tencent.com
  52.   time3.cloud.tencent.com
  53.   time4.cloud.tencent.com
  54.   time5.cloud.tencent.com
  55. *************************************************************************************************/

  56. #define wf_led  0      // 0,D3
  57. #define CS             15     // D8=cs Pin(SPI) D5=CLK, D7=DI
  58. #define anzMAX         4      // number of led matrix Modules
  59. unsigned short maxPosX = anzMAX * 8 - 1;                         //计算最大位置
  60. unsigned short LEDarr[anzMAX][8];                                        //要显示的字符矩阵(40 * 8)
  61. unsigned short helpArrMAX[anzMAX * 8];                            //字符的辅助数组
  62. unsigned short helpArrPos[anzMAX * 8];                                //字符的辅助数组pos
  63. unsigned int z_PosX = 0;                                                        //xPosition 用于时间显示
  64. unsigned int d_PosX = 0;                            //xPosition 用于日期显示
  65. bool f_tckr1s = false;
  66. bool f_tckr1h = false;
  67. bool f_tckr50ms = false;
  68. bool f_tckr24h = false;


  69. #define DATATIME_PRINT
  70. #define CHINESE_CALENDAR                            //中国日历显示方式 1900-01-01,星期
  71. #define LDR_SENSOR
  72. #define LDR_DEBUG

  73. #ifdef LDR_SENSOR
  74. int A0LDR = A0;        // A0 analoog LDR in
  75. #endif

  76. // The object for the Ticker
  77. Ticker tckr;

  78. // Set up the NTP UDP client
  79. WiFiUDP ntpUDP;
  80. NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);

  81. // other displays -------------------------------------
  82. //#define REVERSE_HORIZONTAL                           // Parola, Generic and IC-Station 反转水平
  83. //#define REVERSE_VERTICAL                             // IC-Station display 反转垂直
  84. #define ROTATE HORIZONTAL                                    // Generic display    旋转90度
  85. /*
  86.    p  A  B  C  D  E  F  G        7  6  5  4  3  2  1  0        G  F  E  D  C  B  A  p        G  F  E  D  C  B  A  p
  87.   ------------------------      ------------------------      ------------------------      ------------------------
  88.   0 |o  o  o  o  o  o  o  o|    p |o  o  o  o  o  o  o  o|    0 |o  o  o  o  o  o  o  o|    7 |o  o  o  o  o  o  o  o|
  89.   1 |o  o  o  o  o  o  o  o|    A |o  o  o  o  o  o  o  o|    1 |o  o  o  o  o  o  o  o|    6 |o  o  o  o  o  o  o  o|
  90.   2 |o  o  o  o  o  o  o  o|    B |o  o  o  o  o  o  o  o|    2 |o  o  o  o  o  o  o  o|    5 |o  o  o  o  o  o  o  o|
  91.   3 |o  o              o  o|    C |o  o              o  o|    3 |o  o              o  o|    4 |o  o              o  o|
  92.   4 |o  o    FC-16     o  o|    D |o  o   Generic    o  o|    4 |o  o   Parola     o  o|    3 |o  o  IC-Station  o  o|
  93.   5 |o  o              o  o|    E |o  o              o  o|    5 |o  o              o  o|    2 |o  o              o  o|
  94.   6 |o  o  o  o  o  o  o  o|    F |o  o  o  o  o  o  o  o|    6 |o  o  o  o  o  o  o  o|    1 |o  o  o  o  o  o  o  o|
  95.   7 |o  o  o  o  o  o  o  o|    G |o  o  o  o  o  o  o  o|    7 |o  o  o  o  o  o  o  o|    0 |o  o  o  o  o  o  o  o|
  96.   ------------------------      ------------------------      ------------------------      ------------------------
  97. */
  98. #ifdef CHINESE_CALENDAR
  99. //months
  100. char M_arr[12][4] = {
  101.   { '.', '0', '1', '.' },
  102.   { '.', '0', '2', '.' },
  103.   { '.', '0', '3', '.' },
  104.   { '.', '0', '4', '.' },
  105.   { '.', '0', '5', '.' },
  106.   { '.', '0', '6', '.' },
  107.   { '.', '0', '7', '.' },
  108.   { '.', '0', '8', '.' },
  109.   { '.', '0', '9', '.' },
  110.   { '.', '1', '0', '.' },
  111.   { '.', '1', '1', '.' },
  112.   { '.', '1', '2', '.' }
  113. };
  114. //days
  115. char WT_arr[7][3] = {
  116.   { 'X', 'Q', '7'},
  117.   { 'X', 'Q', '1'},
  118.   { 'X', 'Q', '2'},
  119.   { 'X', 'Q', '3'},
  120.   { 'X', 'Q', '4'},
  121.   { 'X', 'Q', '5'},
  122.   { 'X', 'Q', '6'}
  123. };
  124. #else
  125. //months
  126. char M_arr[12][5] = { { '.', 'J', 'a', 'n', '.' }, { '.', 'F', 'e', 'b', '.' },
  127.   { '.', 'M', 'a', 'r', '.' }, { '.', 'A', 'p', 'r', '.' }, { '.', 'M', 'a', 'y', ' ' }, { '.', 'J', 'u', 'n', 'e' }, { '.', 'J', 'u', 'l', 'y' },
  128.   { '.', 'A', 'u', 'g', '.' }, { '.', 'S', 'e', 'p', 't' }, { '.', 'O', 'c', 't', '.' }, { '.', 'N', 'o', 'v', '.' }, { '.', 'D', 'e', 'c', '.' }
  129. };
  130. //days
  131. char WT_arr[7][4] = { { 'S', 'u', 'n', ',' }, { 'M', 'o', 'n', ',' }, { 'T', 'u', 'e', ',' }, { 'W', 'e', 'd', ',' }, { 'T', 'h', 'u', ',' },
  132.   { 'F', 'r', 'i', ',' }, { 'S', 'a', 't', ',' }
  133. };
  134. #endif


  135. // 8x8矩阵中的字符集5x8,0,0在右上角
  136. unsigned short const font1[96][9] = { {
  137.     0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },   // 0x20, Space
  138.   { 0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x04, 0x00 },   // 0x21, !
  139.   { 0x07, 0x09, 0x09, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00 },   // 0x22, "
  140.   { 0x07, 0x0a, 0x0a, 0x1f, 0x0a, 0x1f, 0x0a, 0x0a, 0x00 },   // 0x23, #
  141.   { 0x07, 0x04, 0x0f, 0x14, 0x0e, 0x05, 0x1e, 0x04, 0x00 },   // 0x24, $
  142.   { 0x07, 0x19, 0x19, 0x02, 0x04, 0x08, 0x13, 0x13, 0x00 },   // 0x25, %
  143.   { 0x07, 0x04, 0x0a, 0x0a, 0x0a, 0x15, 0x12, 0x0d, 0x00 },   // 0x26, &
  144.   { 0x07, 0x04, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 },   // 0x27, '
  145.   { 0x07, 0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x02, 0x00 },   // 0x28, (
  146.   { 0x07, 0x08, 0x04, 0x02, 0x02, 0x02, 0x04, 0x08, 0x00 },   // 0x29, )
  147.   { 0x07, 0x04, 0x15, 0x0e, 0x1f, 0x0e, 0x15, 0x04, 0x00 },   // 0x2a, *
  148.   { 0x07, 0x00, 0x04, 0x04, 0x1f, 0x04, 0x04, 0x00, 0x00 },   // 0x2b, +
  149.   { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02 },   // 0x2c, ,
  150.   { 0x07, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00 },   // 0x2d, -
  151.   { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00 },   // 0x2e, .
  152.   { 0x07, 0x01, 0x01, 0x02, 0x04, 0x08, 0x10, 0x10, 0x00 },   // 0x2f, /
  153.   { 0x07, 0x0e, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0e, 0x00 },   // 0x30, 0
  154.   { 0x07, 0x04, 0x0c, 0x04, 0x04, 0x04, 0x04, 0x0e, 0x00 },   // 0x31, 1
  155.   { 0x07, 0x0e, 0x11, 0x01, 0x02, 0x04, 0x08, 0x1f, 0x00 },   // 0x32, 2
  156.   { 0x07, 0x0e, 0x11, 0x01, 0x06, 0x01, 0x11, 0x0e, 0x00 },   // 0x33, 3
  157.   { 0x07, 0x02, 0x06, 0x0a, 0x12, 0x1f, 0x02, 0x02, 0x00 },   // 0x34, 4
  158.   { 0x07, 0x1f, 0x10, 0x1e, 0x01, 0x01, 0x11, 0x0e, 0x00 },   // 0x35, 5
  159.   { 0x07, 0x06, 0x08, 0x10, 0x1e, 0x11, 0x11, 0x0e, 0x00 },   // 0x36, 6
  160.   { 0x07, 0x1f, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08, 0x00 },   // 0x37, 7
  161.   { 0x07, 0x0e, 0x11, 0x11, 0x0e, 0x11, 0x11, 0x0e, 0x00 },   // 0x38, 8
  162.   { 0x07, 0x0e, 0x11, 0x11, 0x0f, 0x01, 0x02, 0x0c, 0x00 },   // 0x39, 9
  163.   { 0x04, 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x00, 0x00 },   // 0x3a, :
  164.   { 0x07, 0x00, 0x0c, 0x0c, 0x00, 0x0c, 0x04, 0x08, 0x00 },   // 0x3b, ;
  165.   { 0x07, 0x02, 0x04, 0x08, 0x10, 0x08, 0x04, 0x02, 0x00 },   // 0x3c, <
  166.   { 0x07, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00 },   // 0x3d, =
  167.   { 0x07, 0x08, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x00 },   // 0x3e, >
  168.   { 0x07, 0x0e, 0x11, 0x01, 0x02, 0x04, 0x00, 0x04, 0x00 },   // 0x3f, ?
  169.   { 0x07, 0x0e, 0x11, 0x17, 0x15, 0x17, 0x10, 0x0f, 0x00 },   // 0x40, @
  170.   { 0x07, 0x04, 0x0a, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x00 },   // 0x41, A
  171.   { 0x07, 0x1e, 0x11, 0x11, 0x1e, 0x11, 0x11, 0x1e, 0x00 },   // 0x42, B
  172.   { 0x07, 0x0e, 0x11, 0x10, 0x10, 0x10, 0x11, 0x0e, 0x00 },   // 0x43, C
  173.   { 0x07, 0x1e, 0x09, 0x09, 0x09, 0x09, 0x09, 0x1e, 0x00 },   // 0x44, D
  174.   { 0x07, 0x1f, 0x10, 0x10, 0x1c, 0x10, 0x10, 0x1f, 0x00 },   // 0x45, E
  175.   { 0x07, 0x1f, 0x10, 0x10, 0x1f, 0x10, 0x10, 0x10, 0x00 },   // 0x46, F
  176.   { 0x07, 0x0e, 0x11, 0x10, 0x10, 0x13, 0x11, 0x0f, 0x00 },   // 0x37, G
  177.   { 0x07, 0x11, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x11, 0x00 },   // 0x48, H
  178.   { 0x07, 0x0e, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0e, 0x00 },   // 0x49, I
  179.   { 0x07, 0x1f, 0x02, 0x02, 0x02, 0x02, 0x12, 0x0c, 0x00 },   // 0x4a, J
  180.   { 0x07, 0x11, 0x12, 0x14, 0x18, 0x14, 0x12, 0x11, 0x00 },   // 0x4b, K
  181.   { 0x07, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x00 },   // 0x4c, L
  182.   { 0x07, 0x11, 0x1b, 0x15, 0x11, 0x11, 0x11, 0x11, 0x00 },   // 0x4d, M
  183.   { 0x07, 0x11, 0x11, 0x19, 0x15, 0x13, 0x11, 0x11, 0x00 },   // 0x4e, N
  184.   { 0x07, 0x0e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00 },   // 0x4f, O
  185.   { 0x07, 0x1e, 0x11, 0x11, 0x1e, 0x10, 0x10, 0x10, 0x00 },   // 0x50, P
  186.   { 0x07, 0x0e, 0x11, 0x11, 0x11, 0x15, 0x12, 0x0d, 0x00 },   // 0x51, Q
  187.   { 0x07, 0x1e, 0x11, 0x11, 0x1e, 0x14, 0x12, 0x11, 0x00 },   // 0x52, R
  188.   { 0x07, 0x0e, 0x11, 0x10, 0x0e, 0x01, 0x11, 0x0e, 0x00 },   // 0x53, S
  189.   { 0x07, 0x1f, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00 },   // 0x54, T
  190.   { 0x07, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00 },   // 0x55, U
  191.   { 0x07, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0a, 0x04, 0x00 },   // 0x56, V
  192.   { 0x07, 0x11, 0x11, 0x11, 0x15, 0x15, 0x1b, 0x11, 0x00 },   // 0x57, W
  193.   { 0x07, 0x11, 0x11, 0x0a, 0x04, 0x0a, 0x11, 0x11, 0x00 },   // 0x58, X
  194.   { 0x07, 0x11, 0x11, 0x0a, 0x04, 0x04, 0x04, 0x04, 0x00 },   // 0x59, Y
  195.   { 0x07, 0x1f, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1f, 0x00 },   // 0x5a, Z
  196.   { 0x07, 0x0e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0e, 0x00 },   // 0x5b, [
  197.   { 0x07, 0x10, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x00 },   // 0x5c, '\'
  198.   { 0x07, 0x0e, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0e, 0x00 },   // 0x5d, ]
  199.   { 0x07, 0x04, 0x0a, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00 },   // 0x5e, ^
  200.   { 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00 },   // 0x5f, _
  201.   { 0x07, 0x04, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 },   // 0x60, `
  202.   { 0x07, 0x00, 0x0e, 0x01, 0x0d, 0x13, 0x13, 0x0d, 0x00 },   // 0x61, a
  203.   { 0x07, 0x10, 0x10, 0x10, 0x1c, 0x12, 0x12, 0x1c, 0x00 },   // 0x62, b
  204.   { 0x07, 0x00, 0x00, 0x00, 0x0e, 0x10, 0x10, 0x0e, 0x00 },   // 0x63, c
  205.   { 0x07, 0x01, 0x01, 0x01, 0x07, 0x09, 0x09, 0x07, 0x00 },   // 0x64, d
  206.   { 0x07, 0x00, 0x00, 0x0e, 0x11, 0x1f, 0x10, 0x0f, 0x00 },   // 0x65, e
  207.   { 0x07, 0x06, 0x09, 0x08, 0x1c, 0x08, 0x08, 0x08, 0x00 },   // 0x66, f
  208.   { 0x07, 0x00, 0x0e, 0x11, 0x13, 0x0d, 0x01, 0x01, 0x0e },   // 0x67, g
  209.   { 0x07, 0x10, 0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x00 },   // 0x68, h
  210.   { 0x05, 0x00, 0x02, 0x00, 0x06, 0x02, 0x02, 0x07, 0x00 },   // 0x69, i
  211.   { 0x07, 0x00, 0x02, 0x00, 0x06, 0x02, 0x02, 0x12, 0x0c },   // 0x6a, j
  212.   { 0x07, 0x10, 0x10, 0x12, 0x14, 0x18, 0x14, 0x12, 0x00 },   // 0x6b, k
  213.   { 0x05, 0x06, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00 },   // 0x6c, l
  214.   { 0x07, 0x00, 0x00, 0x0a, 0x15, 0x15, 0x11, 0x11, 0x00 },   // 0x6d, m
  215.   { 0x07, 0x00, 0x00, 0x16, 0x19, 0x11, 0x11, 0x11, 0x00 },   // 0x6e, n
  216.   { 0x07, 0x00, 0x00, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00 },   // 0x6f, o
  217.   { 0x07, 0x00, 0x00, 0x1c, 0x12, 0x12, 0x1c, 0x10, 0x10 },   // 0x70, p
  218.   { 0x07, 0x00, 0x00, 0x07, 0x09, 0x09, 0x07, 0x01, 0x01 },   // 0x71, q
  219.   { 0x07, 0x00, 0x00, 0x16, 0x19, 0x10, 0x10, 0x10, 0x00 },   // 0x72, r
  220.   { 0x07, 0x00, 0x00, 0x0f, 0x10, 0x0e, 0x01, 0x1e, 0x00 },   // 0x73, s
  221.   { 0x07, 0x08, 0x08, 0x1c, 0x08, 0x08, 0x09, 0x06, 0x00 },   // 0x74, t
  222.   { 0x07, 0x00, 0x00, 0x11, 0x11, 0x11, 0x13, 0x0d, 0x00 },   // 0x75, u
  223.   { 0x07, 0x00, 0x00, 0x11, 0x11, 0x11, 0x0a, 0x04, 0x00 },   // 0x76, v
  224.   { 0x07, 0x00, 0x00, 0x11, 0x11, 0x15, 0x15, 0x0a, 0x00 },   // 0x77, w
  225.   { 0x07, 0x00, 0x00, 0x11, 0x0a, 0x04, 0x0a, 0x11, 0x00 },   // 0x78, x
  226.   { 0x07, 0x00, 0x00, 0x11, 0x11, 0x0f, 0x01, 0x11, 0x0e },   // 0x79, y
  227.   { 0x07, 0x00, 0x00, 0x1f, 0x02, 0x04, 0x08, 0x1f, 0x00 },   // 0x7a, z
  228.   { 0x07, 0x06, 0x08, 0x08, 0x10, 0x08, 0x08, 0x06, 0x00 },   // 0x7b, {
  229.   { 0x07, 0x04, 0x04, 0x04, 0x00, 0x04, 0x04, 0x04, 0x00 },   // 0x7c, |
  230.   { 0x07, 0x0c, 0x02, 0x02, 0x01, 0x02, 0x02, 0x0c, 0x00 },   // 0x7d, }
  231.   { 0x07, 0x08, 0x15, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 },   // 0x7e, ~
  232.   { 0x07, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00 }    // 0x7f, DEL
  233. };


  234. struct DateTime {
  235.   unsigned short second1, second2, second12, min1, min2, min12, hour1, hour2, hour12;
  236.   unsigned short day1, day2, day12, mon1, mon2, mon12, year1, year2, year12, WT;
  237. } MEZ;

  238. //*************************************************************************************************
  239. const unsigned short InitArr[7][2] = {
  240.   { 0x0C, 0x00 },    // display off
  241.   { 0x00, 0xFF },    // no LEDtest
  242.   { 0x09, 0x00 },    // BCD off
  243.   { 0x0F, 0x00 },    // normal operation
  244.   { 0x0B, 0x07 },    // start display
  245.   { 0x0A, 0x04 },    // brightness
  246.   { 0x0C, 0x01 }     // display on
  247. };
  248. //**************************************************************************************************
  249. void max7219_init()  //all MAX7219 init
  250. {
  251.   unsigned short i, j;
  252.   for (i = 0; i < 7; i++) {
  253.     digitalWrite(CS, LOW);
  254.     delayMicroseconds(1);
  255.     for (j = 0; j < anzMAX; j++) {
  256.       SPI.write(InitArr[i][0]);  //register
  257.       SPI.write(InitArr[i][1]);  //value
  258.     }
  259.     digitalWrite(CS, HIGH);
  260.   }
  261. }
  262. //**************************************************************************************************
  263. void max7219_set_brightness(unsigned short br)  //brightness MAX7219
  264. {
  265.   unsigned short j;
  266.   if (br < 16) {
  267.     digitalWrite(CS, LOW);
  268.     delayMicroseconds(1);
  269.     for (j = 0; j < anzMAX; j++) {
  270.       SPI.write(0x0A);  //register
  271.       SPI.write(br);    //value
  272.     }
  273.     digitalWrite(CS, HIGH);
  274.   }
  275. }
  276. //**************************************************************************************************
  277. void helpArr_init(void)  //helperarray init
  278. {
  279.   unsigned short i, j, k;
  280.   j = 0;
  281.   k = 0;
  282.   for (i = 0; i < anzMAX * 8; i++) {
  283.     helpArrPos[i] = (1 << j);   //bitmask
  284.     helpArrMAX[i] = k;
  285.     j++;
  286.     if (j > 7) {
  287.       j = 0;
  288.       k++;
  289.     }
  290.   }
  291. }
  292. //**************************************************************************************************
  293. void clear_Display()   //clear all
  294. {
  295.   unsigned short i, j;
  296.   for (i = 0; i < 8; i++)     //8 rows
  297.   {
  298.     digitalWrite(CS, LOW);
  299.     delayMicroseconds(1);
  300.     for (j = anzMAX; j > 0; j--) {
  301.       LEDarr[j - 1][i] = 0;       //LEDarr clear
  302.       SPI.write(i + 1);           //current row
  303.       SPI.write(LEDarr[j - 1][i]);
  304.     }
  305.     digitalWrite(CS, HIGH);
  306.   }
  307. }
  308. //*********************************************************************************************************
  309. void rotate_90() // for Generic displays
  310. {
  311.   for (uint8_t k = anzMAX; k > 0; k--) {

  312.     uint8_t i, j, m, imask, jmask;
  313.     uint8_t tmp[8] = {0, 0, 0, 0, 0, 0, 0, 0};
  314.     for (  i = 0, imask = 0x01; i < 8; i++, imask <<= 1) {
  315.       for (j = 0, jmask = 0x01; j < 8; j++, jmask <<= 1) {
  316.         if (LEDarr[k - 1][i] & jmask) {
  317.           tmp[j] |= imask;
  318.         }
  319.       }
  320.     }
  321.     for (m = 0; m < 8; m++) {
  322.       LEDarr[k - 1][m] = tmp[m];
  323.     }
  324.   }
  325. }
  326. //**************************************************************************************************
  327. void refresh_display() //take info into LEDarr
  328. {
  329.   unsigned short i, j;

  330. #ifdef ROTATE_90
  331.   rotate_90();
  332. #endif
  333.   for (i = 0; i < 8; i++)     //8 rows
  334.   {
  335.     digitalWrite(CS, LOW);
  336.     delayMicroseconds(1);
  337.     for (j = anzMAX; j > 0; j--) {
  338.       SPI.write(i + 1);  //current row
  339. #ifdef REVERSE_HORIZONTAL
  340.       SPI.setBitOrder(LSBFIRST);      // bitorder for reverse columns
  341. #endif

  342. #ifdef REVERSE_VERTICAL
  343.       SPI.write(LEDarr[j - 1][7 - i]);
  344. #else
  345.       SPI.write(LEDarr[j - 1][i]);
  346. #endif

  347. #ifdef REVERSE_HORIZONTAL
  348.       SPI.setBitOrder(MSBFIRST);      // reset bitorder
  349. #endif
  350.     }
  351.     digitalWrite(CS, HIGH);
  352.   }
  353. }
  354. //**************************************************************************************************
  355. void char2Arr(unsigned short ch, int PosX, short PosY) { //characters into arr
  356.   int i, j, k, l, m, o1, o2, o3, o4;  //in LEDarr
  357.   PosX++;
  358.   k = ch - 32;                        //ASCII position in font
  359.   if ((k >= 0) && (k < 96))           //character found in font
  360.   {
  361.     o4 = font1[k][0];                 //character width
  362.     o3 = 1 << (o4 - 2);
  363.     for (i = 0; i < o4; i++) {
  364.       if (((PosX - i <= maxPosX) && (PosX - i >= 0))
  365.           && ((PosY > -8) && (PosY < 8))) //within matrix?
  366.       {
  367.         o1 = helpArrPos[PosX - i];
  368.         o2 = helpArrMAX[PosX - i];
  369.         for (j = 0; j < 8; j++) {
  370.           if (((PosY >= 0) && (PosY <= j)) || ((PosY < 0) && (j < PosY + 8))) //scroll vertical
  371.           {
  372.             l = font1[k][j + 1];
  373.             m = (l & (o3 >> i));  //e.g. o4=7  0zzzzz0, o4=4  0zz0
  374.             if (m > 0)
  375.               LEDarr[o2][j - PosY] = LEDarr[o2][j - PosY] | (o1);  //set point
  376.             else
  377.               LEDarr[o2][j - PosY] = LEDarr[o2][j - PosY] & (~o1); //clear point
  378.           }
  379.         }
  380.       }
  381.     }
  382.   }
  383. }

  384. //**************************************************************************************************
  385. void timer50ms() {
  386.   static unsigned int cnt50ms = 0;
  387.   static unsigned int cnt1s = 0;
  388.   static unsigned int cnt1h = 0;
  389.   f_tckr50ms = true;
  390.   cnt50ms++;
  391.   if (cnt50ms == 20) {
  392.     f_tckr1s = true; // 1 sec
  393.     cnt1s++;
  394.     cnt50ms = 0;
  395.   }
  396.   if (cnt1s == 3600) { // 1h
  397.     f_tckr1h = true;
  398.     cnt1h++;
  399.     cnt1s = 0;
  400.   }
  401.   if (cnt1h == 24) { // 1d
  402.     f_tckr24h = true;
  403.     cnt1h = 0;
  404.   }
  405. }
  406. //**************************************************************************************************
  407. void WiFisetup() {
  408.   //WiFiManager
  409.   //Local intialization. Once its business is done, there is no need to keep it around
  410.   WiFiManager wifiManager;

  411.   //wifiManager.resetSettings();

  412.   wifiManager.setAPStaticIPConfig(IPAddress(10, 0, 1, 1), IPAddress(10, 0, 1, 1), IPAddress(255, 255, 255, 0));

  413.   //wifiManager.autoConnect("Wifi Clock");

  414.   // wifiManager.setTimeout(180);

  415.   wifiManager.setConfigPortalTimeout(60);         //1 minute

  416.   if (!wifiManager.autoConnect("Wifi Clock"))
  417.   {
  418.     Serial.println(F("Failed to connect. Reset and try again..."));
  419.     delay(3000);
  420.     ESP.reset();       //重置并重试
  421.     delay(5000);
  422.   }

  423.   //if you get here you have connected to the WiFi
  424.   digitalWrite(wf_led, LOW);   //blue led on if wifi connected

  425.   Serial.println("WiFi Connected!");
  426.   Serial.print("IP ssid: ");
  427.   Serial.println(WiFi.SSID());
  428.   Serial.print("IP addr: ");
  429.   Serial.println(WiFi.localIP());
  430. }
  431. //**************************************************************************************************
  432. void Otasetup() {

  433.   ArduinoOTA.onStart([]() {
  434.     Serial.println("OTA Update Start");
  435.   });

  436.   ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
  437.     Serial.print("Progress: ");
  438.     Serial.println((progress / (total / 100)));
  439.     //    clear_Display();
  440.     char2Arr('O', 45, 0);            //OTA
  441.     char2Arr('T', 39, 0);
  442.     char2Arr('A', 33, 0);
  443.     char2Arr('.', 25, 0);
  444.     char2Arr('.', 19, 0);
  445.     char2Arr('.', 13, 0);
  446.     refresh_display();
  447.   });

  448.   ArduinoOTA.onEnd([]() {
  449.     Serial.println("OTA End,Restart......");
  450.   });

  451.   ArduinoOTA.onError([](ota_error_t error) {
  452.     Serial.printf("Error[%u]: ", error);
  453.     if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
  454.     else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
  455.     else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
  456.     else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
  457.     else if (error == OTA_END_ERROR) Serial.println("End Failed");
  458.   });
  459.   ArduinoOTA.begin();
  460. }
  461. //**************************************************************************************************
  462. #ifdef LDR_SENSOR
  463. void Setintens()
  464. {
  465.   //  int intens = ((1024 - analogRead(A0LDR)) / 300);
  466.   int intens = ((analogRead(A0LDR) - 400) / 12);  //480-663 亮-暗
  467.     if (intens < 8) {
  468.       intens = 10;
  469.     }
  470.     else if (intens == 8 || intens == 9 || intens == 10 || intens == 11 )  {
  471.       intens = 8;
  472.     }
  473.     else if (intens == 12 || intens == 13 || intens == 14 || intens == 15)  {
  474.       intens = 5;
  475.     }
  476.     else if (intens == 16 || intens == 17 || intens == 18 || intens == 19)  {
  477.       intens = 3;
  478.     }
  479.     else if (intens > 19) {
  480.       intens = 1;                          //整理亮度值,值越大亮度越高
  481.     }

  482. #ifdef LDR_DEBUG
  483. Serial.print("A0LDR: ");
  484. Serial.print(analogRead(A0LDR));
  485. Serial.print(" intens: ");
  486. Serial.println(intens);
  487. #endif
  488. max7219_set_brightness(intens);
  489. }
  490. #endif
  491. //**************************************************************************************************
  492. void setup ()
  493. {
  494.   pinMode(wf_led, OUTPUT);    //wifi led
  495.   digitalWrite(wf_led, HIGH); // led off

  496.   pinMode(CS, OUTPUT);
  497.   digitalWrite(CS, HIGH);

  498.   Serial.begin(115200);        // most ESP-01's use 115200 but this could vary
  499.   SPI.begin();
  500.   helpArr_init();
  501.   max7219_init();
  502.   clear_Display();
  503.   tckr.attach(0.05, timer50ms);    // every 50 msec
  504. #ifdef LDR_SENSOR
  505.   Setintens();                     // set intensiteit naar LDR.
  506. #endif
  507. /*
  508.   char2Arr('.', 41, 0);            //LOGO
  509.   char2Arr('C', 37, 0);
  510.   char2Arr('L', 31, 0);
  511.   char2Arr('O', 25, 0);
  512.   char2Arr('C', 19, 0);
  513.   char2Arr('K', 13, 0);
  514.   char2Arr('.', 6, 0);
  515.   refresh_display();
  516. */
  517.   //char2Arr('.', 28, 0);            //LOGO
  518.   char2Arr('H', 29, 0);
  519.   char2Arr('e', 22, 0);
  520.   char2Arr('l', 16, 0);
  521.   char2Arr('l', 10, 0);
  522.   char2Arr('o', 4, 0);
  523.   //char2Arr('.', 4, 0);
  524.   refresh_display();
  525.   delay(2500);
  526.   
  527.   clear_Display();
  528.   char2Arr('W', 29, 0);            //WIFI
  529.   char2Arr('i', 21, 0);
  530.   char2Arr('F', 14, 0);
  531.   char2Arr('i', 7, 0);
  532.   char2Arr('.', 2, 0);
  533.   //char2Arr('.', 13, 0);
  534.   //char2Arr('.', 6, 0);
  535.   refresh_display();
  536.   delay(2500);
  537.   WiFisetup();
  538.   timeClient.begin();              // Start the NTP UDP client
  539.   Otasetup();
  540. }

  541. void loop()
  542. {
  543.   unsigned int second1 = 0, second2 = 0, min1 = 0, min2 = 0, hour1 = 0, hour2 = 0;
  544.   unsigned int second11 = 0, second12 = 0, second21 = 0, second22 = 0;
  545.   unsigned int min11 = 0, min12 = 0, min21 = 0, min22 = 0;
  546.   unsigned int hour11 = 0, hour12 = 0, hour21 = 0, hour22 = 0;
  547.   signed int x = 0; //x1,x2;
  548.   signed int y = 0, y1 = 0, y2 = 0;
  549.   bool updown = false;
  550.   unsigned int sc1 = 0, sc2 = 0, sc3 = 0, sc4 = 0, sc5 = 0, sc6 = 0;
  551.   bool f_scrollend_y = false;
  552.   unsigned int f_scroll_x = false;

  553.   unsigned short year, day, month, hour, minute, second, week;

  554.   z_PosX = maxPosX;
  555.   d_PosX = -8;
  556.   //  x=0; x1=0; x2=0;

  557.   refresh_display();
  558.   updown = true;
  559.   if (updown == false) {
  560.     y2 = -9;
  561.     y1 = 8;
  562.   }
  563.   if (updown == true) { //scroll  up to down
  564.     y2 = 8;
  565.     y1 = -8;
  566.   }

  567.   while (true) {
  568.     yield();
  569.     ArduinoOTA.handle();       //ArduinoOTA
  570.     /*
  571.         if (f_tckr1h == true)        // check each hour if wifi is connected
  572.         {
  573.            if (WiFi.status() != WL_CONNECTED)
  574.            {
  575.              digitalWrite(wf_led,HIGH);   //led off
  576.            }
  577.            else
  578.            {
  579.              digitalWrite(wf_led,LOW);    //led on
  580.            }
  581.                 f_tckr1h == false;
  582.         }
  583.     */

  584.     if (f_tckr1s == true)            // flag 1second
  585.     {
  586.       if (WiFi.status() != WL_CONNECTED)
  587.       {
  588.         digitalWrite(wf_led, HIGH);         //led off
  589.         Serial.println("WiFi Disconnect!");
  590.       }
  591.       else
  592.       {
  593.         digitalWrite(wf_led, LOW);         //led on
  594.       }

  595.       int WiFi_status;
  596.       WiFi_status = digitalRead(wf_led);
  597.       if (WiFi_status) {
  598.         Serial.print("WiFi status: ");
  599.         Serial.println(WiFi_status);
  600.       }

  601. #ifdef LDR_SENSOR
  602.       Setintens();                     // set intensiteit naar LDR.
  603. #endif
  604.       if (timeClient.update()) { // update the NTP client and get the UNIX UTC timestamp
  605.         year = timeClient.getYear();
  606.         month = timeClient.getMonth();
  607.         day = timeClient.getDate();
  608.         week = timeClient.getDay();
  609.         hour = timeClient.getHours();
  610.         minute = timeClient.getMinutes();
  611.         second = timeClient.getSeconds();

  612.         MEZ.WT = week;
  613.         MEZ.second1 = second % 10;
  614.         MEZ.second2 = second / 10;
  615.         MEZ.second12 = second;
  616.         MEZ.min1 = minute % 10;
  617.         MEZ.min2 = minute / 10;
  618.         MEZ.min12 = minute;
  619.         MEZ.hour1 = hour % 10;
  620.         MEZ.hour2 = hour / 10;
  621.         MEZ.hour12 = hour;
  622.         MEZ.day12 = day;
  623.         MEZ.day1 = day % 10;
  624.         MEZ.day2 = day / 10;
  625.         MEZ.mon12 = month;
  626.         MEZ.mon1 = month % 10;
  627.         MEZ.mon2 = month / 10;
  628.         MEZ.year12 = year;
  629.         MEZ.year1 = year % 10;          //Single
  630.         MEZ.year2 = year / 10 % 10;     //Ten
  631.       }

  632. #ifdef DATATIME_PRINT
  633.       Serial.print(MEZ.year12);
  634.       Serial.print("-");
  635.       Serial.print(MEZ.mon12);
  636.       Serial.print("-");
  637.       Serial.print(MEZ.day12);
  638.       Serial.print(" ");
  639.       Serial.print(MEZ.hour12);
  640.       Serial.print(":");
  641.       Serial.print(MEZ.min12);
  642.       Serial.print(":");
  643.       //Serial.print(MEZ.second12);
  644.       //Serial.print(",");
  645.       Serial.println(MEZ.WT);
  646. #endif

  647.       second1 = MEZ.second1;
  648.       second2 = MEZ.second2;
  649.       min1 = MEZ.min1;
  650.       min2 = MEZ.min2;
  651.       hour1 = MEZ.hour1;
  652.       hour2 = MEZ.hour2;
  653.       y = y2;                                 //scroll updown
  654.       sc1 = 1;
  655.       second1++;
  656.       if (second1 == 10) {
  657.         sc2 = 1;
  658.         second2++;
  659.         second1 = 0;
  660.       }
  661.       if (second2 == 6) {
  662.         min1++;
  663.         second2 = 0;
  664.         sc3 = 1;
  665.       }
  666.       if (min1 == 10) {
  667.         min2++;
  668.         min1 = 0;
  669.         sc4 = 1;
  670.       }
  671.       if (min2 == 6) {
  672.         hour1++;
  673.         min2 = 0;
  674.         sc5 = 1;
  675.       }
  676.       if (hour1 == 10) {
  677.         hour2++;
  678.         hour1 = 0;
  679.         sc6 = 1;
  680.       }
  681.       if ((hour2 == 2) && (hour1 == 4)) {
  682.         hour1 = 0;
  683.         hour2 = 0;
  684.         sc6 = 1;
  685.       }

  686.       second11 = second12;
  687.       second12 = second1;
  688.       second21 = second22;
  689.       second22 = second2;
  690.       min11 = min12;
  691.       min12 = min1;
  692.       min21 = min22;
  693.       min22 = min2;
  694.       hour11 = hour12;
  695.       hour12 = hour1;
  696.       hour21 = hour22;
  697.       hour22 = hour2;
  698.       f_tckr1s = false;
  699.       if (MEZ.second12 == 20 || MEZ.second12 == 40 || MEZ.second12 == 00) //设置循环显示时间点
  700.   //    if (MEZ.second12 == 40) //设置循环显示时间点,40s时
  701.         f_scroll_x = true;
  702.     } // end 1s

  703.     if (f_tckr50ms == true) {
  704.       f_tckr50ms = false;
  705.       if (f_scroll_x == true) {
  706.         z_PosX++;
  707.         d_PosX++;
  708.         if (d_PosX == 86) //         char2Arr(WT_arr[MEZ.WT][2], d_PosX - 80, 0);
  709.           z_PosX = 0;
  710.         if (z_PosX == maxPosX) {
  711.           f_scroll_x = false;
  712.           d_PosX = -8;
  713.         }
  714.       }
  715.       /*if (sc1 == 1) {
  716.         if (updown == 1)
  717.           y--;
  718.         else
  719.           y++;
  720.         char2Arr(48 + second12, z_PosX - 42, y);
  721.         char2Arr(48 + second11, z_PosX - 42, y + y1);
  722.         if (y == 0) {
  723.           sc1 = 0;
  724.           f_scrollend_y = true;
  725.         }
  726.       }
  727.       else
  728.         char2Arr(48 + second1, z_PosX - 42, 0);

  729.       if (sc2 == 1) {
  730.         char2Arr(48 + second22, z_PosX - 36, y);
  731.         char2Arr(48 + second21, z_PosX - 36, y + y1);
  732.         if (y == 0)
  733.           sc2 = 0;
  734.       }
  735.       else
  736.         char2Arr(48 + second2, z_PosX - 36, 0);

  737.       char2Arr(' ', z_PosX - 32, 0);*/

  738.       if (sc3 == 1) {
  739.         char2Arr(48 + min12, z_PosX - 25, y);
  740.         char2Arr(48 + min11, z_PosX - 25, y + y1);
  741.         if (y == 0)
  742.           sc3 = 0;
  743.       }
  744.       else
  745.         char2Arr(48 + min1, z_PosX - 25, 0);

  746.       if (sc4 == 1) {
  747.         char2Arr(48 + min22, z_PosX - 19, y);
  748.         char2Arr(48 + min21, z_PosX - 19, y + y1);
  749.         if (y == 0)
  750.           sc4 = 0;
  751.       }
  752.       else
  753.         char2Arr(48 + min2, z_PosX - 19, 0);

  754.       char2Arr(':', z_PosX - 15 + x, 0);

  755.       if (sc5 == 1) {
  756.         char2Arr(48 + hour12, z_PosX - 8, y);
  757.         char2Arr(48 + hour11, z_PosX - 8, y + y1);
  758.         if (y == 0)
  759.           sc5 = 0;
  760.       }
  761.       else
  762.         char2Arr(48 + hour1, z_PosX - 8, 0);

  763.       if (sc6 == 1) {
  764.         char2Arr(48 + hour22, z_PosX - 2, y);
  765.         char2Arr(48 + hour21, z_PosX - 2, y + y1);
  766.         if (y == 0)
  767.           sc6 = 0;
  768.       }
  769.       else
  770.         char2Arr(48 + hour2, z_PosX - 2, 0);

  771. #ifdef CHINESE_CALENDAR
  772.       char2Arr('2', d_PosX - 5, 0);                     //year
  773.       char2Arr('0', d_PosX - 11, 0);
  774.       char2Arr(48 + MEZ.year2, d_PosX - 17, 0);
  775.       char2Arr(48 + MEZ.year1, d_PosX - 23, 0);
  776.       char2Arr(M_arr[MEZ.mon12 - 1][0], d_PosX - 30, 0);
  777.       char2Arr(M_arr[MEZ.mon12 - 1][1], d_PosX - 35, 0);
  778.       char2Arr(M_arr[MEZ.mon12 - 1][2], d_PosX - 41, 0);
  779.       char2Arr(M_arr[MEZ.mon12 - 1][3], d_PosX - 48, 0);
  780.       char2Arr(48 + MEZ.day2, d_PosX - 53, 0);           //day
  781.       char2Arr(48 + MEZ.day1, d_PosX - 59, 0);
  782.       char2Arr(WT_arr[MEZ.WT][0], d_PosX - 68, 0);        //day of the week
  783.       char2Arr(WT_arr[MEZ.WT][1], d_PosX - 74, 0);
  784.       char2Arr(WT_arr[MEZ.WT][2], d_PosX - 80, 0);
  785. #else
  786.       char2Arr(WT_arr[MEZ.WT][0], d_PosX - 5, 0);        //day of the week
  787.       char2Arr(WT_arr[MEZ.WT][1], d_PosX - 11, 0);
  788.       char2Arr(WT_arr[MEZ.WT][2], d_PosX - 17, 0);
  789.       char2Arr(WT_arr[MEZ.WT][3], d_PosX - 23, 0);
  790.       char2Arr(48 + MEZ.day2, d_PosX - 27, 0);           //day
  791.       char2Arr(48 + MEZ.day1, d_PosX - 33, 0);
  792.       char2Arr(M_arr[MEZ.mon12 - 1][0], d_PosX - 39, 0); //month
  793.       char2Arr(M_arr[MEZ.mon12 - 1][1], d_PosX - 43, 0);
  794.       char2Arr(M_arr[MEZ.mon12 - 1][2], d_PosX - 49, 0);
  795.       char2Arr(M_arr[MEZ.mon12 - 1][3], d_PosX - 55, 0);
  796.       char2Arr(M_arr[MEZ.mon12 - 1][4], d_PosX - 61, 0);
  797.       char2Arr('2', d_PosX - 68, 0);                     //year
  798.       char2Arr('0', d_PosX - 74, 0);
  799.       char2Arr(48 + MEZ.year2, d_PosX - 80, 0);
  800.       char2Arr(48 + MEZ.year1, d_PosX - 86, 0);
  801. #endif
  802.       refresh_display(); //alle 50ms
  803.       if (f_scrollend_y == true) {
  804.         f_scrollend_y = false;
  805.       }
  806.     } //end 50ms
  807.     if (y == 0) {
  808.       // do something else
  809.     }
  810.   }  //end while(true)
  811.   //this section can not be reached
  812. }
复制代码


代码修改说明
  1. #define wf_led  0      // 0,D3
复制代码
因为外接WiFi指示灯连接的D3是gpio0,所以,如果外接WiFi指示灯,这里要改为0,如果用esp8266本身的指示灯做WiFi指示灯,就改为2.因为板载小蓝灯是用gpio2控制的。
  1. if (MEZ.second12 == 40) //设置循环显示时间点,40s时
复制代码
修改循环显示的时间点,40代表每分钟的40秒可以循环显示,年,月,日,星期。
  1. /*if (sc1 == 1) {
  2.         if (updown == 1)
  3.           y--;
  4.         else
  5.           y++;
  6.         char2Arr(48 + second12, z_PosX - 42, y);
  7.         char2Arr(48 + second11, z_PosX - 42, y + y1);
  8.         if (y == 0) {
  9.           sc1 = 0;
  10.           f_scrollend_y = true;
  11.         }
  12.       }
  13.       else
  14.         char2Arr(48 + second1, z_PosX - 42, 0);

  15.       if (sc2 == 1) {
  16.         char2Arr(48 + second22, z_PosX - 36, y);
  17.         char2Arr(48 + second21, z_PosX - 36, y + y1);
  18.         if (y == 0)
  19.           sc2 = 0;
  20.       }
  21.       else
  22.         char2Arr(48 + second2, z_PosX - 36, 0);

  23.       char2Arr(' ', z_PosX - 32, 0);*/
复制代码
这一段代码是显示秒的,因为我的模块是4块8*8的,没办法显示秒,所以,注释掉,这样,循环显示的时候也不显示秒,也没有那讨厌的两个点了。
  1.   //char2Arr('.', 28, 0);            //LOGO
  2.   char2Arr('H', 29, 0);
  3.   char2Arr('e', 22, 0);
  4.   char2Arr('l', 16, 0);
  5.   char2Arr('l', 10, 0);
  6.   char2Arr('o', 4, 0);
  7.   //char2Arr('.', 4, 0);
  8.   refresh_display();
  9.   delay(2500);
  10.   
  11.   clear_Display();
  12.   char2Arr('W', 29, 0);            //WIFI
  13.   char2Arr('i', 21, 0);
  14.   char2Arr('F', 14, 0);
  15.   char2Arr('i', 7, 0);
  16.   char2Arr('.', 2, 0);
  17.   //char2Arr('.', 13, 0);
  18.   //char2Arr('.', 6, 0);
  19.   refresh_display();
  20.   delay(2500);
复制代码
这是hello和WiFi的显示,修改括号里的数值,可以改变文字的位置。右上角是(0,0)。
  1. { 'X', 'Q', '7'},
  2. { 'X', 'Q', '1'},
  3. { 'X', 'Q', '2'},
  4. { 'X', 'Q', '3'},
  5. { 'X', 'Q', '4'},
  6. { 'X', 'Q', '5'},
  7. { 'X', 'Q', '6'}
复制代码
这是星期的显示,这里可以改为字符表上的任何字都可以。只限于3个字符。

打赏

参与人数 1家元 +50 收起 理由
家睦 + 50

查看全部打赏

发表于 2020-2-21 17:11:21 | 显示全部楼层
个人觉得滚动显示没有任何意义,本来就是为了方便,结果抬头想看一下,居然没有自己需要获得的信息。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-21 17:25:30 | 显示全部楼层
fryefryefrye 发表于 2020-2-21 17:11
个人觉得滚动显示没有任何意义,本来就是为了方便,结果抬头想看一下,居然没有自己需要获得的信息。 ...

1分钟滚动一次,滚动时间是7-8秒,其实可以把其他的都注释掉,就不滚动了。
回复 支持 反对

使用道具 举报

发表于 2020-3-4 14:00:51 | 显示全部楼层
fryefryefrye 发表于 2020-2-21 17:11
个人觉得滚动显示没有任何意义,本来就是为了方便,结果抬头想看一下,居然没有自己需要获得的信息。 ...

同感,目的是为了抬头就能看到实时时间,有时候抬头看它还在那滚动
回复 支持 反对

使用道具 举报

发表于 2020-3-4 18:10:22 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报

发表于 2020-6-12 22:38:45 来自手机浏览器 | 显示全部楼层
敢问楼主

可以该做5*7的点阵

谢谢
回复 支持 反对

使用道具 举报

发表于 2021-2-3 15:40:43 | 显示全部楼层
lyy-cy 发表于 2020-3-4 18:10
这是我做的,也是4块8x8点阵,滚动,双击上面图片,有视频。

太厉害了,有帖子吗?学习一下
回复 支持 反对

使用道具 举报

发表于 2021-2-6 11:31:07 | 显示全部楼层
很厉害啊,我来学习学习。
回复 支持 反对

使用道具 举报

发表于 2021-3-26 11:00:53 | 显示全部楼层
error: 'class NTPClient' has no member named 'getMonth'
         month = timeClient.getMonth();
这个错误怎么解决
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-3-29 13:03 , Processed in 0.109200 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表