【前言】

一个热爱技术的人一定向往有一个科技感十足的环境吧,那何不亲自实践一下属于技术人的座右铭:“技术改变世界”。

就让我们一步步动手搭建一个属于自己的“智能家居平台”吧(不要对这个名词抬杠啦,技术在手,怎么设计实现因人而异),本文只做抛砖引玉,各路大神如果有更好的想法可以各显神通,当然能在评论区留下更好的想法让大家共同学习是再好不过啦。

在文章最后附有所有源代码,有需要的可以自行下载,感谢Star~

【系列目录】

  1. 树莓派GPIO简介(Python版)
  2. 温湿度数据采集存储(DHT11,MySql)
  3. 温湿度数码管展示(四位共阳数码管)
  4. 构建App展示温湿度报表(ApiCloud,Python Flask)
  5. 普通家用排插集成继电器手工改造
  6. App远程控制“自制智能”排插
  7. 使用花生棒内网穿透实现外网访问
  8. 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 内容

  1. 创建mysql连接
  2. 通过DHT11获取温湿度
  3. 将数据异步写入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

最新文章

  1. 如何在vim里删除空行?
  2. bug:无法给图片加边框
  3. 手动实现WCF[转]
  4. json体会
  5. BZOJ 2467 生成树
  6. Unix环境高级编程学习笔记——fcntl
  7. 武汉科技大学ACM:1010: 零起点学算法27——判断是否直角三角形
  8. Oracle 字符集设置
  9. 解决打包时出现的Failed to verify bitcode
  10. java.lang.reflect.MalformedParameterizedTypeException异常问题
  11. Zabbix 微信报警Python版(带监控项波动图片)
  12. property相关补充
  13. yum安装php Requires: libzip5(x86-64) >= 1.3.2
  14. SNMP扫描
  15. Electron入门笔记(一)-自己快速搭建一个app demo
  16. ARMv8学习 —— SP_EL0和SP_ELx
  17. K - Heavy Cargo dijkstar
  18. topcoder srm 708 div1 -3
  19. 【JAVA】内部类,内部接口
  20. oj提交时常见错误归纳

热门文章

  1. windows服务autofac注入quartz任务
  2. CodeForces 628 D Magic Numbers 数位DP
  3. 关于Math常用的方法
  4. webstorm 突然不能用了?解决办法~
  5. JS-特效 ~ 01. 事件对象、offset偏移/检测、无缝滚动、自动循环轮播图
  6. Tomcat性能调优参数简介
  7. 【MySQL】为什么SQL会这么慢
  8. lambda表达式排序
  9. 新书推荐《再也不踩坑的Kubernetes实战指南》
  10. FreeSql (六)批量插入数据