2024-2-7 16:45:56 [显示全部楼层]
6074浏览
查看: 6074|回复: 2

[ESP8266/ESP32] ESP32 + LED 点阵 DIY 透明面板的数字时钟

[复制链接]


ESP32 + LED 点阵 DIY 透明面板的数字时钟图1

这是一款类似 HUD(抬头显示器,又称平视显示器)的时钟,通过 WiFi 获取当前时间。它基于 ESP32 控制器,使用四个常见的 8×8 点阵显示单元,由 MAX7219 芯片驱动。






组件清单
  • 8×8 点阵显示单元(MAX7219)× 4
  • ESP32 微控制器 × 1
  • 1mm 厚,165 x 75mm 亚克力板 × 1


3D 打印外壳

ESP32 + LED 点阵 DIY 透明面板的数字时钟图2

外壳打印没有支撑,采用丙烯酸板。具体数值为:W=165mm,H=75mm。

ESP32 + LED 点阵 DIY 透明面板的数字时钟图3

最后可使用哑光黑色油漆涂抹外壳。我使用了极低反射率的油漆(MUSOU BLACK),涂满装置和机身的上。

3D 打印文件可以在文末打包下载。


安装 ESP32 微控制器
ESP32 + LED 点阵 DIY 透明面板的数字时钟图4

将 ESP32 微控制器连接到点阵显示单元。将 MAX72XX 库安装到 Arduino IDE 中。

以我的项目为例,连接了 DIN-16、CS-17、CLK-21。源代码中的连接是可变的。可见下文第115-117行。
  1. #define CLK_PIN   21  // or SCK
  2. #define DATA_PIN  16  // or MOSI
  3. #define CS_PIN    17  // or SS
复制代码


在源代码中配置 WiFi。你也可以使用 SmartConfig 智能手机应用程序来执行此操作。

  1. #define WIFI_SSID "SSID" // your WiFi's SSID
  2. #define WIFI_PASS "PASS" // your WiFi's password
复制代码


将微控制器安装到外壳的外部。当然,你也可以使用任何其他的微控制器。

时钟文件代码可以在文末打包下载。
  1. #include <MD_MAX72xx.h>
  2. #include <SPI.h>
  3. #include <WiFi.h>
  4. //////////////////////////////
  5. // MAX7219 hardware configuration
  6. //////////////////////////////
  7. #define BRIGHTNESS MAX_INTENSITY/2
  8. #define HARDWARE_TYPE MD_MAX72XX::FC16_HW
  9. #define MAX_DEVICES 4
  10. #define CLK_PIN   21  // or SCK
  11. #define DATA_PIN  16  // or MOSI
  12. #define CS_PIN    17  // or SS
  13. MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES); // Arbitrary pins
  14. //////////////////////////////
  15. // WiFi and NTP section
  16. //////////////////////////////
  17. // switch between 24H (12 rotors) / 12H (10 rotors)
  18. #define HOUR12 false
  19. // NTP settings
  20. #define TIMEZONE 9 // timezone (GMT = 0, Japan = 9)
  21. #define NTP_SERVER "pool.ntp.org"
  22. #define WIFI_SMARTCONFIG false
  23. #if !WIFI_SMARTCONFIG
  24. // if you do not use smartConfifg, please specify SSID and password here
  25. #define WIFI_SSID "SSID_HERE" // your WiFi's SSID
  26. #define WIFI_PASS "PASS_HERE" // your WiFi's password
  27. #endif
  28. void getNTP(void) {
  29.   for(int i = 0; WiFi.status() != WL_CONNECTED; i++) {
  30.     if(i > 30) {
  31.       ESP.restart();
  32.     }
  33.     Serial.println("Waiting for WiFi connection..");
  34.     delay(1000);
  35.   }
  36.   configTime(TIMEZONE * 3600L, 0, NTP_SERVER);
  37.   printLocalTime();
  38. }
  39. void printLocalTime() {
  40.   struct tm timeinfo;
  41.   if (!getLocalTime(&timeinfo)) {
  42.     Serial.println("Failed to obtain time");
  43.     return;
  44.   }
  45.   Serial.println(&timeinfo, "%A, %Y-%m-%d %H:%M:%S");
  46. }
  47. void wifiSetup() {
  48.   int wifiMotion = 400; // while wainting for wifi, large motion
  49.   int smatconfigMotion = 100; // while wainting for smartConfig, small motion
  50.   WiFi.mode(WIFI_STA);
  51. #if WIFI_SMARTCONFIG
  52.   WiFi.begin();
  53. #else
  54.   WiFi.begin(WIFI_SSID, WIFI_PASS);
  55. #endif
  56.   showText("WiFi..");
  57.   for (int i = 0; ; i++) {
  58.     Serial.println("Connecting to WiFi...");
  59.     delay(1000);
  60.     if (WiFi.status() == WL_CONNECTED) {
  61.       break;
  62.     }
  63. #if WIFI_SMARTCONFIG
  64.   if(i > 6)
  65.     break;
  66. #endif   
  67.   }
  68. #if WIFI_SMARTCONFIG
  69.   if (WiFi.status() != WL_CONNECTED) {
  70.     WiFi.mode(WIFI_AP_STA);
  71.     WiFi.beginSmartConfig();
  72.     //Wait for SmartConfig packet from mobile
  73.     Serial.println("Waiting for SmartConfig.");
  74.     while (!WiFi.smartConfigDone()) {
  75.       Serial.print(".");
  76.       showText("SmCfg");
  77.       delay(1000);
  78.       mx.clear();
  79.       delay(500);
  80.     }
  81.     Serial.println("");
  82.     Serial.println("SmartConfig received.");
  83.     //Wait for WiFi to connect to AP
  84.     Serial.println("Waiting for WiFi");
  85.     showText("WiFi");
  86.     while (WiFi.status() != WL_CONNECTED) {
  87.       delay(1000);
  88.       Serial.print(",");
  89.     }
  90.     mx.clear();
  91.     delay(500);
  92.   }
  93.   Serial.println("WiFi Connected.");
  94. #endif
  95.   Serial.print("SSID: ");
  96.   Serial.println(WiFi.SSID());
  97.   Serial.print("IP Address: ");
  98.   Serial.println(WiFi.localIP());
  99. }
  100. void setup()
  101. {
  102.   Serial.begin(115200);
  103.   Serial.println("start");
  104.   mx.begin();
  105.   mx.control(MD_MAX72XX::INTENSITY, BRIGHTNESS);
  106.   mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::ON);
  107.   mx.clear();
  108.   wifiSetup();
  109.   getNTP(); // get current time
  110. }
  111. void showText(char *message) {
  112.   char *p = message;
  113.   uint8_t charWidth;
  114.   uint8_t cBuf[8];  // this should be ok for all built-in fonts
  115.   int sum = -2;
  116.   mx.clear();
  117.   while (*p != '\0') {
  118.     charWidth = mx.getChar(*p++, sizeof(cBuf) / sizeof(cBuf[0]), cBuf);
  119.     mx.transform(MD_MAX72XX::TSL);
  120.     mx.transform(MD_MAX72XX::TSL); // double column space
  121.     for (uint8_t i=0; i<charWidth; i++) {
  122.       mx.transform(MD_MAX72XX::TSL);
  123.       if (i < charWidth)
  124.         mx.setColumn(0, cBuf[i]);
  125.     }
  126.     sum += charWidth + 2;
  127.   }
  128.   //centering
  129.   for(int i = 0; i < (MAX_DEVICES * ROW_SIZE - sum) / 2; i++) {
  130.     mx.transform(MD_MAX72XX::TSL);
  131.   }
  132.   mx.transform(MD_MAX72XX::TFUD); // flip upside down -- for heads up display
  133. }
  134. void loop()
  135. {
  136.   static int prevhour = -1;
  137.   static int prevMin = -1;
  138.   struct tm tmtime;
  139.   int digit[4];
  140.   char txt[6] = "  :  ";
  141.   getLocalTime(&tmtime);
  142.   if(prevMin == tmtime.tm_min)
  143.     return;
  144.   prevMin = tmtime.tm_min;
  145. #if HOUR12
  146.   tmtime.tm_hour %= 12;
  147.   if(tmtime.tm_hour == 0)
  148.     tmtime.tm_hour = 12;
  149. #endif
  150.   digit[0] = tmtime.tm_hour / 10;
  151.   digit[1] = tmtime.tm_hour % 10;
  152.   digit[2] = tmtime.tm_min / 10;
  153.   digit[3] = tmtime.tm_min % 10;
  154.   txt[0] = digit[0] + '0';
  155.   txt[1] = digit[1] + '0';
  156.   txt[3] = digit[2] + '0';
  157.   txt[4] = digit[3] + '0';
  158.   for(int i = BRIGHTNESS; i >= 0; i--) {
  159.     mx.control(MD_MAX72XX::INTENSITY, i);
  160.     delay(50);
  161.   }
  162.   showText(txt);
  163.   for(int i = 0; i <= BRIGHTNESS; i++) {
  164.     mx.control(MD_MAX72XX::INTENSITY, i);
  165.     delay(50);
  166.   }
  167.   if(tmtime.tm_hour != prevhour) { // get current time via NTP every 6 hours
  168.     if(tmtime.tm_hour % 6 == 0)
  169.       getNTP();
  170.     prevhour = tmtime.tm_hour;
  171.   }
  172. }
复制代码

完成
ESP32 + LED 点阵 DIY 透明面板的数字时钟图5

将显示单元安装到位并插入亚克力板,整个项目就完成了。

原文地址:https://www.instructables.com/HU ... rent-Dot-Matrix-Di/

项目作者:shiura

译文首发于:趣无尽

转载请注明来源信息



HUB-like Wi-Fi Matrix Display.zip

16.72 KB, 下载次数: 32

小鱼果果  见习技师

发表于 2024-2-10 10:44:06

大神666
太神了,欢迎来到自己做不了,别人都能做系列
回复

使用道具 举报

伦**  见习技师

发表于 2024-2-24 12:49:44

太厉害了!!!                                                      
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail