- 机器人等级考试
【2503】CIE 机器人四级实操 1.主题:智能自助红绿灯(四级)
- 2025-6-7 19:58:58 @
一、填空题。 (共1题,共100分)
1.主题:智能自助红绿灯(四级)
器件:Atmega328P主控板1块,交通灯模块2个,按键模块1个,蜂鸣器模块1个,超声波传感器1个。以上模块也可使用分立器件结合面包板搭建。
任务要求:自助红绿灯为行人横穿主路时使用,人行道的总通行时间为10秒。为了安全起见,当人行道变为绿灯前,通过超声波检测主路是否有车辆正在通过,如有车辆正在通过则延长主路黄灯的时长。当超声波传感器检测的距离值小于等于5cm时,表示主路有车辆正在通过人行道。具体要求如下:
(1) 自助红绿灯未启动时,主路显示为绿灯,人行道显示为红灯,蜂鸣器保持静音;
(2) 当人行道按键被按下后,如主路没有车辆通过,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,黄灯时长2秒;
(3) 当人行道按键被按下后,如主路有车辆正在通过,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,此时黄灯的时长为5秒;
(4) 当主路为红灯时,人行道的绿灯点亮并闪烁,闪烁时间间隔为500毫秒,蜂鸣器保持静音;
(5) 当人行道的绿灯还剩余4秒时,绿灯快速闪烁,闪烁时间间隔为250毫秒,同时蜂鸣器发出提示音,提醒行人快速通过;
(6) 人行道通行时间结束,人行道红灯点亮,主路绿灯点亮,蜂鸣器保持静音;
(7) 未作规定处可自行处理,无明显与事实违背即可。
说明:请考生在考试结束前,按照如下要求提交相关文件。
(1) 将程序放在一个文件夹中,压缩为1个“rar或zip”格式文件,并命名为:DJKS4_身份证号,大小5M以下;
(2) 将程序文件通过“上传附件”按钮进行上传;
(3) 程序编写过程中不得打开其它示例程序,不得使用图形化软件生成代码,如发现,实操成绩按照0分处理。
评分项:
- 器件及器件连接(20分)
- 功能实现(80分)
(1) 实现自助红绿灯未启动时,主路显示为绿灯,人行道显示为红灯,蜂鸣器保持静音;(10分)
(2) 实现当人行道按键被按下后,且超声波传感器检测的距离大于5厘米时,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,黄灯的时长为2秒;(10分)
(3) 实现当人行道按键被按下后,且超声波传感器检测的距离不大于5厘米时,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,黄灯的时长为5秒;(10分)
(4) 实现当主路为红灯时,人行道的绿灯点亮并闪烁,闪烁时间间隔为500毫秒,蜂鸣器保持静音;(20分)
(5) 实现当人行道的绿灯还剩余4秒时,绿灯快速闪烁,闪烁时间间隔为250毫秒;(20分)
(6) 实现当人行道的绿灯还剩余4秒时,蜂鸣器发出提示音。(10分)(100分)
5 条评论
-
admin SU @ 2025-6-9 19:08:16
// 智能自助红绿灯控制系统 // 适用于Atmega328P主控板,实现行人自助控制红绿灯功能 // 定义交通灯和设备引脚 const int zhuGreen = 2; // 主路绿灯 const int zhuRed = 3; // 主路红灯 const int zhuYellow = 4; // 主路黄灯 const int renGreen = 5; // 人行道绿灯 const int renRed = 6; // 人行道红灯 const int renYellow = 7; // 人行道黄灯(本系统未使用) const int tonePin = 9; // 蜂鸣器控制引脚 const int keyPin = 12; // 行人请求按钮引脚 // 定义超声波传感器引脚 const int trigPin = A4; // 触发引脚,用于发送超声波信号 const int echoPin = A5; // 回声引脚,用于接收反射的超声波信号 double dis; // 存储测量到的距离值 bool flag = false; // 行人按钮触发标志(false表示未按下) bool renFlag = false; // 人行道通行标志(false表示不可通行) // 初始化设置 void setup() { // 初始化所有交通灯引脚为输出模式 for (int i = 2; i <= 7; i++) { pinMode(i, OUTPUT); } // (1) 系统初始状态:主路绿灯亮,人行道红灯亮,蜂鸣器静音 digitalWrite(zhuGreen, HIGH); // 主路绿灯点亮 digitalWrite(zhuRed, LOW); // 主路红灯熄灭 digitalWrite(zhuYellow, LOW); // 主路黄灯熄灭 digitalWrite(renRed, HIGH); // 人行道红灯点亮 digitalWrite(renGreen, LOW); // 人行道绿灯熄灭 digitalWrite(renYellow, LOW); // 人行道黄灯熄灭 noTone(tonePin); // 关闭蜂鸣器 pinMode(keyPin, INPUT); // 设置按钮引脚为输入模式 Serial.begin(9600); // 初始化串口通信,用于调试 // 初始化超声波传感器 dis = 0; // 初始化距离变量 pinMode(trigPin, OUTPUT); // 设置触发引脚为输出模式 pinMode(echoPin, INPUT); // 设置回声引脚为输入模式 } // 超声波测距函数,返回测量的距离(厘米) float checkdistance() { // 触发超声波发送 digitalWrite(trigPin, LOW); // 先将触发引脚拉低,确保状态稳定 delayMicroseconds(2); // 保持2微秒 digitalWrite(trigPin, HIGH); // 发送10微秒的高电平触发脉冲 delayMicroseconds(10); digitalWrite(trigPin, LOW); // 触发脉冲结束 // 测量回声时间并计算距离 // 距离计算公式:距离(厘米) = 时间(微秒) / 58.00 float distance = pulseIn(echoPin, HIGH) / 58.00; delay(10); // 短暂延时,避免传感器读数冲突 return distance; // 返回测量的距离值(厘米) } // 主循环 void loop() { // 人行道不可通行状态:保持主路绿灯和人行道红灯 if (renFlag == false) { noTone(tonePin); // 确保蜂鸣器静音 // 主路绿灯亮,人行道红灯亮 digitalWrite(zhuGreen, HIGH); digitalWrite(zhuRed, LOW); digitalWrite(zhuYellow, LOW); digitalWrite(renRed, HIGH); digitalWrite(renGreen, LOW); digitalWrite(renYellow, LOW); } // 人行道可通行状态:控制人行道绿灯闪烁和蜂鸣器提示 else { // (4) 前6秒:人行道绿灯以500ms间隔闪烁,蜂鸣器静音 digitalWrite(renRed, LOW); // 熄灭人行道红灯 digitalWrite(renGreen, LOW); // 确保绿灯初始状态为熄灭 digitalWrite(renYellow, LOW); // 确保黄灯初始状态为熄灭 for (int i = 1; i <= 6; i++) { // 循环6次,每次1秒 digitalWrite(renGreen, HIGH); // 点亮绿灯 delay(500); // 保持500ms digitalWrite(renGreen, LOW); // 熄灭绿灯 delay(500); // 保持500ms } // (5) 剩余4秒:人行道绿灯以250ms间隔快速闪烁,蜂鸣器发出提示音 tone(tonePin, 400); // 启动蜂鸣器,频率400Hz for (int i = 1; i <= 8; i++) { // 循环8次,每次500ms digitalWrite(renGreen, HIGH); // 点亮绿灯 delay(250); // 保持250ms digitalWrite(renGreen, LOW); // 熄灭绿灯 delay(250); // 保持250ms } noTone(tonePin); // 关闭蜂鸣器 renFlag = false; // 人行道通行时间结束,设置为不可通行状态 } // 检测行人按钮是否被按下 if (digitalRead(keyPin) == HIGH) { flag = true; // 设置按钮触发标志 Serial.println(flag); // 输出标志状态用于调试 delay(500); // 简单的消抖处理 } dis = checkdistance(); // 测量主路距离 Serial.println(dis); // 输出测量距离用于调试 // 当按钮被按下后,根据主路情况控制信号灯变化 if (flag == true) { if (dis > 5) { // (2) 主路无车辆通过(距离>5cm),黄灯时长2秒 digitalWrite(zhuGreen, HIGH); // 确保主路绿灯亮 delay(1000); // 延时1秒 digitalWrite(zhuGreen, LOW); // 熄灭主路绿灯 digitalWrite(zhuYellow, HIGH); // 点亮主路黄灯 delay(2000); // 黄灯保持2秒 digitalWrite(zhuYellow, LOW); // 熄灭主路黄灯 digitalWrite(zhuRed, HIGH); // 点亮主路红灯 } else { // (3) 主路有车辆通过(距离≤5cm),黄灯时长5秒 digitalWrite(zhuGreen, HIGH); // 确保主路绿灯亮 delay(1000); // 延时1秒 digitalWrite(zhuGreen, LOW); // 熄灭主路绿灯 digitalWrite(zhuYellow, HIGH); // 点亮主路黄灯 delay(5000); // 黄灯保持5秒 digitalWrite(zhuYellow, LOW); // 熄灭主路黄灯 digitalWrite(zhuRed, HIGH); // 点亮主路红灯 } flag = false; // 重置按钮触发标志 renFlag = true; // 设置人行道为可通行状态 } }
-
2025-6-9 18:24:09@
const int zhuGreen = 2; const int zhuRed = 3; const int zhuYellow = 4; const int renGreen = 5; const int renRed = 6; const int renYellow = 7; const int tonePin = 9; const int keyPin = 12; // 定义超声波传感器引脚 const int trigPin = A4; // 触发引脚,用于发送超声波信号 const int echoPin = A5; // 回声引脚,用于接收反射的超声波信号 double dis; // 存储测量到的距离值 void setup() { for (int i = 2; i <= 7; i++) { pinMode(i, OUTPUT); } //(1) 自助红绿灯未启动时,主路显示为绿灯,人行道显示为红灯,蜂鸣器保持静音; //主路显示为绿灯 digitalWrite(zhuGreen, HIGH); digitalWrite(zhuRed,LOW); digitalWrite(zhuYellow,LOW); //人行道显示为红灯 digitalWrite(renRed, HIGH); digitalWrite(renGreen,LOW); digitalWrite(renYellow,LOW); noTone(tonePin); pinMode(keyPin, INPUT); Serial.begin(9600); // 初始化变量和硬件 dis = 0; // 初始化距离变量 pinMode(trigPin, OUTPUT); // 设置触发引脚为输出模式 pinMode(echoPin, INPUT); // 设置回声引脚为输入模式 Serial.begin(9600); // 初始化串口通信,波特率9600 } // 函数:测量距离 float checkdistance() { // 触发超声波发送 digitalWrite(trigPin, LOW); // 先将触发引脚拉低,确保状态稳定 delayMicroseconds(2); // 保持2微秒 digitalWrite(trigPin, HIGH); // 发送10微秒的高电平触发脉冲 delayMicroseconds(10); digitalWrite(trigPin, LOW); // 触发脉冲结束 // 测量回声时间并计算距离 // pulseIn()函数返回高电平持续时间(微秒),即超声波往返时间 // 距离计算公式:距离(厘米) = 时间(微秒) / 58.00 // (声速约340m/s,转换为厘米/微秒:34000/1000000 = 0.034cm/μs // 往返距离 = 0.034 * 时间 → 单程距离 = 0.034 * 时间 / 2 ≈ 时间 / 58) float distance = pulseIn(echoPin, HIGH) / 58.00; delay(10); // 短暂延时,避免传感器读数冲突 return distance; // 返回测量的距离值(厘米) } boolean flag = false;//false表示按键没有按下 boolean renFlag = false;//人行道不能通过 void loop() { if (renFlag == false) { noTone(tonePin); //主路显示为绿灯 digitalWrite(zhuGreen, HIGH); digitalWrite(zhuRed, LOW); digitalWrite(zhuYellow, LOW); //人行道显示为红灯 digitalWrite(renRed, HIGH); digitalWrite(renGreen, LOW); digitalWrite(renYellow, LOW); } else { //(4) 前6秒 当主路为红灯时,人行道的绿灯点亮并闪烁,闪烁时间间隔为500毫秒,蜂鸣器保持静音; digitalWrite(renRed, LOW); digitalWrite(renGreen, LOW); digitalWrite(renYellow, LOW); for (int i = 1; i <= 6; i++) { digitalWrite(renGreen, HIGH); delay(500); digitalWrite(renGreen, LOW); delay(500); } //(5) 当人行道的绿灯还剩余4秒时,绿灯快速闪烁,闪烁时间间隔为250毫秒,同时蜂鸣器发出提示音,提醒行人快速通过; tone(tonePin,400); for (int i = 1; i <= 8; i++) { digitalWrite(renGreen, HIGH); delay(250); digitalWrite(renGreen, LOW); delay(250); } renFlag = false;//人行道不能通过 } //keyValue = digitalRead(keyPin); if (digitalRead(keyPin) == HIGH) { flag = true; Serial.println(flag); delay(500);//简单的消抖一下 } if (flag == true) { dis = checkdistance(); Serial.println(dis); if (dis > 5) { //(2) 当人行道按键被按下后,如主路没有车辆通过,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,黄灯时长2秒; digitalWrite(zhuGreen, HIGH); delay(1000); digitalWrite(zhuGreen, LOW); digitalWrite(zhuYellow, HIGH); delay(2000); digitalWrite(zhuYellow, LOW); digitalWrite(zhuRed, HIGH); } else { //(3) 当人行道按键被按下后,如主路有车辆正在通过,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,此时黄灯的时长为5秒; digitalWrite(zhuGreen, HIGH); delay(1000); digitalWrite(zhuGreen, LOW); digitalWrite(zhuYellow, HIGH); delay(5000); digitalWrite(zhuYellow, LOW); digitalWrite(zhuRed, HIGH); } flag = false; renFlag = true;//人行道能通过 } }
-
2025-6-9 18:21:47@
以下是添加了详细注释的智能自助红绿灯程序代码:
// 智能自助红绿灯控制系统 // 适用于Atmega328P主控板,实现行人自助控制红绿灯功能 // 定义交通灯和设备引脚 const int zhuGreen = 2; // 主路绿灯 const int zhuRed = 3; // 主路红灯 const int zhuYellow = 4; // 主路黄灯 const int renGreen = 5; // 人行道绿灯 const int renRed = 6; // 人行道红灯 const int renYellow = 7; // 人行道黄灯(本系统未使用) const int tonePin = 9; // 蜂鸣器控制引脚 const int keyPin = 12; // 行人请求按钮引脚 // 定义超声波传感器引脚 const int trigPin = A4; // 触发引脚,用于发送超声波信号 const int echoPin = A5; // 回声引脚,用于接收反射的超声波信号 double dis; // 存储测量到的距离值 bool flag = false; // 行人按钮触发标志(false表示未按下) bool renFlag = false; // 人行道通行标志(false表示不可通行) // 初始化设置 void setup() { // 初始化所有交通灯引脚为输出模式 for (int i = 2; i <= 7; i++) { pinMode(i, OUTPUT); } // (1) 系统初始状态:主路绿灯亮,人行道红灯亮,蜂鸣器静音 digitalWrite(zhuGreen, HIGH); // 主路绿灯点亮 digitalWrite(zhuRed, LOW); // 主路红灯熄灭 digitalWrite(zhuYellow, LOW); // 主路黄灯熄灭 digitalWrite(renRed, HIGH); // 人行道红灯点亮 digitalWrite(renGreen, LOW); // 人行道绿灯熄灭 digitalWrite(renYellow, LOW); // 人行道黄灯熄灭 noTone(tonePin); // 关闭蜂鸣器 pinMode(keyPin, INPUT); // 设置按钮引脚为输入模式 Serial.begin(9600); // 初始化串口通信,用于调试 // 初始化超声波传感器 dis = 0; // 初始化距离变量 pinMode(trigPin, OUTPUT); // 设置触发引脚为输出模式 pinMode(echoPin, INPUT); // 设置回声引脚为输入模式 } // 超声波测距函数,返回测量的距离(厘米) float checkdistance() { // 触发超声波发送 digitalWrite(trigPin, LOW); // 先将触发引脚拉低,确保状态稳定 delayMicroseconds(2); // 保持2微秒 digitalWrite(trigPin, HIGH); // 发送10微秒的高电平触发脉冲 delayMicroseconds(10); digitalWrite(trigPin, LOW); // 触发脉冲结束 // 测量回声时间并计算距离 // 距离计算公式:距离(厘米) = 时间(微秒) / 58.00 float distance = pulseIn(echoPin, HIGH) / 58.00; delay(10); // 短暂延时,避免传感器读数冲突 return distance; // 返回测量的距离值(厘米) } // 主循环 void loop() { // 人行道不可通行状态:保持主路绿灯和人行道红灯 if (renFlag == false) { noTone(tonePin); // 确保蜂鸣器静音 // 主路绿灯亮,人行道红灯亮 digitalWrite(zhuGreen, HIGH); digitalWrite(zhuRed, LOW); digitalWrite(zhuYellow, LOW); digitalWrite(renRed, HIGH); digitalWrite(renGreen, LOW); digitalWrite(renYellow, LOW); } // 人行道可通行状态:控制人行道绿灯闪烁和蜂鸣器提示 else { // (4) 前6秒:人行道绿灯以500ms间隔闪烁,蜂鸣器静音 digitalWrite(renRed, LOW); // 熄灭人行道红灯 digitalWrite(renGreen, LOW); // 确保绿灯初始状态为熄灭 digitalWrite(renYellow, LOW); // 确保黄灯初始状态为熄灭 for (int i = 1; i <= 6; i++) { // 循环6次,每次1秒 digitalWrite(renGreen, HIGH); // 点亮绿灯 delay(500); // 保持500ms digitalWrite(renGreen, LOW); // 熄灭绿灯 delay(500); // 保持500ms } // (5) 剩余4秒:人行道绿灯以250ms间隔快速闪烁,蜂鸣器发出提示音 tone(tonePin, 400); // 启动蜂鸣器,频率400Hz for (int i = 1; i <= 8; i++) { // 循环8次,每次500ms digitalWrite(renGreen, HIGH); // 点亮绿灯 delay(250); // 保持250ms digitalWrite(renGreen, LOW); // 熄灭绿灯 delay(250); // 保持250ms } noTone(tonePin); // 关闭蜂鸣器 renFlag = false; // 人行道通行时间结束,设置为不可通行状态 } // 检测行人按钮是否被按下 if (digitalRead(keyPin) == HIGH) { flag = true; // 设置按钮触发标志 Serial.println(flag); // 输出标志状态用于调试 delay(500); // 简单的消抖处理 } // 当按钮被按下后,根据主路情况控制信号灯变化 if (flag == true) { dis = checkdistance(); // 测量主路距离 Serial.println(dis); // 输出测量距离用于调试 if (dis > 5) { // (2) 主路无车辆通过(距离>5cm),黄灯时长2秒 digitalWrite(zhuGreen, HIGH); // 确保主路绿灯亮 delay(1000); // 延时1秒 digitalWrite(zhuGreen, LOW); // 熄灭主路绿灯 digitalWrite(zhuYellow, HIGH); // 点亮主路黄灯 delay(2000); // 黄灯保持2秒 digitalWrite(zhuYellow, LOW); // 熄灭主路黄灯 digitalWrite(zhuRed, HIGH); // 点亮主路红灯 } else { // (3) 主路有车辆通过(距离≤5cm),黄灯时长5秒 digitalWrite(zhuGreen, HIGH); // 确保主路绿灯亮 delay(1000); // 延时1秒 digitalWrite(zhuGreen, LOW); // 熄灭主路绿灯 digitalWrite(zhuYellow, HIGH); // 点亮主路黄灯 delay(5000); // 黄灯保持5秒 digitalWrite(zhuYellow, LOW); // 熄灭主路黄灯 digitalWrite(zhuRed, HIGH); // 点亮主路红灯 } flag = false; // 重置按钮触发标志 renFlag = true; // 设置人行道为可通行状态 } }
这个智能自助红绿灯控制系统实现了所有要求的功能:
- 系统初始状态为主路绿灯亮,人行道红灯亮
- 行人按下按钮后,系统会检测主路是否有车辆
- 根据检测结果控制主路黄灯持续时间(2秒或5秒)
- 人行道绿灯先以500ms间隔闪烁6秒,再以250ms间隔快速闪烁4秒
- 快速闪烁期间蜂鸣器发出提示音
- 人行道通行时间结束后,恢复初始状态
代码中的注释详细解释了每个部分的功能和实现逻辑,便于理解和维护。
-
2025-6-7 20:00:20@
const int zhuGreen = 2; const int zhuRed = 3; const int zhuYellow = 4; const int renGreen = 5; const int renRed = 6; const int renYellow = 7; const int tonePin = 9; const int keyPin = 12; // 定义超声波传感器引脚 const int trigPin = A4; // 触发引脚,用于发送超声波信号 const int echoPin = A5; // 回声引脚,用于接收反射的超声波信号 double dis; // 存储测量到的距离值 void setup() { for (int i = 2; i <= 7; i++) { pinMode(i, OUTPUT); } //(1) 自助红绿灯未启动时,主路显示为绿灯,人行道显示为红灯,蜂鸣器保持静音; //主路显示为绿灯 digitalWrite(zhuGreen, HIGH); //digitalWrite(zhuRed,LOW); //digitalWrite(zhuYellow,LOW); //人行道显示为红灯 digitalWrite(renRed, HIGH); //digitalWrite(renGreen,LOW); //digitalWrite(renYellow,LOW); noTone(tonePin); pinMode(keyPin, INPUT); Serial.begin(9600); // 初始化变量和硬件 dis = 0; // 初始化距离变量 pinMode(trigPin, OUTPUT); // 设置触发引脚为输出模式 pinMode(echoPin, INPUT); // 设置回声引脚为输入模式 Serial.begin(9600); // 初始化串口通信,波特率9600 } boolean flag = false;//false表示按键没有按下 int keyValue; // 函数:测量距离 float checkdistance() { // 触发超声波发送 digitalWrite(trigPin, LOW); // 先将触发引脚拉低,确保状态稳定 delayMicroseconds(2); // 保持2微秒 digitalWrite(trigPin, HIGH); // 发送10微秒的高电平触发脉冲 delayMicroseconds(10); digitalWrite(trigPin, LOW); // 触发脉冲结束 // 测量回声时间并计算距离 // pulseIn()函数返回高电平持续时间(微秒),即超声波往返时间 // 距离计算公式:距离(厘米) = 时间(微秒) / 58.00 // (声速约340m/s,转换为厘米/微秒:34000/1000000 = 0.034cm/μs // 往返距离 = 0.034 * 时间 → 单程距离 = 0.034 * 时间 / 2 ≈ 时间 / 58) float distance = pulseIn(echoPin, HIGH) / 58.00; delay(10); // 短暂延时,避免传感器读数冲突 return distance; // 返回测量的距离值(厘米) } void loop() { //keyValue = digitalRead(keyPin); if (digitalRead(keyPin) == HIGH) { delay(500);//简单的消抖一下 flag = !flag; Serial.println(flag); } if (flag == true) { dis = checkdistance(); Serial.println(dis); if (dis > 5) { //(2) 当人行道按键被按下后,如主路没有车辆通过,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,黄灯时长2秒; digitalWrite(zhuGreen, HIGH); delay(1000); digitalWrite(zhuGreen, LOW); digitalWrite(zhuYellow, HIGH); delay(2000); digitalWrite(zhuYellow, LOW); digitalWrite(zhuRed, HIGH); } else { //(3) 当人行道按键被按下后,如主路有车辆正在通过,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,此时黄灯的时长为5秒; digitalWrite(zhuGreen, HIGH); delay(1000); digitalWrite(zhuGreen, LOW); digitalWrite(zhuYellow, HIGH); delay(5000); digitalWrite(zhuYellow, LOW); digitalWrite(zhuRed, HIGH); } flag = false; } }
-
2025-6-7 19:59:27@
- 1