ESP32 for Arduino 串口通信与数码管显示学习笔记

一、开篇鼓励

恭喜你开启ESP32 for Arduino学习之旅!串口通信是硬件交互的“语言桥梁”,数码管显示是直观成果展现,掌握这些,你已在物联网创意实现路上大步迈进,每一次代码成功运行,都是成长勋章,继续加油呀!

二、串口通信基础(Serial 类方法)

(一)数据发送

1. Serial.print() 系列

  • 功能:以 ASCII 码形式输出数据到串口,是串口“说话”的常用方式。
  • 用法示例
// 输出字符串,默认 ASCII 形式
Serial.print("Hello, ESP32!"); 
// 输出数字 123,按十进制(DEC)显示,也可指定 BIN(二进制)、OCT(八进制)、HEX(十六进制)
Serial.print(123, DEC); 
// 输出浮点数 3.14,保留 2 位小数(默认),也可改 format 参数指定小数位数
Serial.print(3.14); 
  • 优点:格式化输出灵活,方便调试看数据,就像给串口输出“梳妆打扮”,让数据好看又好懂。

2. Serial.println() 系列

  • 功能:和 Serial.print() 类似,贴心之处是输出后自动回车换行,让串口打印内容排版更清晰,比如连续输出多组数据,不会挤在一起。
  • 用法示例
// 输出后自动换行,方便区分不同行数据
Serial.println("This is a new line."); 
// 带格式输出数字并换行,比如输出二进制 101 后换行
Serial.println(5, BIN); 

3. Serial.write() 系列

  • 功能:更“硬核”的输出,输出字符/字符串时和 print 效果类似;输出整数时,直接发二进制数据,像给硬件传“原始指令” 。
  • 用法示例
// 输出字符串,效果同 print 输出 ASCII 形式
Serial.write("ESP32 Write Test"); 
// 输出整数 65,实际发二进制数据,接收端若按字符解析就是 'A'(因 65 对应 ASCII 码 'A' )
Serial.write(65); 
// 数组输出,buf 是整数数组,len 是长度,按字节输出数组内容,适合批量传数据
byte buf[] = {65, 66, 67};
Serial.write(buf, 3); 

(二)数据接收

1. Serial.available()

  • 功能:查询串口接收缓冲区,返回可读取的字节数,是判断“有没有数据进来”的“探测器” 。
  • 用法示例
void loop() {
  // 若返回值大于 0,说明串口有数据等着被读
  if (Serial.available() > 0) { 
    // 这里可写读取数据逻辑
  }
}

2. Serial.read()

  • 功能:从串口缓冲区“拿”1 字节数据,拿完该数据就从缓冲区移除,是串口“听声音”的关键动作 。
  • 用法示例
void loop() {
  if (Serial.available() > 0) {
    // 读取 1 字节数据,存到变量 c,若没数据返回 -1
    char c = Serial.read(); 
    Serial.print("收到字符:");
    Serial.println(c);
  }
}

(三)小总结

发送函数里,print 适合调试、看直观数据;write 适合传二进制指令、批量数据;接收函数 available 搭配 read,就能实现“听 - 读”串口数据流程,像给 ESP32 装了“耳朵”和“嘴巴”,能和电脑、其他硬件聊天啦。

三、结合数码管显示实践(74HC595 驱动多位数码管)

(一)硬件连接逻辑(以 4 位数码管 + 2 个 74HC595 为例)

  • ESP32 引脚:要连 74HC595 的数据引脚(DS)、时钟引脚(SH_CP)、锁存引脚(ST_CP),通过控制这几个引脚时序,让 74HC595 移位输出数据,驱动数码管段选、位选。简单说,就是用 ESP32 指挥 74HC595 点亮数码管的不同段和位,实现数字显示。
  • 数码管原理:多位数码管靠“位选”控制哪一位亮,“段选”控制亮什么数字,利用人眼“视觉暂留”,快速切换位选、段选,实现多位稳定显示。

(二)关键代码及注释

// 定义 74HC595 控制引脚,根据实际接线改,这里假设连这几个引脚
const int dataPin = 9;    
const int clockPin = 10;  
const int latchPin = 11;  
// 数码管段选定义(共阴极,1 表示亮,0 表示灭,对应 a - g 段 + 小数点)
const byte disNum[11] = {
  0b11111100, // 0
  0b01100000, // 1
  0b11011010, // 2
  0b11110010, // 3
  0b01100110, // 4
  0b10110110, // 5
  0b10111110, // 6
  0b11100000, // 7
  0b11111110, // 8
  0b11110110, // 9
  0b00000001  // .
};

void setup() {
  // 设置引脚为输出模式,让 ESP32 能控制 74HC595
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  // 初始化串口,设置波特率 115200,和电脑串口助手通信
  Serial.begin(115200); 
  Serial.println("数码管显示测试开始啦!");
}

// 单个数码管位显示函数,digit 是第几位(1 - 4 等),number 是要显示的数字(0 - 9)
void disPlayNumber(int digit, int number) {
  byte v = 0b0; 
  // 设置位选,bitSet 把对应位设为 1,告诉 74HC595 要控制哪个数码管位
  shiftOut(dataPin, clockPin, MSBFIRST, bitSet(v, digit - 1)); 
  // 设置段选,~ 是取反(因共阴极数码管,段选低电平有效,disNum 里 1 表示亮,取反后对应输出电平)
  shiftOut(dataPin, clockPin, LSBFIRST, ~disNum[number]); 
  digitalWrite(latchPin, LOW);  // 开始传输数据到 74HC595
  digitalWrite(latchPin, HIGH); // 锁存数据,让数码管显示设置的内容
}

// 多位数码管显示函数,把整数 n 拆成个位、十位等,逐个位显示
void disPlayNumberS(int n) {
  int arr[5] = {};
  // 拆分个位
  arr[1] = n % 10; 
  // 拆分十位
  arr[2] = n / 10 % 10; 
  // 拆分百位
  arr[3] = n / 100 % 10; 
  // 拆分千位
  arr[4] = n / 1000 % 10; 
  for (int i = 1; i <= 4; i++) {
    // 控制第几位显示对应数字,4 - i + 1 是调整显示顺序(比如让高位在左,低位在右 )
    disPlayNumber(4 - i + 1, arr[i]); 
  }
}

void loop() {
  // 串口接收数据并显示逻辑
  String valueStr = "";
  int value = 0;
  if (Serial.available() > 0) { // 检测串口有数据
    char v = Serial.read(); // 读 1 字节字符
    valueStr += v; // 拼接成字符串
    value = valueStr.toInt(); // 转成整数,准备显示
  }
  // 把接收的数字显示在数码管,比如串口发 1234,数码管就显示 1234
  disPlayNumberS(value); 
  delay(100); // 延时让显示稳定,也给串口缓冲时间
}

(三)代码逻辑讲解

  1. 引脚与数码管定义:先指定控制 74HC595 的引脚,再定义数码管各数字对应的段选数据,就像给每个数字“画好画像”,告诉程序显示 0 - 9 分别要亮哪些段。
  2. setup 函数:初始化引脚为输出,开启串口,相当于给硬件“搭好舞台”,准备开始表演。
  3. disPlayNumber 函数:控制单个数码管位显示数字,通过 shiftOut 给 74HC595 发位选、段选数据,latchPin 锁存后,数码管就亮对应数字,是数码管显示的“最小动作单元”。
  4. disPlayNumberS 函数:把要显示的整数拆成各位(个位、十位等 ),循环调用 disPlayNumber,让多位数码管依次显示,实现“1234”这样的多位数字展示,像把大任务拆成小步骤,逐个完成。
  5. loop 函数:不断检测串口数据,收到后拼接成字符串、转整数,再调用 disPlayNumberS 显示,让数码管实时反映串口接收的数字,实现“串口收数据 - 数码管显示”闭环。

(四)常见问题与解决

  • 问题 1:数码管显示乱码、缺段。
    • 原因:可能段选定义错(比如共阳极和共阴极搞反,段选数据要取反调整 ),或者 74HC595 接线松、时序不对。
    • 解决:检查数码管类型(共阴/共阳 ),核对 disNum 数据;重新插拔接线,确保接触好;也可简化代码,先测试单个数码管位显示,逐步排查。
  • 问题 2:串口接收数据转整数失败,数码管显示 0 或异常。
    • 原因:串口数据含非数字字符(如换行符 ),toInt 转换失败。
    • 解决:在拼接字符串时,判断字符是否是数字(用 isDigit 函数 ),只拼接数字字符;或者接收完数据后,处理掉换行符等干扰字符,再转整数。

四、总结与拓展

(一)学习收获

通过本次学习,你掌握了 ESP32 for Arduino 串口收发数据(print/write/available/read ),还实现了数码管显示,能让硬件“听”“说”“展示”,这是物联网项目的基础能力,比如以后做串口调试助手、数字显示屏、简单数据采集显示设备,都能用到这些知识!

(二)拓展方向

  1. 多设备通信:让 ESP32 串口连接传感器(如温湿度传感器 ),接收数据后数码管显示,打造简易环境监测仪。
  2. 串口协议扩展:学习 Modbus 等串口通信协议,和工业设备、智能模块通信,让 ESP32 成为“万能翻译官”,接入更复杂系统。
  3. 数码管特效:做滚动数字、闪烁显示,给项目加“特效”,让数码管不止能显示数字,还能当动态装饰,让作品更炫酷!

继续加油呀,每一次代码修改、功能拓展,都是你向“硬件达人”迈进的脚步,期待你用这些知识做出超酷的物联网作品!

0 条评论

目前还没有评论...