资料下载地址:基于物联网的智能家居安全防护系统仿真(仿真+代码)
目录
一、功能介绍
1.单片机和app、OneNet云平台通过wifi进行通信
2.马达模拟家里的用电设备,可通过按键开关
3.可检测用电量,并显示在显示屏、app
4.可检测空气质量,并显示在显示屏、app
5.可检测烟雾浓度,并显示在显示屏、app
6.可检测是否有人闯入,并显示在显示屏、app
7.检测到烟雾浓度、空气质量超标时,蜂鸣器报警,并上报到app上,且自动打开风扇(马达)
8.可通过语音和app控制风扇开关
9.app上可设置烟雾浓度和空气质量报警阈值
二、仿真图

三、程序
cs
#include "key.h"
#include "main.h"
#include "string.h"
#include "oled.h"
_DEF_KEY KeyType = {0xff};
_DEF_KEY_SHA KeySha[12] = {0};
unsigned char xing = 0;
unsigned char password[10] = {"123456" };//默认密码
unsigned char keydata[10 ] = {0};//
uint8_t counts;//按键输入次数
uint8_t errcounts;
extern uint16_t Current_Voltage;
extern uint16_t Current_Voltage2;
extern uint16_t Current_Voltage3;
extern uint8_t shidu ;
extern uint8_t wendu ;
char lines = 0;
char check = 0;
_DEF_KEY_VALUE Sys_Key;
_DEF_PARA_VALUE Sys_Para =
{
35, 15,
35, 15,
35, 15,
35, 15,
};
_DEF_PARA_VALUE_STR Sys_Para_Str =
{
"35", "15",
"35", "15",
"35", "15",
"35", "15",
};
void Motor_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStructure.Pin = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8, GPIO_PIN_SET);
GPIO_InitStructure.Pin = GPIO_PIN_3;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
GPIO_InitStructure.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void Key_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
KEY1_GPIO_CLK_ENABLE(); /*开启按键GPIO口的时钟*/
GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;
GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn); /* 使能中断 */
HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI1_IRQn); /* 使能中断 */
HAL_NVIC_SetPriority(EXTI2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI2_IRQn); /* 使能中断 */
HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn); /* 使能中断 */
HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI4_IRQn); /* 使能中断 */
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); /* 使能中断 */
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); /* 使能中断 */
}
unsigned char Key_Scan(void)
{
if(KeySha[1].KeyTimeCnt > const_key_time) //按键去抖
{
//设置键
KeySha[1].KeyStartFlag = 0;
KeySha[1].KeyTimeCnt = 0;
Sys_Key.KeySet += 2;
Sys_Key.KeySet1Flag = 1;
if(Sys_Key.KeySet == 6)
Sys_Key.KeySet = 0;
}
if(KeySha[2].KeyTimeCnt > const_key_time) //按键去抖
{
//参数加
KeySha[2].KeyStartFlag = 0;
KeySha[2].KeyTimeCnt = 0;
// if(Sys_Key.KeySet == 1)
// {
// Sys_Para.tempH++;
// if(Sys_Para.tempH >= 95)
// Sys_Para.tempH = 95;
// }
// else if(Sys_Key.KeySet == 2)
// {
// Sys_Para.tempL++;
// if(Sys_Para.tempL >= 30)
// Sys_Para.tempL = 30;
// }
if(Sys_Key.KeySet == 2)
{
Sys_Para.PressH++;
if(Sys_Para.PressH >= 95)
Sys_Para.PressH = 95;
}
// else if(Sys_Key.KeySet == 4)
// {
// Sys_Para.PressL++;
// if(Sys_Para.PressL >= 30)
// Sys_Para.PressL = 30;
// }
else if(Sys_Key.KeySet == 4)
{
Sys_Para.GasH++;
if(Sys_Para.GasH >= 95)
Sys_Para.GasH = 95;
}
// else if(Sys_Key.KeySet == 6)
// {
// Sys_Para.GasL++;
// if(Sys_Para.GasL >= 30)
// Sys_Para.GasL = 30;
// }
// else if(Sys_Key.KeySet == 7)
// {
// Sys_Para.humiH++;
// if(Sys_Para.humiH >= 95)
// Sys_Para.humiH = 95;
// }
// else if(Sys_Key.KeySet == 8)
// {
// Sys_Para.humiL++;
// if(Sys_Para.humiL >= 30)
// Sys_Para.humiL = 30;
// }
}
if(KeySha[3].KeyTimeCnt > const_key_time) //按键去抖
{
//参数减
KeySha[3].KeyStartFlag = 0;
KeySha[3].KeyTimeCnt = 0;
// if(Sys_Key.KeySet == 1)
// {
// Sys_Para.tempH--;
// if(Sys_Para.tempH <= 35)
// Sys_Para.tempH = 35;
// }
// else if(Sys_Key.KeySet == 2)
// {
// Sys_Para.tempL--;
// if(Sys_Para.tempL <= 5)
// Sys_Para.tempL = 5;
// }
if(Sys_Key.KeySet == 2)
{
Sys_Para.PressH--;
if(Sys_Para.PressH <= 35)
Sys_Para.PressH = 35;
}
// else if(Sys_Key.KeySet == 4)
// {
// Sys_Para.PressL--;
// if(Sys_Para.PressL <= 5)
// Sys_Para.PressL = 5;
// }
else if(Sys_Key.KeySet == 4)
{
Sys_Para.GasH--;
if(Sys_Para.GasH <= 35)
Sys_Para.GasH = 35;
}
// else if(Sys_Key.KeySet == 6)
// {
// Sys_Para.GasL--;
// if(Sys_Para.GasL <= 5)
// Sys_Para.GasL = 5;
// }
// else if(Sys_Key.KeySet == 7)
// {
// Sys_Para.humiH--;
// if(Sys_Para.humiH <= 35)
// Sys_Para.humiH = 35;
// }
// else if(Sys_Key.KeySet == 8)
// {
// Sys_Para.humiL--;
// if(Sys_Para.humiL <= 5)
// Sys_Para.humiL = 5;
// }
}
if(KeySha[4].KeyTimeCnt > const_key_time) //按键去抖
{
//参数减
KeySha[4].KeyStartFlag = 0;
KeySha[4].KeyTimeCnt = 0;
if(check == 0)
{
check = 1;
}
else
check = 0;
}
}
void DisPlay_Para(void)
{
// sprintf(Sys_Para_Str.tempH,"%d ",Sys_Para.tempH);//转化为字符串
// sprintf(Sys_Para_Str.tempL,"%d ",Sys_Para.tempL);//转化为字符串
// OLED_ShowString(30,0,Sys_Para_Str.tempH);//:oled显示温度值
// OLED_ShowString(85,0,Sys_Para_Str.tempL);//:oled显示温度值
// OLED_ShowString(0,0,"TH:");//:
// OLED_ShowString(55,0,"TL:");//:
sprintf(Sys_Para_Str.PressH, "%d ", Sys_Para.PressH); //转化为字符串
sprintf(Sys_Para_Str.PressL, "%d ", Sys_Para.PressL); //转化为字符串
//OLED_ShowString(30, 0, Sys_Para_Str.PressH); //:oled显示温度值
OLED_ShowString(85, 0, Sys_Para_Str.PressH); //:oled显示温度值
// OLED_ShowString(0, 0, "PH:"); //:
OLED_ShowString(55, 0, "PH:"); //:
sprintf(Sys_Para_Str.GasH, "%d ", Sys_Para.GasH); //转化为字符串
sprintf(Sys_Para_Str.GasL, "%d ", Sys_Para.GasL); //转化为字符串
//OLED_ShowString(30, 2, Sys_Para_Str.GasH); //:oled显示温度值
OLED_ShowString(85, 2, Sys_Para_Str.GasH); //:oled显示温度值
//OLED_ShowString(0, 2, "FH:"); //:
OLED_ShowString(55, 2, "FH:"); //:
// sprintf(Sys_Para_Str.humiH,"%d ",Sys_Para.humiH);//转化为字符串
// sprintf(Sys_Para_Str.humiL,"%d ",Sys_Para.humiL);//转化为字符串
// OLED_ShowString(30,6,Sys_Para_Str.humiH);//:oled显示温度值
// OLED_ShowString(85,6,Sys_Para_Str.humiL);//:oled显示温度值
// OLED_ShowString(0,6,"HH:");//:
// OLED_ShowString(55,6,"HL:");//:
}
void Display_Para_on_off(void)
{
if(Sys_Key.KeySet == 1) OLED_ShowString(30, 0, " ");
else if(Sys_Key.KeySet == 2) OLED_ShowString(85, 0, " ");
else if(Sys_Key.KeySet == 3) OLED_ShowString(30, 2, " ");
else if(Sys_Key.KeySet == 4) OLED_ShowString(85, 2, " ");
}
void ComPare_Para(void)
{
if(
Current_Voltage >= Sys_Para.PressL && Current_Voltage <= Sys_Para.PressH &&
Current_Voltage2 >= Sys_Para.GasL && Current_Voltage2 <= Sys_Para.GasH
)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}
else if( Current_Voltage > Sys_Para.PressH || Current_Voltage2 > Sys_Para.GasH)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
}
}
void match_password(void)
{
ComPare_Para();
if(Sys_Key.KeySet == 0)
{
if(Sys_Key.KeySet1Flag == 1)
{
OLED_Clear() ;
Sys_Key.KeySet1Flag = 0;
}
DisPlay_Init();
Get_Pressure_Gas_Value();
if(check != 0)
{
OLED_ShowCHinese(25, 0, 3); //有
OLED_ShowCHinese(40, 0, 4); //人
OLED_ShowCHinese(55, 0, 7); //闯
OLED_ShowCHinese(70, 0, 8); //入
}
else
{
OLED_ShowCHinese(25, 0, 14); //无
OLED_ShowCHinese(40, 0, 4); //人
OLED_ShowCHinese(55, 0, 7); //闯
OLED_ShowCHinese(70, 0, 8); //入
}
}
else
{
if(Sys_Key.KeySet == 2)
{
if(Sys_Key.KeySet1Flag == 1)
{
OLED_Clear() ;
Sys_Key.KeySet1Flag = 0;
}
}
Display_Para_on_off();
DisPlay_Para();
}
}