目录
一、前言
项目成品图片:

哔哩哔哩视频链接:
STM32智能家居语音系统(ASRPRO版)
(资料分享见文末)
二、项目简介
1.功能详解
基于STM32的智能家居语音系统(ASRPRO版)
功能如下:
- 基于STM32F103C8T6主控芯片
- 检测功能:系统检测周围 温湿度数据、烟雾浓度、光照强度
- 显示功能:将检测到的数据显示在oled屏幕上
- 手动模式:按键控制LED灯、风扇、窗帘、加湿器的开关
- 自动模式:温湿度、烟雾、光照阈值控制灯、窗帘、风扇、加湿器开关以及报警,
- 语音控制:系统也可以通过语音指令控制,LED灯、风扇、窗帘(步进电机模拟)、加湿器的运行。
- PWM调光/速:系统中的LED灯和风扇都支持PWM调节
- 阈值调节:系统传感器阈值大小可以通过按键自行设置调节
- 接入云平台:系统通过ESP8266 WIFI模块连接网络,接入机智云服务器
- 远程控制:可以通过APP查看传感器数据,以及远程控制
2.主要器件
- STM32F103C8T6单片机
- OLED 屏幕
- DHT11温湿度传感器
- MQ-2烟雾传感器
- BH1750光照传感器
- ESP8266-01S(WIFI模块)
- ASRPRO语音模块
- 有源蜂鸣器
- 风扇模块
- 大功率LED灯模块
- 加湿器模块
- 继电器
三、原理图设计
四、PCB硬件设计
PCB图
五、程序设计
cpp
#include "stm32f10x.h" // Device header
#include "oled.h"
#include "adcx.h"
#include "sensormodules.h"
#include "dht11.h"
#include "key.h"
#include "tim2.h"
#include "tim3.h"
#include "flash.h"
#include "motor.h"
#include "pwm.h"
#include "usart.h"
#include "iwdg.h"
#include "relay.h"
#include "usart3.h"
#include "BH1750.h"
#include "fan.h"
SensorModules sensorData; //声明传感器模块的结构体变量
SensorThresholdValue Sensorthreshold; //声明传感器阈值结构体变量
SystemState systemState; //声明系统状态结构体变量
#define FLASH_START_ADDR 0x0801f000 //写入的起始地址
uint8_t oledPages = 1; //系统显示页面
int main(void)
{
OLED_Init();
DHT11_Init();
Key_Init();
MOTOR_Init();
Buzzer_Init();
Relay_Init();
Init_BH1750();
LED_Init();
Fan_Init();
ADCX_Init();
Timer2_Init(9, 14398);
Uart2_Init(9600);
Uart1_Init(115200);
IWDG_Init();
Uart3_Init();
PWM_Init(100 - 1, 720 - 1);
Sensorthreshold.tempValue = FLASH_R(FLASH_START_ADDR); //从指定页的地址读FLASH
Sensorthreshold.humiValue = FLASH_R(FLASH_START_ADDR+2); //从指定页的地址读FLASH
Sensorthreshold.luxValue = FLASH_R(FLASH_START_ADDR+4); //从指定页的地址读FLASH
Sensorthreshold.smokeValue = FLASH_R(FLASH_START_ADDR+6); //从指定页的地址读FLASH
Sensorthreshold.flameValue = FLASH_R(FLASH_START_ADDR+8); //从指定页的地址读FLASH
GENERAL_TIM_Init();
userInit(); //完成机智云初始赋值
gizwitsInit(); //开辟一个环形缓冲区
gizwitsSetMode(WIFI_AIRLINK_MODE);
Delay_ms(1000);
while (1)
{
IWDG_ReloadCounter(); //使能重装载寄存器计数
SensorScan(); //获取传感器数据
switch (oledPages)
{
case DISPLAY_PAGE1:
OLED_Menu1(); //显示主页面1固定信息
SensorDataDisplay1();//显示传感器1数据
/* 手动模式下按键控制执行器的运行 */
if (!systemState.mode)
{
LED_PWM_KEY(); //LED按键控制
Fan_PWM_KEY(); //风扇按键控制
/* 按键控制步进电机的运行 */
if(KeyNum == KEY_4 && systemState.motorCommand.motorLocation == motorLocation_OFF)
{
KeyNum = 0;
systemState.motorCommand.motorAnterogradeFlag = 1;
}
else if ((KeyNum == KEY_4 && systemState.motorCommand.motorLocation == motorLocation_ON))
{
KeyNum = 0;
systemState.motorCommand.motorReversalFlag = 1;
}
}
/*按键按下时切换模式*/
if (KeyNum == KEY_1)
{
KeyNum = 0;
systemState.mode = !systemState.mode;
if (!systemState.mode)
{
Buzzer_OFF();
Relay_OFF();
}
}
/*按键按下时进入阈值设计界面*/
if (KeyNum == KEY_Long1)
{
KeyNum = 0;
oledPages = SETTINGS_PAGE;
OLED_Clear();
}
Asrpro(); //语音控制
MotorOperation(); //步进电机控制
break;
case SETTINGS_PAGE:
OLED_Option(SetSelection()); //实现阈值设置页面的选择功能
OLED_SetInterfacevoid(); //显示阈值设置界面1的固定内容
ThresholdModification(SetSelection()); //实现阈值调节功能
//判断是否退出阈值设置界面
if (KeyNum == KEY_2)
{
KeyNum = 0;
oledPages = DISPLAY_PAGE1; //跳转到主界面
OLED_Clear(); //清屏
//存储修改的传感器阈值至flash内
FLASH_W(FLASH_START_ADDR, Sensorthreshold.tempValue,Sensorthreshold.humiValue,
Sensorthreshold.luxValue, Sensorthreshold.smokeValue, Sensorthreshold.flameValue);
}
break;
default: break;
}
userHandle(); //更新机智云数据点变量存储的值
gizwitsHandle((dataPoint_t *)¤tDataPoint); //数据上传至机智云
}
}
六、实验效果
七、资料内容