百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

使用树莓派+DHT22做一个温湿度计

itomcoil 2025-02-13 12:30 20 浏览

先上一些照片。

硬件:树莓派+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





 
温湿度计






4、启动:

分别启动Nginx、dht.py、serv.py

访问网页http://192.168.31.88



5、一些问题:

因为我毕竟是搞Java服务端开发的,用Python也只是处理一下数据,页面跨域的问题在实际工作中,运维人员就解决了,所以搞这一块有点手生,不过也是很快解决了。

本来我想让开机自启动的,但是查了不少资料,做了不少测试,总是有问题,所以暂时也不弄,就这么跑者吧。


6、后续的一些规划:

因为数据都入库了,我准备使用ECharts,将历史数据做一个折线图。

另外某宝上也看了墨水屏,可以接到树莓派上,将网页上的信息展示在上面。不过那玩意儿也太贵了,4.2寸的要快200了,舍不得啊。

相关推荐

selenium(WEB自动化工具)

定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...

开发利器丨如何使用ELK设计微服务中的日志收集方案?

【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...

高并发系统设计:应对每秒数万QPS的架构策略

当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...

2025 年每个 JavaScript 开发者都应该了解的功能

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...

JavaScript Array 对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战

刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...

动力节点最新JavaScript教程(高级篇),深入学习JavaScript

JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...

一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code

当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...

「晚安·好梦」努力只能及格,拼命才能优秀

欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...

JavaScript 中 some 与 every 方法的区别是什么?

大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...

10个高效的Python爬虫框架,你用过几个?

小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...

12个高效的Python爬虫框架,你用过几个?

实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...

pip3 install pyspider报错问题解决

运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...

PySpider框架的使用

PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...

「机器学习」神经网络的激活函数、并通过python实现激活函数

神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...