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. 通电启动:刚给装置通电,点阵会显示最外侧四边亮、中间灭的图案,符合任务要求 (1) 。
  2. 进入工作状态:第一次按下按键 A 或者 B 后,点阵会变黑(显示全熄灭图案),进入工作状态,满足任务 (2) 。
  3. 单独按 A:工作状态下只按 A,点阵显示 “√”,完成任务 (3) 。
  4. 单独按 B:工作状态下只按 B,点阵显示 “×”,达成任务 (4) 。
  5. A 和 B 都按:工作状态下同时按 A 和 B,点阵回到最外侧四边亮、中间灭的图案,实现任务 (5) 。

五、文件提交

  1. 把写好的程序文件(.ino 等相关文件)放到一个文件夹里 。
  2. 将文件夹压缩成 “rar” 或者 “zip” 格式,命名为 “DJKS5_身份证号”(比如你身份证号是 123456789,就叫 DJKS5_123456789 ),确保大小 5M 以下 。
  3. 考试时通过 “上传附件” 按钮提交压缩包 。

这样,整个答案显示器项目从硬件准备、程序编写到功能验证和文件提交,就都清楚啦,动手做的时候按照步骤来,多调试就能实现效果哟!

0 条评论

目前还没有评论...