基于GD32F303 MCU的智能家居灯光控制系统设计与代码实现

[复制链接]
2722|19
 楼主| 童雨竹 发表于 2024-10-8 07:51 | 显示全部楼层 |阅读模式

最近我使用GD32F303 MCU设计并实现了一个智能家居灯光控制系统。GD32系列单片机凭借其高性能和丰富的外设资源,非常适合用于智能家居等物联网应用场景。以下是我对该项目的设计思路和代码分享。

项目背景智能家居系统的核心是通过远程控制和自动化来提高生活的便利性。在这个项目中,灯光控制系统将通过一个简单的按键实现对家居灯光的开启和关闭。同时,系统能够通过UART通信模块与手机App进行交互,实现远程控制功能。

使用的硬件
  • MCU型号:GD32F303
  • LED:用于指示灯光状态
  • 按键:实现本地开关控制
  • UART通信模块:实现与手机App通信,远程控制灯光
  • 继电器:用于驱动实际灯具的开关

代码实现以下是基于GD32F303 MCU的代码示例,展示如何实现本地按键控制和远程控制灯光:
  1. #include "gd32f30x.h"
  2. #include <stdio.h>

  3. // 初始化LED、按键和串口
  4. void System_Init(void) {
  5.     // 时钟配置
  6.     rcu_periph_clock_enable(RCU_GPIOC);
  7.     rcu_periph_clock_enable(RCU_USART0);
  8.    
  9.     // 配置LED引脚
  10.     gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);
  11.     gpio_bit_reset(GPIOC, GPIO_PIN_13);  // 默认关闭灯光

  12.     // 配置按键引脚
  13.     gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
  14.    
  15.     // 配置UART串口
  16.     usart_deinit(USART0);
  17.     usart_baudrate_set(USART0, 115200);
  18.     usart_word_length_set(USART0, USART_WL_8BIT);
  19.     usart_stop_bit_set(USART0, USART_STB_1BIT);
  20.     usart_parity_config(USART0, USART_PM_NONE);
  21.     usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);
  22.     usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);
  23.     usart_enable(USART0);
  24. }

  25. // 灯光开关控制
  26. void Light_Control(uint8_t state) {
  27.     if (state == 1) {
  28.         gpio_bit_set(GPIOC, GPIO_PIN_13);  // 打开灯光
  29.     } else {
  30.         gpio_bit_reset(GPIOC, GPIO_PIN_13);  // 关闭灯光
  31.     }
  32. }

  33. // UART数据接收
  34. uint8_t UART_Receive(void) {
  35.     while (usart_flag_get(USART0, USART_FLAG_RBNE) == RESET);  // 等待接收数据
  36.     return usart_data_receive(USART0);
  37. }

  38. int main(void) {
  39.     uint8_t light_state = 0;  // 0:灯光关闭,1:灯光打开
  40.     uint8_t uart_data;
  41.    
  42.     System_Init();  // 初始化系统
  43.    
  44.     while (1) {
  45.         // 检测按键是否按下
  46.         if (gpio_input_bit_get(GPIOA, GPIO_PIN_0) == RESET) {
  47.             // 按键按下,切换灯光状态
  48.             light_state = !light_state;
  49.             Light_Control(light_state);
  50.             delay_1ms(500);  // 防止按键抖动
  51.         }
  52.         
  53.         // 检测UART数据
  54.         if (usart_flag_get(USART0, USART_FLAG_RBNE) != RESET) {
  55.             uart_data = UART_Receive();
  56.             if (uart_data == '1') {
  57.                 Light_Control(1);  // 远程打开灯

代码详解
  • 系统初始化:System_Init() 函数配置时钟、GPIO、UART等外设资源,为后续控制灯光、接收按键信号和UART通信做好准备。
  • 灯光控制:Light_Control() 函数根据传入的参数控制LED或灯具的开关状态。1代表开启,0代表关闭。
  • 按键检测:通过检测按键状态来实现本地灯光开关的切换。
  • UART通信:通过UART接收来自手机App的远程控制信号,接收1打开灯光,0关闭灯光。
  • 延时处理:按键控制部分加入了防抖动延时,以确保按键响应稳定。

项目总结
本项目展示了如何基于GD32 MCU实现一个智能家居的灯光控制系统。通过简单的按键和UART通信实现了本地和远程的双重控制。GD32 MCU凭借其强大的处理能力和丰富的外设,非常适合这种智能控制类的物联网项目。未来可以进一步扩展为多设备控制,或者增加更多传感器,打造更完善的智能家居解决方案。

公羊子丹 发表于 2024-10-8 07:51 | 显示全部楼层
用GD32做智能家居控制简直绝配,性价比真的太高了!
周半梅 发表于 2024-10-8 07:51 | 显示全部楼层
我也想尝试下这个项目,不过我可能会用无线模块远程控制灯光。
帛灿灿 发表于 2024-10-8 07:52 | 显示全部楼层
按键防抖处理做得不错,常见问题都解决了!
万图 发表于 2024-10-8 07:52 | 显示全部楼层
这个代码太简洁了,学起来特别方便!
Wordsworth 发表于 2024-10-8 07:52 | 显示全部楼层
我觉得可以扩展成控制多个灯光,不知道GD32能不能处理得了?
Bblythe 发表于 2024-10-8 07:52 | 显示全部楼层
通过UART远程控制很实用,但加入Wi-Fi模块就更智能化了!
Pulitzer 发表于 2024-10-8 07:53 | 显示全部楼层
我之前做过类似项目,但用的是STM32,GD32的资源确实也很丰富。
Uriah 发表于 2024-10-8 07:53 | 显示全部楼层
延时处理好像有点短,按键抖动还会偶尔发生,可能要调大点延时。
Clyde011 发表于 2024-10-8 07:53 | 显示全部楼层
你试过直接用手机蓝牙控制吗?这样通信会更加灵活。
miltk 发表于 2024-10-14 15:21 | 显示全部楼层
智能家居灯光系统的话,用带WiFi或者蓝牙这种无线的MCU比较合适吧
hight1light 发表于 2024-10-14 15:42 | 显示全部楼层
正常用AT的话是OK的,还简单
nuan11nuan 发表于 2024-10-14 16:30 | 显示全部楼层
确实GD做嵌入式设备倒是不错的选择的
twinkhahale 发表于 2024-10-14 17:36 | 显示全部楼层
那你用串口通信模块是哪款啊?
ewyu 发表于 2024-10-14 19:46 | 显示全部楼层
你说的APP通信,用的什么方案啊?
wamed 发表于 2024-10-14 20:45 | 显示全部楼层
现在其实用云端通讯挺好,主要是简单
yuliangren 发表于 2024-10-14 21:02 | 显示全部楼层
看这个代码架构还不错啊, 很容易被理解
gra22ce 发表于 2024-10-15 08:25 | 显示全部楼层
灯光控制的话虽然简单,但是要注意电路设计,因为以后可能要接市电
teaccch 发表于 2024-10-15 11:10 | 显示全部楼层
延迟处理的话不用的,其实按键用外部中断处理效果更好
canfeil 发表于 2024-10-15 13:02 | 显示全部楼层
还行,但是延时是不是弄得有点久了

您需要登录后才可以回帖 登录 | 注册

本版积分规则

171

主题

6217

帖子

2

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