先上一些照片。
硬件:树莓派+DHT22温湿度传感器(白色的那个就是)。
网页,显示当前时间、最新一条监测记录。
传感器记录写入DB程序。
一个简单的查询数据程序。
整个程序下来,涉及了:
树莓派、DHT22温湿度传感器、Python3、SQLite3、Nginx、JQuery。
缘起:
因为疫情原因,在家的时间比较长,一直是在书房工作学习。偶尔去趟客厅,现在天热,客厅朝南,又没开空调,就比较闷热潮湿。我就比较想知道客厅的温湿度。
家里倒是有个物理温湿度计,就是这玩意儿:
不过作为一个IT男,数据不数码化,总觉得很不爽,所以就动了心思买个电子温度计,家里小米的多,就想买这个:
但是现在穷的叮当响,又恰好翻箱底的时候,翻出了我的老树莓派——确实很老了,是很多年前,刚出来的时候买的,GPIO引脚还是26针的,配套的SD卡也找着了,因为这款没有WIFI,恰好又有富余的网线,一装系统还能运行,所以干脆就自己搞吧。
过程:不能放外链,大家想用就搜搜吧。
1、安装系统:
1.1 格式化SD卡:去SD官方网站下载专门的格式化工具
1.2 安装树莓派系统:
下载烧录程序
下载系统
分别是:桌面+命令行版、桌面版、命令行版。我选的是第一个,回头可以在配置里将启动改为进入命令行界面。
烧录:
这个没啥了,选系统镜像,选SD卡,写入。
1.2 系统配置:
升级:
sudo apt-get update
sudo apt-get dist-upgrade
通过桌面首选项,可以打开VNC、SSH服务。
VNC是桌面连接,我们在电脑上用VNC Viewer可以访问树莓派桌面。
SSH是远程命令行访问,在终端上使用命令"ssh pi@树莓派IP"即可。
安装Python3.
安装Nginx、安装SQLite。
安装ufw防火墙,打开端口:
sudo ufw allow 80#Nginx端口
sudo ufw allow 8080#Python的HTTP服务接口
sudo ufw allow 22#SSH端口
sudo ufw allow 5900#VNC端口
2、硬件安装:
去某宝买了DHT22温湿度传感器+杜邦线,20块钱,从汕头发过来的。
传感器一共有三个针脚“+、-、out”
我的树莓派比较老旧,只有26个针脚:
如图,+接入3.3v,-接入Ground,out接入GPIO2。
正负极可不能接反了,会烧的。
3、程序:
3.1 创建数据库、表:
#!/usr/bin/python
import sqlite3
conn=sqlite3.connect('temper.db')
print("Open temperDB")
c = conn.cursor()
c.execute('''CREATE TABLE temper
(ID INTEGER PRIMARY KEY autoincrement,
create_time DEFAULT (datetime('now', 'localtime')),
temp CHAR(50) NOT NULL,
humi CHAR(50) NOT NULL);''')
print('Table created successfully')
conn.commit()
conn.close()
3.2 下载读取传感器相关驱动:
sudo apt-get install build-essential python-dev
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python3 setup.py install
3.3 每隔10分钟,读取传感器记录写入到数据库
#!/usr/bin/python
import Adafruit_DHT
from datetime import datetime
import time
import sqlite3
sensor = Adafruit_DHT.DHT22
#pin = 'P8_11'
pin = 2
def timer(n):
while True:
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
if humidity is not None and temperature is not None:
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
print('温度={0:0.1f}*C 湿度={1:0.1f}%'.format(temperature, humidity))
conn = sqlite3.connect('temper.db')
c = conn.cursor()
c.execute("INSERT INTO temper (temp,humi) VALUES ("+'{0:0.1f}'.format(temperature)+","+'{0:0.1f}'.format(humidity)+")")
conn.commit()
conn.close()
else:
print('Failed to get reading. Try again!')
time.sleep(n)
timer(600)
3.4 Python服务端,返回JSON格式的最新记录:
#!/usr/bin/python
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
import sqlite3
host = ('0.0.0.0', 8080)#开8080端口
class Resquest(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'Application/json')
self.send_header('Accexx-Control-Allow-Origin','*')#解决跨域问题
self.end_headers()
conn = sqlite3.connect('temper.db')
c = conn.cursor()
cursor = c.execute("SELECT * from temper order by id desc limit 0,1")
for row in cursor:
data = {'id':row[0],'time':row[1],'temp':row[2],'humi':row[3]}
result="returnTemp("+json.dumps(data)+")"
self.wfile.write(result.encode())
if __name__ == '__main__':
server = HTTPServer(host, Resquest)
print("Starting server, listen at: %s:%s" % host)
server.serve_forever()
3.5 网页
编辑/var/www/html/index.nginx-debian.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta http-equiv="Access-Control-Allow-Origin" content="*" />
<title>温湿度计</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<script>
$(function() {
var myDate = new Date;
var year = myDate.getFullYear(); //获取当前年
var mon = myDate.getMonth() + 1; //获取当前月
var date = myDate.getDate(); //获取当前日
var h = myDate.getHours();//获取当前小时数(0-23)
var m = myDate.getMinutes();//获取当前分钟数(0-59)
var s = myDate.getSeconds();//获取当前秒
var week = myDate.getDay();
var weeks = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
console.log(year, mon, date, weeks[week])
$("#time").html("当前时间:"+year + "年" + mon + "月" + date + "日" + weeks[week]+" "+h+":"+m+":"+s);
$.ajax({
url: "http://192.168.31.88:8080",//树莓派IP地址,PythonHTTP服务端口号
type: "GET",
dataType: "jsonp",//解决跨域问题
jsonpCallback:"returnTemp",//解决跨域问题
success: function (data) {
$("#data").html("记录ID:"+data.id+"<br/>记录时间:"+data.time+"<br/>温度:"+data.temp+"°,湿度:"+data.humi+"%");
}
});
})
</script>
</head>
<body>
<span id="time"></span><br/>
<span id="data"></span>
</body>
</html>
4、启动:
分别启动Nginx、dht.py、serv.py
访问网页http://192.168.31.88
5、一些问题:
因为我毕竟是搞JAVA服务端开发的,用Python也只是处理一下数据,页面跨域的问题在实际工作中,运维人员就解决了,所以搞这一块有点手生,不过也是很快解决了。
本来我想让开机自启动的,但是查了不少资料,做了不少测试,总是有问题,所以暂时也不弄,就这么跑者吧。
6、后续的一些规划:
因为数据都入库了,我准备使用ECharts,将历史数据做一个折线图。
另外某宝上也看了墨水屏,可以接到树莓派上,将网页上的信息展示在上面。不过那玩意儿也太贵了,4.2寸的要快200了,舍不得啊。