目录
一、前言
项目成品图片:
哔哩哔哩视频链接:
(资料分享见文末)
二、项目简介
1.功能详解
基于STM32的智能家居语音系统
功能如下:
- 温湿度采集:系统通过DHT11模块采集温湿度
- 烟雾监测:通过MQ-2模块采集环境中烟雾浓度
- 光照强度采集:通过BH1750传感器采集环境光照强度
- 窗帘控制:通过步进电机转动模拟窗帘控制
- 风扇控制:通过继电器和指示灯模拟风扇驱动
- 照明控制:通过继电器和指示灯模拟照明驱动
- 蜂鸣器报警:环境烟雾异常情况下蜂鸣器报警
- OLED显示:显示温湿度、光照强度和烟雾浓度
- APP功能:使用机智云APP,包括功能有控制照明灯和风扇开关、显示当前温湿度信息
- 自动模式:烧录自动模式程序,系统根据光强大小控制窗帘和LED灯的开闭,同时禁止手动模式的APP控制
2.主要器件
- STM32F103C8T6最小系统板
- DHT11温湿度传感器
- OLED显示屏(4针I2C协议)
- WiFi模块(ESP8266-01s)
- MQ-2烟雾传感器
- BH1750光照强度传感器
- 28BYJ51步进电机
- 继电器
- 蜂鸣器
- LED灯
三、原理图设计
四、PCB硬件设计
1.PCB图
2.PCB打板焊接图:
五、程序设计
cpp
int main ( void )
{
/* 系统时钟树配置 */
RCC_Configuration();
/* 中断系统配置 */
NVIC_Configuration();
/* 初始化硬件延时, 使用滴答定时器完成 */
delay_init();
/* 板级初始化 */
DEBUG_UART_Config( );
DEBUG_LOG("Bsp init\n");
/* 上电延时,等待各个模块运行稳定 */
delay_ms( 200 );
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF, ENABLE); //使能相应接口的时钟,以及RCC_APB2Periph_AFIO
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //禁用JTAG
/* 初始化定时器3, 中断频率 1000hz */
FML_TIME_Init();
FML_TIME_Register(Sys_timer_handle, 1); //系统时间片,1tick = 1ms
FML_TIME_Start(Sys_timer_handle); //开启定时
/* 配置按键引脚 */
//Key_GPIO_Config(p_SysParamHandle->p_keyhandle);
/* LED Fan IO 初始化 */
LED_Init( );
BEEP_Init();
Moto_Init();
/* dht11 初始化 */
DHT11_Init();
/* 语音模块初始化 */
ld3322_init( );
RegisterLd3322(p_SysParamHandle->psLdHandle, CmdList, CMD_NUM); /*!< 注册指令参数表 */
Switch_GPIO_Config( );
/* 机智云SDK初始化 */
Gizwits_Init();
/* 0.96OLED初始化 */
OLED_Init();
BH1750_Init();
ADC_Sensor_Init();
/*!< 延时确保初始页面错误 */
delay_ms(300);
/* OLED显示初始画面 */
OLED_InitPage( );
while ( 1 )
{
/* 传感器数据 */
if (p_SysParamHandle->u32SensorTim == 0)
{
p_SysParamHandle->u32SensorTim = 200;
p_SysParamHandle->u16Lightness = bh_data_read( ); //!< 读取光照强度
get_mq2_value( &p_SysParamHandle->fMqValue ); //!< 读取烟雾浓度
DHT11_Read_TempAndHumidity( p_SysParamHandle->psDHT11DataHandle );//!< 读取温湿度
}
/* ld3320语音识别模块 */
uint16_t index;
if (psLdHandle->bl_rev_cmd_flg == CMD_REV_OK)
{
psLdHandle->bl_rev_cmd_flg = CMD_REV_NO_OK;
for (index=0; index<psLdHandle->u16_cmd_num; index++)
{
if (!strcmp(psLdHandle->pCmdTable[index].cmd_str, psLdHandle->pu8_rev_cmd_buf))
{
psLdHandle->pCmdTable[index].funCallback();
DEBUG_LOG("Ld3322 check OK\n");
break;
}
}
if (index == psLdHandle->u16_cmd_num)
{
DEBUG_LOG("Ld3322 Erorr\n");
}
User_MemSet(psLdHandle->pu8_rev_cmd_buf, 0x0, 30);
}
/* 机智云云端协议处理 - 任务 */
gizwitsHandle( p_SysParamHandle->p_DataPoint );
/* 机智云数据同步 - 任务 */
app_SyncData_Task( p_SysParamHandle );
/* oled参数更新 - 任务 */
char str[16] = {0};
if (p_SysParamHandle->u32LcdUpdateTim == 0)
{
/* 任务时间重装载 */
p_SysParamHandle->u32LcdUpdateTim = 1000;
sprintf(str, "%d", p_SysParamHandle->psDHT11DataHandle->temp_int);
OLED_ShowCnAndAsciiStr(40, 0, str, 2);
sprintf(str, "%d", p_SysParamHandle->psDHT11DataHandle->humi_int);
OLED_ShowCnAndAsciiStr(40, 2, str, 2);
sprintf(str, "%d", p_SysParamHandle->u16Lightness);
OLED_ShowCnAndAsciiStr(80, 4, str, 2);
sprintf(str, "%.2f", p_SysParamHandle->fMqValue);
OLED_ShowCnAndAsciiStr(80, 6, str, 2);
/* 机智云事件处理 - 线程 */
app_GizwitsDataEvent_Handle( p_SysParamHandle );
}
}
}