跳到主要内容

交通灯

重要提示:关于开发板的兼容性

本教程的核心逻辑适用于所有 ESP32 开发板,但所有操作步骤均以 微雪 ESP32-S3-Zero 迷你开发板 为例进行讲解。如果您使用其他型号的开发板,请根据实际情况修改相应设置。

项目介绍

这个项目展示了一个交通灯的模拟程序,通过 ESP32 的 GPIO 引脚控制三个 LED 灯的亮灭,模拟交通灯的红、黄、绿灯切换过程。

硬件连接

需要使用的器件有:

  • LED * 3
  • 330Ω 电阻 * 3
  • 面包板 * 1
  • 导线
  • ESP32 开发板

按照下面接线图连接电路:

ESP32-S3-Zero 引脚图

ESP32-S3-Zero-Pinout

接线图

代码实现

/*
交通灯模拟

模拟带有红、绿灯以及闪烁黄灯的交通灯系统。
当前状态会通过串口监视器打印输出。

电路连接:
- 红灯 (Red LED) 连接到引脚 7
- 黄灯 (Yellow LED) 连接到引脚 8
- 绿灯 (Green LED) 连接到引脚 9

Wulu (Waveshare Team)
*/

// 引脚定义
const int redPin = 7;
const int yellowPin = 8;
const int greenPin = 9;

// 时间参数定义 (单位:毫秒)
const unsigned long redDuration = 10000; // 红灯时长
const unsigned long greenDuration = 8000; // 绿灯时长
const unsigned long yellowDuration = 3000; // 黄灯总时长
const unsigned long blinkInterval = 500; // 闪烁间隔

void setup() {
// 初始化串口通信
Serial.begin(115200);

Serial.println("交通灯模拟程序已启动...");
Serial.print("当前配置: 红灯=");
Serial.print(redDuration / 1000);
Serial.print("秒, 绿灯=");
Serial.print(greenDuration / 1000);
Serial.print("秒, 黄灯=");
Serial.println(yellowDuration / 1000);

// 配置 LED 引脚为输出模式
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
}

// 辅助函数:关闭所有灯
void allLightsOff() {
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
}

void loop() {
// --- 绿灯阶段 ---
Serial.println("状态:绿灯常亮");
allLightsOff(); // 确保从干净的状态开始
digitalWrite(greenPin, HIGH);
delay(greenDuration);

// --- 黄灯闪烁阶段 ---
Serial.println("状态:黄灯闪烁");
digitalWrite(greenPin, LOW);

// 计算闪烁次数
// 一个完整的周期包含“亮”和“灭”,时长为 blinkInterval * 2
int numBlinks = yellowDuration / (blinkInterval * 2);

// 确保即使时间很短,也至少闪烁一次
if (numBlinks == 0) {
numBlinks = 1;
}

for (int i = 0; i < numBlinks; i++) {
digitalWrite(yellowPin, HIGH);
delay(blinkInterval);
digitalWrite(yellowPin, LOW);
delay(blinkInterval);
}

// --- 红灯阶段 ---
Serial.println("状态:红灯常亮");
// 此时黄灯和绿灯已熄灭,直接点亮红灯
digitalWrite(redPin, HIGH);
delay(redDuration);
}

代码解释

  • 常量定义

    • redPin, yellowPin, greenPin:定义了连接 LED 的 GPIO 引脚号。
    • redDuration, greenDuration, yellowDuration:定义了各灯的持续时间(单位:毫秒)。
    • blinkInterval:定义了黄灯闪烁的间隔时间。
  • 初始化 (setup)

    • Serial.begin(115200):初始化串口通信,波特率为 115200,用于在串口监视器中查看程序运行状态。
    • pinMode(pin, OUTPUT):将连接 LED 的引脚配置为输出模式,以便控制 LED 的亮灭。
  • 辅助函数 (allLightsOff)

    • 这是一个自定义函数,用于将所有 LED 引脚设置为 LOW(低电平),从而熄灭所有灯。这有助于在切换状态前确保没有残留的亮灯状态。
  • 主循环 (loop)

    • 绿灯阶段:首先调用 allLightsOff() 熄灭所有灯,然后点亮绿灯 (digitalWrite(greenPin, HIGH)) 并保持 greenDuration 毫秒。
    • 黄灯闪烁阶段
      • 熄灭绿灯。
      • 计算闪烁次数:numBlinks = yellowDuration / (blinkInterval * 2)
      • 使用 for 循环控制黄灯交替亮灭 (HIGH -> delay -> LOW -> delay)。
    • 红灯阶段:点亮红灯 (digitalWrite(redPin, HIGH)) 并保持 redDuration 毫秒。

参考链接