/*
* 实验二:花样流水灯(完整版)
* STM32 Nucleo-64 C031C6
* 4个LED连接到:PA5, PA6, PA7, PB6
* 包含6种基础花样 + 跑马灯效果
*/
// 定义LED引脚数组
int ledPins[] = {PA5, PA6, PA7, PB6};
int ledCount = 4; // LED数量
int breathPin1=PB5;
int breathPin2=PB10;
// 延时时间(毫秒)
int delayTime = 200;
void setup() {
// 将所有LED引脚设置为输出模式
for (int i = 0; i < ledCount; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW); // 初始状态:全部熄灭
}
pinMode(breathPin1, OUTPUT);
pinMode(breathPin2, OUTPUT);
digitalWrite(breathPin1, LOW);
digitalWrite(breathPin2, LOW);
}
void bothBreathLED(int duration){
int cycleTime=15;
int steps=duration / cycleTime;
for (int i=0;i<steps;i++){
float progress=(float)i / steps*2;
float brightness;
if (progress<=1.0){
brightness=progress;
}
else{
brightness=2.0-progress;
}
int onTime=max(1,(int)(cycleTime*brightness));
int offTime=max(1,cycleTime-onTime);
digitalWrite(breathPin1, HIGH);
digitalWrite(breathPin2, HIGH);
delay(onTime);
digitalWrite(breathPin1, LOW);
digitalWrite(breathPin2, LOW);
delay(offTime);
}
}
void loop() {
// ===== 花样一:单向流水灯(从左到右)=====
for (int i = 0; i < ledCount; i++) {
digitalWrite(ledPins[i], HIGH); // 点亮当前LED
delay(delayTime);
digitalWrite(ledPins[i], LOW); // 熄灭当前LED
}
delay(delayTime * 2); // 间隔时间
bothBreathLED(1000);
// ===== 花样二:反向流水灯(从右到左)=====
for (int i = ledCount - 1; i >= 0; i--) {
digitalWrite(ledPins[i], HIGH);
delay(delayTime);
digitalWrite(ledPins[i], LOW);
}
delay(delayTime * 2);
bothBreathLED(1000);
// ===== 花样三:双向流水灯(两端向中间)=====
// 从两端向中间依次点亮
for (int i = 0; i < ledCount / 2; i++) {
digitalWrite(ledPins[i], HIGH); // 左边第i个
digitalWrite(ledPins[ledCount - 1 - i], HIGH); // 右边第i个
delay(delayTime);
digitalWrite(ledPins[i], LOW);
digitalWrite(ledPins[ledCount - 1 - i], LOW);
}
delay(delayTime * 2);
bothBreathLED(1000);
// ===== 花样四:全部同时闪烁 =====
for (int j = 0; j < 3; j++) { // 闪烁3次
for (int i = 0; i < ledCount; i++) {
digitalWrite(ledPins[i], HIGH);
}
delay(delayTime);
for (int i = 0; i < ledCount; i++) {
digitalWrite(ledPins[i], LOW);
}
delay(delayTime);
}
delay(delayTime * 3);
bothBreathLED(1000);
// ===== 花样五:累积点亮,然后累积熄灭 =====
// 从左到右依次点亮,并保持亮着
for (int i = 0; i < ledCount; i++) {
digitalWrite(ledPins[i], HIGH);
delay(delayTime);
}
// 从左到右依次熄灭
for (int i = 0; i < ledCount; i++) {
digitalWrite(ledPins[i], LOW);
delay(delayTime);
}
delay(delayTime * 2);
bothBreathLED(1000);
// ===== 花样六:交替闪烁 =====
// 奇数位LED和偶数位LED交替闪烁
for (int j = 0; j < 4; j++) { // 交替4次
// 点亮偶数位(索引0,2)
for (int i = 0; i < ledCount; i += 2) {
digitalWrite(ledPins[i], HIGH);
}
delay(delayTime);
// 熄灭偶数位
for (int i = 0; i < ledCount; i += 2) {
digitalWrite(ledPins[i], LOW);
}
// 点亮奇数位(索引1,3)
for (int i = 1; i < ledCount; i += 2) {
digitalWrite(ledPins[i], HIGH);
}
delay(delayTime);
// 熄灭奇数位
for (int i = 1; i < ledCount; i += 2) {
digitalWrite(ledPins[i], LOW);
}
}
delay(delayTime * 3);
// ===== 花样七:跑马灯效果(一个亮点来回跑)=====
// 重复3次跑马灯效果
for (int repeat = 0; repeat < 3; repeat++) {
// 从左向右跑
for (int i = 0; i < ledCount; i++) {
digitalWrite(ledPins[i], HIGH); // 点亮当前LED
delay(delayTime / 2); // 亮的时间
digitalWrite(ledPins[i], LOW); // 熄灭当前LED
delay(delayTime / 2); // 间隔时间
}
// 从右向左跑
for (int i = ledCount - 1; i >= 0; i--) {
digitalWrite(ledPins[i], HIGH);
delay(delayTime / 2);
digitalWrite(ledPins[i], LOW);
delay(delayTime / 2);
}
}
delay(delayTime * 4); // 花样之间的较长间隔
for (int repeat=0;repeat<5;repeat++){
bothBreathLED(1500);
}
delay(delayTime*2);
}