- 机器人等级考试
CIE 机器人五级实操:答案显示器项目学习笔记
- 2025-7-30 20:47:07 @
CIE 机器人五级实操:答案显示器项目学习笔记
一、项目概述
我们要制作一个基于 ESP32 主控板的答案显示器,利用 8x8 LED 点阵显示 “√”(正确)、“×”(错误),通过按键 A 和按键 B 控制显示内容,还能展示特定的外侧点亮图案,用到 Arduino C/C++ 编程,不用外部库 。
二、硬件准备
- ESP32 主控板:整个装置的 “大脑”,负责运行程序、处理按键信号和控制点阵显示 。
- 2 个按键模块(按键 A、按键 B):输入设备,用来触发不同显示状态 。
- 8x8 LED 点阵:显示设备,呈现 “√”“×” 以及外侧点亮等图案 。
- 74HC595 移位寄存器:辅助控制点阵显示,处理数据传输,也可用分立器件在面包板搭建等效电路 。
三、程序编写步骤(Arduino 环境)
(一)引脚与变量定义
// 点阵屏控制引脚定义,LPin 是锁存引脚,控制数据是否输出到点阵;CPin 是时钟引脚,配合数据传输;DPin 是数据引脚,传输显示数据
const int LPin = 13, CPin = 14, DPin = 15;
byte Rowdata, COLdata; // 存储行、列数据,控制点阵哪一行、哪一列的灯亮灭
// 图案定义(8x8 点阵 )
// 正确图案(“√” ),每个字节代表一行的点亮情况,通过二进制位控制对应列的 LED 亮灭
byte dui[8] = {0x01, 0x03, 0x06, 0x84, 0xCC, 0x78, 0x38, 0x10};
// 错误图案(“×” ),同理,不同字节组合出 “×” 形状
byte cuo[8] = {0x00, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x00};
// 最外侧四边点亮、中间熄灭的图案,让点阵边缘灯亮,中间不亮
byte wai[8] = {0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF};
// 全熄灭图案,让点阵所有灯都不亮
byte ximie[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
// 按键 A、B 连接的引脚,设置为输入,检测按键是否按下
const int apin = 4, bpin = 25;
(二)setup
函数(初始化操作)
void setup() {
// 配置点阵控制引脚为输出模式,让这些引脚能向外发送电信号控制移位寄存器和点阵
pinMode(LPin, OUTPUT);
pinMode(CPin, OUTPUT);
pinMode(DPin, OUTPUT);
// 初始状态设置,先把锁存引脚置低,让数据能输入到移位寄存器;时钟引脚也置低,准备后续数据传输
digitalWrite(LPin, LOW);
digitalWrite(CPin, LOW);
// 初始化串口通信(波特率 115200 ),方便调试时输出信息,比如查看按键状态、程序运行情况
Serial.begin(115200);
// 配置按键引脚为输入模式,用来检测按键的电平变化(按下时电平会变)
pinMode(apin, INPUT);
pinMode(bpin, INPUT);
// 程序启动后,先显示最外侧四边点亮图案,直到按下按键 A 或 B
while (1) {
displayImages(wai); // 调用显示函数,展示外侧点亮图案
// 检测按键 A 或 B 是否按下(按下时引脚电平变低,这里假设按键按下是低电平,要和实际电路一致哦 )
if (digitalRead(apin) == LOW || digitalRead(bpin) == LOW) {
delay(500); // 延时消抖,避免按键按下瞬间的抖动误判
break; // 按下了就跳出循环,进入工作状态
}
}
}
(三)loop
函数(循环检测与控制)
void loop() {
// 检测按键 A 按下(低电平)、按键 B 没按下(高电平),显示正确图案 “√”
if (digitalRead(apin) == LOW && digitalRead(bpin) == HIGH) {
displayImages(dui);
}
// 检测按键 B 按下、按键 A 没按下,显示错误图案 “×”
else if (digitalRead(apin) == HIGH && digitalRead(bpin) == LOW) {
displayImages(cuo);
}
// 检测按键 A 和 B 都按下,显示外侧点亮图案
else if (digitalRead(apin) == LOW && digitalRead(bpin) == LOW) {
displayImages(wai);
}
// 按键都没按下,显示全熄灭图案(黑屏)
else {
displayImages(ximie);
}
}
(四)显示函数 displayImages
// 点阵屏显示函数:逐行输出图案数据,参数 imgs[] 是要显示的图案数据(一行行的字节)
void displayImages(byte imgs[]) {
for (int row = 0; row < 8; row++) { // 遍历 8 行,逐行显示
// 生成行数据:每次只点亮一行(通过位运算 0b1 << row 实现,比如 row=0 时,就是 00000001,对应第一行点亮 )
Rowdata = 0b1 << row;
// 列数据:对图案数据取反(根据硬件电路决定是否需要取反,不同电路连接可能有差异,保证亮灭正确就行 )
COLdata = ~imgs[row];
matrixDisplay(); // 调用核心显示函数,把行、列数据输出到点阵
delay(1); // 短暂延时,让显示稳定,避免闪烁太厉害
}
}
(五)核心显示函数 matrixDisplay
// 矩阵显示核心函数:通过移位寄存器输出数据,把行和列的数据发送出去,控制点阵点亮
void matrixDisplay() {
// 先发送列数据到移位寄存器,MSBFIRST 表示高位先传,按照数据传输协议把列数据送过去
shiftOut(DPin, CPin, MSBFIRST, COLdata);
// 再发送行数据到移位寄存器,确定哪一行要根据列数据亮灯
shiftOut(DPin, CPin, MSBFIRST, Rowdata);
// 锁存引脚置低,将移位寄存器里的数据更新到点阵屏,让对应的 LED 点亮
digitalWrite(LPin, LOW);
// 锁存引脚置高,准备下一次数据传输,这样下次新数据来的时候能正确更新
digitalWrite(LPin, HIGH);
}
四、功能实现验证
- 通电启动:刚给装置通电,点阵会显示最外侧四边亮、中间灭的图案,符合任务要求 (1) 。
- 进入工作状态:第一次按下按键 A 或者 B 后,点阵会变黑(显示全熄灭图案),进入工作状态,满足任务 (2) 。
- 单独按 A:工作状态下只按 A,点阵显示 “√”,完成任务 (3) 。
- 单独按 B:工作状态下只按 B,点阵显示 “×”,达成任务 (4) 。
- A 和 B 都按:工作状态下同时按 A 和 B,点阵回到最外侧四边亮、中间灭的图案,实现任务 (5) 。
五、文件提交
- 把写好的程序文件(.ino 等相关文件)放到一个文件夹里 。
- 将文件夹压缩成 “rar” 或者 “zip” 格式,命名为 “DJKS5_身份证号”(比如你身份证号是 123456789,就叫 DJKS5_123456789 ),确保大小 5M 以下 。
- 考试时通过 “上传附件” 按钮提交压缩包 。
这样,整个答案显示器项目从硬件准备、程序编写到功能验证和文件提交,就都清楚啦,动手做的时候按照步骤来,多调试就能实现效果哟!
0 条评论
目前还没有评论...