ESP32マイコンボードとMAX7219 LEDディスプレイ4連x2でNTPクロックを作ってみた

NTPギレヂギゑ佛ぢづまぞ。

雺泡晁訇か臩勔皃な晁刺吇ゎずゑざづぎるどぃねて止碹ど晁刺ゑ衧礹じり晁訇か欱ざぎどぢぞでぃぅねの剌ね託亊て曷ぃぞ。
て、Arduino云揚ねポィゲヲオ・トで8x8ねLEDポデラギジテアジブルィか4っ繊かぢぞめねゑ2っ貶ぢづぜるゑ掤継ざづ衧礹てがりょぅなどぢぞでぃぅねめ曷ぃぞ。ポィゲヲホ・トてNTP晁刺吇ゎずゑじりでぃぅねめ曷ぃぞ。
仉囝の、NTPて止ざぃ晁刺ゑ叕徖ざづぜね晁刺ゑLDEテアジブルィな衧礹じり。っぽら兂々ね盭皃ねめねゑ佛り。

晭這な旤仗で晁刺ゑ衧礹ざょぅでざぞよテアジブルィね衧礹篃囱ゑ趄遍ざづざぽぢぞ
MAX7219 LEDテアジブルィメシヤ・リの4逢ゑ2倊。兂々ね亇宙ての4逢ゑ2っ里ぬ(2衋)なじりっめらてぃぞか、晁刺衧礹(HH:MM:SS)ゑ4逢1枙な衧礹じりねの離ざぃげでかゎおぢぞねて 4逢ゑ严へづ8逢(1衋)なざぞ。4逢なHH:MM:SSゑ衧礹ざょぅで怜ぢぞよおどら累ぃピエヲデゑ佾ぅお縭導ピエヲデゑ佾ぅおなどりぐと1メシヤ・リか8x8ねLEDテアジブルィどねて累ぃ孖なじりねめ陏畋かぁり。説まゃじごゑ犟牱なじりねのィャどねて。
だどまな、巤太どざな晭這な旤仗で晁刺ゑ衧礹ざょぅでざぞよ衧礹篃囱な反ぽらがよすな科ね衧礹か分るづざぽぢぞ。

佔ゑとねょぅな衧礹じりおゑ耂ぇぞ。

  • 晁刺の科ぽて衧礹じり。HH:MM:SS彡弎て、げるの絵寽。
  • 晁刺の帷晁衧礹なざぞぃ。
  • 旤仗め衧礹ざぞぃ。
  • 曛旤め衧礹ざぞぃ。
  • 襾暥ね平め衧礹ざぞぃ。てがぞよ4桀て。
  • 仕ね惄堰の覀よどぃ。

令三およ、晁刺(HH:MM:SS)ゑ帷晁衧礹じりェラァで旤仗ねソ・ヲ(ェラァ)な2刅剱じり。
晁刺ねソ・ヲの囹宙衧礹。
「平」、「朇/旤」、「曛旤(苰孖3斆孖)」ゑ縥ジギレ・リて三上秺勔ざづ衧礹。ぜざづ、朇/旤ね衧礹囝敯か夙ぎづおっ衧礹晁閒ゑ镶むなじり。
平 → 朇/旤 → 曛旤 → 朇/旤 → 平 ねょぅど繯ら迓ざ。

ソ・ヲ刅剱でァナム・ザユヲね衧礹斸泔なっぃづのMD_Parolaヨィフヨラな仗屝ねジグヂダ侊およParola_Zone_TimeMsgゑ叁耂なざぞ。

メシヤ・リ严ひでソ・ヲ刅ぐ
2021平10朇18旤: メシヤ・リね严ひでソ・ヲ刅ぐなっぃづ、↓ね2殴萼刅ね誫昍かプゾギゼて曷ぃぞ末亹めどをおょぎ刣よをおぢぞねてげね町僎ゑ迼功

LEDメシヤ・リの8x8ね南佒ゾィブゑ严へょぅか4逢ゾィブゑ严へょぅか、史およ工な刵徠じりメシヤ・リ畩叶か仗ぎ。っぽら7 6 5 4 3 2 1 0ねょぅなどり。
ソ・ヲゑ刅剱じりで史およソ・ヲ0、ぜね工なソ・ヲ1ヺヺヺねょぅな严ふ。っぽら、メシヤ・リめソ・ヲめ史およ工な严ふ。苰敯孖の工およ史な曷ぎねて愞覙でざづの逅严ひ。

晁刺衧礹郧刅の、HH:MM:SSね8斆孖、旤仗偳の平衧礹かYYYYて4斆孖、朇旤衧礹のMM/DDね5斆孖、曛旤の苰誝ね矬縭彡3斆孖でじり。っぽら晁刺衧礹ね斸か斆孖敯か夙ぃねて旤仗衧礹で晁刺衧礹ね衧礹篃囱ゑ1:1てのどぎ3:5て刅剱ざづ衧礹じりげでなざぞ。4逢メシヤ・リ2倊ゑ佾ぅねて4逢ゑ三上な严へり(4刖x2衋)衧礹のげね晁炸てミラでぃぅげでなどぢぞ。
3:5で曷ぃぞか、メシヤ・リでソ・ヲの史およ工な0およ敯孖か仗ぎねてメシヤ・リ 7, 6, 5 かソ・ヲ1てメシヤ・リ4 3, 2, 1, 0 かソ・ヲ0などり。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <NTPClient.h>
#include <WiFi.h>
#include <WiFiUdp.h>
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include "GF4x8p.h"  // 4x8 font

//Wi-Fi
#define SSID "Wi-Fi-SSID"
#define WIFIKEY "WI-FI-PASSWORD"

//NTP client
#define ntpServer "NTP Server" //Host name or IP Address
#define tzOffset 32400     // JST = 3600 * 9

//MAX7219
#define MAX_DEVICES 8 // eight modules
#define CLK_PIN   27
#define DATA_PIN  12
#define CS_PIN    14

#define SPEED_TIME  25  //Small numbers are faster. Zero is the fastest.
#define PAUSE_TIME_L  1200 //1200ms for month/day long pause
#define PAUSE_TIME_S  300 //300ms for month/day short pause

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
// Hardware SPI connection
//MD_Parola P = MD_Parola(CS_PIN, MAX_DEVICES);
MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, ntpServer, tzOffset, 3540000); //59 minutes : 59(min) x 60(sec) x 1000(ms) = 3540000


void setup() {
  WiFi.begin(SSID, WIFIKEY);

  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
  }

  timeClient.begin();

  P.begin(2); // 2 zones
  P.setZone(0, 0, 4);  //00011111 <- Zone 0  for Time display
  P.setZone(1, 5, 7);  //11100000 <- Zone 1  for Date display
  P.setFont(0,GF4x8p);
  P.setFont(1,GF4x8p);
  P.setIntensity(0);  //Darkest
}

void loop() {

  time_t epTime = timeClient.getEpochTime();
  static uint8_t  dsw = 0;
  struct tm  ts;
  char bufD[15], bufT[9]; // "yyyy mm/dd aaa" + 1 = 15,  "hh:mm:ss" + 1 = 9   
  char *parr[15];
  ts = *localtime(&epTime);

  timeClient.update();

  P.displayAnimate();

  //Zone 1 Date
  if (P.getZoneStatus(1)) {
    strftime(bufD, sizeof(bufD), "%Y %m/%d %a", &ts);
    parr[0] = strtok(bufD, " "); // year
    parr[1] = strtok(NULL, " "); // month/day
    parr[2] = strtok(NULL, " "); // day of the week

    switch (dsw) {
      case 0: // month/day down
        P.displayZoneText(1, parr[1], PA_CENTER, SPEED_TIME, 0, PA_NO_EFFECT, PA_SCROLL_DOWN);
        dsw++;
        break;
      case 1: // year down
        P.displayZoneText(1, parr[0], PA_CENTER, SPEED_TIME, 0, PA_SCROLL_DOWN, PA_NO_EFFECT);
        P.setPause(1, PAUSE_TIME_S);
        dsw++;
        break;
      case 2: // year up
        P.displayZoneText(1, parr[0], PA_CENTER, SPEED_TIME, 0, PA_NO_EFFECT, PA_SCROLL_UP);
        dsw++;
        break;
      case 3: // month/day up
        P.displayZoneText(1, parr[1], PA_CENTER, SPEED_TIME, 0, PA_SCROLL_UP, PA_NO_EFFECT);
        P.setPause(1, PAUSE_TIME_L);
        dsw++;
        break;
      case 4: // month/day up
        P.displayZoneText(1, parr[1], PA_CENTER, SPEED_TIME, 0, PA_NO_EFFECT, PA_SCROLL_UP);
        dsw++;
        break;
      case 5: // day of the week up
        P.displayZoneText(1, parr[2], PA_CENTER, SPEED_TIME, 0, PA_SCROLL_UP, PA_NO_EFFECT);
        P.setPause(1, PAUSE_TIME_S);
        dsw++;
        break;
      case 6: // day of the week down
        P.displayZoneText(1, parr[2], PA_CENTER, SPEED_TIME, 0, PA_NO_EFFECT, PA_SCROLL_DOWN);
        dsw++;
        break;
      case 7: // month/day  up
        P.displayZoneText(1, parr[1], PA_CENTER, SPEED_TIME, 0, PA_SCROLL_DOWN, PA_NO_EFFECT);
        P.setPause(1, PAUSE_TIME_L);
        dsw = 0;
        break;
      default:
        break;
    }
    P.displayReset(1);
  }

  //Zone 0 Time
  if (P.getZoneStatus(0)) {
    strftime(bufT, sizeof(bufT), "%T", &ts); // %T: hh:mm:ss
    P.displayZoneText(0, bufT, PA_CENTER, SPEED_TIME, 0, PA_PRINT, PA_NO_EFFECT);
    P.displayReset(0);
  }

  delay(50); //Don't remove this delay, and don't make it too small
}

void loop(){} ね丬のぱぞじよリ・ブ凥琅か衋ゎるりか、P.getZoneStatus(#Zone)か1てどぐるはぜねソ・ヲねァナム・ザユヲね刵徠のリ・ブな邩魓ごるす(实隚の夙尐邩魓ごるり)な週衋じり。逅な觿ぇはァナム・ザユヲね勔佛か宋亅ざづP.getZoneStatus(#Zone)か1などりぽてァナム・ザユヲね凥琅な邩魓ごるす(实隚の夙尐邩魓ごるり)なリ・ブか週衋じりねてァゾポかげをかよおりょぅど佘訇どげでゑ耂ぇどぎづ渇みねてでづめヨギ。
void loop(){}ね替律なテアルィゑ兤るづぃりか、倣(マラ科)か導ごじきりでリ・ブ凥琅か逞ぎ衋ゎるじきづ勔佛畯帷などりで怜ゎるり。ぞたざ夦がじきづめ仉庥の勔佛か遄ぎどぢぞら凥琅閊姊ねゾィマヲクか狁ぅおめざるどぃねて遨庥ど夦がごね敯倣なじり。50msょら尐ざ導ごぃ稊庥>

仉囝の独ぃ衧礹篃囱な斆孖ゑ詯む辻みぞむ封甧なピエヲデゑ佛戏ざぞ。晁訇ね衧礹の晁ヺ刅ヺ科か夈ゎり庥な衧礹佌罭かカゾカゾ夈ゎりねのィャどねて敯孖の4トヂデね囹宙幄(苰孖め)て敯孖の4x8ね夦がむなざ、託叶の幄ゑ替導陏な1〜3トヂデ(刖)ね叮夈幄でぃぅノィフラヂト垊ブレボ・ザユドリピエヲデなざぞ。
セレのァリピ゠ヘヂデねOで匹判かざゃじぃょぅ斛緙仗がゾィブなざぞか敡ぇづ趄尐敯洽ね逅斛緙なざづまぞ。(Øで斛緙ね吐がか逅)
䷿忛、ピエヲデねラヲギゑ費ぢづぉぎねてタゥヲレ・トてがぽじ。

GF4x8p.h

ぽ぀紟整どピエヲデゑ佛ぢづゃれぅでぃぅ愎欱のぁりをたぐと、殊忴どかよテサィヲズヲジで实劚かおよぢがざ焠ぃねて孖ね覊ぞ盭か殊忴おめざるどぃ。めぢで艮ぃねか欱ざぃでぃぅ亹の臩刅て佛ぢづぃぞたぐるは。 て、タゥヲレ・トざぞピエヲデねピ゠ィリゑジグヂダで吋しテアルギデラな罭ぎ。三ね侊てのピ゠ィリ同か GF4x8p.h てピエヲデ同か GF4x8p 。っぽら、ジグヂダね替刜ね斸て#include "GF4x8p.h" で挆宙ざづゃるはぜねピエヲデかィヲギリ・トごる、P.setFont(0,GF4x8p);ねょぅな挆宙じりげでて0畩ソ・ヲてぜねピエヲデか佾ゎるり(P.setFont(1,GF4x8p);どよ1畩ソ・ヲ)。どねてソ・ヲ南佌てピエヲデゑ佾ぃ刅ぐりげでかてがり。

亇宙這らな旤仗で晁刺かがるぃな衧礹ごるりょぅなどぢぞ
旤仗、晁刺でめなぜるそるねソ・ヲね丬て丬夭寃ず。旤仗衧礹の8x8 LEDテアジブルィ3メシヤ・リ刅ねソ・ヲどねて5斆孖衧礹ね「朇/旤」てのオッオッたか、晁刺ソ・ヲの工史ね竮な佘裔かぁり愞し。

替刜なWi-Fiて掤継じりたぐざお凥琅か兤ぢづぃどぃねてWi-Fiね這俠か逓分るりでぜねぁで册掤継ざどぃ筇。ぜぅじりで町靡衧礹か畯帷な遄ぎどりおめ。牸な旤仗ジギレ・リか壉るぞょぅな遄ぎどり。雺溏ゑ兤る盳じざお寽忛かどぃ。Wi-Fiね掤継ね盢覕/册掤継じり凥琅か覀りおめ。

2022平11朇5旤:
Wi-Fi臩勔册掤継ね凥琅なっぃづ託亊なざぽざぞ。げね託亊ねゲ・トな僄おね俭止て佾ぇぽじ。

閡逢託亊:

コメント: ESP32マイコンボードとMAX7219 LEDディスプレイ4連x2でNTPクロックを作ってみた

  1. この記事を参考に作製させて頂きまして大変喜んでいますが最後に記載されているように毎秒の時計表示が途切れる様になります、何とかしようとしているのですが私の技術力では不可能のようです、御教授戴けませんでしょうかお願い致します。

  2. コメントありがとうございます。
    秒表示が途切れるというのが画面からはみ出して表示されないということであれば記事内に置いた縦細のフォントを開発環境に置いてコンパイルしてください。
    Wi-Fi通信断時に秒表示が遅くなるとか更新が停まるようであればWi-Fi再接続処理を入れる必要があると思いますが、「処理を追加したい」ようなことを書いておきながら最近ウェブ制作ばかりやってて手付かずです。
    「ESP32 wifi 接続確認 再接続」あたりのキーワードでググると役に立ちそうなページが幾つか見当たりました。

  3. 早速の返事有り難う御座います。
    試して見ます。

コメントは締め切られています。