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

单 LED 矩阵 Arduino 翻转时钟

组件和用品

Arduino Nano R3
× 1
Maxim Integrated DS3231M - ±5ppm,I2C 实时时钟
× 1
8x8 LED 矩阵与 MAX7219 驱动器
× 1
RGB 扩散共阴极
× 1
电阻 220 ohm
× 2
带按钮的旋转编码器
× 1

必要的工具和机器

烙铁(通用)

应用和在线服务

Arduino IDE

关于这个项目

我构建了这个由 Adrian Jones 开发的 8x8 LED 矩阵模块时钟。时间通过从左到右滚动显示,或者在软件控制下从上到下滚动。时间的每个数字从右侧依次滑入,居中时,会暂时停止并略微变亮。然后它向左滚动,同时显示中的下一个数字滚动到视图中。循环重复,在连续显示之间有一个短暂的延迟。对于“从上到下”垂直翻转,你应该改变:

静态布尔 top2bottom =false;

到:

静态布尔 top2bottom =true;

正如您在代码的注释中看到的那样,可以更改许多参数,例如滚动速度、字符之间的空行数、12/24 小时显示、字符之间的毫秒、亮度等。

使用旋转编码器可以轻松设置时间。双色二极管显示设置模式(分钟、小时或正常)。我将时钟放在一个由两个基本部件组成的盒子中,因此可以访问盒子内部非常方便实用。

代码

  • 代码
代码Arduino
//************************************************* ********************************************//// 矩阵时钟// Adrian Jones,2014 年 3 月//// - 允许从左到右和从上到下滚动///********************* ****************************************************** ******************//#include  // I2C-WIRE library#include  // RTC-Library// 定义 max7219 寄存器和控制引脚#限定max7219_reg_noop 0×00#限定max7219_reg_digit0 0×01#限定max7219_reg_digit1 0×02#限定max7219_reg_digit2×03#限定max7219_reg_digit3 0×04#限定max7219_reg_digit4 0×05#限定max7219_reg_digit5 0×06#限定max7219_reg_digit6 0x07的#限定max7219_reg_digit7 0x08的#限定max7219_reg_decodeMode 0×09#限定max7219_reg_intensity 0X0A#限定max7219_reg_scanLimit 0x0b#define max7219_reg_shutdown 0x0c#define max7219_reg_displayTest 0x0f#define dataIn 12 // DIN#define load 10 // CS #define clock 11 // CLKchar alphanum[][8] ={{0x00,0x00,0x00,0x0x00x0 ,0x00,0x00}, // 空白十六进制20 Dec 32 {0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10}, // ! 33 {0x00,0x28,0x28,0x28,0x00,0x00,0x00,0x00}, // " 34 {0x00,0x28,0x7C,0x28,0x7C,0x28,0x00,0x00}, // #x,305, // #105 0x50,0x38,0x14,0x54,0x38,0x10}, // $ {0x41,0xA2,0x44,0x08,0x10,0x22,0x45,0x82}, // % {0x38,0x44,0x40,xA,0x0x 0x44,0x3A}, // &{0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00}, // ' {0x30,0x40,0x80,0x80,0x80,0x80,0x40, //x40 40 {0xC0,0x20,0x10,0x10,0x10,0x10,0x20,0xC0}, // ) {0x28,0x10,0xAA,0x54,0xAA,0x10,0x28,0x00}, // * {0x,00,0x10 0x10,0xFE,0x10,0x10,0x10}, // + {0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x10}, //, {0x00,0x00,0x00,0x00,0x0x7E 0x00}, // - {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18}, // . {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}, //E ,0xC1,0xA1,0x91,0x89,0x85,0x83,0x7E}, // 0 {0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x7C}, // 1 {0x38,0x40x10,x10 ,0x20,0x40,0xFE}, // 2 50 {0x7C,0x82,0x02,0x3C,0x02,0x02,0x82,0x7C}, // 3 {0x08,0x18,0x28,0x48,0xFE,00}x0808 , // 4 {0xFE,0x80,0xF8,0x04,0x02,0x82,0x44,0x38}, // 5 {0x38,0x44,0x80,0xB8,0xC4 ,0x82,0x44,0x38}, // 6 {0xFE,0x02,0x04,0x08,0x10,0x20,0x20,0x20}, // 7 {0x7C,0x82,0x82,0x7C,0x82,0x2,x70} // 8 {0x7C,0x82,0x82,0x7E,0x02,0x82,0x44,0x38}, // 9 {0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00}, //, :{0x0,0 0x18,0x18,0x00,0x18,0x18,0x30}, //; {0x00,0x10,0x20,0x40,0x80,0x40,0x20,0x10}, // <60 {0x00,0x00,0x00,0x7E,0x00,0x7E,0x00,0x00}, // ={0x0,0,0 0x20,0x10,0x20,0x40,0x80}, //> {0x70,0x88,0x88,0x10,0x20,0x20,0x00,0x20}, // ? {0x7E,0x81,0x99,0xA1,0xA1,0x9E,0x80,0x7E}, // @ {0x3C,0x42,0x81,0x81,0xFF,0x81,0x81,0x81}, // A {0xFC,0x1,0x0x0FE ,0x81,0x81,0x82,0xFC}, // B {0x3C,0x42,0x81,0x80,0x80,0x81,0x42,0x3C}, // C {0xFC,0x82,0x81,0x81,0x81,0x810x81,0x810 }, // D {0xFE,0x80,0x80,0xFC,0x80,0x80,0x80,0xFE}, // E {0xFE,0x80,0x80,0xFC,0x80,0x80,0x80,0x80}, // F 70 {0x3C ,0x42,0x81,0x80,0x87,0x81,0x42,0x3C}, // G {0x81,0x81,0x81,0xFF,0x81,0x81,0x81,0x81}, // H {0xFE,0x10,0x10,0x100 ,0x10,0x10,0xFE}, // I {0xFF,0x08,0x08,0x08,0x08,0x88,0x88,0x70}, // J {0x88,0x90,0xA0,0xC0,0xA0,0x90,0x48, // K {0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFE}, // L {0x81,0xC3,0xA5,0x99,0x81,0x81,0x81,0x81}, // M {0x81,0x 0xA1,0x91,0x89,0x85,0x83,0x81}, // N {0x3C,0x42,0x81,0x81,0x81,0x81,0x42,0x3C}, // O {0xFC,0x82,0x81,0xFC,0x82 0x80,0x80}, // P 80 {0x3C,0x42,0x81,0x81,0x81,0x85,0x42,0x3D}, // Q {0xFC,0x82,0x81,0x82,0xFC,0x84,0x82, //x82 R {0x3C,0x42,0x81,0x40,0x3E,0x81,0x42,0x3C}, // S {0xFE,0x10,0x10,0x10,0x10,0x10,0x1 0,0x10}, // T {0x82,0x82,0x82,0x82,0x82,0x82,0x44,0x38}, // U {0x82,0x82,0x82,0x82,0x82,0x44,0x28,0x10}, // {0x81,0x81,0x81,0x81,0x99,0xA5,0xC3,0x81}, // W {0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81}, // X {0x82,0x20x4 ,0x10,0x10,0x10,0x10}, // Y {0xFF,0x02,0x04,0x08,0x10,0x20,0x40,0xFF}, // Z 90 {0xE0,0x80,0x80,0x80,0x,80x80x80 0xE0}, // [ {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}, // {0x07,0x01,0x01,0x01,0x01,0x01,0x01,0x07}, //E, // ] 0xA0,0xE0,0xA0,0xAA,0x15,0x15,0x11}, // am(编码为'^' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E}, // _ {0x10,0 0x00,0x00,0x00,0x00,0x00,0x00}, // ' {0x00,0x00,0x38,0x04,0x3C,0x44,0x48,0x34}, // 一个 {0x00,0x40,0x40,4x8x 0x44,0x38}, // b {0x00,0x00,0x18,0x24,0x40,0x40,0x24,0x18}, // c {0x00,0x04,0x04,0x04,0x3C,0x44,0x44,0x3} 100 {0x00,0x00,0x38,0x44,0x7C,0x40,0x44,0x38}, // e {0x00,0x18,0x20,0x20,0x78,0x20,0x20,0x20}, // f {0x4,000 0x44,0x38,0x04,0x44,0x38}, // g {0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x44}, // h {0x0 0,0x00,0x40,0x00,0x40,0x40,0x40,0x40}, // i {0x00,0x08,0x00,0x08,0x08,0x08,0x48,0x30}, // j {0x00,0x40,0x40 0x50,0x60,0x50,0x48}, // k {0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x20}, // l {0x00,0x00,0x00,0x28,0x54,0x4x40 , // m {0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44}, // n 110 {0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x38}, //x,0x38}, // o 0x00,0x70,0x48,0x48,0x70,0x40,0x40}, // p {0x00,0x00,0x30,0x48,0x48,0x38,0x08,0x08}, // q {0x00,0x00,0x0x0x0 0x40,0x40,0x40}, // r {0x00,0x30,0x48,0x40,0x30,0x08,0x48,0x30}, // s {0x00,0x20,0x70,0x20,0x20,0x20,0x10} / t {0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x38}, // u {0x00,0x00,0x44,0x44,0x44,0x44,0x28,0x10}, // vx80x000 ,0x82,0x82,0x92,0x54,0x28}, // w {0x00,0x00,0x84,0x48,0x30,0x30,0x48,0x84}, // x 120 {0x00,0x48,0x48,0x30x4 0x48,0x30}, // y {0x00,0x00,0x00,0x7C,0x08,0x10,0x20,0x7C}, // z {0x00,0x30,0x40,0x40,0x80,0x40,0x40, //x {0x00,0x20,0x7C} {0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20}, // | {0x00,0x60,0x10,0x10,0x08,0x10,0x10,0x60}, // } {0xE0,0xA0,0xE0,0x80,0x8A,0x15,0x15,0x11} // pm 代码为 '~' 十六进制126 };//定义RTC操作RTC_DS1307 RTC; // 微型 RTC (DS1307) 模块 (SDA - A4, SCL - A5)// 旋转编码器、开关和 LED 控制#define enc_PinA 2 // 编码器 A 到引脚 2(中断 0)#define enc_PinB 4 // 编码器 B 到pin 4#define enc_Switch 3 // 编码器切换到 pin 3(中断 1)#define mode_Pin 8 // 模式 LED pin#define min_Pin 9 // 分钟 LED pin unsigned char enc_A, enc_B, enc_A_prev=0;static boolean rotation =false;静态布尔顺时针 =假;静态布尔更新标志 =假;静态整数模式 =0; // 0 - 无,1 - 小时设置,2 - 分钟设置// 定义显示字符串#define max_array_size 100char ac[max_array_size] ={};byte rc[8] ={};String display_message ="";int arraylen; // 操作参数#define delay_line 75 // 换行之间的毫秒数#define delay_char 400 // 字符之间的毫秒数#define delay_mess 500 // 消息之间的毫秒数#define cblanks 1 // 字符之间的空行数#define eblanks 0 //消息末尾的额外空行数(8 行以上)// display featuresstatic boolean top2bottom =false; // 显示方向(从上到下,或从右到左)static boolean hours24 =false; // 24 小时显示?static boolean charHI =true; // 高亮整个字符static boolean doSerial =true; // 串行输出?//*** ****************************************************** ************************************//// 初始设置//****** ****************************************************** *********************************//void setup() { Wire.begin(); Serial.begin( 57600); if(doSerial) Serial.print("MATRIX Clock - Adrian Jones, Mar. 2014"); // 8x8 LED 矩阵控制引脚 pinMode(dataIn, OUTPUT); pinMode(clock, OUTPUT); pinMode(load, OUTPUT) ); initMatrix(); // 初始化 LED 矩阵 // LED 引脚 pinMode(mode_Pin, OUTPUT); // 模式引脚 digitalWrite(mode_Pin, 1); pinMode(min_Pin, OUTPUT); // 分钟引脚 digitalWrite(min_Pin, 1); // 编码器控制 pinMode(enc_PinA, INPUT_PULLUP); digitalWrite(enc_PinA, HIGH); // 旋转编码器引脚 A pinMode(enc_PinB, INPUT_PULLUP); digitalWrite(enc_PinB, HIGH); // 旋转编码器引脚 B pinMode(enc_Switch, INPUT_PULLUP);digitalWrite(enc_Switch, HIGH); // 编码器开关 attachInterrupt(0, rotEncoder, CHANGE); // 时间设置 attachInterrupt(1, swEncoder, CHANGE); // 分钟/小时 // RTC RTC.begin(); if (!RTC.isrunning()) { RTC.adjust(DateTime(__DATE__, __TIME__)); if(doSerial) Serial.println(" (RTC 重置)"); } else { if(doSerial) Serial.println(" (RTC 运行)"); } //************************************************** ********************************************//// 主循环/ /***************************************************** ****************************************//void loop() { DateTime now =RTC.now(); // show_time_and_date(现在); // 显示时间 display_message =createMessage(now); arraylen =initDisplayString(display_message); if(updateFlag) { show_time_and_date(now);更新标志 =假; }而(旋转){延迟(1); // 去抖动 adjTime(now, 顺时针); show_time_and_date(RTC.now()); display_message =createMessage(现在); arraylen =initDisplayString(display_message);延迟(1);旋转 =假; // 将中断标志重置为 false } delay(5); for (int i =0; i <(arraylen-7); i++) { // 遍历消息数组,一次推进一个字节 for (int j =1; j <9; j++) { maxSingle(j,ac [i+8-j]); } // 第 1 行得到 ac[i+8],第 2 行得到 ac[i+7] 等等……第 8 行得到 ac[i+0] if(i%(8+cblanks) ==0) { / / 当显示屏上有一个完整的字符时... if(charHI) maxSingle(max7219_reg_intensity, 0x01); // ... 增加亮度并暂时停止 newDelay(delay_char); } else { // 正常亮度 maxSingle(max7219_reg_intensity, 0x00);新延迟(延迟线); } } if(mode ==0) newDelay(delay_mess);}// ************************************* **************************************************** / /// 中断例程// ******************************************* **************************************** //// 函数 rotEncoder():ISR 调用当编码器rotatedvoid rotEncoder(){ delay(1); enc_A =digitalRead(enc_PinA); enc_B =digitalRead(enc_PinB); if(!enc_A &&enc_A_prev){ // 顺时针改变状态 =(!enc_A &&enc_B)?真假;如果(模式!=0)旋转=真; } enc_A_prev =enc_A; // 为下次存储 A 的值 }// 函数 swEncoder():当编码器按钮按下时调用 ISR void swEncoder(){ delay(1); if(digitalRead (enc_Switch) !=LOW) 返回; //如果开关按下延迟(1); // 去抖动 if(digitalRead (enc_Switch) !=LOW) return; // 如果 switch 仍然按下 mode++;模式 =模式 % 3; // 递增模式 digitalWrite(mode_Pin, !(mode ==1)); // 小时调整 LED digitalWrite(min_Pin, !(mode ==2)); // 分钟调整 LED updateFlag =true;}// **************************************** ******************************************** //// 操作程序// **************************************************** ********************************** //// 函数 newDelayvoid newDelay (int dly) { for (int z =1; z=25) adj_hrs =1; } else { // 递减 if(adj_hrs ==0) adj_hrs =24; if(--adj_hrs <=0) adj_hrs =24; RTC.adjust(DateTime(now.year(), now.month(), now.day(), adj_hrs, now.minute(), now.second())); } if(mode ==2) { // 调整分钟 int adj_mins =now.minute(); if(dir) { if(++adj_mins>=60) adj_mins =0; } else { if(--adj_mins <0) adj_mins =59; RTC.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), adj_mins, now.second())); }}// 函数 rotChar(char):对于字符 char,将位转置 90 度。 (top - bottom ==> left - right)// 并将结果存储在 rc[0] - rc[7].byte rotChar(char inLetter) { int ind =int(inLetter) - 0x20; for (int col =0; col <8; col++) { 字节掩码 =0x01 <<(7-col); for (int row =0; row <8; row++) { bitWrite(rc[col], 7-row,(alphanum[ind][row] &mask)); } }} // function show_time_and_date:打印出时间字符串 &bytesvoid show_time_and_date(DateTime datetime){ if(doSerial) { int minutes =datetime.minute(); int hours =datetime.hour();如果(小时==0)小时=24; int seconds =datetime.second();字符 delim ='/';字符树形 =' '; String te ="当前日期/时间:"; te =te + datetime.year() + delim + datetime.month() + delim + datetime.day() + delim; Serial.print(te); if(hours<10) Serial.print(0); Serial.print(小时,DEC); Serial.print(":");如果(分钟<10)串行打印(0); Serial.print(分钟,DEC); Serial.print(":"); if(seconds <10) Serial.print(0); Serial.print(seconds,DEC); Serial.println(""); } }String createMessage(DateTime datetime) { String new_mess =" "; int hr =datetime.hour()%24; if(hr ==0) hr =24; int mn =datetime.minute(); if(mode ==0) { // 普通模式 if(hour24) { new_mess +=hr; } else { new_mess +=(hr> 12)?小时 - 12 :小时; } new_mess +=':'; if(mn <10) new_mess +='0'; new_mess +=mn; if(!hour24) new_mess +=(hr> 12)? "~":"^"; } if(mode ==1) { // 调整时间 new_mess +=hr; } if(mode ==2) { // 调整分钟 if(mn <10) new_mess +='0'; new_mess +=mn; } return new_mess;}// function initDisplayString() :创建消息字符串数组,在字符之间和末尾有空格 initDisplayString(String message) { int x =0; for (int y =0; y > 1); // put data digitalWrite(load,HIGH);}// function putByte() :将数据加载到矩阵,MSB 到 LSB void putByte(byte data) { byte i =8;字节掩码; while(i> 0) { // MSB 到 LSB 掩码 =0x01 <<(i - 1); // 创建位掩码 digitalWrite(clock, LOW); // 勾选 if (data &mask){ // 选择位 digitalWrite(dataIn, HIGH);// 发送 1 } else { digitalWrite(dataIn, LOW); // 发送 0 } digitalWrite(clock, HIGH); // 托克 --i; // 移动到较小的位 }}

示意图


制造工艺

  1. Arduino pov 视觉时钟
  2. DIY 最简单的 IV9 Numitron 时钟与 Arduino
  3. 主时钟
  4. 自制 16x8 矩阵上的 Arduino Nano 俄罗斯方块游戏
  5. MotionSense
  6. LED Matrix + Motion Sensor Door Display [Arduino Holiday]
  7. Arduino Quadruped
  8. 使用 Bolt 和 Arduino 控制 LED 亮度
  9. 带有 Arduino、Yaler 和 IFTTT 的物联网仪表
  10. Arduino 排斥电磁悬浮
  11. Arduino Powered Weather Balloon Datalogger
  12. 使用 Arduino Uno 控制 LED 矩阵