查看: 14651|回复: 19

[大赛作品提交] 树莓派3+openhab智能家居辅助管理平台设计

  [复制链接]
  • TA的每日心情
    奋斗
    2021-6-9 11:33
  • 签到天数: 460 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2018-1-11 12:59:05 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 Litthins 于 2018-5-25 17:44 编辑

    感谢E络盟提供的助赛基金。

    一、项目名称
        一种基于树莓派和openhab的智能家居辅助管理平台
    二、原理及演示
           详见报告文档,源码已经共享
           视频演示移步:e络盟杯树莓派创意设计大赛Litthins团队作品

           部分截图在文章最后。

    ————————————————————我是分割线————————————————————

    e络盟杯树莓派创意设计大赛
    作品设计报告

    树莓派3+openHAB智能家居辅助管理平台


    参赛者学校:中国石油大学(华东)
    作者:邓承杰、高伟、尚亚期
    时间:2018年1月10日(5月25日更新版)


    一、摘要
    本项目开发了一种家庭设备控制平台,提供家庭环境的实时监控功能(温度、湿度、火灾报警),提供安防功能(视频监控,红外人体识别,录像和抓拍),针对老人和职场人士的日常事务管理方案,此外还有家庭ftp服务器,wifi热点等辅助功能。系统以树莓派及openHAB2为基础,力图将家电设备纳入统一管理,提供高度集成的管理界面,可通过手机、电脑直接对家庭环境进行监测和控制。
    二、系统设计方案
    (一)总体设计

    本系统以树莓派和openHAB2为基础,结合单片机控制的传感器,实现辅助管理平台的功能。其中,以flask框架建立web服务器,实现与openHAB2的交互。本服务器向下通过GPIO口与单片机通讯,接收单片机上各个传感器的状态;向上与openHAB2交互,可以实时返回请求数据或传递用户命令,执行相关功能。

    实物图正面

    实物图正面

    (二)树莓派系统设计file:///C:\Users\RASPBE~1\AppData\Local\Temp\ksohtml\wps581B.tmp.png
    树莓派作为本地服务端,兼顾flask框架下webserver的实现和openHAB2的运行。Webserver结合Rpi.GPIO模块以实现和单片机的通讯。数据获取方式为自定义的“接收请求-发送数据”的被动模式,该模式是阻塞式设计,数据的发送和接收完全由树莓派控制,增强可靠性。从单片机获得的数据在服务器中进行处理,之后直接返回给openHAB2。OpenHAB2中的界面为自定义界面,每个磁贴实现单独的一种或一个功能,该页面支持用户根据自身需要进行更改,方便后期添加新功能。
    (三)单片机系统设计
    本系统使用廉价的51单片机做下位机,单片机负责管理温度传感器、湿度传感器、烟雾传感器、蜂鸣器。人体红外识别模块从单片机系统中脱离出来,单独委托给树莓派直接管理,以提高系统反应速度。
    三、硬件系统设计
    (一)单片机的设计
    1.程序目的:
    通过c51单片机读取DHT11温度湿度传感器的数据,以及MQ-2烟雾传感器的数据,并使用一种自定义的数据传输方式,将读取到的数据传输给树莓派,由树莓派处理传输的数据。
    2.程序思路:读取DTH11温度湿度传感器中的数据(在wendushidu.c中),将读取到的40位二进制数据,取其前16位转化为三位十进制数字(湿度),取中间16位转化为有一位小数的三位十进制数字(温度),将湿度与温度合并转化为六位十进制数据并将其传送给main.c进行处理。
    读取MQ-2烟雾传感器的数据(在main.c中),将烟雾传感器输出高低电平给单片机的P2^6引脚,判断引脚的高低电平就可以知道周围环境烟雾是否达到设定值。
    C51与树莓派的通讯:在main.c中将从wendushidu.c接收的六位十进制数据转化为有三位十进制数字(湿度),三位十进制数字(温度),都带有一位小数,将接受到的烟雾传感器数据转化为一位十进制数据。将每一位十进制数据转化为四位二进制数据,有7位十进制数据,转化为28位二进制数据,其中前12位为湿度,中间十二位为温度,最后四位为烟雾标志值。当树莓派发送给c51的P3^2管脚一个低电平时,c51触发中断,进入main.c中的中断函数。当树莓派发送给c51的P3^1管脚一个高电平时,c51的P2^1便发送给树莓派一个高低电平,也就是一位二进制数据,c51等待下一次P2^1管脚低电平,树莓派给P2^1管脚高电平。重复上述操作28次,便将湿度温度烟雾标志值这28位二进制数据传递给树莓派,树莓派将c51的P3^2管脚拉高,结束完整的一次传输。重复中断操作,就可以实现实时读取传感器数据并传输数据到树莓派。
    3.温度湿度传感器DTH11:DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃。DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。
    图片1.png 图片2.png
    file:///C:\Users\RASPBE~1\AppData\Local\Temp\ksohtml\wps68FA.tmp.jpg
    file:///C:\Users\RASPBE~1\AppData\Local\Temp\ksohtml\wps68FB.tmp.jpg
    DHT11与c51的接线说明:

    将DHT11的2引脚接到c51的P3^6引脚,VCC接5v正电源,GND接地;

    DHT11的程序说明:见程序文件c51程序.txt
    1)初始化DHT11 见函数DHT11_start()   
    2)从DHT11中读取一位数据  见函数DHT11_rec_byte()
    3)从DHT11中读取四十位数据,并将其转化为湿度温度,返回                出函数见函数DHT11_receive()

    4.烟雾传感器MQ-2:适用于家庭或者工厂的气体泄漏检测装置,适宜与液化气,丁烷,丙烷,甲烷,酒精,氢气,烟雾等检测装置。故因此,MQ-2可以准确来说是一个多种气体探测器。MQ-2的探测范围极其的广泛。它的优点:灵敏度高、响应快、稳定性好、寿命长、驱动电路简单。
    MQ-2的工作原理:MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至而变化,就会引起表面导电率的变化利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大。
    调定MQ-2上的螺母,就可以调节检测的限定值,当未达到限定值时,DO输出高电平;当烟雾或有害气体浓度过大时,达到限定的浓度值,DO输出低电平。

    MQ-2与c51接线说明:
    MQ-2有四个管脚,分别为VCC,GND,AO,DO。VCC管脚接+5V,GND管脚接地,AO悬空,DO接c51上的P2^6;
    MQ-2的程序说明:见c51文档中的main.c文件
    MQ-2的DO管脚发出的电平传递到c51上的P2^6上,读取P2^6上的电平高低就可以判断是否周围环境的烟雾有害气体浓度是否达到限定值,当达到限定值时,P2^6读取到低电平;当未达到限定值时,P2^6读取到的时低电平。
    (二)树莓派GPIO口设计
    对树莓派GPIO口的设计上,采用单独功能的GPIO口进行通讯。其中单片机由树莓派GPIO模块供电,树莓派与下位机通讯使用三个引脚,树莓派控制台灯功能的实现使用了区别于单片机供电的另外两个电源和两个地,继电器模块使用一电源,台灯供电由继电器控制,继电器作用信号由树莓派控制,向上由openHAB2的用户界面经用户触发。
    (三)其他器件的连接
    蜂鸣器直连在烟雾监测模块上,不经过单片机,保证可靠。
    四、软件设计方案
    (一)OpenHAB2的介绍和设计
    1. 介绍

    openHAB全称为open Home Automation Bus,即开放式家庭自动化总线,该项目旨在为家庭自动化构建提供一个通用的集成平台。openHAB是一个纯Java打造的开源项目,完全基于OSGi(Open Service Gateway Initiative),并使用Jetty作为web服务器。Jetty和Equinox OSGi运行时一起构成了openHAB的核心基础。
    1.1 工作原理
    openHAB的设计是厂商中立的,且与硬件/协议无关。openHAB通过绑定(binding),汇集了不同的总线系统、硬件设备和接口协议。这些绑定可以通过openHAB事件总线发送和接收命令,并更新状态。开发者可以在openHAB的基础上设计独特的操作界面,以开放自己的家庭自动化系统,或者利用其他技术来创建设备的新的控制方式。
    1.2 平台架构
    openHAB平台架构图如上所示。openHAB平台架构具有极强的模块化设计特点,用户可以动态的向平台添加新的功能,移除不需要的模块。基于此特性,在平台开发过程中,可以更加灵活的对系统的功能进行控制和扩展。
    图片3.png
    2. 设计
    2.1.总体设计

    openHAB平台的总体设计示意图如下所示。
    图片4.png
    用户交互界面我们采用openHAB提供的HABPanel,该UI界面具有美观、易操作、信息展示全面的特点。通过添加窗口小部件(Widget)即可将我们所需的功能模块添加到用户界面上,进行操作与展示。
    总体设计分为五个模块,分别是:天气预报模块、灯光控制模块、摄像监控模块、温湿度检测模块和日程管理模块。
    2.2.天气预报模块
    天气预报模块示意图如下所示。
    图片5.png
    天气预报模块使用openHAB提供的weather binding。通过配置该binding,调用天气服务提供商提供的天气预报API获取天气信息,然后在openHAB配置文件中将这些天气服务数据item化,最后在HABPanel的Widget中进行调用,即可将天气情况展示在界面上。在widget中天气数据会通过后台服务传递的数据进行实时更新。
    Item配置文件代码如下:
    图片6.png
    Weather Binding配置文件代码如下:
    图片7.png
    此处我们使用的是ForecastIo提供的API,该API支持五天的天气预报数据。通过输入ForecastIo提供的API(apikey)以及目标地的经纬度(latitude、longtitude)便可获得所需地点的天气数据。
    2.3.灯光控制模块
    灯光控制模块示意图如下图所示。
    图片8.png
    灯光控制模块使用openHAB提供的HTTP Binding。通过在openHAB配置文件中生成灯光控制开关实例,然后该实例调用HTTP Binding服务向基于Flask框架实现的本地服务器发送开关命令从而实现灯光的控制。在HABPanel界面生成Button Widget,调用灯光控制开关实例,然后便可以通过点击该按钮实现对灯光的开关控制了。
    Item配置文件代码如下:
    图片9.png
    2.4.摄像监控模块
    摄像监控模块示意图如下所示。
    摄像监控模块共有三部分构成(红线圈出部分),
    图片10.png
    对应图像展示Widget、摄像头直接控制Widget和红外人体感应控制Widget。该模块采用HTTP
    Binding和GPIO Binding。通过在openHAB配置文件中生成摄像头直接控制开关实例,然后该实例调用HTTP Binding服务向基于Flask框架实现的本地服务器发送开关命令从而实现摄像头的直接开关控制。另一方面,通过添加人体感应传感器,还可实现感应到有人出现后自动打开摄像头的操作,红外人体感应传感器与树莓派的引脚连接后,通过GPIO Binding将传感器信号在配置文件中实例化,将GPIO口传送过来的高低电平信号(人出现与否的信号)传送到实例化的对象上,然后通过openHAB中的自定义Rule实现感应后将摄像头控制开关打开从而打开摄像头的操作。
    在HABPanel中添加上相应Widget后即可通过点按开关按钮实现摄像头的开关操作。
    Item配置文件代码如下:
    图片11.png
    Rule配置文件代码如下:
    图片12.png
    5.温湿度检测模块
    温湿度检测模块示意图如下所示。
    图片13.png
    该模块主要使用了InfluxDB和Grafana。InfluxDB用于存储温湿度传感器传送过来的温湿度数据。Grafana用于温湿度数据的可视化展示,通过调用InfluxDB中的数据,即可展示出直观的数据。最后在HABPanel中定义一个
    frame Widget,将动态温湿度数据图表链接绑定到该Widget上,通过不断刷新InfluxDB中的数据,即可实现图表的动态展示。
    温湿度数据通过task.py脚步本从树莓派的GPIO口进行读取,并直接POST到数据库中,进行更新。
    6.日程管理模块
    日程管理模块示意图如下图所示。
    图片14.png
    该模块通过引用第三方日程管理平台(SuperProductivity),然后在林格爱一个Panel中自定义Widget绑定平台提供的接口即可实现日程管理的操作,用户侧滑打开task
    Panel,然后输入相应日程任务即可将事项加入到日程表中。该平台还支持日程的导出和本地日程文件的导入,操作极为方便。除此之外通过点击顶部的Back to Home按钮还可迅速跳转到home Panel主界面,检测home的其他数据和操作其他硬件设备。
    (二)Flask框架的介绍及设计
    1. 介绍

    Flask是一个使用 Python 编写的轻量级 Web 应用框架。其WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。Flask也被称为 “microframework” ,因为它使用简单的核心,用extension 增加其他功能。Flask没有默认使用的 数据库、窗体验证工具。
    2. 设计
    ① 基于Flask的Web服务器代码

    1. <font face="宋体" size="4" color="#000000">from flask import Flask, request
    2. from flask_script import Manager
    3. import RPi.GPIO as GPIO
    4. import os

    5. app = Flask(__name__)
    6. manager = Manager(app)

    7. @app.route('/switch_on', methods=['POST'])
    8. def SwitchOn():
    9.     if request.method == 'POST':
    10.         os.system('bash /home/pi/RPi_Cam_Web_Interface/start.sh')
    11.         return '<h1>Switch ON!</h1>'

    12. @app.route('/switch_off', methods=['POST'])
    13. def SwitchOff():
    14.     if request.method == 'POST':
    15.         os.system('bash /home/pi/RPi_Cam_Web_Interface/stop.sh')
    16.         return '<h1>SWITCH OFF!</h1>'

    17. @app.route('/light_on', methods=['POST'])
    18. def LightOn():
    19.     if request.method == 'POST':
    20.         GPIO.setmode(GPIO.BCM)
    21.         GPIO.setup(26,GPIO.OUT,initial=GPIO.HIGH)
    22.         GPIO.output(26,GPIO.LOW)
    23.         return '<h1>Light ON!</h1>'

    24. @app.route('/light_off', methods=['POST'])
    25. def LightOff():
    26.     if request.method == 'POST':
    27.         GPIO.setmode(GPIO.BCM)
    28.         GPIO.setup(26,GPIO.OUT,initial=GPIO.HIGH)
    29.         GPIO.output(26,GPIO.HIGH)
    30.         return '<h1>Light OFF!</h1>'

    31. @app.route('/fire', methods=['GET'])
    32. def Fire():
    33.     if request.method == 'GET':
    34.         GPIO.setmode(GPIO.BCM)
    35.         GPIO.setup(13,GPIO.OUT,initial=GPIO.LOW)
    36.         GPIO.output(13,GPIO.HIGH)
    37.         GPIO.cleanup()
    38.         return '<h1>Fire!</h1>'

    39. if __name__ == '__main__':
    40.             manager.run()</font>
    复制代码
                    此代码通过定义路由的方法,对每个不同的功能定义不同的url,openHAB2通过访问特定url触发特定代码段,结合RPi.GPIO实现具体功能。代码简单易懂,变量名称直白,便不再多加注释。
    ② 传感器的监控程序代码
    1. <font face="宋体" size="4" color="#000000">from task.task import Task_Class

    2. app2=Task_Class()
    3. app2.HTF()

    4. import RPi.GPIO as GPIO
    5. import json
    6. import math
    7. import requests
    8. import sys
    9. from time import sleep
    10. import os

    11. class Task_Class:

    12.     def HTF(self):
    13.         IP = "192.168.0.54"        # The IP of the machine hosting your influxdb instance
    14.         DB = "openhab_db"               # The database to write to, has to exist
    15.         USER = "openhab"             # The influxdb user to authenticate with
    16.         PASSWORD = "raspberry"  # The password of that user
    17.         #TIME = 1                  # Delay in seconds between two consecutive updates
    18.        # STATUS_MOD = 5            # The interval in which the updates count will be printed to your console
    19.         while 1:
    20.             bits_humidity=[]
    21.             bits_temperature=[]
    22.             bits_fire=[]
    23.             GPIO.setmode(GPIO.BCM)
    24.             GPIO.setup(17, GPIO.OUT,initial=GPIO.HIGH)
    25.             GPIO.setup(27, GPIO.OUT,initial=GPIO.LOW)
    26.             GPIO.setup(22, GPIO.IN)
    27.             sleep(0.04)
    28.             GPIO.output(17, GPIO.LOW)
    29.             sleep(0.04)
    30.             GPIO.output(17, GPIO.HIGH)
    31.             for i in range(12):
    32.                 GPIO.output(27, GPIO.HIGH)
    33.                 sleep(0.01)
    34.                 bit_temperature=(GPIO.input(22))
    35.                 bits_temperature.append(bit_temperature)
    36.                 sleep(0.01)
    37.                 GPIO.output(27, GPIO.LOW)
    38.                 sleep(0.01)
    39.             for i in range(12):
    40.                 GPIO.output(27, GPIO.HIGH)
    41.                 sleep(0.01)
    42.                 bit_humidity=(GPIO.input(22))
    43.                 bits_humidity.append(bit_humidity)
    44.                 sleep(0.01)
    45.                 GPIO.output(27, GPIO.LOW)
    46.                 sleep(0.01)
    47.             for i in range(4):
    48.                 GPIO.output(27, GPIO.HIGH)
    49.                 sleep(0.01)
    50.                 bit_fire=(GPIO.input(22))
    51.                 bits_fire.append(bit_fire)
    52.                 sleep(0.01)
    53.                 GPIO.output(27, GPIO.LOW)
    54.                 sleep(0.01)
    55.             humidity=((8*bits_humidity[0]+4*bits_humidity[1]+2*bits_humidity[2]+bits_humidity[3])*10+\
    56.                 (8*bits_humidity[4]+4*bits_humidity[5]+2*bits_humidity[6]+bits_humidity[7])+\
    57.                 (8*bits_humidity[8]+4*bits_humidity[9]+2*bits_humidity[10]+bits_humidity[11])*0.1)
    58.             temperature=10*((8*bits_temperature[0]+4*bits_temperature[1]+2*bits_temperature[2]+bits_temperature[3])*10+\
    59.                 (8*bits_temperature[4]+4*bits_temperature[5]+2*bits_temperature[6]+bits_temperature[7])+\
    60.                 (8*bits_temperature[8]+4*bits_temperature[9]+2*bits_temperature[10]+bits_temperature[11])*0.1)
    61.             if bits_fire[3]==0:
    62.                     os.system('http GET 127.0.0.1:5000/fire')
    63.             GPIO.cleanup()
    64.             v1 = 'temp_wave value=%d' % temperature
    65.             v2 = 'humi_wave value=%d' % humidity
    66.             r1 = requests.post("http://%s:8086/write?db=%s" %(IP, DB), auth=(USER, PASSWORD), data=v1)
    67.             r2 = requests.post("http://%s:8086/write?db=%s" %(IP, DB), auth=(USER, PASSWORD), data=v2)
    68.             print(['POST Success!',temperature,humidity])
    69.         return(1)</font>
    复制代码
                    此段将传感器的主要功能封装成一个名为task的模块,在主程序中调用以实现其功能。脚本将数据从单片机中读出,进行格式处理,再post给openHAB2用于绘制图像。
    (三)51单片机的程序
    1. <font face="宋体" size="4" color="#000000">#ifndef _WENDUSHIDU_H_
    2. #define _WENDUSHIDU_H_
    3. #include<reg52.h>
    4. #include<intrins.h>
    5. //---重定义关键词---//
    6. #ifndef uchar
    7. #define uchar unsigned char
    8. #endif

    9. #ifndef uint
    10. #define uint unsigned int
    11. #endif


    12. //--声明全局函数--//
    13. void DHT11_delay_us(uchar );
    14. void DHT11_delay_ms(uint );
    15. void DHT11_start();
    16. uchar DHT11_rec_byte();
    17. uint erzhuanshi(uchar );
    18. long DHT11_receive();

    19. #endif
    20. #include <reg52.h>
    21. #include <intrins.h>
    22. #include "wendushidu.h"        //调用wendushidu传感器头文件

    23. #define uint unsigned int
    24. #define uchar unsigned char

    25. sbit shuju=P2^0; //用于给树莓派传输数据
    26. sbit key=P3^2;         //中断线  用于发送数据的标识
    27. sbit jiance=P3^1;        //与树莓派通讯时接受树莓派的信号
    28. sbit q2=P2^6;     //与MQ-2烟雾传感器相连
    29. long wendu,shidu,yanwu;        //定义温度 湿度


    30. void delay10ms(void)   //误差 0us  延时10ms
    31. {
    32.     unsigned char a,b,c;
    33.     for(c=1;c>0;c--)
    34.         for(b=38;b>0;b--)
    35.             for(a=130;a>0;a--);
    36. }

    37. /*函数功能:外部中断0的初始化*/
    38. void Int0Init()         
    39. {
    40.   EA=0;                         //关闭总中断
    41.   IT0=1;
    42.   EX0=1;
    43.   EA=1;                         //打开总中断
    44. }
    45. /*-----------------------------------*/


    46. void delay(uint i)          //延时程序,大约延时i微妙
    47. {
    48.         while(i--);        
    49. }

    50. /*此函数功能:接收一个十进制的数字,返回4位二进制数字*/
    51. void fanhuanzhi(int shuzi)        
    52. {
    53.    int shuzi1,shuzi2,shuzi3,shuzi4;  //定义发送的4个二进制数字
    54.    shuzi1=shuzi/8;                                         //转换十进制为4个二进制数字
    55.    shuzi2=shuzi%8/4;
    56.    shuzi3=shuzi%4/2;
    57.    shuzi4=shuzi%2;
    58.    while(!jiance);                                         //等待树莓派发送高电平
    59.    while(jiance)                                           //在树莓派高电平时处理数据
    60.    {
    61.            shuju=shuzi1;
    62.            while(jiance);                                 //等待树莓派变为低电平后结束第一位二进制的计算
    63.             
    64.    }
    65.    while(!jiance);
    66.    while(jiance)  
    67.    {
    68.            shuju=shuzi2;
    69.            while(jiance);
    70.             
    71.    }
    72.    while(!jiance);
    73.    while(jiance)  
    74.    {
    75.            shuju=shuzi3;
    76.            while(jiance);
    77.             
    78.    }
    79.    while(!jiance);
    80.    while(jiance)  
    81.    {
    82.            shuju=shuzi4;
    83.            while(jiance);
    84.             
    85.    }
    86. }
    87. /*----------------------------------------------------*/


    88. /*此函数功能:发送给树莓派28位二进制数据,前12位为湿度,中间12位为温度,最后四位为烟雾检测*/
    89. void Int0() interrupt 0                                          
    90. {
    91.    delay(1000);                 //延时消抖
    92.    if(key==0)                 //再次判断是否触发中断
    93.    {
    94.   
    95.    int  test1,test2,test3,test4,test5,test6,test7;   //分别定义为湿度的十位,个位,十分位,温度的十位,个位,十分位,烟雾检测位
    96.    test1=shidu/100;                   //湿度的十位
    97.    test2=shidu%100/10;           //湿度的个位
    98.    test3=shidu%10;                   //湿度的十分位
    99.    test4=wendu/100;
    100.    test5=wendu%100/10;
    101.    test6=wendu%10;
    102.     if(q2==0)                           //用于判断烟雾是否达到设定值
    103.    {
    104.       test7=0;
    105.    }
    106.    if(q2==1)
    107.    {
    108.       test7=1;
    109.    }
    110.    fanhuanzhi(test1);                //传送数据        前三个为湿度  中间三个为温度 最后一个为烟雾标志值
    111.    fanhuanzhi(test2);
    112.    fanhuanzhi(test3);
    113.    fanhuanzhi(test4);
    114.    fanhuanzhi(test5);
    115.    fanhuanzhi(test6);
    116.    fanhuanzhi(test7);  
    117.    }
    118.   
    119. }


    120. void main()           //主函数
    121. {
    122.   long zjsj;   //传递中间量
    123.   Int0Init();  //初始化外部中断0
    124.   
    125.   while(1)
    126.   {
    127.      zjsj=DHT11_receive();           //读取传感器数据,湿度以及温度
    128.          shidu=zjsj/1000;                   //计算湿度
    129.          wendu=zjsj%1000;                   //计算温度
    130.   }
    131. }
    132. #include <reg52.h>
    133. #include <intrins.h>

    134. #define uint unsigned int
    135. #define uchar unsigned char

    136. sbit Data=P3^6;   //定义数据线

    137. void DHT11_delay_us(uchar n)  //延时n微秒
    138. {
    139.     while(--n);
    140. }

    141. void DHT11_delay_ms(uint z)           //延时n毫秒
    142. {
    143.    uint i,j;
    144.    for(i=z;i>0;i--)
    145.       for(j=110;j>0;j--);
    146. }

    147. void DHT11_start()                 //初始化DHT11
    148. {
    149.    Data=1;
    150.    DHT11_delay_us(2);
    151.    Data=0;
    152.    DHT11_delay_ms(20);   //延时18ms以上
    153.    Data=1;
    154.    DHT11_delay_us(30);
    155. }

    156. uchar DHT11_rec_byte()      //接收一个字节
    157. {
    158.    uchar i,dat=0;
    159.   for(i=0;i<8;i++)    //从高到低依次接收8位数据
    160.    {         
    161.       while(!Data);   ////等待50us低电平过去
    162.      DHT11_delay_us(8);    //延时60us,如果还为高则数据为1,否则为0
    163.       dat<<=1;           //移位使正确接收8位数据,数据为0时直接移位
    164.       if(Data==1)    //数据为1时,使dat加1来接收数据1
    165.          dat+=1;
    166.       while(Data);  //等待数据线拉低   
    167.     }  
    168.     return dat;
    169. }


    170. /*函数功能:将二进制数转换为十进制数字*/
    171. uint erzhuanshi(uint bajinzhi)
    172. {
    173.     int i;
    174.         int jiecheng=1,dataa,date=0;
    175.         for(i=0;i<8;i++)
    176.         {
    177.             dataa=bajinzhi&0x01;
    178.                 date=date+dataa*jiecheng;
    179.                 bajinzhi>>=1;
    180.                 jiecheng=jiecheng*2;
    181.         }
    182.         return date;
    183. }
    184. /*----------------------------------------------------*/


    185. /*函数功能:接收DHT11的40位数据*/
    186. long  DHT11_receive()      //接收40位的数据
    187. {
    188.     long fanhui;  //定义返回的温度湿度数值
    189.     uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
    190.     DHT11_start();
    191.     if(Data==0)
    192.     {
    193.         while(Data==0);   //等待拉高     
    194.         DHT11_delay_us(40);  //拉高后延时80us
    195.         R_H=DHT11_rec_byte();    //接收湿度高八位  
    196.         R_L=DHT11_rec_byte();    //接收湿度低八位  
    197.         T_H=DHT11_rec_byte();    //接收温度高八位  
    198.         T_L=DHT11_rec_byte();    //接收温度低八位
    199.         revise=DHT11_rec_byte(); //接收校正位

    200.         DHT11_delay_us(25);    //结束

    201.         if((R_H+R_L+T_H+T_L)==revise)      //校正
    202.         {
    203.             RH=R_H;
    204.             RL=R_L;
    205.             TH=T_H;
    206.             TL=T_L;
    207.                         fanhui=(RH%100)*10000+(RL/10)*1000+(TH%100)*10+TL/10;        //将湿度温度转换为一个6位的十进制数返回,前三位为湿度*10,后三位为温度*10
    208.         }        
    209.     }
    210.         return fanhui;        //返回湿度温度特征量
    211. }</font>
    复制代码
    (四)其他
    Wifi热点的功能使用creat_ap实现,详见:
    游客,如果您要查看本帖隐藏内容请回复

    日程管理功能由super-productivity实现,详见:
    游客,如果您要查看本帖隐藏内容请回复

    五、系统测试及结果分析
    详见视频链接:

    e络盟杯树莓派创意设计大赛Litthins团队作品
    http://v.youku.com/v_show/id_XMzMwODgxMzA4OA==.html?spm=a2h3j.8428770.3416059.1


    六、结论
    本系统实现了基于树莓派和openHAB2的家庭设备控制平台,提供家庭环境的实时监控功能(温度、湿度、火灾报警),提供安防功能(视频监控,红外人体识别,录像和抓拍),针对老人和职场人士的日常事务管理方案,此外还有家庭ftp服务器,wifi热点等辅助功能。系统以树莓派及openHAB2为基础,通过openHAB2和flask框架天然的适应性,将家电设备纳入统一管理,提供高度集成的管理界面,可通过手机、电脑直接对家庭环境进行监测和控制。此外,由于openHAB2的高度灵活性,可以根据自身要求添加相应的功能,在flask框架下的webserver中加入对应的响应即可实现定制功能,系统开发适应性强。


    实物图侧面

    实物图侧面

    用户界面1

    用户界面1

    用户界面2

    用户界面2

    用户界面3

    用户界面3

    有图有真相

    有图有真相
    图片15.png

    源代码.zip

    1.28 MB, 下载次数: 62

    项目源码

    回复

    使用道具 举报

    该用户从未签到

    发表于 2018-1-15 13:14:29 | 显示全部楼层
    好细致的报告
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-6-9 11:33
  • 签到天数: 460 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2018-1-16 19:51:24 | 显示全部楼层
    ky123 发表于 2018-1-15 13:14
    好细致的报告

    其实马马虎虎啦,考试周时间太紧,有一些地方也没有交代清楚
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2021-2-27 22:16
  • 签到天数: 1568 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2018-1-17 23:52:14 | 显示全部楼层
    项目写的蛮详细的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-6-9 11:33
  • 签到天数: 460 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2018-1-19 18:18:43 | 显示全部楼层
    feixiang20 发表于 2018-1-17 23:52
    项目写的蛮详细的

    报告书还是写得仓促,考试周要复习的课程太多时间紧
    有问题的地方尽管问,我们尽力回答哈
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-6-9 11:33
  • 签到天数: 460 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2018-5-25 17:48:39 | 显示全部楼层
    本次更新优化了排版,去掉了word文档直接转换的格式问题,使文档结构更紧凑,更容易阅读。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-1-22 17:03
  • 签到天数: 33 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2018-5-29 17:48:15 | 显示全部楼层
    好详尽哦,支持楼主!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2018-5-30 10:09:31 | 显示全部楼层
    好棒的项目,我学到了很多,谢谢楼主认真解答
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-6-9 11:33
  • 签到天数: 460 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2018-5-30 12:15:03 | 显示全部楼层
    Asmodeus 发表于 2018-5-29 17:48
    好详尽哦,支持楼主!

    谢谢,我们会继续努力的!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-6-9 11:33
  • 签到天数: 460 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2018-5-30 12:16:06 | 显示全部楼层
    shanggelaile 发表于 2018-5-30 10:09
    好棒的项目,我学到了很多,谢谢楼主认真解答

    Flask真的可以说是非常优秀了
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-3-29 20:27 , Processed in 0.219229 second(s), 37 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.