Arduino Uno打造智能交通灯:OLED(IIC)屏实时显示倒计时与当前交通灯颜色

在智能交通系统中,交通灯起着至关重要的作用。今天,我将与大家分享一个有趣的项目——利用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秒
  }
}

### 使用四个Arduino板实现红绿灯控制系统 #### 硬件需求 为了构建一个基于四个Arduino板的红绿灯控制系统,所需的主要组件如下[^3]: - Arduino Uno R3 开发板 × 4 - 红、黄、绿三色LED发光二极管各一套(每套至少含4个) - 杜邦线 若干 - 电阻 (建议220Ω) #### 连接方法 每个Arduino板将模拟一个方向上的交通信号灯。对于每一个Arduino板来说,红色、黄色和绿色LED应该按照以下方式连接: - 将红色LED的正极接到数字引脚9; - 黄色LED的正极接到数字引脚10; - 绿色LED的正极接到数字引脚11。 负极端则全部接地(GND),并通过串联适当大小的限流电阻保护LED不被过电流损坏。 #### 编程逻辑 下面提供了一个简单的Arduino代码片段用于控制单个方向上的交通灯状态变化: ```cpp // 定义引脚编号 const int redPin = 9; const int yellowPin = 10; const int greenPin = 11; void setup() { pinMode(redPin, OUTPUT); pinMode(yellowPin, OUTPUT); pinMode(greenPin, OUTPUT); // 初始状态下设置为红灯亮起 digitalWrite(redPin, HIGH); } void loop() { trafficLightSequence(); } void trafficLightSequence(){ // Green light on for 5 seconds turnOnGreen(); delay(5000); // Yellow light on for 2 seconds as warning before switching to red turnOnYellow(); delay(2000); // Red light on for 5 seconds while other directions get their greens/yellows turnOnRed(); delay(5000); } void turnOnRed(){digitalWrite(redPin,HIGH);} void turnOnYellow(){digitalWrite(yellowPin,HIGH);} void turnOnGreen(){digitalWrite(greenPin,HIGH);} void turnOffAllLights(){ digitalWrite(redPin, LOW); digitalWrite(yellowPin, LOW); digitalWrite(greenPin, LOW); } ``` 这段代码定义了基本的颜色切换序列,并且可以作为基础模板应用于所有四个Arduino控制器上。需要注意的是,在实际部署时还需要考虑不同方向之间的协调工作,确保不会发生冲突或混乱的情况。 为了让整个系统的运作更为流畅和谐调一致,可以通过串口通信或其他形式的数据交换机制让各个节点之间同步时间间隔或者共享当前的状态信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值