基于物联网的智能家居安全防护系统设计

资料下载地址:基于物联网的智能家居安全防护系统仿真(仿真+代码)

目录

一、功能介绍

二、仿真图

三、程序

一、功能介绍

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();

    }

}
相关推荐
独自归家的兔7 小时前
OCPP 1.6 协议详解:StatusNotification 状态通知指令
开发语言·数据库·spring boot·物联网
开开心心就好12 小时前
无需安装的单机塔防游戏轻松畅玩
人工智能·游戏·pdf·音视频·智能家居·语音识别·媒体
QH1392923188013 小时前
KEYSIGHT E5071C 端网络分析仪
网络·功能测试·嵌入式硬件·物联网·单元测试·集成测试·模块测试
Circle Studio17 小时前
颠覆英伟达!2386 亿晶圆级芯片独角兽,正式冲击 IPO
人工智能·物联网
终将超越过去18 小时前
ASRPRO使用
单片机·物联网
修勾勾L19 小时前
OneNet平台生成token注意事项
stm32·物联网
电化学仪器白超1 天前
小乌龟Git全程图形化操作指南:嵌入式本地版本管理与Gitee私有云备份实战
git·python·单片机·嵌入式硬件·物联网·gitee·自动化
唯创知音1 天前
人体红外感应模块推荐:智能家居、电子门锁、洗浴设备方案
智能家居
MC皮蛋侠客2 天前
Modbus Poll 使用文档
物联网·modbus·调试
想放学的刺客2 天前
单片机嵌入式试题(第34期)嵌入式开发的利器:逻辑分析仪与示波器深度解析
arm开发·stm32·单片机·嵌入式硬件·物联网