题目一:交通灯设计 一 实训任务 设计基于Arduino的双向交通灯系统,实现控制、方向显示、10秒倒计时功能。 二 实训要求 1、 基本要求 (1) 按照题目要求独立完成Arduino程序设计。 (2)显示南北两个方向的交通灯状态(红、黄、绿),共6只灯。 (3)每隔10秒钟切换一个方向,绿灯亮之前黄灯开始闪烁三次结束。 (4)通过点阵显示当前正在通行的方向和倒计时时间。 (5)通过按键控制,调整通行时间。 (6)通过按键设置紧急状态(红灯全亮)。 2、发挥部分 1、设置人行道通行指示灯,并通过按键控制 2、紧急状态期间可通过蜂鸣器报警 3、其它。
时间: 2024-03-18 19:40:00 浏览: 174
sketch_jun10a_基于arduino的交通灯设计_Sketch!_
5星 · 资源好评率100%
为了实现上述要求,可以按照以下步骤设计Arduino程序:
1. 定义引脚
首先需要定义每个交通灯的引脚,以及点阵和按键的引脚,例如:
```
#define LED_NS_RED 2
#define LED_NS_YELLOW 3
#define LED_NS_GREEN 4
#define LED_EW_RED 5
#define LED_EW_YELLOW 6
#define LED_EW_GREEN 7
#define DOT_MATRIX Data
#define BUTTON_UP 8
#define BUTTON_DOWN 9
#define BUTTON_EMERGENCY 10
#define BUZZER 11
```
2. 初始化引脚
在`setup()`函数中,需要初始化每个引脚的状态,例如:
```
void setup() {
pinMode(LED_NS_RED, OUTPUT);
pinMode(LED_NS_YELLOW, OUTPUT);
pinMode(LED_NS_GREEN, OUTPUT);
pinMode(LED_EW_RED, OUTPUT);
pinMode(LED_EW_YELLOW, OUTPUT);
pinMode(LED_EW_GREEN, OUTPUT);
pinMode(DOT_MATRIX, OUTPUT);
pinMode(BUTTON_UP, INPUT_PULLUP);
pinMode(BUTTON_DOWN, INPUT_PULLUP);
pinMode(BUTTON_EMERGENCY, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
}
```
3. 控制交通灯状态
需要编写函数来控制交通灯的状态,例如:
```
void setLights(int nsRed, int nsYellow, int nsGreen, int ewRed, int ewYellow, int ewGreen) {
digitalWrite(LED_NS_RED, nsRed);
digitalWrite(LED_NS_YELLOW, nsYellow);
digitalWrite(LED_NS_GREEN, nsGreen);
digitalWrite(LED_EW_RED, ewRed);
digitalWrite(LED_EW_YELLOW, ewYellow);
digitalWrite(LED_EW_GREEN, ewGreen);
}
```
其中,`nsRed`、`nsYellow`、`nsGreen`、`ewRed`、`ewYellow`、`ewGreen` 分别代表南北方向的红、黄、绿灯和东西方向的红、黄、绿灯的状态。可以通过调用这个函数来控制交通灯状态。
4. 控制倒计时
可以使用`delay()`函数来实现倒计时,例如:
```
void countdown(int seconds) {
for (int i = seconds; i >= 0; i--) {
displayDirection();
displayCountdown(i);
delay(1000);
}
}
```
其中,`seconds`代表倒计时的秒数。在倒计时期间,可以通过点阵显示当前交通方向和倒计时时间,分别通过`displayDirection()`和`displayCountdown()`函数实现。
5. 控制黄灯闪烁
可以使用`for`循环来控制黄灯闪烁,例如:
```
void blinkYellow(int times) {
for (int i = 0; i < times; i++) {
setLights(0, 1, 0, 0, 1, 0);
delay(500);
setLights(0, 0, 0, 0, 0, 0);
delay(500);
}
}
```
其中,`times`代表黄灯闪烁的次数。在黄灯闪烁期间,需要让南北方向和东西方向的黄灯同时闪烁。
6. 控制交通方向切换
可以编写函数来控制交通方向的切换,例如:
```
void switchDirection() {
setLights(1, 0, 0, 0, 0, 1); // 红灯亮
delay(5000); // 等待5秒
blinkYellow(3); // 黄灯闪烁三次
setLights(0, 0, 1, 1, 0, 0); // 绿灯亮
countdown(10); // 倒计时10秒
}
```
在这个函数中,首先将南北方向和东西方向的红灯同时亮起,等待5秒钟后,黄灯开始闪烁,闪烁三次后,南北方向绿灯亮起,同时点阵显示南北方向的箭头,进行倒计时。
7. 控制按键
可以使用`digitalRead()`函数来读取按键状态,例如:
```
void checkButtons() {
if (digitalRead(BUTTON_UP) == LOW) {
countdownTime++;
}
if (digitalRead(BUTTON_DOWN) == LOW) {
countdownTime--;
}
if (digitalRead(BUTTON_EMERGENCY) == LOW) {
emergency();
}
}
```
其中,`countdownTime`代表倒计时时间,按下“+”键可以增加倒计时时间,按下“-”键可以减少倒计时时间,按下紧急按钮可以进入紧急状态。
8. 控制点阵显示
可以使用`shiftOut()`函数来控制点阵显示,例如:
```
void displayDirection() {
byte direction = 0b00000000;
if (currentDirection == NORTH_SOUTH) {
direction = 0b00000101;
} else if (currentDirection == EAST_WEST) {
direction = 0b00001010;
}
digitalWrite(DOT_MATRIX_CS, LOW);
shiftOut(DOT_MATRIX, DOT_MATRIX_CLOCK, MSBFIRST, direction);
digitalWrite(DOT_MATRIX_CS, HIGH);
}
```
其中,`currentDirection`代表当前通行的方向,可以根据这个值来显示对应的箭头。
9. 控制蜂鸣器
可以使用`tone()`函数和`noTone()`函数来控制蜂鸣器,例如:
```
void emergency() {
setLights(1, 0, 0, 1, 0, 0); // 红灯全亮
tone(BUZZER, 1000); // 蜂鸣器报警
delay(5000);
noTone(BUZZER);
setLights(0, 0, 0, 0, 0, 0); // 所有灯熄灭
}
```
在这个函数中,首先将南北方向和东西方向的红灯同时亮起,蜂鸣器报警,等待5秒钟后,蜂鸣器停止报警,所有灯熄灭。
完整的程序代码如下:
阅读全文