[LKS32 软件] 基于凌鸥LKS32C306 MCU的智能家居灯光控制系统

[复制链接]
1603|11
 楼主| 公羊子丹 发表于 2024-10-15 08:02 | 显示全部楼层 |阅读模式
凌鸥LKS32C306 MCU 是一款高性价比的 32 位 ARM Cortex-M3 微控制器,广泛应用于家居自动化、物联网等领域。本项目展示如何使用 LKS32C306 MCU 实现一个智能灯光控制系统,通过按键和串口指令控制灯的状态,并支持定时熄灯功能。

系统概述
  • 主要功能

    • 按键切换灯光开关状态
    • 通过串口接收控制指令
    • 实现定时熄灯功能
    • MCU 在非操作时进入低功耗模式
  • 硬件组成

    • MCU:LKS32C306
    • 按键模块
    • LED 灯
    • UART 串口模块

硬件连接
  • 按键与LKS32C306连接
    • 按键 -> GPIOA.0
  • LED与LKS32C306连接
    • LED -> GPIOB.0
  • UART与MCU连接
    • RX -> UART1_RX
    • TX -> UART1_TX

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

  2. #define LED_PIN GPIO_PIN_0  
  3. #define BUTTON_PIN GPIO_PIN_0  

  4. volatile uint8_t led_state = 0;  

  5. void SysTick_Handler(void) {
  6.     static uint32_t counter = 0;  
  7.     counter++;
  8.     if (counter >= 5000) {  // 5秒自动熄灯
  9.         GPIO_ResetBits(GPIOB, LED_PIN);
  10.         led_state = 0;
  11.         counter = 0;
  12.     }
  13. }

  14. void GPIO_Init_Config(void) {
  15.     GPIO_InitTypeDef GPIO_InitStruct;
  16.    
  17.     // 初始化按键输入
  18.     GPIO_InitStruct.Pin = BUTTON_PIN;
  19.     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  20.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  21.     GPIO_Init(GPIOA, &GPIO_InitStruct);
  22.    
  23.     // 初始化LED输出
  24.     GPIO_InitStruct.Pin = LED_PIN;
  25.     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  26.     GPIO_Init(GPIOB, &GPIO_InitStruct);
  27. }

  28. void UART_Init_Config(void) {
  29.     UART_InitTypeDef UART_InitStruct;
  30.     UART_InitStruct.BaudRate = 9600;
  31.     UART_InitStruct.WordLength = UART_WORDLENGTH_8B;
  32.     UART_InitStruct.StopBits = UART_STOPBITS_1;
  33.     UART_InitStruct.Parity = UART_PARITY_NONE;
  34.     UART_Init(UART1, &UART_InitStruct);
  35. }

  36. void EXTI0_IRQHandler(void) {
  37.     if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
  38.         led_state = !led_state;
  39.         if (led_state) {
  40.             GPIO_SetBits(GPIOB, LED_PIN);
  41.         } else {
  42.             GPIO_ResetBits(GPIOB, LED_PIN);
  43.         }
  44.         EXTI_ClearITPendingBit(EXTI_Line0);
  45.     }
  46. }

  47. void UART1_IRQHandler(void) {
  48.     if (UART_GetITStatus(UART1, UART_IT_RXNE) != RESET) {
  49.         char command = UART_ReceiveData(UART1);
  50.         if (command == '1') {
  51.             GPIO_SetBits(GPIOB, LED_PIN);  // 打开灯光
  52.             led_state = 1;
  53.         } else if (command == '0') {
  54.             GPIO_ResetBits(GPIOB, LED_PIN);  // 关闭灯光
  55.             led_state = 0;
  56.         }
  57.         UART_ClearITPendingBit(UART1, UART_IT_RXNE);
  58.     }
  59. }

  60. int main(void) {
  61.     SystemInit();  
  62.     GPIO_Init_Config();
  63.     UART_Init_Config();
  64.    
  65.     SysTick_Config(SystemCoreClock / 1000);  // 1ms 中断
  66.    
  67.     while (1) {
  68.         __WFI();  // 等待中断,进入低功耗模式
  69.     }
  70. }
代码解析
  • 按键控制:通过中断检测按键状态,每次按键触发切换灯的开关状态。
  • UART命令控制:接收'1'和'0'指令控制LED的开关。
  • 定时熄灯功能:使用SysTick定时中断,每5秒自动关闭灯光。
  • 低功耗模式:在主循环中调用__WFI(),等待中断时进入低功耗模式,节省能耗。

项目效果
  • 按键控制:用户按下按键后,LED切换开关状态。
  • 串口指令控制:通过串口发送1或0指令实现灯光的开启和关闭。
  • 定时熄灯:LED开启后若无进一步操作,5秒后自动熄灭。

优化建议
  • 蓝牙扩展:增加蓝牙模块,支持远程灯光控制。
  • 自适应亮度调节:结合环境光传感器,实现智能亮度控制。
  • 多灯控制:扩展GPIO口,实现多个灯的独立控制。
  • 语音控制:结合语音识别模块,提升智能化体验。
周半梅 发表于 2024-10-15 08:03 | 显示全部楼层
这个定时熄灯功能不错,家里的小夜灯可以用这个思路。
周半梅 发表于 2024-10-15 08:04 来自手机 | 显示全部楼层
按键和串口控制都支持,很适合实际应用。
帛灿灿 发表于 2024-10-15 08:05 来自手机 | 显示全部楼层
有没有试过把这个项目移植到LKS32其他型号上?
童雨竹 发表于 2024-10-15 08:05 来自手机 | 显示全部楼层
把蓝牙加进去就完美了,手机控制更方便。
万图 发表于 2024-10-15 08:06 来自手机 | 显示全部楼层
低功耗模式用得好,MCU闲置时省电很关键。
Wordsworth 发表于 2024-10-15 08:06 来自手机 | 显示全部楼层
代码逻辑清晰,一看就懂,给个赞。
Pulitzer 发表于 2024-10-15 08:06 来自手机 | 显示全部楼层
5秒熄灯时间固定的,能不能做成可调的?
Bblythe 发表于 2024-10-15 08:07 来自手机 | 显示全部楼层
凌鸥的芯片稳定性怎么样?有没有人用过一段时间了?

评论

很稳定,国内很多知名的企业都在稳定出货  发表于 2024-10-15 13:28
Uriah 发表于 2024-10-15 08:07 来自手机 | 显示全部楼层
这个代码还能支持PWM调光吗?
Clyde011 发表于 2024-10-15 08:08 来自手机 | 显示全部楼层
我正好在找灯控方案,这代码简直太及时了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

204

主题

6578

帖子

3

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