解决方案:自己动手实现智能家居之温湿度数据采集存储(DHT11,MySql)

优采云 发布时间: 2022-12-02 12:25

  解决方案:自己动手实现智能家居之温湿度数据采集存储(DHT11,MySql)

  【前言】

  一个热爱技术的人,一定向往充满技术的环境,何不践行技术人的座右铭:“科技改变世界”。

  让我们一步步搭建一个属于自己的“智能家居平台”(不要嘲笑这个名词,技术在手,如何设计和实现因人而异),这篇文章只是为了吸引ideas,如果各行各业有更好的idea可以大显身手,当然把更好的idea留在评论区,大家一起学习就更好了。

  文末附上全部源码,需要的可以自行下载,谢谢Star~

  【系列目录】

  树莓派GPIO介绍(Python版) 温湿度数据采集与存储(DHT11、MySql) 温湿度数码管显示(四位共阳极数码管) 搭建显示温湿度报表的app(ApiCloud、Python Flask) ) 普通家用插座集成继电器 手动改造App远程控制“自制智能”插排板 使用花生棒穿透内网实现外网访问App进行*敏*感*词*(*敏*感*词*模块集成)

  【本节概要】

  上一节我们介绍了树莓派的简单使用以及树莓派的GPIO。本小节根据上一节的知识点采集房屋内的温湿度数据,并搭建python脚本将采集到的数据写入mysql。数据库持久性。

  效果图:

  那我们就一步一步来解释这个折腾的过程吧……

  【硬件采购】

  “某宝”买了一个DHT11模块,大概¥6。为了方便线路的灵活连接,我们买了一些面包板和杜邦线。

  硬件采购完成后,我们开始进行软件部分的工作~~~

  【DHT11模块获取温湿度】

  DHT11硬件接口

  DHT11有3个IO接口,1个VCC(正极)接3.3v,1个GND接GND,剩下1个DATA接树莓派任意GPIO。设备上有印刷字体标明管脚,按照说明书连接到树莓派即可。

  使用开源类库Adafruit_DHT获取温湿度

  读取温湿度,我们可以使用封装好的开源库:Adafruit_DHT

  import Adafruit_DHT

# Use read_retry method. This will retry up to 15 times to

# get a sensor reading (waiting 2 seconds between each retry).

# this is bcm code

humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT11, 4)

  构建数据存储部分

  为了方便我们读写MySql,我们需要一个MySqlHelper.py,内容如下:

  # coding=utf-8

import pymysql

from Utility.Configs import Cfg_MySql

class MySqlHelper:

conn = None

def __init__(self, db):

cfg_mysql = Cfg_MySql()

self.conn = pymysql.connect(host=cfg_mysql.get('host'), port=int(cfg_mysql.get('port')), user=cfg_mysql.get('user'), passwd=cfg_mysql.get('passwd'), db=db)

def getConnAndCur(self):

return self.conn,self.conn.cursor()

def executeSql(self,sql):

conn,cur = self.getConnAndCur()

cur.execute(sql)

conn.commit()

cur.close()

conn.close()

# 用完记得释放

# cur.close()

# conn.close()

  mysql的连接信息是通过ini配置文件存储的,我们还需要一个Configs.py读写配置文件,内容如下:

  # coding=utf-8

<p>

import configparser

# 树莓派的ubuntu系统里面如果要使用计划任务,则必须写成绝对路径,意味着这里需要加前缀

# RASPBERRY_PI_PATH = '/7tniy/SevenTiny.SmartHome'

# Windows调试不需要加绝对路径

RASPBERRY_PI_PATH_ROOT = ''

# get configuration

config = configparser.ConfigParser()

config.read(RASPBERRY_PI_PATH_ROOT + 'SmartHome.ini',encoding='UTF-8')

class Cfg_MySql:

__tag = 'MySql'

def __init__(self):

pass

def get(self, name):

return config.get(self.__tag, name)

</p>

  我们的配置文件SmartHome.ini可以放在项目的根目录下。内容如下:

  [MySql]

connectionstring = 1

host = 192.168.0.1

port = 3306

user = prod

passwd = 123456xxx

  数据库表结构:

  /*

Navicat MySQL Data Transfer

Source Server :

Source Server Version : 50644

Source Host :

Source Database : SmartHome

Target Server Type : MYSQL

Target Server Version : 50644

File Encoding : 65001

Date: 2019-10-08 21:38:09

*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------

-- Table structure for DailyMonitor

-- ----------------------------

DROP TABLE IF EXISTS `DailyMonitor`;

CREATE TABLE `DailyMonitor` (

`Id` int(11) NOT NULL AUTO_INCREMENT,

`DateTime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,

`Year` int(11) DEFAULT NULL,

`Month` int(11) DEFAULT NULL,

`Day` int(11) DEFAULT NULL,

`Hour` int(11) DEFAULT NULL,

`Temperature` double(255,0) DEFAULT NULL,

`Humidity` double(255,0) DEFAULT NULL,

PRIMARY KEY (`Id`)

) ENGINE=InnoDB AUTO_INCREMENT=1211 DEFAULT CHARSET=utf8;

  

" />

  主要监控脚本SmartHomeScreen.py内容

  # coding=utf-8

from Utility.MySqlHelper import MySqlHelper

import _thread

import Adafruit_DHT

import time

import datetime

import RPi.GPIO as GPIO

import sys

sys.path.append('..')

def WriteToDb(timenow, year, month, day, hour, temp, humi):

smartHomeDb = MySqlHelper("SmartHome")

smartHomeDb.executeSql("INSERT INTO DailyMonitor (DateTime,Year,Month,Day,Hour,Temperature,Humidity) VALUES ('{0}',{1},{2},{3},{4},{5},{6})".format(

timenow, year, month, day, hour, temp, humi))

# 已经写入数据库的小时标识,插入数据的同时,修改为下一个小时,用于比较是否需要写入

hasWriteToDbHour = datetime.datetime.now().hour

while(True):

# time

timenow = datetime.datetime.now()

# Use read_retry method. This will retry up to 15 times to

# get a sensor reading (waiting 2 seconds between each retry).

# this is bcm code

humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT11, 4)

print('time:{0},humidity:{1}%,temperature:{2}*C'.format(

datetime.datetime.now(), humidity, temperature))

# 异步将数据写入mysql

if hasWriteToDbHour == timenow.hour:

_thread.start_new_thread(WriteToDb, (timenow, timenow.year,

timenow.month, timenow.day, timenow.hour, temperature, humidity))

if hasWriteToDbHour == 23:

hasWriteToDbHour = 0

else:

hasWriteToDbHour = hasWriteToDbHour + 1

time.sleep(2)

  【温湿度监测】

  我们通过SSH远程连接到树莓派的终端

  通过FTP上传我们的项目到树莓派服务器

  将我们的主脚本作为后台进程运行(关闭终端进程不会退出)

  nohup python SmartHomeScreen.py

  这样我们的信息采集脚本就一直在工作,每隔一小时就会采集一次温度和湿度,并存储到数据库表中。

  【预防措施】

  【总结】

  通过本节内容,我们利用树莓派的GPIO和DHT11温湿度采集模块,实现了对环境中温湿度的24小时实时采集,并作为基础数据持久化到MySql中用于我们随后的监控面板和监控报告。

  在后面的章节中,我们将介绍利用我们采集

的24小时温湿度数据制作温湿度报表…… 效果预热:

  【来源地址】

  Github:

  解决方案:Webpack-信息收集工具

  团队:横格安全团队,未来会开源工具。

  定位:协助红队人员快速搜集信息,定位目标资产,寻找薄弱环节。

  语言:python3开发

  功能:一站式服务,只需输入根域名即可一键采集

敏感信息。具体案例见下文。

  0x02 安装

  为了避免踩坑,建议安装在如下环境

  chmod 777 build.sh./build.sh

  

" />

  python3 webpackfind.py -h

  0x03 效果展示

  自动爬虫

  自动爬取本地文件

  

" />

  0x04 使用指令语法功能

  python3 webpack find.py -u

  采集

域名下的webpack

  python3 webpack find.py -j ./js

  本地读取js信息采集

  0x05 项目获取

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线