2025-03
主题:智能自助红绿灯
器件
Atmega328P主控板1块,交通灯模块2个,按键模块1个,蜂鸣器模块1个,超声波传感器1个。以上模块也可使用分立器件结合面包板搭建。
任务要求:
自助红绿灯为行人横穿主路时使用,人行道的总通行时间为10秒。为了安全起见,当人行道变为绿灯前,通过超声波检测主路是否有车辆正在通过,如有车辆正在通过则延长主路黄灯的时长。当超声波传感器检测的距离值小于等于5cm时,表示主路有车辆正在通过人行道。具体要求如下:
(1)自助红绿灯未启动时,主路显示为绿灯,人行道显示为红灯,蜂鸣器保持静音;
(2)当人行道按键被按下后,如主路没有车辆通过,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,黄灯时长2秒;
(3)当人行道按键被按下后,如主路有车辆正在通过,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,此时黄灯的时长为5秒;
(4)当主路为红灯时,人行道的绿灯点亮并闪烁,闪烁时间间隔为500毫秒,蜂鸣器保持静音;
(5)当人行道的绿灯还剩余4秒时,绿灯快速闪烁,闪烁时间间隔为250毫秒,同时蜂鸣器发出提示音,提醒行人快速通过;
(6)人行道通行时间结束,人行道红灯点亮,主路绿灯点亮,蜂鸣器保持静音;
(7)控制程序采用Arduino C/C++代码编写,不得使用图形化软件编写;
(8)未作规定处可自行处理,无明显与事实违背即可。
说明
请考生在考试结束前,按照如下要求提交相关文件。
(1) 将程序放在一个文件夹中,压缩为1个“rar或zip”格式文件,并命名为:DJKS4_身份证号,大小5M以下;
(2) 将程序文件通过“上传附件”按钮进行上传;
(3) 程序编写过程中不得打开其它示例程序,不得使用图形化软件生成代码,如发现,实操成绩按照0分处理。
评分项
1.器件及器件连接(20分)
2.功能实现(80分)
(1)实现自助红绿灯未启动时,主路显示为绿灯,人行道显示为红灯,蜂鸣器保持静音;(10分)
(2)实现当人行道按键被按下后,且超声波传感器检测的距离大于5厘米时,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,黄灯的时长为2秒;(10分)
(3)实现当人行道按键被技下后,且超声波传感器检测的距离不大于5厘米时,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,黄灯的时长为5秒;(10分)
(4)实现当主路为红灯时,人行道的绿灯点亮并闪烁,闪烁时间间隔为500毫秒,蜂鸣器保持静音;(20分)
(5)实现当人行道的绿灯还剩余4秒时,绿灯快速闪烁,闪烁时间间隔为250亳秒;(20分)
(6)实现当人行道的绿灯还剩余4秒时,蜂鸣器发出提示音。(10分)
程序参考
| 器件 | 引脚 |
|---|---|
| 主路绿灯 | 12 |
| 主路黄灯 | 11 |
| 主路红灯 | 10 |
| 人行绿灯 | A3 |
| 人行黄灯 | A2 |
| 人行红灯 | A1 |
| 按键 | 2 |
| 蜂鸣器 | 3 |
| 超声波T | 8 |
| 超声波E | 9 |
int cm() {
pinMode(8, OUTPUT);
pinMode(9, INPUT);
digitalWrite(8, 0);
delayMicroseconds(2);
digitalWrite(8, 1);
delayMicroseconds(10);
digitalWrite(8, 0);
int s = pulseIn(9, 1) / 58.0;
return s;
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(2, INPUT);
pinMode(12, OUTPUT); //绿
pinMode(11, OUTPUT); //黄
pinMode(10, OUTPUT); //红
pinMode(A3, OUTPUT); //绿
pinMode(A2, OUTPUT); //黄
pinMode(A1, OUTPUT); //红
}
void loop() {
// put your main code here, to run repeatedly:
int s = cm();
Serial.println(s);
delay(200);
//主路开始时显示绿灯,人行显示红灯,蜂鸣器不发声
digitalWrite(12, 1);
digitalWrite(11, 0);
digitalWrite(10, 0);
digitalWrite(A3, 0);
digitalWrite(A2, 0);
digitalWrite(A1, 1);
noTone(3);
//按下按键且距离大于5
if (digitalRead(2) and s > 5) {
delay(1000);
digitalWrite(12, 0);
digitalWrite(11, 1);
digitalWrite(10, 0);
delay(2000);
digitalWrite(12, 0);
digitalWrite(11, 0);
digitalWrite(10, 1);
//慢闪6次是6秒
for (int i = 1; i <= 6; i++) {
digitalWrite(A3, 1);
digitalWrite(A2, 0);
digitalWrite(A1, 0);
delay(500);
digitalWrite(A3, 0);
digitalWrite(A2, 0);
digitalWrite(A1, 0);
delay(500);
}
//快闪8次是4秒
for (int i = 1; i <= 8; i++) {
tone(3, 800);
digitalWrite(A3, 1);
digitalWrite(A2, 0);
digitalWrite(A1, 0);
delay(250);
digitalWrite(A3, 0);
digitalWrite(A2, 0);
digitalWrite(A1, 0);
delay(250);
}
//按下按键且距离小于5
} else if (digitalRead(2) and (s > 0 and s <= 5)) {
delay(1000);
digitalWrite(12, 0);
digitalWrite(11, 1);
digitalWrite(10, 0);
delay(5000);
digitalWrite(12, 0);
digitalWrite(11, 0);
digitalWrite(10, 1);
for (int i = 1; i <= 6; i++) {
digitalWrite(A3, 1);
digitalWrite(A2, 0);
digitalWrite(A1, 0);
delay(500);
digitalWrite(A3, 0);
digitalWrite(A2, 0);
digitalWrite(A1, 0);
delay(500);
}
for (int i = 1; i <= 8; i++) {
tone(3, 800);
digitalWrite(A3, 1);
digitalWrite(A2, 0);
digitalWrite(A1, 0);
delay(250);
digitalWrite(A3, 0);
digitalWrite(A2, 0);
digitalWrite(A1, 0);
delay(250);
}
}
}