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);
    }
  }
}