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 创意拓展方向

  1. 呼吸灯效果:用LEDC模拟输出语句(ESP32支持PWM的引脚)控制数码管亮度渐变。
  2. 数字闪烁:在显示函数中加入电平翻转和延时,实现闪烁效果。
  3. 多数码管级联:通过增加控制引脚或使用移位寄存器(如74HC595),实现多位数字显示(如时间、温度)。

提示:实际应用中需根据数码管参数(工作电压、电流)调整电阻阻值,避免损坏器件。

1 条评论

  • @ 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