设计基于Arduino的双向交通灯系统,实现控制、方向显示、10秒倒计时功能。 二 实训要求 1、 基本要求 (1) 按照题目要求独立完成Arduino程序设计。 (2)显示南北两个方向的交通灯状态(红、黄、绿),共6只灯。 (3)每隔10秒钟切换一个方向,绿灯亮之前黄灯开始闪烁三次结束。 (4)通过点阵显示当前正在通行的方向和倒计时时间。 (5)通过按键控制,调整通行时间。 (6)通过按键设置紧急状态(红灯全亮)。 2、发挥部分 1、设置人行道通行指示灯,并通过按键控制 2、紧急状态期间可通过蜂鸣器报警 3、其它。
时间: 2024-02-20 16:56:50 浏览: 243
sketch_jun10a_基于arduino的交通灯设计_Sketch!_
5星 · 资源好评率100%
很好,这是一个非常有趣的项目!我可以提供一些思路和代码示例,帮助你完成这个项目。
首先,我们需要准备以下材料:
- 1个Arduino主板
- 6只LED灯(3个红色、2个黄色、1个绿色)
- 1个4x4点阵LED显示屏
- 2个按键
- 1个蜂鸣器
- 杜邦线若干
接下来,我们可以按照以下步骤进行程序设计:
1. 定义引脚和变量
```c
// 定义LED灯的引脚
#define LED_N_RED 2
#define LED_N_YELLOW 3
#define LED_N_GREEN 4
#define LED_S_RED 5
#define LED_S_YELLOW 6
#define LED_S_GREEN 7
// 定义按键引脚
#define BUTTON_UP 8
#define BUTTON_DOWN 9
#define BUTTON_EMERGENCY 10
// 定义点阵显示屏引脚
#define LED_MATRIX_DIN 11
#define LED_MATRIX_CS 12
#define LED_MATRIX_CLK 13
// 定义倒计时时间和状态
int count_down = 10; // 初始倒计时时间为10秒
bool is_emergency = false; // 是否处于紧急状态
// 定义点阵显示内容
byte led_matrix_data[4] = {0, 0, 0, 0}; // 初始化为空
// 定义计时器
unsigned long timer = 0;
```
2. 初始化引脚和点阵显示屏
```c
void setup() {
// 初始化LED灯引脚,设置为输出模式
pinMode(LED_N_RED, OUTPUT);
pinMode(LED_N_YELLOW, OUTPUT);
pinMode(LED_N_GREEN, OUTPUT);
pinMode(LED_S_RED, OUTPUT);
pinMode(LED_S_YELLOW, OUTPUT);
pinMode(LED_S_GREEN, OUTPUT);
// 初始化按键引脚,设置为输入模式
pinMode(BUTTON_UP, INPUT_PULLUP);
pinMode(BUTTON_DOWN, INPUT_PULLUP);
pinMode(BUTTON_EMERGENCY, INPUT_PULLUP);
// 初始化点阵显示屏
LedControl lc = LedControl(LED_MATRIX_DIN, LED_MATRIX_CLK, LED_MATRIX_CS, 1);
lc.shutdown(0, false); // 打开点阵显示屏
lc.setIntensity(0, 15); // 设置亮度
lc.clearDisplay(0); // 清空显示内容
}
```
3. 实现交通灯控制逻辑
```c
void traffic_light_control(bool is_north) {
// 设置南北方向灯的状态
if (is_north) {
digitalWrite(LED_N_RED, HIGH);
digitalWrite(LED_N_YELLOW, LOW);
digitalWrite(LED_N_GREEN, LOW);
digitalWrite(LED_S_RED, LOW);
digitalWrite(LED_S_YELLOW, LOW);
digitalWrite(LED_S_GREEN, HIGH);
led_matrix_data[0] = B00011000; // 显示南向
} else {
digitalWrite(LED_N_RED, LOW);
digitalWrite(LED_N_YELLOW, LOW);
digitalWrite(LED_N_GREEN, HIGH);
digitalWrite(LED_S_RED, HIGH);
digitalWrite(LED_S_YELLOW, LOW);
digitalWrite(LED_S_GREEN, LOW);
led_matrix_data[0] = B00001111; // 显示北向
}
// 倒计时前3秒闪烁黄灯
if (count_down <= 3) {
int blink = (millis() / 500) % 2;
digitalWrite(is_north ? LED_N_YELLOW : LED_S_YELLOW, blink);
}
// 切换方向和倒计时
if (millis() - timer >= count_down * 1000) {
timer = millis();
count_down = 10; // 重置倒计时时间
// 切换方向
traffic_light_control(!is_north);
}
}
```
4. 实现倒计时和紧急状态控制
```c
void count_down_control() {
// 按键控制倒计时时间
if (digitalRead(BUTTON_UP) == LOW) {
count_down++;
}
if (digitalRead(BUTTON_DOWN) == LOW) {
count_down--;
}
// 紧急状态控制
if (digitalRead(BUTTON_EMERGENCY) == LOW) {
is_emergency = true;
} else {
is_emergency = false;
}
// 显示倒计时时间和当前方向
led_matrix_data[1] = count_down / 10;
led_matrix_data[2] = count_down % 10;
if (is_emergency) {
led_matrix_data[3] = B00000100; // 显示紧急状态
} else {
led_matrix_data[3] = B00000000; // 清空显示内容
}
// 倒计时结束时报警
if (count_down == 0 && !is_emergency) {
tone(BUZZER_PIN, 1000, 1000);
delay(1000);
noTone(BUZZER_PIN);
count_down = 10;
}
}
```
5. 主程序逻辑
```c
void loop() {
// 控制交通灯
traffic_light_control(true);
// 控制倒计时和紧急状态
count_down_control();
// 更新点阵显示屏
LedControl lc = LedControl(LED_MATRIX_DIN, LED_MATRIX_CLK, LED_MATRIX_CS, 1);
for (int i = 0; i < 4; i++) {
lc.setRow(0, i, led_matrix_data[i]);
}
}
```
这样,我们就完成了基于Arduino的双向交通灯系统的设计和编程。当然,还可以根据个人兴趣和需求进行更多的拓展和改进,例如添加人行道通行指示灯、调整交通灯控制逻辑等等。
阅读全文