ESP32点亮数码管显示数字0到9

672 阅读2分钟

最近在做一个物联网小项目,之前用过Arduino,最近了解到ESP32开发版,成本低,配置高,还自带蓝牙和wifi,那肯定要上手试试啦。在这里做一个简单的记录吧。

数码管的型号是5161AS。

5161AS 数码管引脚排列图(顶部引脚)


10 9 8 7 6
|  | | | |
+--+--+--+--+
|            |
|  f     a   |
+--+--+--+--+
|  g         |
+--+--+--+--+
|  e  d     b |
+--+--+--+--+
|            |
|  dp   c    |
+--+--+--+--+
  |  | | | |
  1  2 3 4 5

引脚分配说明

引脚号段/功能ESP32 GPIO 引脚
1eGPIO 19
2dGPIO 18
3共阴极GND
4cGPIO 5
5dpGPIO 23
6bGPIO 4
7aGPIO 2
8共阴极GND
9fGPIO 21
10gGPIO 22

硬件连接说明

  1. 将数码管的各段引脚(a 到 g 及 dp)分别连接到 ESP32 的对应 GPIO 引脚。
  2. 将数码管的共阴极引脚(3 和 8)连接到 GND。

图示说明

以下是连接图的示意:

rust
复制代码
ESP32 GPIO 引脚   ->   数码管段引脚   ->   数码管
----------------------------------------------
GPIO 2           ->   a               ->   引脚 7
GPIO 4           ->   b               ->   引脚 6
GPIO 5           ->   c               ->   引脚 4
GPIO 18          ->   d               ->   引脚 2
GPIO 19          ->   e               ->   引脚 1
GPIO 21          ->   f               ->   引脚 9
GPIO 22          ->   g               ->   引脚 10
GPIO 23          ->   dp              ->   引脚 5
GND              ->   共阴极          ->   引脚 38

示例代码

cpp
复制代码
// 定义数码管段的引脚
const int segmentA = 2;
const int segmentB = 4;
const int segmentC = 5;
const int segmentD = 18;
const int segmentE = 19;
const int segmentF = 21;
const int segmentG = 22;
const int segmentDP = 23; // 小数点段

// 数码管段的引脚数组
const int segments[] = { segmentA, segmentB, segmentC, segmentD, segmentE, segmentF, segmentG, segmentDP };

// 数字 0-9 对应的段码(共阴极)
const uint8_t digitCodes[] = {
  0b00111111, // 0
  0b00000110, // 1
  0b01011011, // 2
  0b01001111, // 3
  0b01100110, // 4
  0b01101101, // 5
  0b01111101, // 6
  0b00000111, // 7
  0b01111111, // 8
  0b01101111  // 9
};

void setup() {
  // 初始化所有段引脚为输出模式
  for (int i = 0; i < 8; i++) {
    pinMode(segments[i], OUTPUT);
    digitalWrite(segments[i], LOW); // 初始化为低电平(熄灭状态)
  }

  // 初始化串口
  Serial.begin(115200);
}

void loop() {
  // 显示数字 0-9
  for (int i = 0; i < 10; i++) {
    displayDigit(i);
    delay(1000); // 每秒切换一次
  }
}

// 显示一个数字
void displayDigit(int digit) {
  uint8_t code = digitCodes[digit];

  for (int i = 0; i < 7; i++) { // 只控制 a 到 g 段
    digitalWrite(segments[i], (code >> i) & 0x01);
  }
}

最终效果:www.bilibili.com/video/BV1ii…