在智能交通系统中,交通灯起着至关重要的作用。今天,我将与大家分享一个有趣的项目——利用Arduino Uno、LED交通灯和0.96寸OLED显示屏制作一个智能交通灯系统,该系统不仅能够模拟交通灯的正常运行,还能在OLED屏幕上实时显示当前亮起的灯颜色以及剩余时间的倒计时,让整个交通灯的运行状态一目了然。
交通灯作为城市交通的重要组成部分,其准确性和可视性对于保障交通安全和提高交通效率至关重要。传统的交通灯大多只能通过灯的颜色变化来指示交通信号,而无法提供更详细的信息。通过引入OLED显示屏,我们可以为交通灯系统增添更多的交互性和信息展示功能,为未来的智能交通系统探索一种可能的实现方式。
交通信号灯连接
-
红色LED的长脚(正极)连接到Arduino Uno的数字引脚10。
-
黄色LED的长脚连接到数字引脚11。
-
绿色LED的长脚连接到数字引脚12。
-
GND连接到Arduino Uno的GND引脚。
OLED(IIC)显示屏连接
-
OLED显示屏的VCC引脚连接到Arduino Uno的5V引脚。
-
OLED显示屏的GND引脚连接到Arduino Uno的GND引脚。
-
OLED显示屏的SCL引脚连接到Arduino Uno的A5引脚。
-
OLED显示屏的SDA引脚连接到Arduino Uno的A4引脚。
软件库安装
在编写程序之前,我们需要先安装Adafruit_SSD1306库以及依赖项Adafruit GFX Library。这两个库可以通过Arduino IDE的内置管理器轻松获取。安装完成后,我们就可以在程序中调用这些库来控制OLED显示屏了。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int redLed = 10;
int yellowLed = 11;
int greenLed = 12;
void setup() {
pinMode(redLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(greenLed, OUTPUT);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.display(); //show splashscreen
delay(2000); // Pause for 2 seconds
display.clearDisplay(); // clears the screen and buffer
}
void loop() {
//红灯亮
display.clearDisplay();
display.setTextSize(1); // Draw 1X-scale text
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0); // Start at top-left corner
display.println(F("Red light"));
display.display();
for(int i = 5; i > 0; i--) {
digitalWrite(redLed, HIGH);
digitalWrite(yellowLed, LOW);
digitalWrite(greenLed, LOW);
display.clearDisplay();
display.setTextSize(1); // Draw 1X-scale text
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0); // Start at top-left corner
display.println(F("Red light"));
display.setCursor(0,10); // Start at top-left corner
display.print("Time left: ");
display.print(i);
display.print("s");
display.display();
delay(1000); //红灯亮1秒
}
//黄灯亮
display.clearDisplay();
display.setTextSize(1); // Draw 1X-scale text
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0); // Start at top-left corner
display.println(F("Yellow light"));
display.display();
for(int i = 2; i > 0; i--) {
digitalWrite(redLed, LOW);
digitalWrite(yellowLed, HIGH);
digitalWrite(greenLed, LOW);
display.clearDisplay();
display.setTextSize(1); // Draw 1X-scale text
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0); // Start at top-left corner
display.println(F("Yellow light"));
display.setCursor(0,10); // Start at top-left corner
display.print("Time left: ");
display.print(i);
display.print("s");
display.display();
delay(1000); //黄灯亮1秒
}
//绿灯亮
display.clearDisplay();
display.setTextSize(1); // Draw 1X-scale text
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0); // Start at top-left corner
display.println(F("Green light"));
display.display();
for(int i = 5; i > 0; i--) {
digitalWrite(redLed, LOW);
digitalWrite(yellowLed, LOW);
digitalWrite(greenLed, HIGH);
display.clearDisplay();
display.setTextSize(1); // Draw 1X-scale text
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0); // Start at top-left corner
display.println(F("Green light"));
display.setCursor(0,10); // Start at top-left corner
display.print("Time left: ");
display.print(i);
display.print("s");
display.display();
delay(1000); //绿灯亮1秒
}
}