树莓派4B_温湿度_传感器_WEB折线图

 

1.用 apache 呈现网页前端,网页去访问 python3.x 提供的 温湿度接口,

2.获取数据后, 前端用vue.js 绑定数据,用echarts.js 进行绘图.

 

python3.x  获取 温湿度的接口

Server.py

 

from http.server import HTTPServer, BaseHTTPRequestHandler
import json
import urllib
import datetime
import Adafruit_DHT
from http.server import BaseHTTPRequestHandler, HTTPServer
from json import dumps

sensor = Adafruit_DHT.DHT22
pin = 24

""" my function"""
def getData():
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
    temperature = round(temperature,1)
    humidity = round(humidity,1)
    result = {"state":"success","value":str(temperature) +","+str(humidity),"time":datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
    print(result)
    return result

""" The HTTP request handler """
class RequestHandler(BaseHTTPRequestHandler):
  def _send_cors_headers(self):
      """ Sets headers required for CORS """
      self.send_header("Access-Control-Allow-Origin", "*")
      self.send_header("Access-Control-Allow-Methods", "GET,POST,OPTIONS")
      self.send_header("Access-Control-Allow-Headers", "x-api-key,Content-Type")

  def send_dict_response(self, d):
      """ Sends a dictionary (JSON) back to the client """
      self.wfile.write(bytes(dumps(d), "utf8"))

  def do_OPTIONS(self):
      self.send_response(200)
      self._send_cors_headers()
      self.end_headers()

  def do_GET(self):
      try:
         self.send_response(200)
         self._send_cors_headers()
         self.end_headers()
         # response = {}
         # response["status"] = "OK"
         result = getData()
         self.send_dict_response(result)
      except:
         print("error")

  # def do_POST(self):
  #     self.send_response(200)
  #     self._send_cors_headers()
  #     self.send_header("Content-Type", "application/json")
  #     self.end_headers()
  #     dataLength = int(self.headers["Content-Length"])
  #     data = self.rfile.read(dataLength)
  #     print(data)
  #     response = {}
  #     response["status"] = "OK"
  #     self.send_dict_response(response)
if __name__ == '__main__':
    print("Starting server")
    httpd = HTTPServer(("", 8787), RequestHandler)
    print("Hosting server on port 8787")
    httpd.serve_forever()

  

 

 

 

index.html (显示数据的 静态网页)

 

<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>v-charts</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/v-charts/lib/style.min.css"></script>
</head>
<body>
 <div id="app">
  <ve-line :data="chartData" :extend="extend"></ve-line>
</div>
 
</body>
<script  src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/v-charts/lib/index.min.js"></script>
<script type="text/javascript">
var mainData =new Vue({
  el: '#app',
  data () {
    this.extend = {
       //x轴文本设置
        // 'xAxis.0.axisLabel.rotate': 45,//x轴文本倾斜
        // 'xAxis.0.axisLine.lineStyle.color': "red",//x轴文本改变颜色
        // 'xAxis.0.axisLabel.color': 'red',//x轴文本颜色
        // 'xAxis.0.axisLabel.fontSize': 16,//x轴文本字体大小
        // 'xAxis.0.axisLabel.fontFamily': 'Arial',//x轴文本字体系列
        // 'xAxis.0.axisLabel.fontWeight': 'bold',//x轴文本字体粗细
        // 'xAxis.0.axisLabel.align': 'center',//x轴文本字体位置
 
       'yAxis.0.axisLabel.color': "green",
      
       yAxis:[{
              type: 'value',
              min: 0,
              max: 100,
           }],
        series: {
          label: {
            normal: {
              show: true
            }
          }
        }
      }
    return {
      chartData: {
        label: {show:true},
        columns: ['时间','温度', '湿度'],
        rows: [
        ]
      }
    }
  },
  // components: { VeLine }
})
</script>
<script type="text/javascript">
 
 
function getDate(res) {
    res = JSON.parse(res);
    if (res.state=="success") {
 
  var timeSplit = res.time.split(" ")[1].split(":");
  var ws = res.value.split(",");
  var dataRos =mainData.$data.chartData.rows
  if (dataRos.length>=10) {
    dataRos.shift();
  }
  dataRos.push({ '时间':timeSplit[0]+"."+timeSplit[1]+"."+timeSplit[2], '温度': ws[0], '湿度': ws[1] });
  mainData.$data.chartData.rows=dataRos;
 }
};
 
setInterval(function() {
  $.ajax({
            type: 'get',
            url: 'http://192.168.12.1:8787',
            headers: {
            'Content-type': "application/json"
             },
            success: function (res) {
              getDate(res);
              
            },
            error(err) {
                console.error(err)
            }
        });
}, 5000)
</script>
</html>

  

 

 

 

静态网页 放入 apache 目录. 为了做成离线的,可以把 js ,css 下载到本地.

 

 

启动 apache 服务,

 

 

启动,python3.x  获取 温湿度的接口

 

 

我们进行网页 访问

 

 

posted @ 2021-03-10 22:58  likehc  阅读(680)  评论(0编辑  收藏  举报