使用Arduino Uno和4位数码管制作交通信号灯
在这个项目中,我们将使用Arduino Uno、红色LED、绿色LED、黄色LED和4位数码管制作一个交通信号灯,并在数码管上显示倒计时。这个项目不仅展示了基本的Arduino编程和硬件控制,还涉及到定时和显示技术,非常适合初学者和爱好者。:连接到Arduino的数字引脚2。:连接到Arduino的数字引脚3。:连接到Arduino的数字引脚4。:连接到Arduino的数字引脚5。:连接到Ardu
·
在这个项目中,我们将使用Arduino Uno、红色LED、绿色LED、黄色LED和4位数码管制作一个交通信号灯,并在数码管上显示倒计时。这个项目不仅展示了基本的Arduino编程和硬件控制,还涉及到定时和显示技术,非常适合初学者和爱好者。
-
连接LED灯
-
红色LED:连接到Arduino的数字引脚2。
-
绿色LED:连接到Arduino的数字引脚3。
-
黄色LED:连接到Arduino的数字引脚4。
-
每个LED的负极(短脚)连接到GND。
-
-
连接4位数码管
-
CLK:连接到Arduino的数字引脚5。
-
DIO:连接到Arduino的数字引脚6。
-
VCC:连接到Arduino的5V。
-
GND:连接到Arduino的GND。
-
#include <TM1637Display.h>
// 定义LED引脚
const int redLED = 2;
const int greenLED = 3;
const int yellowLED = 4;
// 定义数码管引脚
const int CLK = 5;
const int DIO = 6;
// 初始化TM1637显示
TM1637Display display(CLK, DIO);
// 定义信号灯状态
enum TrafficLightState {
RED,
GREEN,
YELLOW
};
// 定义倒计时时间
const int redDuration = 10; // 红灯持续时间(秒)
const int greenDuration = 10; // 绿灯持续时间(秒)
const int yellowDuration = 5; // 黄灯持续时间(秒)
// 全局变量
TrafficLightState currentState = RED;
unsigned long startTime = 0;
int remainingTime = 0;
void setup() {
// 初始化LED引脚
pinMode(redLED, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
// 初始化显示
display.setBrightness(0x0f); // 设置亮度
// 初始化信号灯状态
startTime = millis();
remainingTime = redDuration;
digitalWrite(redLED, HIGH);
displayCountdown(remainingTime);
}
void loop() {
unsigned long currentTime = millis();
int elapsedTime = (currentTime - startTime) / 1000; // 计算经过的时间(秒)
if (elapsedTime >= remainingTime) {
// 切换信号灯状态
switch (currentState) {
case RED:
currentState = GREEN;
remainingTime = greenDuration;
digitalWrite(redLED, LOW);
digitalWrite(greenLED, HIGH);
break;
case GREEN:
currentState = YELLOW;
remainingTime = yellowDuration;
digitalWrite(greenLED, LOW);
digitalWrite(yellowLED, HIGH);
break;
case YELLOW:
currentState = RED;
remainingTime = redDuration;
digitalWrite(yellowLED, LOW);
digitalWrite(redLED, HIGH);
break;
}
startTime = currentTime;
}
// 更新倒计时显示
displayCountdown(remainingTime - elapsedTime);
}
void displayCountdown(int time) {
// 确保time在0到99之间
time = time % 100;
int tens = time / 10;
int units = time % 10;
// 清空前两位的显示内容
uint8_t clearSegments[] = {0x00, 0x00, 0x00, 0x00};
display.setSegments(clearSegments, 0, 2);
// 显示倒计时,只在最后两位显示
display.showNumberDecEx(tens * 10 + units, 0b0111, false, 2, 2);
}

更多推荐



所有评论(0)