在这个项目中,我们将使用Arduino Uno、红色LED、绿色LED、黄色LED和4位数码管制作一个交通信号灯,并在数码管上显示倒计时。这个项目不仅展示了基本的Arduino编程和硬件控制,还涉及到定时和显示技术,非常适合初学者和爱好者。

  1. 连接LED灯

    • 红色LED:连接到Arduino的数字引脚2。

    • 绿色LED:连接到Arduino的数字引脚3。

    • 黄色LED:连接到Arduino的数字引脚4。

    • 每个LED的负极(短脚)连接到GND。

  2. 连接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);
}

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐