亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Arduino Nano Clock with 4x64 LED Matrix(新版)

组件和用品

Arduino Nano R3
× 1
LED 矩阵
× 1
光敏电阻
× 1
面包板(通用)
× 1
DS3231
× 1

应用和在线服务

Arduino IDE

关于这个项目


在几米的房间里读取时钟显示需要这样的LED矩阵显示器。

以优惠的价格购买了 4 单元显示器后,我在 Hackster 上寻找可用的项目:有几个,用于 Arduino Nano。如果您想同时查看小时、分钟和秒:只有少数项目可以工作,因为您需要的数字比广泛使用的每个数字 5x7 像素的数字要小。一种选择是使用 MD_Parola 库,但代码大小对于简单时钟来说太大了。另一个经过测试的选项是 Max72xxPanel 库,但它太旧并且调用了其他库。最后,该项目基于基本接口库MD_MAX722XX,包含在所有其他库中。

这个站点的评论让我回顾了硬件方面和代码。

- 有许多名为 DS3231 的库。我用这个:http://www.rinkydinkelectronics.com/library.php?id=73

Arduino/chipKit 库支持 DS3231 I2C 实时时钟版权所有 (C)2015 Rinky-Dink Electronics, Henning Karlsen。版权所有

- 第一:LED矩阵显示。市场上有多种型号,因此上传此代码后,显示器很可能会显示奇怪的东西。解决方案:从“MD_MAX72xx_lib.h”库上传此示例:“MD_MAX72xx_HW_Mapper.ino”并找到您的硬件型号。在我的代码中,模型是这样定义的:#define HARDWARE_TYPE MD_MAX72XX::ICSTATION_HW,但是在您设置正确的模型之前这可能不起作用!

- 漂亮的小秒针最近没有出现?现在(v2),这些秒的字体都包含在代码中,因此无需更改任何其他库。

- 由于 Arduino 更新,出现了很长的编译警告列表。现在,月份在二维字符数组中,不再使用指针。任何其他警告来自 DS3231.h 库,但可以忽略。

- 闪烁的点现在只有 2 个点!在“hh:mm”之后使用我的 3x5 字体显示准确的秒数。而且,列点“:”几乎每秒闪烁两次,只是为了表明它还活着!

- 响应请求:每分钟显示时间 53 秒,最后 7 秒显示日期和温度。

- 如果在 loop() 中取消注释两行,也可以显示星期几。在这种情况下,您可能更愿意将 53 秒的间隔减少到 51。

- 如果您更喜欢 12 小时格式,请参阅我较早的答案之一。

- 可以在 Arduino 串行监视器中设置 RTC 时间,方法是在输入区域中写入 DD/MM/YYYY hh:mm:ss(不要忘记它们之间的空格)并按 Enter/Send。只要连接了 USB 电缆并且串行监视器正常工作(正确的 COM 和波特率),就可以完成此操作。

新代码使用了 13558 字节(44%)和 372 字节(18%)的变量,所以它有点短!

日期显示为“dd Mon”,室温显示为 deg。摄氏度(使用 RTC 内部传感器估计)显示在单独的页面上。亮度由光敏电阻控制。然而,即使没有光传感器,代码也能工作。

感谢您的关注,通过“尊重”按钮显示!

代码

  • 旧版本 - Arduino Nano 点阵时钟
  • 新版本 (v2) - Arduino Nano 点阵时钟
旧版本 - Arduino Nano 点阵时钟Arduino
由于自初始版本以来许多库发生了变化,因此此代码已过时。使用新版本所有连接都在代码中描述。对于小字体,更改 MD_MAX72xx_font.cpp 中的几行,如代码中所述。
/* 警告:初始代码现已过时。使用新的(版本 2)* Arduino Nano DS3231 时钟和 LED 矩阵 4x(8x8) SPI * * Arduino Nano 5V 逻辑 - 32kB prog。空间 * 工具:板:Arduino Nano;处理器:ATmega328P(旧引导加载程序)!!* LED 矩阵 4x(8x8) SPI,右侧连接器(最后一个模块)* https://www.banggood.com/MAX7219-Dot-Matrix-Module-4-in- 1-Display-For-Arduino-p-1072083.html?rmmds=myorder&cur_warehouse=CN* * 连接:*>> LCD 4x64 -> Arduino Nano:(使用硬件SPI):* 5V -> 5V pin* GND -> GND pin* CLK_PIN -> 13 // 或 SCK* DATA_PIN -> 11 // 或 MOSI* CS_PIN -> 10 // 或 SS * *>> DS3231 RTC -> Arduino Nano:* SDA (DAT) -> A4* SCL ( CLK) -> A5 * 灵感来自:1) AnthoTRONICS 的 Arduino Clock 上次编辑:2019 年 3 月 22 日* 但没有 MD_parola,因为它占用空间大!新的 getdate 函数。* 2) pluc68000 有史以来最简单的 UNO 数字时钟:* https://create.arduino.cc/projecthub/plouc68000/simplest-uno-digital-clock-ever-4613aa?ref=user&ref_id=680368&offset=1* 3)Leonardo Sposina 的 LEDDotMatrixClock.ino,但这里没有“Max72xxPanel.h”* https://github.com/leonardosposina/arduino-led-dot-matrix-clock/blob/master/LEDDotMatrixClock/LEDDotMatrixClock.ino* 不使用Max72xxPanel.h,但仍使用小尺寸数字。此处占用空间小。* 替换库 MD_MAX72XX/src/MD_MAX72xx_font.cpp :* 1) #define USE_NEW_FONT 1* 2) 字体 #148 ... 158 必须替换为 3x5 字体:3, 248, 136, 248, / / 48 0 3, 144, 248, 128, // 49 1 3, 200, 168, 184, // 50 2 3, 136, 168, 248, // 51 3 3, 112, 72, 224, // 5 4 3, 184, 168, 232, // 53 5 3, 248, 168, 232, // 54 6 3, 8, 232, 24, // 55 7 3, 248, 168, 248, // 56 8 3 , 184, 168, 248, // 57 9 1, 80, // 58 :* * project:13790 bytes (44%);变量 361 字节 (17%)* 作者:MVP https://www.hackster.io/MVP*/#include #include "DS3231.h"#include "MD_MAX72xx_lib.h"//#include " Font_Data.h"DS3231 rtc(SDA, SCL); // 实时时钟常量字节 LDR_PIN =A2; // LDR 传感器引脚#define MAX_DEVICES 4// 定义引脚#define CLK_PIN 13 // 或SCK#define DATA_PIN 11 // 或MOSI#define CS_PIN 10 // 或SS#define HARDWARE_TYPE MD_MAX72XX::ICSTATION_HW#define USE_NEW_FONT 1#define BUF_SIZE 20 // 文本缓冲区大小#define CHAR_SPACING 1 // 字符之间的像素char buf[BUF_SIZE], secs[4];uint8_t dots;// SPI 硬件接口// Max72xxPanel matrix =Max72xxPanel(CS_PIN, H_DISPLAYS, V_DISPLAYS)XX matrix;MD_MAX72 =MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);const byte WAIT =100;const byte SPACER =1;byte FONT_WIDTH;bool timeset=false;void adjustClock(String data) { byte _day =data.substring(0,2).toInt (); byte _month =data.substring(3,5).toInt(); int _year =data.substring(6,10).toInt(); byte _hour =data.substring(11,13).toInt(); byte _min =data.substring(14,16).toInt(); byte _sec =data.substring(17,19).toInt(); rtc.setTime(_hour, _min, _sec); rtc.setDate(_day, _month, _year); Serial.println(F(">>日期时间设置成功!")); timeset=true;}byte ledintensitySelect(int light) { byte _value =0; if (light>=0 &&light <=127) { _value =12; } else if (light>=128 &&light <=319) { _value =3; } else if (light>=320 &&light <=512) { _value =0; } return _value;};void printText(uint8_t modStart, uint8_t modEnd, char *pMsg)// 将文本字符串打印到指定的 LED 矩阵模块。// 打印后消息区填充空白列。{ uint8_t state =0; uint8_t curLen; uint16_t showLen; uint8_t cBuf[FONT_WIDTH]; int16_t col =((modEnd + 1) * COL_SIZE) - 1; matrix.control(modStart, modEnd, MD_MAX72XX::UPDATE, MD_MAX72XX::OFF); do // 有限状态机打印可用空间中的字符 { switch(state) { case 0:// 从字体表中加载下一个字符 // 如果到达消息末尾,则重置消息指针 if (*pMsg =='\0') { showLen =col - (modEnd * COL_SIZE); // 填充字符 state =2;休息; } // 从字体文件中检索下一个字符 showLen =matrix.getChar(*pMsg++, sizeof(cBuf)/sizeof(cBuf[0]), cBuf); CurLen =0;状态++; // !!故意掉到下一个状态开始显示 case 1:// 显示字符矩阵的下一部分.setColumn(col--, cBuf[curLen++]); // 完成字体字符,现在显示字符之间的空格 if (curLen ==showLen) { showLen =CHAR_SPACING;状态 =2; } 休息; case 2:// 初始化状态以显示空列 curLen =0;状态++; // 遇到情况 3: // 显示字符间距或消息填充结束(空白列) matrix.setColumn(col--, 0); curLen++;如果(curLen ==showLen)状态=0;休息;默认值:col =-1; // 这肯定会结束 do 循环 } } while (col>=(modStart * COL_SIZE)); matrix.control(modStart, modEnd, MD_MAX72XX::UPDATE, MD_MAX72XX::ON);}void setup() { pinMode(LDR_PIN, INPUT_PULLUP); Serial.begin(9600); Serial.println(F(">> Arduino 32x8 LED 点阵时钟!")); Serial.println(F(">>使用
格式设置时钟的日期和小时!")); rtc.begin();矩阵开始();矩阵清除(); FONT_WIDTH=5 + 间距; // 字体宽度为 5 像素 matrix.control(MD_MAX72XX::INTENSITY, 2);; // 使用 0 到 15 之间的值作为亮度}void getDate()// 日期设置:读取时钟日期的代码{ char*months[]={"Jan","Feb","Mar","Apr", “五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};字符串 dts =rtc.getDateStr(); // 获取 dd/mm/yyyy 字符串 String dds=dts.substring(0,2); // 提取日期 String mms=dts.substring(3,5); // 提取月份 int mm=mms.toInt(); // 转换为月份数 dds.concat(" "); dds.concat(字符串(月[mm-1])); // 将日期字符串重建为 "dd Mmm" dds.toCharArray(buf,sizeof(buf)); // 返回缓冲区}void getHour()// 日期设置:读取时钟日期的代码{ String dts =rtc.getTimeStr(); // 获取 hh:mm:ss 字符串 String hhs=dts.substring(0,2); // 提取小时 int hh=hhs.toInt(); // 转换为数字 if (hh <10) dots=7; if(hh> 19 &&hh <24) 点数=13; if ((hh> 9 &&hh <20) || (hh ==21)) dots=11;如果 (hh ==1) 点 =5;如果(hh ==11)点=10; //String outmsg=dts.substring(0,5); // 提取 hh:mm (可选) String outmsg=String(hh); // 提取 h 如果 h<10 outmsg.concat(":"); // 添加:outmsg.concat(dts.substring(3,5)); // 添加 mm outmsg.toCharArray(buf,BUF_SIZE);}void showsec(){ String dts =rtc.getTimeStr(); // 获取 hh:mm:ss 字符串 String scs1=dts.substring(6,7); String scs2=dts.substring(7); char sc1=148+scs1.toInt(); // 转换为char的索引 char sc2=148+scs2.toInt(); // 转换为字符的索引 matrix.setChar(6,sc1); matrix.setChar(2,sc2);}void loop() { byte ledIntensity =ledintensitySelect(analogRead(LDR_PIN));矩阵控制(MD_MAX72XX::INTENSITY,ledIntensity);; // 使用 0 到 15 之间的值作为亮度 // 从 buf getHour() 显示 hh:mm;打印文本(0,MAX_DEVICES-1,buf);延迟(等待); // 闪烁两个点: for (uint8_t i=0; i<8; i++){ matrix.setColumn(MAX_DEVICES*8-dots,36); showsec();延迟(250); matrix.setColumn(MAX_DEVICES*8-dots,0); showsec();延迟(250); } // 向上滚动退出: for (uint8_t i=0; i<8; i++){ matrix.transform(MD_MAX72XX::TSU);延迟(2*等待);延迟(等待);获取日期();打印文本(0,MAX_DEVICES-1,buf);延迟(20*等待); int temp =rtc.getTemp();温度=温度-1; // 偏移量 -1 C String outmsg=String(temp); outmsg.concat("C"); outmsg.toCharArray(buf,BUF_SIZE);打印文本(0,MAX_DEVICES-1,buf);延迟(20*等待); // RTC 中的时间设置: if (Serial.available()> 0 &×et==false) { adjustClock(Serial.readString()); }}
新版本 (v2) - Arduino Nano 点阵时钟Arduino
根据新库更新。
/* Arduino Nano DS3231 时钟,带 LED 矩阵 4x(8x8) SPI * 版本 2 - 更新 15/05/2-21 * Arduino Nano 5V 逻辑 - 32kB prog。空间 * 工具:板:Arduino Nano;处理器:ATmega328P(旧引导加载程序)!!* LED 矩阵 4x(8x8) SPI,右侧连接器(最后一个模块)* https://www.banggood.com/MAX7219-Dot-Matrix-Module-4-in- 1-Display-For-Arduino-p-1072083.html?rmmds=myorder&cur_warehouse=CN* * 连接:*>> LCD 4x64 -> Arduino Nano:(使用硬件SPI):* 5V -> 5V pin* GND -> GND pin* CLK_PIN -> 13 // 或 SCK* DATA_PIN -> 11 // 或 MOSI* CS_PIN -> 10 // 或 SS * *>> DS3231 RTC -> Arduino Nano:* SDA (DAT) -> A4* SCL ( CLK) -> A5 * 灵感来自:1) AnthoTRONICS 的 Arduino Clock 上次编辑:2019 年 3 月 22 日* 但没有 MD_parola,因为它占用空间大!新的 getdate 函数。* 2) pluc68000 有史以来最简单的 UNO 数字时钟:* https://create.arduino.cc/projecthub/plouc68000/simplest-uno-digital-clock-ever-4613aa?ref=user&ref_id=680368&offset=1* 3)Leonardo Sposina 的 LEDDotMatrixClock.ino,但这里没有“Max72xxPanel.h”* https://github.com/leonardosposina/arduino-led-dot-matrix-clock/blob/master/LEDDotMatrixClock/LEDDotMatrixClock.ino* 不使用Max72xxPanel.h,但仍使用小尺寸数字。此处占用空间小。* * 项目:113558 字节(44%);变量 372 字节 (17%)* 作者:MVP https://www.hackster.io/MVP*/#include #include "DS3231.h"#include "MD_MAX72xx_lib.h"//#include " Font_Data.h"DS3231 rtc(SDA, SCL); // 实时时钟常量字节 LDR_PIN =A2; // LDR 传感器引脚#define MAX_DEVICES 4// 定义引脚#define CLK_PIN 13 // 或 SCK#define DATA_PIN 11 // 或 MOSI#define CS_PIN 10 // 或 SS// 在您的 LED 矩阵硬件模型下方定义://# define HARDWARE_TYPE MD_MAX72XX::ICSTATION_HW#define HARDWARE_TYPE MD_MAX72XX::FC16_HW#define USE_NEW_FONT 1#define BUF_SIZE 20 // 文本缓冲区大小#define CHAR_SPACING 1 // 字符之间的像素char buf[BUF_SIZE], secs, secs[4] ss, dots;// 小字体的定义:uint8_t Font3x5 [ 10 ][ 3 ]={ { 248, 136, 248}, // 48 0 {144, 248, 128}, // 49 1 {200, 168 , 184}, // 50 2 {136, 168, 248}, // 51 3 {112, 72, 224}, // 52 4 {184, 168, 232}, // 53 5 {248, 168, 232 }, // 54 6 {8, 232, 24}, // 55 7 {248, 168, 248}, // 56 8 {184, 168, 248}}; // 57 9char Month[12][4]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep"," Oct","Nov","Dec"};char* wday;// SPI硬件接口// Max72xxPanel matrix =Max72xxPanel(CS_PIN, H_DISPLAYS, V_DISPLAYS);MD_MAX72XX matrix =MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);const byte =100;const byte SPACER =1;byte FONT_WIDTH;bool timeset=false;void adjustClock(String data) { byte _day =data.substring(0,2).toInt(); byte _month =data.substring(3,5).toInt(); int _year =data.substring(6,10).toInt(); byte _hour =data.substring(11,13).toInt(); byte _min =data.substring(14,16).toInt(); byte _sec =data.substring(17,19).toInt(); rtc.setTime(_hour, _min, _sec); rtc.setDate(_day, _month, _year); Serial.println(F(">>日期时间设置成功!")); timeset=true;}byte ledintensitySelect(int light) { byte _value =0; if (light>=0 &&light <=127) { _value =12; } else if (light>=128 &&light <=319) { _value =3; } else if (light>=320 &&light <=512) { _value =0; } return _value;};void printText(uint8_t modStart, uint8_t modEnd, char *pMsg)// 将文本字符串打印到指定的 LED 矩阵模块。// 打印后消息区填充空白列。{ uint8_t state =0; uint8_t curLen; uint16_t showLen; uint8_t cBuf[FONT_WIDTH]; int16_t col =((modEnd + 1) * COL_SIZE) - 1; matrix.control(modStart, modEnd, MD_MAX72XX::UPDATE, MD_MAX72XX::OFF); do // 有限状态机打印可用空间中的字符 { switch(state) { case 0:// 从字体表中加载下一个字符 // 如果到达消息末尾,则重置消息指针 if (*pMsg =='\0') { showLen =col - (modEnd * COL_SIZE); // 填充字符 state =2;休息; } // 从字体文件中检索下一个字符 showLen =matrix.getChar(*pMsg++, sizeof(cBuf)/sizeof(cBuf[0]), cBuf); CurLen =0;状态++; // !!故意掉到下一个状态开始显示 case 1:// 显示字符矩阵的下一部分.setColumn(col--, cBuf[curLen++]); // 完成字体字符,现在显示字符之间的空格 if (curLen ==showLen) { showLen =CHAR_SPACING;状态 =2; } 休息; case 2:// 初始化状态以显示空列 curLen =0;状态++; // 遇到情况 3: // 显示字符间距或消息填充结束(空白列) matrix.setColumn(col--, 0); curLen++;如果(curLen ==showLen)状态=0;休息;默认值:col =-1; // 这肯定会结束 do 循环 } } while (col>=(modStart * COL_SIZE)); matrix.control(modStart, modEnd, MD_MAX72XX::UPDATE, MD_MAX72XX::ON);}void setup() { pinMode(LDR_PIN, INPUT_PULLUP); Serial.begin(9600); Serial.println(F(">> Arduino 32x8 LED 点阵时钟!")); Serial.println(F(">>使用
格式设置时钟的日期和小时!")); rtc.begin();矩阵开始();矩阵清除(); FONT_WIDTH=5 + 间距; // 字体宽度为 5 像素 matrix.control(MD_MAX72XX::INTENSITY, 2);; // 使用 0 到 15 之间的值作为亮度 rtc.setDOW(); // 新 RTC 需要}void getDate()// 日期设置:读取时钟日期的代码{ String dts =rtc.getDateStr(); // 获取 dd/mm/yyyy 字符串 String dds=dts.substring(0,2); // 提取日期 String mms=dts.substring(3,5); // 提取月份 int mm=mms.toInt(); // 转换为月份数 dds.concat(" "); dds.concat(字符串(月[mm-1])); // 将日期字符串重建为 "dd Mmm" dds.toCharArray(buf,sizeof(buf)); // 返回缓冲区 wday =rtc.getDOWStr(2);}void getHour()// 日期设置:读取时钟日期的代码{ String dts =rtc.getTimeStr(); // 获取 hh:mm:ss 字符串 String hhs=dts.substring(0,2); // 提取小时 String mms=dts.substring(3,5); // 提取分钟 hh=hhs.toInt(); // 转换为数字 mm=mms.toInt(); // 转换成数字 mm ss=(dts.substring(6,8)).toInt(); // 提取秒数 if (hh>=0 &&hh <10) dots=7;如果 (hh> 9 &&hh <20) 点数=11;如果 (hh> 19 &&hh <25) 点数=13;如果 (hh%10 ==1) 点数-=2; //String outmsg=dts.substring(0,5); // 提取 hh:mm (可选) String outmsg=String(hh); // 提取 h 如果 h<10 // outmsg.concat(":"); // 添加:但是在 2 列上!! outmsg.concat(char(124)); // 在数字之间添加 1 个完整的列 outmsg.concat(dts.substring(3,5)); // 添加 mm outmsg.toCharArray(buf,BUF_SIZE);}// 新版本函数,使用小嵌入字体void showsec(uint8_t secs){ uint8_t secs1=secs%10; uint8_t secs2=secs/10; for (uint8_t k=0; k<3; k++){ matrix.setColumn(MAX_DEVICES*8-26-k,Font3x5 [secs2][k]); matrix.setColumn(MAX_DEVICES*8-30-k,Font3x5 [secs1][k]); }}void loop() { byte ledIntensity =ledintensitySelect(analogRead(LDR_PIN));矩阵控制(MD_MAX72XX::INTENSITY,ledIntensity);; // 使用 0 到 15 之间的值作为亮度 getHour(); // 从 RTC 读取时间 printText(0,MAX_DEVICES-1,buf); // 从 buf matrix.setColumn(MAX_DEVICES*8-dots,0); 显示 hh|mm; // 清除 | unsigned long inst =millis(); // 标记这一刻 while (ss <53){ // 每分钟的前 53 秒显示时间 while (millis() - inst> 1000){ inst =millis(); ss++; // 增加秒数 showsec(ss); // 显示秒数 (uint8_t i =0; i <2; i++){ matrix.setColumn(MAX_DEVICES*8-dots,36); // 闪烁两个点:延迟(240); matrix.setColumn(MAX_DEVICES*8-dots,0);延迟(240); } } } // 然后“时间”向上滚动: for (uint8_t i=0; i<8; i++){ matrix.transform(MD_MAX72XX::TSU);延迟(3*等待); } // 写入当前日期:getDate();打印文本(0,MAX_DEVICES-1,buf);延迟(20*等待); // 写星期几(如果没有注释): //printText(0,MAX_DEVICES-1,wday); //延迟(20*等待); // 写入来自 RTC 传感器的估计室温 int temp =rtc.getTemp();温度=温度-1; // 偏移量 -1 C String outmsg=String(temp); outmsg.concat("C"); outmsg.toCharArray(buf,BUF_SIZE);打印文本(0,MAX_DEVICES-1,buf);延迟(20*等待); // 如果在 Arduino IDE 中激活串行监视器,则 RTC 中的时间设置: if (Serial.available()> 0 &×et==false) { adjustClock(Serial.readString()); }}

示意图

受 Leonardo Sposina 启发,但 #define CS_PIN(Matrix)<--> 10(Nano)
所有 Matrix 项目的原理图几乎相同。这里的光敏电阻是原装的。如代码中所述:#define CS_PIN(Matrix)<--> 10(Nano) https://github.com/leonardosposina/arduino-led-dot-matrix-clock

制造工艺

  1. 带有伊斯兰祈祷时间的 Arduino 时钟
  2. Arduino 温度。使用 3.2 显示的监视器和实时时钟
  3. Arduino 带蓝牙控制 LED!
  4. 玩 Nextion Display
  5. LED Matrix + Motion Sensor Door Display [Arduino Holiday]
  6. Arduino Nano:使用操纵杆控制 2 个步进电机
  7. 单 LED 矩阵 Arduino 翻转时钟
  8. 使用 Arduino Uno 控制 LED 矩阵
  9. 带有 Arduino Nano 的手持盖革计数器
  10. 带智能显示屏的智能电池充电器多路复用器
  11. 带有实时时钟的 Arduino OLED 温度显示
  12. Arduboy Clone 与 Arduino Nano 和 I2C OLED 显示器