- 机器人等级考试
ESP32 for Arduino 串口通信与数码管显示学习笔记
- 2025-7-25 21:52:39 @
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); // 延时让显示稳定,也给串口缓冲时间
}
(三)代码逻辑讲解
- 引脚与数码管定义:先指定控制 74HC595 的引脚,再定义数码管各数字对应的段选数据,就像给每个数字“画好画像”,告诉程序显示 0 - 9 分别要亮哪些段。
setup
函数:初始化引脚为输出,开启串口,相当于给硬件“搭好舞台”,准备开始表演。disPlayNumber
函数:控制单个数码管位显示数字,通过shiftOut
给 74HC595 发位选、段选数据,latchPin
锁存后,数码管就亮对应数字,是数码管显示的“最小动作单元”。disPlayNumberS
函数:把要显示的整数拆成各位(个位、十位等 ),循环调用disPlayNumber
,让多位数码管依次显示,实现“1234”这样的多位数字展示,像把大任务拆成小步骤,逐个完成。loop
函数:不断检测串口数据,收到后拼接成字符串、转整数,再调用disPlayNumberS
显示,让数码管实时反映串口接收的数字,实现“串口收数据 - 数码管显示”闭环。
(四)常见问题与解决
- 问题 1:数码管显示乱码、缺段。
- 原因:可能段选定义错(比如共阳极和共阴极搞反,段选数据要取反调整 ),或者 74HC595 接线松、时序不对。
- 解决:检查数码管类型(共阴/共阳 ),核对
disNum
数据;重新插拔接线,确保接触好;也可简化代码,先测试单个数码管位显示,逐步排查。
- 问题 2:串口接收数据转整数失败,数码管显示 0 或异常。
- 原因:串口数据含非数字字符(如换行符 ),
toInt
转换失败。 - 解决:在拼接字符串时,判断字符是否是数字(用
isDigit
函数 ),只拼接数字字符;或者接收完数据后,处理掉换行符等干扰字符,再转整数。
- 原因:串口数据含非数字字符(如换行符 ),
四、总结与拓展
(一)学习收获
通过本次学习,你掌握了 ESP32 for Arduino 串口收发数据(print
/write
/available
/read
),还实现了数码管显示,能让硬件“听”“说”“展示”,这是物联网项目的基础能力,比如以后做串口调试助手、数字显示屏、简单数据采集显示设备,都能用到这些知识!
(二)拓展方向
- 多设备通信:让 ESP32 串口连接传感器(如温湿度传感器 ),接收数据后数码管显示,打造简易环境监测仪。
- 串口协议扩展:学习 Modbus 等串口通信协议,和工业设备、智能模块通信,让 ESP32 成为“万能翻译官”,接入更复杂系统。
- 数码管特效:做滚动数字、闪烁显示,给项目加“特效”,让数码管不止能显示数字,还能当动态装饰,让作品更炫酷!
继续加油呀,每一次代码修改、功能拓展,都是你向“硬件达人”迈进的脚步,期待你用这些知识做出超酷的物联网作品!
0 条评论
目前还没有评论...