[STM32F1] 基于STM32F103C8T6的智能LED灯控制系统

[复制链接]
2780|9
 楼主| 周半梅 发表于 2024-10-15 08:22 | 显示全部楼层 |阅读模式
STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,因其高性价比和强大的功能被广泛应用于嵌入式系统中。本项目基于这款MCU,实现了智能LED灯的控制系统,能够通过按键调节LED灯的亮度,并在不同模式之间切换。

系统功能
  • 按键控制:短按改变亮度,长按切换工作模式(如闪烁模式)。
  • PWM调光:通过PWM控制LED亮度,实现平滑变化。
  • 低功耗设计:在无操作时进入待机模式。

电路设计
  • MCU:STM32F103C8T6
  • LED灯:通过GPIO输出控制
  • 按键:实现模式切换和亮度调整
  • 供电:使用USB 5V供电

代码实现
  1. #include "stm32f10x.h"  

  2. void GPIO_Config(void) {
  3.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  

  4.     GPIO_InitTypeDef GPIO_InitStructure;
  5.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  6.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  7.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  8.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  9.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  10.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  
  11.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  12. }

  13. void PWM_Config(void) {
  14.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  

  15.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  16.     TIM_TimeBaseStructure.TIM_Period = 999;
  17.     TIM_TimeBaseStructure.TIM_Prescaler = 71;
  18.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  19.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  20.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  21.     TIM_OCInitTypeDef TIM_OCInitStructure;
  22.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  23.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  24.     TIM_OCInitStructure.TIM_Pulse = 0;
  25.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  26.     TIM_OC1Init(TIM3, &TIM_OCInitStructure);
  27.     TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

  28.     TIM_Cmd(TIM3, ENABLE);
  29. }

  30. void Delay(volatile uint32_t nCount) {
  31.     for (; nCount != 0; nCount--);
  32. }

  33. int main(void) {
  34.     GPIO_Config();
  35.     PWM_Config();

  36.     uint16_t brightness = 0;
  37.     uint8_t mode = 0;  

  38.     while (1) {
  39.         if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0) {
  40.             Delay(300000);
  41.             if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0) {
  42.                 mode = !mode;
  43.             } else {
  44.                 brightness = (brightness + 100) % 1000;
  45.             }
  46.             TIM_SetCompare1(TIM3, brightness);
  47.         }

  48.         if (mode) {
  49.             TIM_SetCompare1(TIM3, brightness);
  50.             Delay(1000000);
  51.             TIM_SetCompare1(TIM3, 0);
  52.             Delay(1000000);
  53.         }
  54.     }
  55. }
系统设计要点
  • PWM调光
    使用定时器TIM3产生PWM信号,通过改变占空比来调节LED亮度,带来平滑的亮度变化效果。
  • 按键控制逻辑
    短按按键增加亮度,长按按键切换模式。在闪烁模式下,LED灯以一定频率开关。
  • 低功耗管理
    当系统在一段时间内无按键操作时,可以进一步进入待机模式,节省电量。


项目扩展
  • 远程控制:可添加蓝牙模块,通过手机APP控制LED。
  • RGB灯控制:升级为RGB LED,实现颜色变化。
  • 定时功能:添加RTC模块,实现定时开关灯。

结论通过本项目,我们展示了如何使用STM32F103C8T6实现一个智能LED控制系统。STM32F103C8T6的强大功能和丰富的外设资源使其在照明系统中的应用具有极大的优势。未来,我们可以进一步扩展系统功能,实现更加智能化的控制。

公羊子丹 发表于 2024-10-15 08:23 来自手机 | 显示全部楼层
这个项目真棒!我正好在学STM32,代码清晰易懂。
帛灿灿 发表于 2024-10-15 08:23 来自手机 | 显示全部楼层
用PWM控制LED亮度效果很好,平滑的亮度变化确实更舒服。
童雨竹 发表于 2024-10-15 08:23 来自手机 | 显示全部楼层
长按切换模式的设计挺有创意的,避免了复杂的操作。
万图 发表于 2024-10-15 08:24 来自手机 | 显示全部楼层
STM32F103的资源确实丰富,这块板子做这种项目真合适。
Wordsworth 发表于 2024-10-15 08:24 来自手机 | 显示全部楼层
如果能加个遥控功能就更好了,比如用红外模块。
Bblythe 发表于 2024-10-15 08:25 来自手机 | 显示全部楼层
这个项目我可以直接拿来做实验课的演示了,太实用了!
Pulitzer 发表于 2024-10-15 08:25 来自手机 | 显示全部楼层
代码部分很详细,尤其是GPIO和PWM的配置,受教了。
Uriah 发表于 2024-10-15 08:26 来自手机 | 显示全部楼层
期待后续的扩展版本,尤其是RGB灯的控制模块。
Clyde011 发表于 2024-10-15 08:27 来自手机 | 显示全部楼层
如果支持Wi-Fi连接,那就是个完整的智能家居项目了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

171

主题

6172

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部