- 机器人等级考试
ESP32 for Arduino 学习笔记:数码管驱动与应用
- 2025-8-13 19:03:29 @
ESP32 for Arduino 学习笔记:数码管驱动与应用
一、数码管基础认知
1.1 结构与分类
数码管是由多个LED(发光二极管)组成的数字显示器件,核心结构为7个LED构成的“8”字形状(对应a-g段),加上小数点dp段,共8个显示单元。
- 共阴数码管:公共引脚接阴极(GND),给对应段阳极高电平(1)时该段亮。
- 共阳数码管:公共引脚接阳极(VCC),给对应段阴极低电平(0)时该段亮。
提示:本次学习以共阴数码管为例,电路和代码逻辑均基于此类型设计。
1.2 显示原理(共阴为例)
通过控制不同段的亮灭组合显示数字,“1”表示亮,“0”表示灭,具体对应关系如下:
显示内容 | a段 | b段 | c段 | d段 | e段 | f段 | g段 | dp段 |
---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 1 | 1 | 0 | 0 | ||
1 | 0 | 0 | 0 | |||||
2 | 1 | 0 | 1 | 1 | 1 | |||
3 | 1 | 0 | ||||||
4 | 0 | 0 | 1 | |||||
5 | 1 | 0 | 1 | |||||
6 | 1 | |||||||
7 | 1 | 0 | ||||||
8 | 1 | 1 | 1 | |||||
9 | 0 | |||||||
小数点 | 0 | 0 | 1 |
二、电路搭建(连接Arduino引脚 + 一位共阴数码管)
2.1 硬件清单
- 连接Arduino引脚开发板(替代ESP32)
- 一位共阴数码管(含a-g、dp段引脚)
- 200Ω电阻(8个,用于限流保护LED)
- 面包板及杜邦线若干
2.2 接线方式
数码管段 | 连接Arduino引脚 | 备注(串联电阻) |
---|---|---|
a段 | GPIO 2 | 电阻一端接VCC,另一端接数码管a段 |
b段 | GPIO 3 | 同上 |
c段 | GPIO 4 | |
d段 | GPIO 5 | |
e段 | GPIO 6 | |
f段 | GPIO 7 | |
g段 | GPIO 8 | |
dp段 | GPIO 9 | |
公共阴极 | GND | 直接接Arduino的GND |
注意:若使用共阳数码管,公共阳极需接VCC,且代码中电平逻辑需反向(1→0,0→1)。
三、基础代码实现(显示数字0和7)
3.1 代码示例(含详细注释)
// 定义数码管段对应的ESP32引脚(与电路接线对应)
#define a 2 // a段接GPIO 2
#define b 3 // b段接GPIO 3
#define c 4 // c段接GPIO 4
#define d 5 // d段接GPIO 5
#define e 6 // e段接GPIO 6
#define f 7 // f段接GPIO 7
#define g 8 // g段接GPIO 8
#define dp 9 // 小数点接GPIO 9
void setup() {
// 初始化串口通信(波特率9600,用于调试输出)
Serial.begin(9600);
// 将控制数码管的引脚设置为输出模式
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(dp, OUTPUT);
// 串口打印初始化信息
Serial.println("数码管驱动初始化完成!");
}
void loop() {
// 循环显示0和7,每次显示间隔1秒
disNum0(); // 显示数字0
delay(1000); // 延时1000毫秒(1秒)
disNum7(); // 显示数字7
delay(1000);
}
// 显示数字0(共阴逻辑:对应段为1时亮)
void disNum0() {
digitalWrite(a, 1); // a段亮
digitalWrite(b, 1); // b段亮
digitalWrite(c, 1); // c段亮
digitalWrite(d, 1); // d段亮
digitalWrite(e, 1); // e段亮
digitalWrite(f, 1); // f段亮
digitalWrite(g, 0); // g段灭
digitalWrite(dp, 0); // 小数点灭
Serial.println("显示数字:0");
}
// 显示数字7(共阴逻辑)
void disNum7() {
digitalWrite(a, 1); // a段亮
digitalWrite(b, 1); // b段亮
digitalWrite(c, 1); // c段亮
digitalWrite(d, 0); // d段灭
digitalWrite(e, 0); // e段灭
digitalWrite(f, 0); // f段灭
digitalWrite(g, 0); // g段灭
digitalWrite(dp, 0); // 小数点灭
Serial.println("显示数字:7");
}
3.2 代码解析
- 引脚定义:通过
#define
将数码管段与Arduino引脚绑定,方便后期修改接线。 setup()
函数:初始化串口和引脚模式,确保数码管能被Arduino控制。loop()
函数:循环调用显示函数,实现数字交替显示。- 显示函数(如
disNum0()
):根据共阴数码管的亮灭规则,用digitalWrite
控制引脚电平,组合出对应数字。
四、扩展功能实现
4.1 完整数字显示(0-9及小数点)
在基础代码中补充其他数字的显示函数,示例如下:
// 显示数字1
void disNum1() {
digitalWrite(a, 0); digitalWrite(b, 1); digitalWrite(c, 1);
digitalWrite(d, 0); digitalWrite(e, 0); digitalWrite(f, 0);
digitalWrite(g, 0); digitalWrite(dp, 0);
Serial.println("显示数字:1");
}
// 显示数字2
void disNum2() {
digitalWrite(a, 1); digitalWrite(b, 1); digitalWrite(c, 0);
digitalWrite(d, 1); digitalWrite(e, 1); digitalWrite(f, 0);
digitalWrite(g, 1); digitalWrite(dp, 0);
Serial.println("显示数字:2");
}
// 其余数字(3-9)的显示函数可参考上述格式,根据表格中的亮灭规则编写
// ...
// 显示小数点
void disNumDian() {
// 仅点亮小数点,其余段灭
digitalWrite(a, 0); digitalWrite(b, 0); digitalWrite(c, 0);
digitalWrite(d, 0); digitalWrite(e, 0); digitalWrite(f, 0);
digitalWrite(g, 0); digitalWrite(dp, 1);
Serial.println("显示:.");
}
4.2 9-1倒计时功能
void loop() {
// 从9到1依次显示,每次停留1秒
disNum9(); delay(1000);
disNum8(); delay(1000);
disNum7(); delay(1000);
disNum6(); delay(1000);
disNum5(); delay(1000);
disNum4(); delay(1000);
disNum3(); delay(1000);
disNum2(); delay(1000);
disNum1(); delay(1000);
}
4.3 显示简单字符(以“L”为例)
“L”的形状需要e、d、c段亮,其余段灭,函数如下:
void disCharL() {
digitalWrite(a, 0); digitalWrite(b, 0); digitalWrite(c, 1);
digitalWrite(d, 1); digitalWrite(e, 1); digitalWrite(f, 0);
digitalWrite(g, 0); digitalWrite(dp, 0);
Serial.println("显示字符:L");
}
五、学习总结与拓展
5.1 核心知识点
- 数码管通过控制LED段亮灭组合显示数字/字符,分共阴和共阳两种类型。
- ESP32通过GPIO引脚输出高低电平,驱动数码管显示(需注意与数码管类型匹配的电平逻辑)。
- 程序设计需将“数字→段亮灭规则→引脚电平”对应起来,通过函数封装简化代码。
5.2 创意拓展方向
- 呼吸灯效果:用
LEDC模拟输出语句
(ESP32支持PWM的引脚)控制数码管亮度渐变。 - 数字闪烁:在显示函数中加入电平翻转和延时,实现闪烁效果。
- 多数码管级联:通过增加控制引脚或使用移位寄存器(如74HC595),实现多位数字显示(如时间、温度)。
提示:实际应用中需根据数码管参数(工作电压、电流)调整电阻阻值,避免损坏器件。
1 条评论
-
admin SU @ 2025-8-13 22:04:29
void setup() { Serial.begin(9600); for (int i = 2; i <= 9; i++) { pinMode(i, OUTPUT); Serial.print(String(i) + " "); } } void loop() { disNum9(); delay(1000); disNum8(); delay(1000); disNum7(); delay(1000); disNum6(); delay(1000); disNum5(); delay(1000); disNum4(); delay(1000); disNum3(); delay(1000); disNum2(); delay(1000); disNum1(); delay(1000); disNum0(); delay(1000); } void disNum0() { digitalWrite(2, !1); digitalWrite(3, !1); digitalWrite(4, !1); digitalWrite(5, !1); digitalWrite(6, !1); digitalWrite(7, !1); digitalWrite(8, !0); digitalWrite(9, !0); } void disNum1() { digitalWrite(2, !0); digitalWrite(3, !1); digitalWrite(4, !1); digitalWrite(5, !0); digitalWrite(6, !0); digitalWrite(7, !0); digitalWrite(8, !0); digitalWrite(9, !0); } void disNum2() { digitalWrite(2, !1); digitalWrite(3, !1); digitalWrite(4, !0); digitalWrite(5, !1); digitalWrite(6, !1); digitalWrite(7, !0); digitalWrite(8, !1); digitalWrite(9, !0); } void disNum3() { digitalWrite(2, !1); digitalWrite(3, !1); digitalWrite(4, !1); digitalWrite(5, !1); digitalWrite(6, !0); digitalWrite(7, !0); digitalWrite(8, !1); digitalWrite(9, !0); } void disNum4() { digitalWrite(2, !0); digitalWrite(3, !1); digitalWrite(4, !1); digitalWrite(5, !0); digitalWrite(6, !0); digitalWrite(7, !1); digitalWrite(8, !1); digitalWrite(9, !0); } void disNum5() { digitalWrite(2, !1); digitalWrite(3, !0); digitalWrite(4, !1); digitalWrite(5, !1); digitalWrite(6, !0); digitalWrite(7, !1); digitalWrite(8, !1); digitalWrite(9, !0); } void disNum6() { digitalWrite(2, !1); digitalWrite(3, !0); digitalWrite(4, !1); digitalWrite(5, !1); digitalWrite(6, !1); digitalWrite(7, !1); digitalWrite(8, !1); digitalWrite(9, !0); } void disNum7() { digitalWrite(2, !1); digitalWrite(3, !1); digitalWrite(4, !1); digitalWrite(5, !0); digitalWrite(6, !0); digitalWrite(7, !0); digitalWrite(8, !0); digitalWrite(9, !0); } void disNum8() { digitalWrite(2, !1); digitalWrite(3, !1); digitalWrite(4, !1); digitalWrite(5, !1); digitalWrite(6, !1); digitalWrite(7, !1); digitalWrite(8, !1); digitalWrite(9, !0); } void disNum9() { digitalWrite(2, !1); digitalWrite(3, !1); digitalWrite(4, !1); digitalWrite(5, !1); digitalWrite(6, !0); digitalWrite(7, !1); digitalWrite(8, !1); digitalWrite(9, !0); } void disNumDian() { digitalWrite(2, !0); digitalWrite(3, !0); digitalWrite(4, !0); digitalWrite(5, !0); digitalWrite(6, !0); digitalWrite(7, !0); digitalWrite(8, !0); digitalWrite(9, !1); }
- 1