自己动手实现智能家居之温湿度数据采集存储(DHT11,MySql)
【前言】
一个热爱技术的人一定向往有一个科技感十足的环境吧,那何不亲自实践一下属于技术人的座右铭:“技术改变世界”。
就让我们一步步动手搭建一个属于自己的“智能家居平台”吧(不要对这个名词抬杠啦,技术在手,怎么设计实现因人而异),本文只做抛砖引玉,各路大神如果有更好的想法可以各显神通,当然能在评论区留下更好的想法让大家共同学习是再好不过啦。
在文章最后附有所有源代码,有需要的可以自行下载,感谢Star~
【系列目录】
- 树莓派GPIO简介(Python版)
- 温湿度数据采集存储(DHT11,MySql)
- 温湿度数码管展示(四位共阳数码管)
- 构建App展示温湿度报表(ApiCloud,Python Flask)
- 普通家用排插集成继电器手工改造
- App远程控制“自制智能”排插
- 使用花生棒内网穿透实现外网访问
- App远程监控(摄像头模块集成)
【本节概要】
上一节我们介绍了树莓派以及树莓派的GPIO的简单使用,这一节基于上一节的知识点采集屋内的温度和湿度数据,并且构建python脚本将采集到的数据写入到mysql数据库持久化。
效果图:

那么接下来我们就一步步讲解这个折腾的过程...
【硬件采购】
”某宝“购买一个DHT11模块,大概¥6,为了方便线路灵活连接,我们购买了面包板和杜邦线若干。



硬件采购完毕,我们开始搞软件部分~~~
【DHT11模块获取温湿度】
DHT11硬件接口
DHT11有三个IO接口,一个VCC(正极)接3.3v,一个GND接GND,剩下一个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
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)
我们的配置文件 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 内容
- 创建mysql连接
- 通过DHT11获取温湿度
- 将数据异步写入MySql(每小时一次)
# 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

这样我们的信息采集脚本就一直在工作中了,每小时会采集一次温湿度,并存储到数据库表中。
【注意事项】
- 树莓派中默认安装的python版本是2.7,我们的代码是采用python3编写的,可能有不兼容的情况,需要重新安装python3.6以上版本
- 我们的GPIO类库是不能在没有GPIO支持的设备上调试的,也就是说在windows本地调试毫无意义,并且安装GPIO的包会出现各种问题,建议直接将代码复制到树莓派调试,无需在本地调试
【总结】
通过本节内容,我们实现了利用树莓派的GPIO和DHT11温湿度采集模块24小时实时采集环境中的温湿度,并且持久化到了MySql中,作为我们后续监控面板和监控报表的基础数据。
后续章节我们会介绍利用我们采集的24小时温湿度数据制作温湿度报表... 效果预热:
【源码地址】
Github:https://github.com/sevenTiny/SevenTiny.SmartHome
自己动手实现智能家居之温湿度数据采集存储(DHT11,MySql)的更多相关文章
- 自己动手实现智能家居之树莓派GPIO简介(Python版)
[前言] 一个热爱技术的人一定向往有一个科技感十足的环境吧,那何不亲自实践一下属于技术人的座右铭:“技术改变世界”. 就让我们一步步动手搭建一个属于自己的“智能家居平台”吧(不要对这个名词抬杠啦,技术 ...
- DIY智能家居——零基础入门篇
概要 本文主要根据笔者从零开始接触硬件,以小白视角开启IoT探索,根据相关资料DIY一个温湿度传感器.后经过探索发现新大陆--Home Assistant&Homebridge,最终实现了一个 ...
- zigbee智能家居基础扫盲
zigbee Zigbee是基于IEEE802.15.4标准的低功耗个域网协议.根据这个协议规定的技术是一种短距离.低功耗的无线通信技术.这一名称来源于蜜蜂的八字舞,由于蜜蜂(bee)是靠飞翔和&qu ...
- 转载智能家居 作者:热情的沙漠 出处:http://www.cnblogs.com/buptzym/
理工男打造帝都89平智能家庭 毕业后的2016年年初,搬入新家,总算不用在出租屋里鬼混了,于是就想把之前童年的梦想:智能家居+家庭影院好好实现一下~ 相比帝都高昂的房价,这些东东还凑合玩得起,不过 ...
- 智能家居DIY-空气质量检测篇-获取温度和湿度篇
目录 智能家居DIY-空气质量检测篇-获取空气污染指数 前言 话说楼主终于升级当爸了,宝宝现在5个月了,宝宝出生的时候是冬天,正是魔都空气污染严重的时候,当时就想搞个自动开启空气净化器,由于种种原因一 ...
- 基于ESP32的智能家居管理系统的设计与实现
基于ESP32的智能家居管理系统的设计与实现 ESP32的智能家居管理系统访问链接: https://www.cnblogs.com/easyidea/p/13101165.html 一.需求分析 1 ...
- 智能家居DIY
近期智能家居比較火,将房子简单改造下,也算体验智能家居. 本文解说的是用无线的方式,长处是:不用改造现有线路,直接安装模块就可以实现想要的功能,花的钱也较少,共六百左右 =============== ...
- 基于ZigBee模块与51单片机之间的简化智能家居项目简介(学生版本)
5月份学校举行比赛,我们团队报名<智能家居>的项目,设计的总体思路用:QT写的上位机与ZigBee无线通信加51作为终端的简易版智能家居 电路连接:PC机->cc2530(协调器)- ...
- 基于Linux的智能家居的设计(3)
2 硬件设计 本课题的硬件设计包含主控制器.传输数据设计.数据採集设计.控制驱动设计.显示设计.门禁设计. 2.1 主控制器 依据方案三选择S3C6410主控芯片,S3C6410是由Samsung ...
随机推荐
- 2019DX#10
Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Minimum Spanning Trees 22.22%(2/9) 1002 Lin ...
- CodeForces div3 第一场
A Wrong Subtraction 题意: 对于一个数操作n次,操作如下: 如果末尾是0就将这个数除以10, 如果末尾不是0就将这个数-1, 直接做就好了. 代码: #include<bit ...
- 2015 省赛 简单的图论问题? bfs
[E] 简单的图论问题? 时间限制: 5000 ms 内存限制: 65535 K 问题描述 给一个 n 行 m 列的迷宫,每个格子要么是障碍物要么是空地.每个空地里都有一个权值.你的 任务是从找一条( ...
- 题解 yzoj1663: 愤怒的牛(二分) yzoj1662: 曲线(三分)
话说二分和三分的题还没有整理过,就趁这两题来整理下笔记 先讲讲关于二分,对于二分的具体边界长期以来对我来说都是个玄学问题,都是边调边拍改对的.思路大体是确定左边界l,和有边界r,判断满足条件缩小范围. ...
- 关于Ubunto在VMwark中无法全屏。
1.右键点击Ubunto桌面,进入终端 输入: 1.sudo apt-get install open-vm* 安装依赖项 2.sudo apt-get install open-vm-tools ...
- Java服务器-Disruptor使用注意
最近看了一下部署游戏后台的服务器状况,发现我的一个Java程序其占用的CPU时长超过100%,排查后发现竟是Disruptor引起的,让我们来看看究竟为什么Disruptor会有这样的表现. 发现占用 ...
- Java代理设计模式(Proxy)的几种具体实现
Proxy是一种结构设计模型,主要解决对象直接访问带来的问题,代理又分为静态代理和动态代理(JDK代理.CGLIB代理. 静态代理:又程序创建的代理类,或者特定的工具类,在平时开发中经常用到这种代理模 ...
- Sublime运行C++程序教程
前言 传说sublime是全球最好的编辑器,可是只是编辑器啊!!!如果要运行,对于我们这些蒟蒻来说,不得不去使用DEV_C++.我们总是幻想能让sublime变成一个轻量级IDE,那该多好啊!!! 那 ...
- Python分布式爬虫必学框架Scrapy打造搜索引擎
Python分布式爬虫必学框架Scrapy打造搜索引擎 部分课程截图: 点击链接或搜索QQ号直接加群获取其它资料: 链接:https://pan.baidu.com/s/1-wHr4dTAxfd51M ...
- FreeSql (三十三)CodeFirst 类型映射
前面有介绍过几篇 CodeFirst 内容文章,有 <(二)自动迁移实体>(https://www.cnblogs.com/FreeSql/p/11531301.html) <(三) ...
