# 智能家居 **Repository Path**: streamLiu/smart-home ## Basic Information - **Project Name**: 智能家居 - **Description**: 毕设 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-02 - **Last Updated**: 2026-04-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 智能家居控制系统 > 基于 STM32F103C8 单片机的智能家居控制解决方案 [![Gitee](https://img.shields.io/badge/Gitee-仓库地址-red)](https://gitee.com/streamLiu/smart-home) [![License](https://img.shields.io/badge/License-学习交流-blue)]() --- ## 目录 1. [项目简介](#项目简介) 2. [硬件平台](#硬件平台) 3. [项目结构](#项目结构) 4. [功能特性](#功能特性) 5. [引脚定义表](#引脚定义表) 6. [使用说明](#使用说明) 7. [软件架构](#软件架构) 8. [接口API](#接口api) 9. [Proteus仿真](#proteus仿真) 10. [注意事项](#注意事项) 11. [许可证](#许可证) --- ## 项目简介 本项目是一个基于 **STM32F103C8** 单片机的智能家居控制系统,提供了多种外设驱动和应用程序,可实现: - 💡 LED 指示控制 - 🔘 按键检测与响应 - 🔄 电机转速控制 (PWM) - 🎯 舵机角度控制 - 📺 OLED 显示 - 📡 串口通信 - 📊 模拟信号采集 (ADC) --- ## 硬件平台 | 项目 | 参数 | |:----:|:-----| | **主控芯片** | STM32F103C8T6 | | **晶振** | 8MHz (HSE) | | **系统时钟** | 72MHz | | **工作电压** | 3.3V | | **Flash** | 64KB | | **RAM** | 20KB | --- ## 项目结构 ``` 毕设/ ├── keil/ # Keil MDK 工程文件 │ ├── Hardware/ # 硬件驱动层 │ │ ├── ADC.c/h # 模数转换器驱动 │ │ ├── Key.c/h # 按键驱动 │ │ ├── LED.c/h # LED驱动 │ │ ├── Motor.c/h # 直流电机驱动 │ │ ├── OLED.c/h # OLED显示屏驱动 │ │ ├── OLED_Font.h # OLED字库 │ │ ├── PWM.c/h # PWM脉宽调制驱动 │ │ ├── Serial.c/h # 串口通信驱动 │ │ └── Servo.c/h # 舵机驱动 │ ├── Library/ # STM32标准外设库 │ │ ├── misc.c/h │ │ └── stm32f10x_*.c/h │ ├── System/ # 系统层 │ │ ├── Delay.c/h # 延时函数 │ │ └── timer.c/h # 定时器 │ ├── User/ # 用户应用程序 │ │ ├── main.c # 主程序入口 │ │ └── stm32f10x_it.c # 中断处理 │ ├── Start/ # 启动文件 │ │ ├── startup_stm32f10x_md.s │ │ └── system_stm32f10x.c/h │ └── Project.uvprojx # Keil工程文件 │ ├── proteus/ # Proteus仿真文件 │ └── 智能家居.pdsprj # 仿真工程 │ ├── .trae/ # AI Agent配置 │ ├── agents/ # Agent配置文件 │ └── rules/ # 项目规则 │ ├── README.md # 中文说明文档 ├── README.en.md # 英文说明文档 └── STM32F103C8T6引脚定义.png # 引脚图 ``` --- ## 功能特性 ### 外设驱动 | 外设 | 功能描述 | 状态 | |:----:|:---------|:----:| | LED | LED灯开关、状态翻转 | ✅ | | Key | 按键扫描检测(上/下/确认) | ✅ | | Motor | 直流电机转速控制 (PWM调速) | ✅ | | Servo | 舵机角度控制 (0°-180°) | ✅ | | ADC | 模拟信号采集 (3通道) | ✅ | | OLED | 128×64 OLED显示屏显示 | ✅ | | Serial | 串口通信 (USART1, 9600bps) | ✅ | | PWM | 脉宽调制输出 | ✅ | ### 显示功能 OLED显示屏支持以下格式: - ✅ 字符显示 (`OLED_ShowChar`) - ✅ 字符串显示 (`OLED_ShowString`) - ✅ 数字显示 - 带前导零填充 (`OLED_ShowNum`) - ✅ 有符号数字显示 (`OLED_ShowSignedNum`) - ✅ 十六进制数显示 (`OLED_ShowHexNum`) - ✅ 二进制数显示 (`OLED_ShowBinNum`) --- ## 引脚定义表 ### GPIO引脚分配 | 外设 | 引脚 | 端口 | 功能说明 | 配置模式 | |:----:|:----:|:----:|:---------|:---------| | LED | PA4 | GPIOA | LED指示灯输出 | 推挽输出 | | Key_UP | PB1 | GPIOB | 上按键输入 | 内部上拉 | | Key_DOWN | PB10 | GPIOB | 下按键输入 | 内部上拉 | | Key_ENTER | PB12 | GPIOB | 确认按键输入 | 内部上拉 | | Motor_PWM | PA6 | GPIOA | 电机PWM控制输出 | TIM3_CH1 | | Servo_PWM | PA1 | GPIOA | 舵机PWM控制输出 | TIM2_CH2 | | OLED_SCL | PB8 | GPIOB | OLED I2C时钟线 | 开漏输出 | | OLED_SDA | PB9 | GPIOB | OLED I2C数据线 | 开漏输出 | | USART1_TX | PA9 | GPIOA | 串口1发送 | 复用推挽 | | USART1_RX | PA10 | GPIOA | 串口1接收 | 上拉输入 | | ADC_CH0 | PA0 | GPIOA | 模拟输入通道0 | 模拟输入 | | ADC_CH2 | PA2 | GPIOA | 模拟输入通道2 | 模拟输入 | | ADC_CH3 | PA3 | GPIOA | 模拟输入通道3 | 模拟输入 | ### 引脚功能分组 ``` PA0 - ADC_CH0 PA1 - Servo_PWM PA2 - ADC_CH2 PA3 - ADC_CH3 PA4 - LED PA6 - Motor_PWM PA9 - USART1_TX PA10 - USART1_RX PB1 - Key_UP PB8 - OLED_SCL PB9 - OLED_SDA PB10 - Key_DOWN PB12 - Key_ENTER ``` --- ## 使用说明 ### 硬件连接 根据实际硬件电路连接以下外设: | 外设 | 连接引脚 | 说明 | |:-----|:---------|:-----| | LED指示灯 | PA4 | 低电平点亮 | | 按键输入 | PB1(上), PB10(下), PB12(确认) | 内部上拉,低电平有效 | | 电机驱动接口 | PA6 | PWM输出,TIM3_CH1 | | 舵机控制接口 | PA1 | PWM输出,TIM2_CH2 | | OLED显示屏 | PB8(SCL), PB9(SDA) | I2C接口,软件模拟 | | 串口USART1 | PA9(TX), PA10(RX) | 波特率9600 | | ADC输入 | PA0, PA2, PA3 | 模拟输入通道 | ### 编译环境 - **IDE**: Keil MDK 5.x - **芯片包**: STM32F1xx_DFP - **编译器**: ARM Compiler 5/6 ### 编译步骤 1. 使用 Keil MDK 打开 `keil/Project.uvprojx` 文件 2. 选择目标芯片 **STM32F103C8** 3. 点击 **Rebuild** 按钮进行编译 4. 使用 ST-Link 或串口下载到开发板 ### 调试配置 - 调试器: ST-Link V2 - 调试接口: SWD - 时钟: 8MHz HSE --- ## 软件架构 ### 主程序流程 ``` main() ├── 系统初始化 │ ├── SystemInit() # 系统时钟配置 │ ├── LED_Init() # LED初始化 │ ├── Key_Init() # 按键初始化 │ ├── Motor_Init() # 电机初始化 │ ├── Servo_Init() # 舵机初始化 │ ├── OLED_Init() # OLED初始化 │ ├── Serial_Init() # 串口初始化 │ └── AD_Init() # ADC初始化 │ └── 主循环 (while(1)) ├── Key_GetNum() # 检测按键 ├── 执行对应操作 │ ├── LED控制 │ ├── 电机调速 │ ├── 舵机角度设置 │ └── OLED显示更新 └── Serial数据处理 ``` ### 中断处理 - **USART1_IRQHandler**: 串口接收中断 - **DMA1_Channel1_IRQHandler**: ADC DMA传输完成中断 --- ## 接口API ### LED驱动 ```c void LED_Init(void); // 初始化LED void LED_On(void); // 点亮LED void LED_Off(void); // 熄灭LED void LED_Turn(void); // 翻转LED状态 uint8_t LED_Read(void); // 读取LED状态 ``` ### 按键驱动 ```c void Key_Init(void); // 初始化按键 uint16_t Key_GetNum(void); // 获取按键值 // 返回值: KEY_NONE(0), KEY_UP(1), KEY_DOWN(2), KEY_ENTER(3) ``` ### 电机驱动 ```c void Motor_Init(void); // 初始化电机 void Motor_SetSpeed(int speed); // 设置转速 // speed范围: 0-100 (0停止, 100满速) ``` ### 舵机驱动 ```c void Servo_Init(void); // 初始化舵机 void Servo_SetAngle(double angle); // 设置角度 // angle范围: 0°-180° ``` ### OLED驱动 ```c void OLED_Init(void); // 初始化OLED void OLED_Clear(void); // 清屏 // 显示函数 void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char); void OLED_ShowString(uint8_t Line, uint8_t Column, char *String); void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length); void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length); void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length); void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length); // Line: 1-4, Column: 1-16 ``` ### 串口驱动 ```c void Serial_Init(void); // 初始化串口 (9600bps) void Serial_SendByte(uint16_t bit); // 发送单字节 void Serial_SendString(char* string); // 发送字符串 // 接收数据 extern char Serial_RxData[100]; // 接收缓冲区 extern uint8_t Serial_RxFlag; // 接收标志位 ``` ### ADC驱动 ```c void AD_Init(void); // 初始化ADC // 使用DMA传输,数据自动存储到 AD_Value 数组 extern uint16_t AD_Value[4]; // ADC转换结果 // AD_Value[0] - 通道0 (PA0) // AD_Value[1] - 通道2 (PA2) // AD_Value[2] - 通道3 (PA3) ``` --- ## Proteus仿真 本项目包含 Proteus 仿真文件,可在无硬件的情况下进行功能验证。 ### 仿真文件位置 ``` proteus/智能家居.pdsprj ``` ### 仿真环境 - **软件**: Proteus 8.x - **单片机模型**: STM32F103C8 - **外设模型**: - LED、按键 - 直流电机 - 舵机 - OLED显示屏 - 虚拟串口终端 ### 仿真步骤 1. 打开 Proteus 软件 2. 加载 `proteus/智能家居.pdsprj` 文件 3. 双击单片机,加载编译生成的 `.hex` 文件 4. 点击运行按钮开始仿真 --- ## 注意事项 1. **电源要求** - 确保开发板供电正常 (3.3V) - 舵机和电机可能需要独立供电 2. **下载程序** - 下载前确认调试接口连接正确 - 首次下载可能需要按住复位键 3. **OLED显示屏** - 使用 I2C 接口,注意 SCL/SDA 引脚配置 - 软件模拟 I2C,无需硬件 I2C 外设 4. **舵机控制** - 需要 PWM 信号控制 - 角度范围 0°-180° - 供电电流要求较高 5. **串口通信** - 默认波特率: 9600 - 数据位: 8,停止位: 1,无校验 --- ## 相关链接 - **Gitee仓库**: [https://gitee.com/streamLiu/smart-home](https://gitee.com/streamLiu/smart-home) - **英文文档**: [README.en.md](./README.en.md) - **STM32参考手册**: [STM32F103xx Reference Manual](https://www.st.com/) --- ## 许可证 本项目仅供学习交流使用。 --- ## 更新日志 | 版本 | 日期 | 更新内容 | |:----:|:----:|:---------| | v1.0 | 2026-04-02 | 初始版本,完善文档结构 | --- **作者**: streamLiu **最后更新**: 2026-04-06