引言
本项目设计了一个基于STM32的模拟舞台灯光控制系统,可以通过调节灯光的亮度、颜色和模式,实现多种灯光效果模拟,如渐变、闪烁和跟随节奏的灯光变化。该系统结合了LED灯条、PWM控制和按钮输入等,实现了舞台灯光的多样化展示。适用于小型舞台、演出场景或舞台灯光教学。
环境准备
1. 硬件设备
- STM32F103C8T6 开发板(或其他 STM32 系列)
- RGB LED 灯条(如 WS2812 或常见的 RGB LED 灯)
- PWM 控制器(用于调节 LED 灯的亮度)
- 按键(用于选择灯光模式)
- OLED 显示屏(用于显示当前模式和亮度信息)
- 面包板和杜邦线
- USB-TTL 串口调试工具
2. 软件工具
- STM32CubeMX:用于初始化 STM32 外设。
- Keil uVision 或 STM32CubeIDE:用于编写和下载代码。
- ST-Link 驱动程序:用于下载程序到 STM32。
项目实现
1. 硬件连接
- RGB LED 灯条连接:如果使用 WS2812 灯条,将数据引脚连接到 STM32 的 GPIO 引脚(如 PA0)。如果使用 PWM 控制的 RGB LED,分别将 R、G、B 引脚连接到 STM32 的 PWM 输出引脚(如 PA1, PA2, PA3)。
- 按键连接:将三个按键连接到 STM32 的 GPIO(如 PA4, PA5, PA6),用于调节亮度、切换灯光模式和重置。
- OLED 显示屏连接:将 OLED 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7),用于显示当前模式和亮度。
2. STM32CubeMX 配置
- 打开 STM32CubeMX,选择你的开发板型号。
- 配置系统时钟为 HSI,确保系统稳定运行。
- 配置 GPIO 引脚用于按键输入。
- 配置 PWM 输出用于调节 RGB LED 灯的亮度。
- 配置 I2C 用于与 OLED 显示屏通信。
- 生成代码,选择 Keil 或 STM32CubeIDE 作为工具链。
3. 编写主程序
在生成的项目基础上,编写 RGB 灯光控制、模式切换、亮度调节和 OLED 显示的代码。以下是智能舞台灯光控制系统的基本代码示例:
#include "stm32f1xx_hal.h"
#include "oled.h"
#include "rgb_led.h"// 定义灯光模式
#define MODE_STATIC 0 // 固定颜色模式
#define MODE_BREATH 1 // 呼吸灯模式
#define MODE_RAINBOW 2 // 彩虹渐变模式
#define MODE_FLASH 3 // 闪烁模式
#define MODE_MUSIC 4 // 音乐律动模式// 定义引脚
#define BUTTON_MODE_PIN GPIO_PIN_4
#define BUTTON_UP_PIN GPIO_PIN_5
#define BUTTON_DOWN_PIN GPIO_PIN_6
#define BUTTON_PORT GPIOA// 函数声明
void Set_LED_Color(uint8_t r, uint8_t g, uint8_t b);
void Update_LED_Mode(uint8_t mode);
void Adjust_Brightness(uint8_t direction);
uint8_t Check_Button(uint16_t pin);
void Display_Status(uint8_t mode, uint8_t brightness);
void System_Init(void);// 全局变量
uint8_t current_mode = MODE_STATIC;
uint8_t brightness = 5; // 默认亮度// 初始化系统
void System_Init(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_TIM1_Init(); // 用于 PWM 控制 LED 亮度MX_I2C1_Init(); // 用于 OLED 显示OLED_Init();RGB_LED_Init(); // 初始化 RGB LEDOLED_ShowString(0, 0, "Stage Light Ready");
}// 设置 LED 颜色
void Set_LED_Color(uint8_t r, uint8_t g, uint8_t b)
{RGB_LED_SetColor(r * brightness / 10, g * brightness / 10, b * brightness / 10);
}// 更新灯光模式
void Update_LED_Mode(uint8_t mode)
{switch (mode){case MODE_STATIC:Set_LED_Color(255, 0, 0); // 固定红色break;case MODE_BREATH:// 简单呼吸灯效果for (int i = 0; i < 255; i++){Set_LED_Color(i, 0, 0);HAL_Delay(10);}for (int i = 255; i >= 0; i--){Set_LED_Color(i, 0, 0);HAL_Delay(10);}break;case MODE_RAINBOW:// 简单彩虹渐变效果for (int i = 0; i < 255; i++){Set_LED_Color(255, i, 255 - i);HAL_Delay(10);}break;case MODE_FLASH:Set_LED_Color(255, 255, 255);HAL_Delay(100);Set_LED_Color(0, 0, 0);HAL_Delay(100);break;case MODE_MUSIC:// 假设从 ADC 获取音乐信号(模拟音乐律动)uint8_t music_intensity = HAL_ADC_GetValue(&hadc1) / 4;Set_LED_Color(music_intensity, 0, 255 - music_intensity);HAL_Delay(50);break;default:Set_LED_Color(0, 0, 0);break;}
}// 调节亮度
void Adjust_Brightness(uint8_t direction)
{if (direction && brightness < 10)brightness++;else if (!direction && brightness > 1)brightness--;
}// 检查按键
uint8_t Check_Button(uint16_t pin)
{return HAL_GPIO_ReadPin(BUTTON_PORT, pin) == GPIO_PIN_RESET;
}// 显示状态
void Display_Status(uint8_t mode, uint8_t brightness)
{OLED_Clear();OLED_ShowString(0, 0, "Mode:");OLED_ShowNumber(48, 0, mode, 1);OLED_ShowString(0, 1, "Brightness:");OLED_ShowNumber(80, 1, brightness, 2);
}int main(void)
{System_Init();while (1){// 检查按键,切换模式或调整亮度if (Check_Button(BUTTON_MODE_PIN)){current_mode = (current_mode + 1) % 5; // 循环切换模式Display_Status(current_mode, brightness);HAL_Delay(300); // 防抖延时}if (Check_Button(BUTTON_UP_PIN)){Adjust_Brightness(1); // 增加亮度Display_Status(current_mode, brightness);HAL_Delay(300);}if (Check_Button(BUTTON_DOWN_PIN)){Adjust_Brightness(0); // 减少亮度Display_Status(current_mode, brightness);HAL_Delay(300);}// 更新 LED 显示效果Update_LED_Mode(current_mode);HAL_Delay(100); // 每0.1秒刷新一次效果}
}
4. RGB LED 灯光控制
以下是控制 RGB LED 的代码示例,使用 PWM 控制灯光的颜色和亮度:
#include "tim.h"// 初始化 RGB LED
void RGB_LED_Init(void)
{// 初始化 PWM 信号用于控制 R、G、B 通道
}// 设置 RGB 颜色
void RGB_LED_SetColor(uint8_t r, uint8_t g, uint8_t b)
{__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, r); // 红色通道__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, g); // 绿色通道__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, b); // 蓝色通道
}
5. 按键处理
处理按键输入,用于切换灯光模式和调节亮度:
#include "gpio.h"// 检查按键
uint8_t Check_Button(uint16_t pin)
{return HAL_GPIO_ReadPin(BUTTON_PORT, pin) == GPIO_PIN_RESET;
}
⬇帮大家整理了单片机的资料
包括stm32的项目合集【源码+开发文档】
点击下方蓝字即可领取,感谢支持!⬇
点击领取更多嵌入式详细资料
问题讨论,stm32的资料领取可以私信!
6. 系统工作原理
常见问题与解决方法
1. LED 灯光闪烁不稳定
2. 按键响应不灵敏
3. OLED 显示不正常
4. 音乐律动模式无效果
结论
通过本项目,我们设计了一个基于 STM32 的智能舞台灯光控制系统,成功实现了多种灯光模式的控制,包括固定颜色、呼吸灯、彩虹渐变、闪烁和音乐律动等功能。系统能够通过按键实现模式切换和亮度调节,并通过 OLED 显示屏显示当前状态,具有直观的操作体验。该系统不仅适用于舞台表演、派对活动等场合,还可以作为教学示范项目,帮助学习者掌握 STM32 在 LED 控制和 PWM 应用中的知识。
通过该项目,用户可以深刻理解 STM32 微控制器如何与外部硬件设备(如 LED、OLED 显示屏、传感器等)进行交互,进一步提升对嵌入式系统开发的理解和实践能力。在实际应用中,该系统还可以扩展更多功能,如蓝牙远程控制、更多颜色模式的实现等,为舞台灯光控制带来更多创新和可能性。
- 模式切换:通过按键切换灯光模式,实现不同的灯光效果,包括固定颜色、呼吸灯、彩虹渐变、闪烁和音乐律动。
-
亮度调节:用户可以通过按键增加或减少 LED 灯光的亮度,从而调节灯光效果的强度。亮度的变化通过调整 PWM 信号的占空比来实现,使灯光更加柔和或者更亮,适应不同场景需求。
-
OLED 显示:OLED 显示屏用于实时显示当前的灯光模式和亮度等级,使用户能够直观地了解系统的运行状态。每次切换模式或调整亮度时,OLED 屏幕会更新显示相应的数值,便于调节。
- 问题原因:PWM 信号频率设置不当,可能导致 LED 灯光在某些亮度下出现闪烁现象。
- 解决方法:确保 PWM 频率足够高(通常高于1kHz),以避免人眼可察觉的闪烁。可以通过 STM32CubeMX 调整定时器的时钟频率和周期。
- 问题原因:按键输入可能受到了机械抖动的影响。
- 解决方法:在按键检测时加入去抖动处理,延时 200ms~300ms,确保每次按键动作只被识别一次。
- 问题原因:I2C 通信错误、SDA 或 SCL 引脚连接不良、OLED 模块供电不足等。
- 解决方法:检查 I2C 地址是否正确,确认 OLED 模块供电正常,确保引脚连接牢固。如果使用的是不同型号的 OLED 屏幕,还需要确保初始化代码与屏幕型号匹配。
- 问题原因:ADC 采样频率设置不合理,或者没有正确读取音乐信号的输入。
- 解决方法:确认 ADC 输入引脚连接正确,并且采样频率与音乐信号的频率范围相匹配。可以使用调试工具检查 ADC 的采样值是否正确。