交通灯
重要提示:关于开发板的兼容性
本教程的核心逻辑适用于所有 ESP32 开发板,但所有操作步骤均以 微雪 ESP32-S3-Zero 迷你开发板 为例进行讲解。如果您使用其他型号的开发板,请根据实际情况修改相应设置。
项目介绍
这个项目展示了一个交通灯的模拟程序,通过 ESP32 的 GPIO 引脚控制三个 LED 灯的亮灭,模拟交通灯的红、黄、绿灯切换过程。
硬件连接
需要使用的器件有:
- LED * 3
- 330Ω 电阻 * 3
- 面包板 * 1
- 导线
- ESP32 开发板
按照下面接线图连接电路:
ESP32-S3-Zero 引脚图


代码实现
/*
交通灯模拟
模拟带有红、绿灯以及闪烁黄灯的交通灯系统。
当前状态会通过串口监视器打印输出。
电路连接:
- 红灯 (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(低电平),从而熄灭所有灯。这有助于在切换状态前确保没有残留的亮灯状态。
- 这是一个自定义函数,用于将所有 LED 引脚设置为
-
主循环 (
loop):- 绿灯阶段:首先调用
allLightsOff()熄灭所有灯,然后点亮绿灯 (digitalWrite(greenPin, HIGH)) 并保持greenDuration毫秒。 - 黄灯闪烁阶段:
- 熄灭绿灯。
- 计算闪烁次数:
numBlinks = yellowDuration / (blinkInterval * 2)。 - 使用
for循环控制黄灯交替亮灭 (HIGH->delay->LOW->delay)。
- 红灯阶段:点亮红灯 (
digitalWrite(redPin, HIGH)) 并保持redDuration毫秒。
- 绿灯阶段:首先调用