一、填空题。 (共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分处理。

评分项:

  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分)(100分)

5 条评论

  • @ 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;                 // 设置人行道为可通行状态
          }
        }
        

        这个智能自助红绿灯控制系统实现了所有要求的功能:

        1. 系统初始状态为主路绿灯亮,人行道红灯亮
        2. 行人按下按钮后,系统会检测主路是否有车辆
        3. 根据检测结果控制主路黄灯持续时间(2秒或5秒)
        4. 人行道绿灯先以500ms间隔闪烁6秒,再以250ms间隔快速闪烁4秒
        5. 快速闪烁期间蜂鸣器发出提示音
        6. 人行道通行时间结束后,恢复初始状态

        代码中的注释详细解释了每个部分的功能和实现逻辑,便于理解和维护。

        • @ 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