打印
[LKS32 软件]

基于凌鸥LKS32C306 MCU的智能家居灯光控制系统

[复制链接]
202|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

代码实现
#include "LKS32C306.h"

#define LED_PIN GPIO_PIN_0  
#define BUTTON_PIN GPIO_PIN_0  

volatile uint8_t led_state = 0;  

void SysTick_Handler(void) {
    static uint32_t counter = 0;  
    counter++;
    if (counter >= 5000) {  // 5秒自动熄灯
        GPIO_ResetBits(GPIOB, LED_PIN);
        led_state = 0;
        counter = 0;
    }
}

void GPIO_Init_Config(void) {
    GPIO_InitTypeDef GPIO_InitStruct;
   
    // 初始化按键输入
    GPIO_InitStruct.Pin = BUTTON_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
   
    // 初始化LED输出
    GPIO_InitStruct.Pin = LED_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_Init(GPIOB, &GPIO_InitStruct);
}

void UART_Init_Config(void) {
    UART_InitTypeDef UART_InitStruct;
    UART_InitStruct.BaudRate = 9600;
    UART_InitStruct.WordLength = UART_WORDLENGTH_8B;
    UART_InitStruct.StopBits = UART_STOPBITS_1;
    UART_InitStruct.Parity = UART_PARITY_NONE;
    UART_Init(UART1, &UART_InitStruct);
}

void EXTI0_IRQHandler(void) {
    if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
        led_state = !led_state;
        if (led_state) {
            GPIO_SetBits(GPIOB, LED_PIN);
        } else {
            GPIO_ResetBits(GPIOB, LED_PIN);
        }
        EXTI_ClearITPendingBit(EXTI_Line0);
    }
}

void UART1_IRQHandler(void) {
    if (UART_GetITStatus(UART1, UART_IT_RXNE) != RESET) {
        char command = UART_ReceiveData(UART1);
        if (command == '1') {
            GPIO_SetBits(GPIOB, LED_PIN);  // 打开灯光
            led_state = 1;
        } else if (command == '0') {
            GPIO_ResetBits(GPIOB, LED_PIN);  // 关闭灯光
            led_state = 0;
        }
        UART_ClearITPendingBit(UART1, UART_IT_RXNE);
    }
}

int main(void) {
    SystemInit();  
    GPIO_Init_Config();
    UART_Init_Config();
   
    SysTick_Config(SystemCoreClock / 1000);  // 1ms 中断
   
    while (1) {
        __WFI();  // 等待中断,进入低功耗模式
    }
}
代码解析
  • 按键控制:通过中断检测按键状态,每次按键触发切换灯的开关状态。
  • 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其他型号上?

使用特权

评论回复
5
童雨竹| | 2024-10-15 08:05 | 只看该作者
把蓝牙加进去就完美了,手机控制更方便。

使用特权

评论回复
6
万图| | 2024-10-15 08:06 | 只看该作者
低功耗模式用得好,MCU闲置时省电很关键。

使用特权

评论回复
7
Wordsworth| | 2024-10-15 08:06 | 只看该作者
代码逻辑清晰,一看就懂,给个赞。

使用特权

评论回复
8
Pulitzer| | 2024-10-15 08:06 | 只看该作者
5秒熄灯时间固定的,能不能做成可调的?

使用特权

评论回复
9
Bblythe| | 2024-10-15 08:07 | 只看该作者
凌鸥的芯片稳定性怎么样?有没有人用过一段时间了?

使用特权

评论回复
评论
玉树临风小黑龙 2024-10-15 13:28 回复TA
很稳定,国内很多知名的企业都在稳定出货 
10
Uriah| | 2024-10-15 08:07 | 只看该作者
这个代码还能支持PWM调光吗?

使用特权

评论回复
11
Clyde011| | 2024-10-15 08:08 | 只看该作者
我正好在找灯控方案,这代码简直太及时了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

4051

帖子

1

粉丝