无线传感器:智能家居监控系统设计

news2024/11/26 20:44:16

创造声明:本文档由北溪入江流与砂砾共同协作完成

一:选题理由

1.1 市场分析

随着经济的发展,人们的生活水平提高,人们对家庭居住的环境,安全性和智能性需求越来越高,越来越多的人开始关注智能家居系统。智能家居是在互联网影响之下物联化的体现。智能家居通过物联网技术将家中的各种设备连接到一起。给用户更舒适的生活体验。衣食住行最基本的需求,而在住这一需求中,人类日常除了在公司工作外,与家庭是接触最多的,所以智能家居有极大的市场前景和用户需求。

二:题目要求

以提高家居生活的安全性、舒适度、人性化为目的,设计智能家居监控系统。

  1. 设计必须实现家居温度、煤气泄漏、外人闯入、火灾(烟雾)的全部检测;
  2. 各检测节点可通过无线方式连接到主机,检测到危险信号后,主机采用声光报警或远程报警;
  3. 系统具有检测灵敏、报警及时、性价比高等特点;

三:可行性分析

为实现温度检测功能,需要采用热敏传感器;为了实现煤气和烟雾等气体检测,需要采用气体检测传感器;为了实现监控外人闯入,需要采用磁控开关传感器,将磁控开关安装在门窗处,避免家里无人时外人闯入。当相关传感器触发报警信息时,需要报警系统即使响应,采用声光报警或远程报警等操作。在本系统中,主要设计热敏传感器、气体检测传感器、磁控开关传感器、报警系统等几个模块,各个传感器之间相互独立,由报警系统统一获取传感器信息进行处理,从技术角度和现实成本角度上可行性较高。

四:需求分析

无线传感器网络技术的迅速兴起与蓬勃发展,其稳定、安全、高效、经济等优点十分突出,所以其应用也十分广泛。无线传感器网络已经无处不在、与我们生活息息相关,并且渗透到生活的方方面面,如空调、VCD机、手机、微波炉、自动洗衣机及汽车电子设备等。的特点是体积较小,也就是其集成特性,其内部结构是普通计算机系统的简化,增加一些外围电路,就能够组成一个完整的小系统,无线传感器网络具有很强的可扩展性。它具有和普通计算机类似的、强大的数据处理功能,通过使用一些科学的算法,可以获得很强的数据处理能力。所以无线传感器网络在工业应用中,可以极大地提高工业设备的智能化、数据处理能力和处理效率,而且无线传感器网络无需占用很大的空间。
智能家居是在互联网影响之下物联化的体现。智能家居通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统、影音服务器、影柜系统、网络家电等)连接到一起,提供家电控制、照明控制、电话远程控制、室内外遥控、防盗报警、环境监测、暖通控制、红外转发以及可编程定时控制等多种功能和手段。与普通家居相比,智能家居不仅具有传统的居住功能,兼备建筑、网络通信、信息家电、设备自动化,提供全方位的信息交互功能,甚至为各种能源费用节约资金。
智能家居是在互联网影响之下物联化的体现。智能家居最初的发展主要以灯光遥控控制、电器远程控制和电动窗帘控制为主,随着行业的发展,智能控制的功能越来越多,控制的对象不断扩展,控制的联动场景要求更高,其不断延伸到家庭安防报警、背景音乐、可视对讲、门禁指纹控制等领域,可以说智能家居几乎可以涵盖所有传统的弱电行业,市场发展前景诱人,因此和其产业相关的各路品牌不约而同加大力度争夺智能家居业务,市场渐成春秋争霸之势。
智能家居通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统)连接到一起,提供家电控制、照明控制、电话远程控制、室内外遥控、防盗报警、环境监测等多种功能和手段。与普通家居相比,智能家居不仅具有传统的居住功能,兼备建筑、网络通信、信息家电、设备自动化,提供全方位的信息交互功能,甚至为各种能源费用节约资金。可以说智能家居几乎可以涵盖所有传统的弱电行业,市场发展前景巨大。

五:概要设计

5.1 总体模块设计

请添加图片描述

5.2 系统流程图设计

请添加图片描述

5.3 数据库设计

5.3.1 数据库变量设计

智能家居监控系统数据库
名称类型功能
sTempIntegerunsigned char温度的整数值
sTempDecimalunsigned char温度的小数值
sHumidityIntegerunsigned char湿度的整数值
sHumidityDecimalunsigned char湿度的小数值
ADCValueunsigned int气体数值
infraredValueunsigned int红外检测

5.4 核心算法设计

5.4.1 主函数

int main() {
    xtal_init();
    led_init();
    // 初始化温度传感器
    dht11_io_init();
    uart0_init(0x00, 0x00);
    
    // 红外传感器
    P0SEL &= ~0x20;                        //P0_5为普通io口
    P0DIR &= ~0x20;                        //P0_5输入
    
    while (1) {
        // 处理温度数据
        cal_dht11_data();
        
        // 处理气体数据
        cal_adc_data();
        
        cal_infrared_data();
        
        display();
    }
}

5.4.2 读取温度传感器

int read_dht11_data() {
    int flag = 1;
    unsigned char dat1, dat2, dat3, dat4, dat5, ck;

    //主机拉低18ms
    COM_CLR;
    halWait(18);
    COM_SET;

    flag = 0;
    while (COM_R && ++flag);
    if (flag == 0) return 0;

    //总线由上拉电阻拉高 主机延时20us
    //主机设为输入 判断从机响应信号
    //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
    flag = 0;
    while (!COM_R && ++flag);
    if (flag == 0) return 0;
    flag = 0;
    while (COM_R && ++flag);
    if (flag == 0) return 0;


    dat1 = dht11_read_byte();

    dat2 = dht11_read_byte();

    dat3 = dht11_read_byte();

    dat4 = dht11_read_byte();

    dat5 = dht11_read_byte();

    ck = dat1 + dat2 + dat3 + dat4;

    if (ck == dat5) {
        sHumidityInteger = dat1;
        sHumidityDecimal = dat2;
        sTempInteger = dat3;
        sTempDecimal = dat4;
    }
    return 1;
}

六:详细设计

6.1 界面设计

首行显示Smart home monitoring system,即智能家居监控系统,第二行显示温度并输出当前环境温度,第三行显示湿度并输出当前环境湿度,第四行输出气体参数,第五行输出红外线判断结果判断当前是否有人员通过。
请添加图片描述

6.2 温度检测子模块设计

搭建热敏电阻测温电路,结合CC2530将采集的电压模拟量转换为数字量,通过无线传感器网络对测温公式实时处理,进而获取到温度值。热敏电阻灵敏度较高,其电阻温度系数要比金属大10~100倍以上,能检测出10-6C的温度变化;工作温度范围宽,并且由于体积小,可以检测狭小空间的温度,灵活性强,使用方便,成本低。本次设计采用此方案,利用热敏电阻实现获取环境温度。
请添加图片描述
请添加图片描述

6.3 气体传感器

MQ-2 型可燃气体/烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式 N 型半导体。当处于200~300°C 温度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒受到该烟雾的调制而变化,就会引起表而电导率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾浓度越大,电导率越大输出电阻越低。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。因此可通过读取可燃气体/烟雾传感器的输出信号,经 ADC 转换在串口显示。当检测到附近有可燃气体时,ADC 转换的值发生变化。以此实现判断是否有火灾,并传递相关信号到软件的目的。
请添加图片描述

请添加图片描述

6.4 红外线检测子模块设计

普通人体会发射10um 左右的特定波长红外线,用专门设计的传感器就可以针对性的检测这种 红外线的存在与否,当人体红外线照射到传感器上后,因热释电效应将向外释放电荷,后续电路经 检测处理后就能产生控制信号。,通过检测 IO 口值的变化来读取人体红外传感器的控制信号。当检测到有人体活 动时, 输入的 IO 值发生变化。当传感器模块检测到有人入侵时,会返回一个IO 口的控制信号,读取IO 口的状态判断是否有人体活动,在本系统中利用红外传感器获得是否有外人闯入的信号,并将信号存入变量中在软件部分控制报警装置,实现红外检测外人闯入的功能。
请添加图片描述
请添加图片描述

七:编码与测试

7.1 编码

#include <stdio.h>
#include <ioCC2530.h>
#include "dht11.h"
#include "sys_init.h"
#include "uart.h"
#include "hal_mcu.h"
#include "hal_assert.h"
#include "hal_board.h"

#include "hal_rf.h"
#include "basic_rf.h"

// 温度
unsigned char sTempInteger;
unsigned char sTempDecimal;
// 湿度
unsigned char sHumidityInteger;
unsigned char sHumidityDecimal;
// ADC
unsigned int ADCValue;
// 红外线
unsigned int infraredValue;

#define RF_CHANNEL            25      // 2.4 GHz RF channel


#define PAN_ID                0x1020
#define SEND_ADDR             0x2530
#define RECV_ADDR             0x2520

#define NODE_TYPE             0         //0:接收节点,1:发送节点

static basicRfCfg_t basicRfConfig;

// 向服务器发送数据
void send_data() {
    // 发送的字符数组内容
    uint8 pTxData[] = {'A', 'L', 'E', 'R', 'T', '\n'};
    uint8 ret;

    printf("send node start up...\r\n");
    // Keep Receiver off when not needed to save power
    // 关闭接收器以节省电源
    basicRfReceiveOff();

    // Main loop
    while (TRUE) {
        // 发送数据包——发送pTxData数据到RECV_ADDR
        ret = basicRfSendPacket(RECV_ADDR, pTxData, sizeof pTxData);
        if (ret == SUCCESS) {
            // 发送成功
            // P1_0灯亮
            hal_led_on(1);
            // 等待100ms
            halMcuWaitMs(100);
            // P1_0灯灭
            hal_led_off(1);
            // 等待900ms
            halMcuWaitMs(900);
        } else {
            // 发送失败
            // P1_0灯亮
            hal_led_on(1);
            // 等待1000ms
            halMcuWaitMs(1000);
            // P1_0灯灭
            hal_led_off(1);
        }
    }
}


// 报警
void alarm() {
    // 蜂鸣器响

    // 向服务器发送数据
    halMcuInit();

    hal_led_init();

    hal_uart_init();

    if (FAILED == halRfInit()) {
        HAL_ASSERT(FALSE);
    }

    // Config basicRF
    basicRfConfig.panId = PAN_ID;
    basicRfConfig.channel = RF_CHANNEL;
    basicRfConfig.ackRequest = TRUE;
    basicRfConfig.myAddr = SEND_ADDR;

    if (basicRfInit(&basicRfConfig) == FAILED) {
        HAL_ASSERT(FALSE);
    }

    send_data();
}

// 温度传感器
// 读取温度传感器
int read_dht11_data() {
    int flag = 1;
    unsigned char dat1, dat2, dat3, dat4, dat5, ck;

    //主机拉低18ms
    COM_CLR;
    halWait(18);
    COM_SET;

    flag = 0;
    while (COM_R && ++flag);
    if (flag == 0) return 0;

    //总线由上拉电阻拉高 主机延时20us
    //主机设为输入 判断从机响应信号
    //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
    flag = 0;
    while (!COM_R && ++flag);
    if (flag == 0) return 0;
    flag = 0;
    while (COM_R && ++flag);
    if (flag == 0) return 0;


    dat1 = dht11_read_byte();

    dat2 = dht11_read_byte();

    dat3 = dht11_read_byte();

    dat4 = dht11_read_byte();

    dat5 = dht11_read_byte();

    ck = dat1 + dat2 + dat3 + dat4;

    if (ck == dat5) {
        sHumidityInteger = dat1;
        sHumidityDecimal = dat2;
        sTempInteger = dat3;
        sTempDecimal = dat4;
    }
    return 1;
}

// 处理温度
int cal_dht11_data() {
    int result = read_dht11_data();
    if (result == 1) {
        // 00101101B = 45D
        char temp_flag = 0b00101101;
        if (sTempInteger >= temp_flag) {
            // 报警
            alarm();
            halWait(250);           // 延时
            D7 = !D7;                    // 标志发送状态
            halWait(250);
            halWait(250);
            return 1;
        }
    } else {
        halWait(250);           // 延时
        D7 = !D7;                    // 标志发送状态
        halWait(250);
        halWait(250);
        return 0;
    }
}

// 气体检测传感器
unsigned int getADC(void) {
    unsigned int value;

    P0SEL |= 0x02;
    ADCCON3 = (0xB1);   // 选择AVDD5为参考电压;12分辨率;P0_1  ADC

    ADCCON1 |= 0x30;    // 选择ADC的启动模式为手动
    ADCCON1 |= 0x40;    // 启动AD转化

    while (!(ADCCON1 & 0x80));  // 等待ADC转化结束

    value = ADCL >> 2;
    value |= (ADCH << 6);       // 取得最终转化结果,存入value中

    return ((value) >> 2);
}

int cal_adc_data() {
    unsigned int adc = getADC();
    ADCValue = adc;
    // 01000110B = 70D
    char adc_flag = 0b01000110;
    if (adc >= adc_flag) {
        // 报警
        alarm();
    }
    halWait(250);           // 延时
    D7 = !D7;                    // 标志发送状态
    halWait(250);
    halWait(250);
}

// 红外传感器
void cal_infrared_data() {
    char Str[10];
    int value;

    value = P0_5;
    infraredValue = value;
    if (value == 1) {
        alarm();
    }
    halWait(250);           // 延时
    D7 = !D7;                    // 标志发送状态
    halWait(250);
    halWait(250);
}

void display() {
    printf("temperature:%c.%c", sTempInteger, sTempDecimal);
    printf("humidity:%c.%c", sHumidityInteger, sHumidityDecimal);
    printf("ADCValue:%u", ADCValue);
    printf("infraredValue:%u", infraredValue);
}


int main() {
    xtal_init();
    led_init();
    // 初始化温度传感器
    dht11_io_init();
    uart0_init(0x00, 0x00);

    // 红外传感器
    P0SEL &= ~0x20;                        //P0_5为普通io口
    P0DIR &= ~0x20;                        //P0_5输入

    while (1) {
        // 处理温度数据
        cal_dht11_data();

        // 处理气体数据
        cal_adc_data();

        cal_infrared_data();

        display();
    }
}

7.2 测试

根据上述方案,基于软件搭建电路,对所设计的系统进行仿真。如图所示,环境温度为28.5度时,煤气浓度为51%,烟雾浓度为62%时,采集到的数据为温度25.0度,煤气浓度为47.8%,烟雾浓度为61.9%。此时,系统通过P2P模块进行数据的传输,并且系统检测到煤气浓度和烟雾浓度异常,开启报警系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/724425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FANUC机器人MEMO-126故障报警,无更多可用TPP内存的处理方法

FANUC机器人MEMO-126故障报警&#xff0c;无更多可用TPP内存的处理方法 如下图所示&#xff0c;示教器上报警提示“MEMO-126 无更多可用TPP内存”&#xff0c; 检查系统TPP存储空间是否够用&#xff0c;如下图所示&#xff0c;依次找到MENU—状态—存储器&#xff0c; 如下…

SSM项目前后端分离+IDEA运行环境(含前端源码)(个人博客系统)

目录 后端项目环境配置 1、创建一个SpringBoot项目&#xff0c;添加MyBatis框架和数据库MySQL驱动依赖 2、配置项目文件&#xff1a;application.yml 3、创建数据库表 4、创建分层结构目录 返回统一数据格式 创建统一数据格式返回类&#xff1a;AjaxResult 创建实现统一…

两款免费好用的OPCUA服务端模拟器

一、OPC UA服务器1 1、下载 https://download.csdn.net/download/qq_43445867/87967458 2、安装完打开即可开启opc服务 另外此软件还可以模拟一些变量变化 二、OPC UA服务器2 1、测试opc服务器 启动Softing OPC Client输入连接信息后可以看到已经连接到OPC服务器 Softing …

企业内容管理升级 3.0:构建生态协同,助力合规成长

企业内容管理曾一度火热&#xff0c;但其早期方案似乎已过时。实际上,随着企业数字化转型的加深,企业内容管理也在不断演进&#xff0c;陪伴着企业数字化成长。 企业内容管理3.0 企业内容管理1.0实现企业无纸化&#xff0c;提高业务运营效率。以电子影像技术为主,使纸质文件电…

手撕spring03源码

概述 传入对象参数通过cglib实例化代理对象整体设计 知识补充 /**** param beanDefinition* param beanName* param ctor 构造方法* param args 参数* return* throws BeansException*/Overridepublic Object instantiate(BeanDefinition beanDefinition, String beanName, C…

安达发|APS车间排产软件生产计划优化利器

APS车间排产软件是一款专门针对制造企业的生产计划排程优化软件。它可以帮助企业实现优化排程和提高生产效率。具体来说&#xff0c;它能够解决企业面临的多种复杂问题&#xff0c;包括&#xff1a; 1. 优化排产计划&#xff0c;避免设备闲置和资源浪费。通过对订单和产能的预…

Python:简单处理表格和图片数据并初步分析

目录 1.需求&#xff1a; 2.表格示例&#xff1a; 3.安装第三方库 4.代码实现 &#xff1a; 1.需求&#xff1a; 8.对周五面试结果excel表格进行操作 20分输出所有同学“名称&#xff1a;对应成绩”的信息 2分输出分值最高和最低的同学名称及分数&#xff0c;&#xff08;…

Spring Boot 中的静态资源是什么,如何使用

Spring Boot 中的静态资源是什么&#xff0c;如何使用 在 Web 应用程序中&#xff0c;静态资源通常是指不会动态生成的文件&#xff0c;例如图片、CSS、JavaScript 文件等。Spring Boot 提供了一种简单的方式来处理这些静态资源&#xff0c;让我们可以更加方便地管理和使用它们…

金融人离不开的CFA,中国人民大学与加拿大女王大学金融硕士国际班学员貌似也离不开

全球最具含金量的证书CFA证书也会被质疑你相信吗&#xff1f;号称“全球金融第一考”的CFA&#xff0c;是强化和丰富金融知识体系的。而认为这个证书只是一种背书&#xff0c;与工作实践无用的这批人&#xff0c;小编认为可能这些人也跟学历无用论是一类人。现实的他们是因为拿…

K8S-概述

k8s是什么&#xff1f; go语言开发的开源的跨主机的容器编排工具&#xff1b;全称是kubernetes&#xff1b; k8s的组件&#xff1a; master&#xff1a; ①kube-apiserver 所有服务统一的访问入口&#xff0c;无论对内还是对外&#xff1b; ②kube-controller-manager 资源…

【python系列】手把手教你在pypi发布自己的包-他人可pip下载

前言 最近在写一个接口执行引擎用作于接口自动化测试平台的核心。 看了挺多资料&#xff0c;做了挺多事情&#xff0c;学了挺多乱七八糟的知识&#xff0c;笔记记得乱糟糟的&#xff0c;以至于一直没有整理发文&#xff08;啊其实我就是懒&#xff09;&#xff0c;各位见谅。…

openkylin安装git、openssh-server

openkylin安装成功之后是没有安装git的&#xff0c;故不能clone代码 也没有安装openssh-server&#xff0c;故不能使用finalshell等工具通过ssh登录 安装git和openssh-server 打开终端&#xff1a;桌面空白处&#xff0c;右键&#xff0c;点击打开终端 输入下面的命令&…

第九章 elasticsearch集群与商品搜索

1、支持复杂的查询; 2、ES从一出生就是为分布式、集群化而 生的,不仅方便横向扩展、动态增加节点 创建索引的时候,定义3个分片,每个分片1个副本集,一个就有6个分片 如图,不论我们有多少个es实例,当用户需要对es进行增删改查的时候,连接任何一台节点都行,es内部会进行…

linux 安装中文输入法

sudo apt-get install fcitx-googlepinyin

【PAT B 1010,1011】一元多项式求导 ,A+B和C

目录 1010 一元多项式求导 1011 AB 和 C 1010 一元多项式求导 设计函数求一元多项式的导数。&#xff08;注&#xff1a;xn&#xff08;n为整数&#xff09;的一阶导数为nxn−1。&#xff09; 输入格式: 以指数递降方式输入多项式非零项系数和指数&#xff08;绝对值均为不…

Spring拦截器入门案例讲解

1.拦截器的概念 拦截器是一种动态拦截方法调用的机制&#xff0c;在SpringMVC中动态拦截控制器方法的执行。 作用 在指定的方法调用前后执行预先设定的代码阻止原始方法的执行 2.拦截器和过滤器的区别 归属不同&#xff1a;Filter属于Servlet技术&#xff0c;Interceptor属…

第二课:Figma 界面认识

创建文件 进入 Figma 后&#xff0c;可以查看最近浏览的内容&#xff0c;官方也推荐了一些基础的项目&#xff0c;点击右上角 Design file&#xff08;设计文件&#xff09;即可创建项目&#xff1b; 注&#xff1a;网页版和本地版界面样式布局一致。 创建画布 点击左上画框…

SpringBoot教学资料2-Hello SpringBoot!

Hello SpringBoot&#xff01; springboot的启动 1.创建springboot项目。注意选择spring-boot-starter-parent版本。版本兼容适配问题请看下列。 springboot1.5.9以下兼容jdk1.7 springboot2.x.x版本兼容jdk1.8 springboot3.0及以上版本兼容jdk17 springboot2.1之后的版本已…

企业微信自建应用获取登录用户敏感信息,一键授权 (python篇,详细多图)

目录 收起 企业微信自建应用配置 自建应用 构造网页授权链接 请求用户信息 补充 ACCESS_TOKEN 企业微信自建应用配置 自建应用 新建应用 企业微信管理后台——>应用管理&#xff0c;拉到最下方&#xff0c;创建应用 创建应用 配置应用 在应用管理页面点击刚才创…

jmeter 性能测试用 csv,这个坑有些扯蛋

⏩很多人在使用 jmeter 做接口测试、自动化测试和性能测试时&#xff0c;都喜欢用 CSV 数据文件设置功能&#xff0c;来读取准备好的测试数据。虽然这种方法并不是最优方案&#xff0c;在我们的性能测试课程中&#xff0c;讲解了更优的方案&#xff0c;但是&#xff0c;没有上过…