Arduino 编写blink闪烁灯

Arduino Blink 闪烁灯完全指南

1. 基础版本

1.1 最简单的Blink程序

// 最简单的Blink程序 - 使用板载LED
void setup() {
  // 初始化引脚模式 - D13引脚连接到板载LED
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // LED亮
  delay(1000);                       // 等待1秒
  digitalWrite(LED_BUILTIN, LOW);    // LED灭
  delay(1000);                       // 等待1秒
}

1.2 使用自定义引脚

// 使用外部LED连接到特定引脚
const int LED_PIN = 13;  // 可以改为任何数字引脚

void setup() {
  pinMode(LED_PIN, OUTPUT);  // 将引脚设置为输出模式
  Serial.begin(9600);        // 初始化串口用于调试
  Serial.println("Blink Program Started!");
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  Serial.println("LED ON");    // 串口输出状态
  delay(1000);                 // 亮1秒
  
  digitalWrite(LED_PIN, LOW);
  Serial.println("LED OFF");   // 串口输出状态
  delay(1000);                 // 灭1秒
}

2. 变体版本

2.1 不对称闪烁

const int LED_PIN = 13;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // 亮的时间短,灭的时间长 - 心跳效果
  digitalWrite(LED_PIN, HIGH);
  delay(200);                    // 亮0.2秒
  
  digitalWrite(LED_PIN, LOW);
  delay(800);                    // 灭0.8秒
  
  // Morse码SOS: ... --- ...
  // S: 短亮3次
  for(int i = 0; i < 3; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(200);     // 短点
    digitalWrite(LED_PIN, LOW);
    delay(200);     // 字符内间隔
  }
  delay(400);       // 字符间间隔
  
  // O: 长亮3次
  for(int i = 0; i < 3; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(600);     // 长划
    digitalWrite(LED_PIN, LOW);
    delay(200);     // 字符内间隔
  }
  delay(400);       // 字符间间隔
  
  // S: 短亮3次
  for(int i = 0; i < 3; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(200);     // 短点
    digitalWrite(LED_PIN, LOW);
    delay(200);     // 字符内间隔
  }
  delay(2000);      // 单词间长间隔
}

2.2 呼吸灯效果

// 使用PWM实现呼吸灯效果
const int LED_PIN = 9;  // 必须是支持PWM的引脚(3,5,6,9,10,11)

void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // 亮度逐渐增加
  for(int brightness = 0; brightness <= 255; brightness++) {
    analogWrite(LED_PIN, brightness);  // PWM输出,0-255
    delay(5);                          // 控制变化速度
  }
  
  // 亮度逐渐减少
  for(int brightness = 255; brightness >= 0; brightness--) {
    analogWrite(LED_PIN, brightness);
    delay(5);
  }
  
  delay(1000);  // 呼吸完成后暂停1秒
}

3. 多LED控制

3.1 多个LED流水灯

// 控制多个LED实现流水灯效果
const int NUM_LEDS = 4;
int ledPins[NUM_LEDS] = {8, 9, 10, 11};  // 4个LED连接的引脚

void setup() {
  // 初始化所有LED引脚
  for(int i = 0; i < NUM_LEDS; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
  
  Serial.begin(9600);
  Serial.println("Running LED Chaser...");
}

void loop() {
  // 正向流动
  for(int i = 0; i < NUM_LEDS; i++) {
    digitalWrite(ledPins[i], HIGH);  // 点亮当前LED
    delay(200);                      // 保持200毫秒
    digitalWrite(ledPins[i], LOW);   // 熄灭当前LED
  }
  
  // 反向流动
  for(int i = NUM_LEDS - 1; i >= 0; i--) {
    digitalWrite(ledPins[i], HIGH);
    delay(200);
    digitalWrite(ledPins[i], LOW);
  }
  
  // 同时闪烁效果
  for(int i = 0; i < 3; i++) {
    // 全部点亮
    for(int j = 0; j < NUM_LEDS; j++) {
      digitalWrite(ledPins[j], HIGH);
    }
    delay(200);
    
    // 全部熄灭
    for(int j = 0; j < NUM_LEDS; j++) {
      digitalWrite(ledPins[j], LOW);
    }
    delay(200);
  }
}

3.2 RGB LED控制

// 控制RGB LED显示不同颜色
const int RED_PIN = 9;
const int GREEN_PIN = 10;
const int BLUE_PIN = 11;

void setup() {
  pinMode(RED_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);
  
  Serial.begin(9600);
  Serial.println("RGB LED Controller Ready");
}

void loop() {
  // 红色
  setColor(255, 0, 0);
  Serial.println("Red");
  delay(1000);
  
  // 绿色
  setColor(0, 255, 0);
  Serial.println("Green");
  delay(1000);
  
  // 蓝色
  setColor(0, 0, 255);
  Serial.println("Blue");
  delay(1000);
  
  // 黄色
  setColor(255, 255, 0);
  Serial.println("Yellow");
  delay(1000);
  
  // 紫色
  setColor(255, 0, 255);
  Serial.println("Purple");
  delay(1000);
  
  // 青色
  setColor(0, 255, 255);
  Serial.println("Cyan");
  delay(1000);
  
  // 白色
  setColor(255, 255, 255);
  Serial.println("White");
  delay(1000);
  
  // 彩虹渐变
  rainbowEffect();
}

void setColor(int red, int green, int blue) {
  analogWrite(RED_PIN, red);
  analogWrite(GREEN_PIN, green);
  analogWrite(BLUE_PIN, blue);
}

void rainbowEffect() {
  Serial.println("Rainbow Effect");
  
  // 红色到绿色
  for(int i = 0; i <= 255; i++) {
    setColor(255 - i, i, 0);
    delay(10);
  }
  
  // 绿色到蓝色
  for(int i = 0; i <= 255; i++) {
    setColor(0, 255 - i, i);
    delay(10);
  }
  
  // 蓝色到红色
  for(int i = 0; i <= 255; i++) {
    setColor(i, 0, 255 - i);
    delay(10);
  }
}

4.1 按钮控制LED

// 按钮控制LED开关
const int LED_PIN = 13;
const int BUTTON_PIN = 2;

int buttonState = 0;        // 存储按钮状态

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);  // 使用内部上拉电阻
  
  Serial.begin(9600);
  Serial.println("Button-controlled Blink");
}

void loop() {
  // 读取按钮状态
  buttonState = digitalRead(BUTTON_PIN);
  
  // 注意:使用上拉电阻时,按下为LOW,释放为HIGH
  if (buttonState == LOW) {
    digitalWrite(LED_PIN, HIGH);  // 按下时LED亮
    Serial.println("Button pressed - LED ON");
  } else {
    digitalWrite(LED_PIN, LOW);   // 释放时LED灭
    Serial.println("Button released - LED OFF");
  }
  
  delay(50);  // 防抖动延迟
}

4.2 双击检测

// 检测按钮双击控制LED
const int LED_PIN = 13;
const int BUTTON_PIN = 2;

unsigned long lastPressTime = 0;
bool ledState = false;
int clickCount = 0;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  
  Serial.begin(9600);
  Serial.println("Double Click Detector");
}

void loop() {
  int buttonState = digitalRead(BUTTON_PIN);
  
  if (buttonState == LOW) {  // 按钮按下
    delay(50);  // 防抖动
    
    if (digitalRead(BUTTON_PIN) == LOW) {  // 确认按下
      unsigned long currentTime = millis();
      
      // 检查是否是双击(500ms内两次按下)
      if (currentTime - lastPressTime < 500) {
        clickCount++;
        
        if (clickCount == 2) {  // 双击
          ledState = !ledState;  // 切换LED状态
          digitalWrite(LED_PIN, ledState);
          
          if (ledState) {
            Serial.println("Double click - LED ON");
          } else {
            Serial.println("Double click - LED OFF");
          }
          
          clickCount = 0;  // 重置计数
        }
      } else {
        clickCount = 1;  // 第一次点击
      }
      
      lastPressTime = currentTime;
      
      // 等待按钮释放
      while (digitalRead(BUTTON_PIN) == LOW) {
        delay(10);
      }
    }
  }
  
  // 超时重置
  if (millis() - lastPressTime > 1000) {
    clickCount = 0;
  }
}

5. 高级效果

// 使用定时器中断实现精确闪烁
#include <TimerOne.h>

const int LED_PIN = 13;
bool ledState = false;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
  
  // 初始化Timer1,设置中断间隔500000微秒(0.5秒)
  Timer1.initialize(500000);
  
  // 绑定中断处理函数
  Timer1.attachInterrupt(blinkISR);
  
  Serial.println("Timer Interrupt Blink Started");
}

void loop() {
  // 主循环可以执行其他任务
  // LED闪烁由中断自动处理
  
  // 示例:每秒打印一次状态
  static unsigned long lastPrint = 0;
  if (millis() - lastPrint >= 1000) {
    Serial.print("Running... Uptime: ");
    Serial.print(millis() / 1000);
    Serial.println("s");
    lastPrint = millis();
  }
}

// 中断服务程序 - 必须简短
void blinkISR() {
  ledState = !ledState;
  digitalWrite(LED_PIN, ledState);
}

5.2 非阻塞闪烁

// 不使用delay()的非阻塞闪烁
const int LED_PIN = 13;

// 时间变量
unsigned long previousMillis = 0;
const long interval = 1000;  // 闪烁间隔(毫秒)

bool ledState = false;       // LED当前状态

void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
  Serial.println("Non-blocking Blink Started");
}

void loop() {
  // 获取当前时间
  unsigned long currentMillis = millis();
  
  // 检查是否到达切换时间
  if (currentMillis - previousMillis >= interval) {
    // 保存上次切换时间
    previousMillis = currentMillis;
    
    // 切换LED状态
    ledState = !ledState;
    digitalWrite(LED_PIN, ledState);
    
    // 输出状态
    if (ledState) {
      Serial.println("LED ON");
    } else {
      Serial.println("LED OFF");
    }
  }
  
  // 这里可以添加其他非阻塞任务
  // 例如:读取传感器、处理串口数据等
  checkSerial();
}

void checkSerial() {
  if (Serial.available()) {
    char command = Serial.read();
    
    switch(command) {
      case 'f':  // 快速闪烁
        interval = 200;
        Serial.println("Fast blink mode");
        break;
      case 's':  // 慢速闪烁
        interval = 2000;
        Serial.println("Slow blink mode");
        break;
      case 'n':  // 正常闪烁
        interval = 1000;
        Serial.println("Normal blink mode");
        break;
    }
  }
}

6. 模式切换系统

6.1 多种闪烁模式

// 多模式LED控制器
const int LED_PIN = 13;
const int BUTTON_PIN = 2;

int mode = 0;            // 当前模式
const int MODE_COUNT = 4; // 模式数量

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  
  Serial.begin(9600);
  Serial.println("Multi-mode LED Controller");
  Serial.println("Press button to change mode");
}

void loop() {
  // 检查按钮切换模式
  if (digitalRead(BUTTON_PIN) == LOW) {
    delay(50);  // 防抖动
    if (digitalRead(BUTTON_PIN) == LOW) {
      mode = (mode + 1) % MODE_COUNT;
      Serial.print("Mode changed to: ");
      Serial.println(mode);
      
      // 等待按钮释放
      while(digitalRead(BUTTON_PIN) == LOW) {
        delay(10);
      }
    }
  }
  
  // 根据模式执行不同的闪烁效果
  switch(mode) {
    case 0:
      mode0Blink();  // 正常闪烁
      break;
    case 1:
      mode1Blink();  // 快速闪烁
      break;
    case 2:
      mode2Blink();  // 心跳效果
      break;
    case 3:
      mode3Blink();  // SOS信号
      break;
  }
}

// 模式0: 正常闪烁 (1Hz)
void mode0Blink() {
  digitalWrite(LED_PIN, HIGH);
  delay(500);
  digitalWrite(LED_PIN, LOW);
  delay(500);
}

// 模式1: 快速闪烁 (5Hz)
void mode1Blink() {
  digitalWrite(LED_PIN, HIGH);
  delay(100);
  digitalWrite(LED_PIN, LOW);
  delay(100);
}

// 模式2: 心跳效果
void mode2Blink() {
  digitalWrite(LED_PIN, HIGH);
  delay(200);
  digitalWrite(LED_PIN, LOW);
  delay(200);
  digitalWrite(LED_PIN, HIGH);
  delay(200);
  digitalWrite(LED_PIN, LOW);
  delay(600);
}

// 模式3: SOS摩尔斯电码
void mode3Blink() {
  // S: ... (短点3次)
  for(int i = 0; i < 3; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(200);
    digitalWrite(LED_PIN, LOW);
    delay(200);
  }
  delay(400);
  
  // O: --- (长划3次)
  for(int i = 0; i < 3; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(600);
    digitalWrite(LED_PIN, LOW);
    delay(200);
  }
  delay(400);
  
  // S: ... (短点3次)
  for(int i = 0; i < 3; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(200);
    digitalWrite(LED_PIN, LOW);
    delay(200);
  }
  delay(1000);
}

6.2 串口控制模式

// 通过串口命令控制LED模式
const int LED_PIN = 13;

enum BlinkMode {
  MODE_OFF,
  MODE_SLOW,
  MODE_NORMAL,
  MODE_FAST,
  MODE_BREATH,
  MODE_RAINBOW
};

BlinkMode currentMode = MODE_OFF;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(115200);
  
  Serial.println("=== LED Control System ===");
  Serial.println("Commands:");
  Serial.println("  off     - Turn LED off");
  Serial.println("  slow    - Slow blink (2Hz)");
  Serial.println("  normal  - Normal blink (1Hz)");
  Serial.println("  fast    - Fast blink (5Hz)");
  Serial.println("  breath  - Breathing effect");
  Serial.println("  rainbow - RGB rainbow effect");
}

void loop() {
  // 处理串口命令
  if (Serial.available()) {
    String command = Serial.readStringUntil('\n');
    command.trim();
    
    if (command == "off") {
      currentMode = MODE_OFF;
      digitalWrite(LED_PIN, LOW);
      Serial.println("LED off");
    }
    else if (command == "slow") {
      currentMode = MODE_SLOW;
      Serial.println("Slow blink mode");
    }
    else if (command == "normal") {
      currentMode = MODE_NORMAL;
      Serial.println("Normal blink mode");
    }
    else if (command == "fast") {
      currentMode = MODE_FAST;
      Serial.println("Fast blink mode");
    }
    else if (command == "breath") {
      currentMode = MODE_BREATH;
      Serial.println("Breathing effect mode");
    }
    else if (command == "rainbow") {
      currentMode = MODE_RAINBOW;
      Serial.println("Rainbow effect mode");
    }
    else {
      Serial.println("Unknown command");
    }
  }
  
  // 根据当前模式执行
  switch(currentMode) {
    case MODE_SLOW:
      digitalWrite(LED_PIN, HIGH);
      delay(1000);
      digitalWrite(LED_PIN, LOW);
      delay(1000);
      break;
      
    case MODE_NORMAL:
      digitalWrite(LED_PIN, HIGH);
      delay(500);
      digitalWrite(LED_PIN, LOW);
      delay(500);
      break;
      
    case MODE_FAST:
      digitalWrite(LED_PIN, HIGH);
      delay(100);
      digitalWrite(LED_PIN, LOW);
      delay(100);
      break;
      
    case MODE_BREATH:
      for(int i = 0; i <= 255; i++) {
        analogWrite(LED_PIN, i);
        delay(5);
      }
      for(int i = 255; i >= 0; i--) {
        analogWrite(LED_PIN, i);
        delay(5);
      }
      break;
      
    case MODE_OFF:
    default:
      // 什么都不做
      break;
  }
}

7.1 光控LED

// 根据环境光线控制LED
const int LED_PIN = 13;
const int LDR_PIN = A0;  // 光敏电阻

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(LDR_PIN, INPUT);
  
  Serial.begin(9600);
  Serial.println("Light-controlled LED");
}

void loop() {
  // 读取光敏电阻值(0-1023)
  int lightLevel = analogRead(LDR_PIN);
  
  Serial.print("Light level: ");
  Serial.println(lightLevel);
  
  // 根据光线强度控制LED
  if (lightLevel < 500) {  // 光线较暗
    digitalWrite(LED_PIN, HIGH);
    Serial.println("Dark - LED ON");
  } else {  // 光线较亮
    digitalWrite(LED_PIN, LOW);
    Serial.println("Bright - LED OFF");
  }
  
  delay(500);  // 每0.5秒检测一次
}

7.2 温度控制闪烁频率

// 根据温度改变LED闪烁频率
#include <DHT.h>

#define DHTPIN 2
#define DHTTYPE DHT11

const int LED_PIN = 13;

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  pinMode(LED_PIN, OUTPUT);
  dht.begin();
  
  Serial.begin(9600);
  Serial.println("Temperature-controlled Blink");
}

void loop() {
  // 读取温度
  float temperature = dht.readTemperature();
  
  if (isnan(temperature)) {
    Serial.println("Failed to read temperature!");
    return;
  }
  
  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.println("°C");
  
  // 根据温度计算闪烁间隔
  // 温度越高,闪烁越快
  int blinkInterval = map(temperature, 20, 35, 1000, 100);
  blinkInterval = constrain(blinkInterval, 100, 1000);
  
  Serial.print("Blink interval: ");
  Serial.print(blinkInterval);
  Serial.println("ms");
  
  // 闪烁一次
  digitalWrite(LED_PIN, HIGH);
  delay(blinkInterval / 2);  // 亮半周期
  digitalWrite(LED_PIN, LOW);
  delay(blinkInterval / 2);  // 灭半周期
}

8. 综合项目:智能状态指示灯

/*
智能状态指示灯系统
功能:
1. 正常模式:缓慢呼吸灯
2. 警告模式:黄色快速闪烁
3. 错误模式:红色常亮
4. 网络模式:蓝色心跳
5. 串口命令控制模式切换
*/

// 如果是RGB LED,使用以下引脚定义
const int RED_PIN = 9;
const int GREEN_PIN = 10;
const int BLUE_PIN = 11;

// 如果是单色LED,使用这个引脚
const int LED_PIN = 13;

enum SystemState {
  STATE_NORMAL,
  STATE_WARNING,
  STATE_ERROR,
  STATE_NETWORK,
  STATE_CUSTOM
};

SystemState currentState = STATE_NORMAL;

void setup() {
  // 初始化引脚
  pinMode(RED_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);
  
  // 初始化串口
  Serial.begin(115200);
  
  Serial.println("=== Smart Status Indicator ===");
  Serial.println("Available commands:");
  Serial.println("  normal   - Normal operation (green breathing)");
  Serial.println("  warning  - Warning state (yellow fast blink)");
  Serial.println("  error    - Error state (red solid)");
  Serial.println("  network  - Network activity (blue heartbeat)");
  Serial.println("  custom   - Custom pattern");
}

void loop() {
  // 处理串口命令
  handleSerialCommands();
  
  // 根据当前状态执行对应的LED模式
  switch(currentState) {
    case STATE_NORMAL:
      normalMode();
      break;
      
    case STATE_WARNING:
      warningMode();
      break;
      
    case STATE_ERROR:
      errorMode();
      break;
      
    case STATE_NETWORK:
      networkMode();
      break;
      
    case STATE_CUSTOM:
      customMode();
      break;
  }
}

void handleSerialCommands() {
  if (Serial.available()) {
    String command = Serial.readStringUntil('\n');
    command.trim();
    
    if (command == "normal") {
      currentState = STATE_NORMAL;
      Serial.println("Switched to NORMAL mode");
    }
    else if (command == "warning") {
      currentState = STATE_WARNING;
      Serial.println("Switched to WARNING mode");
    }
    else if (command == "error") {
      currentState = STATE_ERROR;
      Serial.println("Switched to ERROR mode");
    }
    else if (command == "network") {
      currentState = STATE_NETWORK;
      Serial.println("Switched to NETWORK mode");
    }
    else if (command == "custom") {
      currentState = STATE_CUSTOM;
      Serial.println("Switched to CUSTOM mode");
    }
  }
}

void normalMode() {
  // 绿色呼吸灯效果
  for(int brightness = 0; brightness <= 255; brightness++) {
    setColor(0, brightness, 0);
    delay(5);
    checkSerial();  // 非阻塞检查串口
  }
  for(int brightness = 255; brightness >= 0; brightness--) {
    setColor(0, brightness, 0);
    delay(5);
    checkSerial();  // 非阻塞检查串口
  }
}

void warningMode() {
  // 黄色快速闪烁(红+绿)
  setColor(255, 255, 0);  // 黄色
  delay(200);
  setColor(0, 0, 0);      // 熄灭
  delay(200);
}

void errorMode() {
  // 红色常亮
  setColor(255, 0, 0);
}

void networkMode() {
  // 蓝色心跳效果
  setColor(0, 0, 255);  // 亮
  delay(150);
  setColor(0, 0, 64);   // 暗
  delay(150);
  setColor(0, 0, 255);  // 亮
  delay(150);
  setColor(0, 0, 0);    // 灭
  delay(600);
}

void customMode() {
  // 自定义模式:彩虹渐变
  rainbowEffect();
}

void setColor(int red, int green, int blue) {
  analogWrite(RED_PIN, red);
  analogWrite(GREEN_PIN, green);
  analogWrite(BLUE_PIN, blue);
}

void rainbowEffect() {
  // 红->绿
  for(int i = 0; i <= 255; i++) {
    setColor(255 - i, i, 0);
    delay(10);
    checkSerial();
  }
  // 绿->蓝
  for(int i = 0; i <= 255; i++) {
    setColor(0, 255 - i, i);
    delay(10);
    checkSerial();
  }
  // 蓝->红
  for(int i = 0; i <= 255; i++) {
    setColor(i, 0, 255 - i);
    delay(10);
    checkSerial();
  }
}

void checkSerial() {
  if (Serial.available()) {
    String command = Serial.readString();
    command.trim();
    
    if (command == "normal" || command == "warning" || 
        command == "error" || command == "network") {
      // 切换模式时跳出当前循环
      return;
    }
  }
}

9. 电路连接示例

9.1 单LED连接

电路连接:
Arduino UNO           LED
───────              ──────
GND      ────────────┤ ├─── 负极(短脚)
D13      ──────220Ω──┤ ├─── 正极(长脚)

注意:
1. LED长脚为正极,短脚为负极
2. 必须串联220Ω电阻限流
3. 电阻可以连接在正极或负极一侧

9.2 RGB LED连接

共阳RGB LED连接:
Arduino UNO           RGB LED
───────              ──────
5V       ──────────── 公共阳极(长脚)
GND      ──────220Ω── R(红色)
D9       ──────220Ω── G(绿色)
D10      ──────220Ω── B(蓝色)

共阴RGB LED连接:
Arduino UNO           RGB LED
───────              ──────
GND      ──────────── 公共阴极(长脚)
D9       ──────220Ω── R(红色)
D10      ──────220Ω── G(绿色)
D11      ──────220Ω── B(蓝色)

注意:
1. 确认LED是共阳还是共阴
2. 每路都必须串联限流电阻
3. PWM引脚控制亮度

10. 常见问题与调试

10.1 LED不亮的检查步骤

// 调试代码:测试LED和引脚
const int TEST_PIN = 13;

void setup() {
  Serial.begin(9600);
  pinMode(TEST_PIN, OUTPUT);
  
  Serial.println("LED Test Program");
  Serial.println("Testing pin " + String(TEST_PIN));
}

void loop() {
  // 测试1:直接控制
  Serial.println("Test 1: Direct control");
  digitalWrite(TEST_PIN, HIGH);
  Serial.println("LED should be ON");
  delay(2000);
  digitalWrite(TEST_PIN, LOW);
  Serial.println("LED should be OFF");
  delay(2000);
  
  // 测试2:快速闪烁
  Serial.println("Test 2: Fast blink");
  for(int i = 0; i < 10; i++) {
    digitalWrite(TEST_PIN, HIGH);
    delay(100);
    digitalWrite(TEST_PIN, LOW);
    delay(100);
  }
  
  // 测试3:模拟呼吸效果
  Serial.println("Test 3: Breathing effect (PWM)");
  for(int i = 0; i <= 255; i++) {
    analogWrite(TEST_PIN, i);
    delay(10);
  }
  for(int i = 255; i >= 0; i--) {
    analogWrite(TEST_PIN, i);
    delay(10);
  }
  
  delay(2000);
}

10.2 故障排除清单

问题1:LED完全不亮
✅ 检查USB线是否连接
✅ 检查开发板电源灯是否亮
✅ 检查LED正负极是否接反
✅ 检查电阻是否连接正确
✅ 检查代码中引脚号是否正确
✅ 检查是否有其他程序占用引脚

问题2:LED常亮不闪烁
✅ 检查代码中是否有delay()
✅ 检查loop()函数逻辑
✅ 检查是否有其他设备干扰
✅ 检查电源是否稳定

问题3:闪烁频率不对
✅ 检查delay()参数单位(毫秒)
✅ 检查是否有其他代码影响时序
✅ 检查主频设置是否正确

问题4:PWM效果不明显
✅ 检查引脚是否支持PWM(带~符号)
✅ 检查PWM值范围(0-255)
✅ 检查LED类型(有些LED需要更高电压)

总结

学习路径建议:

  1. 初学者:从最简单的Blink开始,理解setup()和loop()
  2. 进阶学习:尝试修改delay时间,创建不同的闪烁模式
  3. 中级项目:加入按钮控制、传感器交互
  4. 高级应用:使用中断、PWM、多任务处理
  5. 实际应用:将Blink用作状态指示、警报信号等

最佳实践:

  1. 始终使用合适的限流电阻保护LED
  2. 添加串口输出用于调试
  3. 使用常量定义引脚号,便于修改
  4. 考虑使用非阻塞代码提高响应性
  5. 为不同的功能创建独立的函数

Blink程序虽然简单,但包含了Arduino编程的所有核心概念,是学习嵌入式系统的最佳起点!

posted @ 2026-01-02 17:11  ukyo--碳水化合物  阅读(2)  评论(0)    收藏  举报