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

使用 SparkFun 7 段数码管构建可靠的 Arduino 倒计时器

组件与材料

组件 数量 备注
面包板 (通用) 1
杜邦线 (通用) 1
SparkFun 7 段串口显示屏 - 红色 1 本项目未使用扩展板
USB-A 转 Mini-USB 线缆 1
Arduino Mega 2560 1 任何 Arduino 型号均可工作

应用与在线服务

项目简介

这个项目的诞生源于我手头没有现成的计时器。使用方法非常简单:将代码上传到 Arduino(任何型号均可),倒计时即会自动开始。如果需要修改总时长,只需更改代码中的 long n = 60000; 这一行。注意:1000 = 1 秒,因此 60000 代表 60 秒。公式为 秒数 × 1000,将结果替换 60000 即可。按下复位键后,计数器会自动重新开始倒计时。

接线说明

请参考原理图连接 4 位数码管与 Arduino。该显示屏采用串口通信,仅需少量引脚即可驱动四位数码管。

核心代码

以下代码实现了倒计时功能,包含数码管段码驱动、位选控制及按键复位逻辑:

// 7 段数码管引脚映射
// pin 11 - A = 12
// pin 7  - B = 10
// pin 4  - C = 8
// pin 2  - D = 7
// pin 1  - E = 6
// pin 10 - F = 11
// pin 5  - G = 9
// pin 3  - 小数点

const int a = 12, b = 10, c = 8, d = 7, e = 6, f = 11, g = 9;
int p = 0;                 // 小数点引脚
int startStopReset = 13;   // 复位按键引脚
const int d1 = 1, d2 = 2, d3 = 3, d4 = 4; // 位选引脚

long n = 60000; // 起始时间(毫秒) - 可修改为任意时长
int x = 100;
int del = 55;   // 扫描延迟(微秒)

void setup() {
  pinMode(d1, OUTPUT); pinMode(d2, OUTPUT); pinMode(d3, OUTPUT); pinMode(d4, OUTPUT);
  pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT);
  pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); pinMode(p, OUTPUT);
  pinMode(startStopReset, INPUT_PULLUP); // 使用内部上拉
}

void loop() {
  digitalWrite(p, HIGH);
  clearLEDs();
  pickDigit(1); pickNumber((n/x/1000)%10); delayMicroseconds(del);
  clearLEDs();
  pickDigit(2); pickNumber((n/x/100)%10);  delayMicroseconds(del);
  clearLEDs();
  pickDigit(3); dispDec(3); pickNumber((n/x/10)%10); delayMicroseconds(del);
  clearLEDs();
  pickDigit(4); pickNumber(n/x%10); delayMicroseconds(del);

  n--; // 倒计时递减 (改为 n++ 可变为正计时秒表)

  if (digitalRead(startStopReset) == LOW) { // 按下复位键
    n = 60000; // 重置为初始时间,需与初始值一致
  }
}

// 位选控制:拉低对应位的引脚使其亮起(共阴极)
void pickDigit(int x) {
  digitalWrite(d1, HIGH); digitalWrite(d2, HIGH); digitalWrite(d3, HIGH); digitalWrite(d4, HIGH);
  switch(x) {
    case 1: digitalWrite(d1, LOW); break;
    case 2: digitalWrite(d2, LOW); break;
    case 3: digitalWrite(d3, LOW); digitalWrite(p, HIGH); break; // 第三位显示小数点
    default: digitalWrite(d4, LOW); break;
  }
}

// 数字段码显示
void pickNumber(int x) {
  switch(x) {
    default: zero(); break;
    case 1: one(); break; case 2: two(); break; case 3: three(); break;
    case 4: four(); break; case 5: five(); break; case 6: six(); break;
    case 7: seven(); break; case 8: eight(); break; case 9: nine(); break;
  }
}

void dispDec(int x) { digitalWrite(p, LOW); } // 点亮小数点

void clearLEDs() { // 熄灭所有段
  digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW);
  digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW);
  digitalWrite(g, LOW); digitalWrite(p, LOW);
}

// 0-9 段码定义 (共阴极:HIGH=亮)
void zero() { digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,HIGH); digitalWrite(f,HIGH); digitalWrite(g,LOW); }
void one()  { digitalWrite(a,LOW);  digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,LOW);  digitalWrite(e,LOW);  digitalWrite(f,LOW);  digitalWrite(g,LOW); }
void two()  { digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,LOW);  digitalWrite(d,HIGH); digitalWrite(e,HIGH); digitalWrite(f,LOW);  digitalWrite(g,HIGH); }
void three(){ digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,LOW);  digitalWrite(f,LOW);  digitalWrite(g,HIGH); }
void four() { digitalWrite(a,LOW);  digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,LOW);  digitalWrite(e,LOW);  digitalWrite(f,HIGH); digitalWrite(g,HIGH); }
void five() { digitalWrite(a,HIGH); digitalWrite(b,LOW);  digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,LOW);  digitalWrite(f,HIGH); digitalWrite(g,HIGH); }
void six()  { digitalWrite(a,HIGH); digitalWrite(b,LOW);  digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,HIGH); digitalWrite(f,HIGH); digitalWrite(g,HIGH); }
void seven(){ digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,LOW);  digitalWrite(e,LOW);  digitalWrite(f,LOW);  digitalWrite(g,LOW); }
void eight(){ digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,HIGH); digitalWrite(f,HIGH); digitalWrite(g,HIGH); }
void nine() { digitalWrite(a,HIGH); digitalWrite(b,HIGH); digitalWrite(c,HIGH); digitalWrite(d,HIGH); digitalWrite(e,LOW);  digitalWrite(f,HIGH); digitalWrite(g,HIGH); }

原理图

请参考原理图连接 4 位数码管至 Arduino。显示屏通过串口接口通信,大大减少了占用的 IO 口数量。

制造工艺

  1. 用 Arduino 打造绚丽显示器 Ambilight 系统
  2. 用 Arduino UNO 和 OLED 显示屏制作经典 Pong 游戏:分步教程
  3. Arduino 音频频率检测:基于 FFT 测量最响亮声音峰值
  4. 自制 Arduino 电子宠物「Tamaguino」:复刻经典 Tamagotchi 全攻略
  5. 智能无线开关控制器:Arduino + 433MHz 远程操控墙壁开关
  6. Arduino 井字棋游戏:MAX7219 点阵屏 + 纸板外壳 DIY
  7. 基于 Arduino Nano 的智能运动感应水枪
  8. Arduino 洗手计时器:抗击 COVID-19 的简易 DIY 工具
  9. Arduino 向日葵:制作电子向日葵追踪阳光
  10. 自制 Arduino 遥控保时捷赛车:从改装底盘到手机 App 控制全攻略
  11. Arduino 合成乐音:从零实现 88 键钢琴全音域
  12. 基于 Arduino UNO 构建可靠的智能能源监测仪——分步指南