您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

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

时间:2020-08-18 10:54:56  来源:  作者:

先上一些照片。

硬件:树莓派+DHT22温湿度传感器(白色的那个就是)。

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

 

网页,显示当前时间、最新一条监测记录。

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

 

传感器记录写入DB程序。

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

 

一个简单的查询数据程序。

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

 

整个程序下来,涉及了:

树莓派、DHT22温湿度传感器、Python3、SQLite3、Nginx、JQuery。


缘起:

因为疫情原因,在家的时间比较长,一直是在书房工作学习。偶尔去趟客厅,现在天热,客厅朝南,又没开空调,就比较闷热潮湿。我就比较想知道客厅的温湿度。

家里倒是有个物理温湿度计,就是这玩意儿:

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

 

不过作为一个IT男,数据不数码化,总觉得很不爽,所以就动了心思买个电子温度计,家里小米的多,就想买这个:

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

 

但是现在穷的叮当响,又恰好翻箱底的时候,翻出了我的老树莓派——确实很老了,是很多年前,刚出来的时候买的,GPIO引脚还是26针的,配套的SD卡也找着了,因为这款没有WIFI,恰好又有富余的网线,一装系统还能运行,所以干脆就自己搞吧。


过程:不能放外链,大家想用就搜搜吧。

1、安装系统:

1.1 格式化SD卡:去SD官方网站下载专门的格式化工具

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

 

1.2 安装树莓派系统:

下载烧录程序

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

 

下载系统

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

 

分别是:桌面+命令行版、桌面版、命令行版。我选的是第一个,回头可以在配置里将启动改为进入命令行界面。

烧录:

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

 

这个没啥了,选系统镜像,选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个针脚:

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

 

如图,+接入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

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

 


5、一些问题:

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

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


6、后续的一些规划:

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

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



Tags:树莓派   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
丰色 发自 凹非寺 量子位 报道 | 公众号 QbitAI给树莓派安装Windows 11系统时麻烦吗?先要去官网下载arm版系统,然后进行镜像烧录;烧好后,还要在树莓派上进行一些配置?现在,有一个...【详细内容】
2021-09-06  Tags: 树莓派  点击:(81)  评论:(0)  加入收藏
树莓派由注册于英国的慈善组织“Raspberry Pi 基金会”开发,外形只有信用卡大小,却具有电脑的所有基本功能,这就是Raspberry Pi电脑板,中文译名"树莓派"。 音乐播放器没错,你可以...【详细内容】
2021-06-02  Tags: 树莓派  点击:(131)  评论:(0)  加入收藏
前言在GitHub上发现一个好玩的项目,不用安装其它任何依赖包,只要运行一个Python脚本就可以在局域网构建一个视频监控系统。果断试了一下,确实挺好玩的,现在分享给大家。 搭建方...【详细内容】
2021-03-16  Tags: 树莓派  点击:(172)  评论:(0)  加入收藏
有没有听说过树莓派?在这篇文章中,我们来看看这台非常酷的小电脑是什么,也简单介绍一下你可以用它做什么。 还涵盖了目前所有Pi的迭代版本,以及他们的特点。每个版本都略有不同,...【详细内容】
2021-03-01  Tags: 树莓派  点击:(203)  评论:(0)  加入收藏
学习 Linux 的童鞋如果想买个玩具,树莓派肯定是不二之选。对于树莓派的介绍,良许就先不赘述了,百度一搜一大把。简而言之,树莓派就是一个小电脑,我们可以用它来学习 Linux ,也可...【详细内容】
2020-08-31  Tags: 树莓派  点击:(78)  评论:(0)  加入收藏
概述如题,我们今天主要讲利用网云穿官方提供的内网穿透功能来外网访问树莓派上的网站,以及通过 ssh 进行远程管理。树莓派树莓派是基于博通出品的 arm 架构处理器的微型电脑,价...【详细内容】
2020-08-19  Tags: 树莓派  点击:(75)  评论:(0)  加入收藏
先上一些照片。硬件:树莓派+DHT22温湿度传感器(白色的那个就是)。 网页,显示当前时间、最新一条监测记录。 传感器记录写入DB程序。 一个简单的查询数据程序。 整个程序下来,涉及...【详细内容】
2020-08-18  Tags: 树莓派  点击:(59)  评论:(0)  加入收藏
在树莓派上运行 Fedora。&bull; 来源:linux.cn &bull; 作者:Nick Hardiman &bull; 译者:geekpi &bull;(本文字数:2180,阅读时长大约:3 分钟)在树莓派上运行 Fedora。树莓派基金会...【详细内容】
2020-08-15  Tags: 树莓派  点击:(156)  评论:(0)  加入收藏
当提到智能硬件时,相信不少开发者第一个想到的便是树莓派。当然,其实智能硬件所涵盖的范围非常广,今天 Gitee 为大家推荐的就是涵盖了物联网、消费级硬件、键盘、树莓派等多...【详细内容】
2020-08-05  Tags: 树莓派  点击:(69)  评论:(0)  加入收藏
作为一款体积小巧的开发板,树莓派已经提供了预配置的系统环境。但对于追求更丰富的功能体验的用户来说,Windows 10 IoT Core 显然也是一个不错的选择。好消息是,曾于去年为树莓...【详细内容】
2020-07-17  Tags: 树莓派  点击:(106)  评论:(0)  加入收藏
▌简易百科推荐
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(11)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(12)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(10)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(10)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(14)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(17)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(21)  评论:(0)  加入收藏
一、概述观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察...【详细内容】
2021-12-13  唯一浩哥    Tags:Java   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条