使用Django搭建简易数据中台(基于Grove - Temperature Humidity Pressure Gas Sensor)

最近在做基于Wio Terminal的简易智能家居中控系统,在使用Wio Terminal的过程中遇到了一些问题,在使用Grove - Temperature Humidity Pressure Gas Sensor时无法正常获取到数据,为了项目的进度,我打算使用Plan B:

  • 使用Seeeduino V4.2开发板接收数据
  • PC端作为服务端; Wio Terminal作为边缘设备
  • Wio Terminal通过web请求获取服务端的数据

我原来的计划是把Wio Terminal直接作为服务端,但是经过这几天的测试,我发现Wio Terminal可能承受不住我的项目(我的技术还不太够),所以只好走个弯路,不过不影响项目的进行,因为我也有搭建数据管理端的计划。那么这篇文章就来讲一讲具体怎么搭建的:

  1. 设备端获取数据
  2. PC端读取串口数据
  3. 搭建WEB服务器

1. 设备端获取数据

这一部分很简单,Seeed官方文档里讲的很清楚,简单地复制粘贴就可以了:
https://wiki.seeedstudio.com/Grove-Temperature_Humidity_Pressure_Gas_Sensor_BME680/

首先是接线:
在这里插入图片描述
我很喜欢Seeed系列的开发板和传感器,其中一个原因是它的接线非常简单,四合一的线,Grove - Temperature Humidity Pressure Gas Sensor选择I2C口,直接插上去就好了。

下面就是上传程序了,这里我在官方提供代码地基础上做了小小的调整:

#include "seeed_bme680.h"
#define IIC_ADDR  uint8_t(0x76)

Seeed_BME680 bme680(IIC_ADDR); /* IIC PROTOCOL */

void setup() {
    Serial.begin(9600);
    while (!Serial);
    delay(100);
    while (!bme680.init()) {
        Serial.println("bme680 init failed ! can't find device!");
        delay(10000);
    }
}

void loop() {
    if (bme680.read_sensor_data()) {
        Serial.println("Failed to perform reading :(");
        return;
    }
    Serial.print("temperature: ");
    Serial.print(bme680.sensor_result_value.temperature);
    Serial.print(" C; ");

    Serial.print("pressure: ");
    Serial.print(bme680.sensor_result_value.pressure / 1000.0);
    Serial.print(" KPa; ");

    Serial.print("humidity: ");
    Serial.print(bme680.sensor_result_value.humidity);
    Serial.print(" %; ");

    Serial.print("gas: ");
    Serial.print(bme680.sensor_result_value.gas / 1000.0);
    Serial.print(" Kohms");
    Serial.println();

    delay(2000);
}

我把数据输出改成了一行完成,目的是方便PC端的读取

打开Arduino IDE的串口监视器:
在这里插入图片描述
有以上输出就说明程序上传成功了

2. PC端读取串口数据

PC端我用Python读取串口数据,用到了serial这个库,用pip可以直接安装

读取串口数据的代码也不难:

import serial
import datetime

def getDatas():
    serialPort = "COM10"  # 串口
    baudRate = 9600  # 波特率
    ser = serial.Serial(serialPort, baudRate, timeout=0.5)
    # print("参数设置:串口=%s ,波特率=%d" % (serialPort, baudRate))
    while True:
        str = ser.readline().decode('utf-8')
        if str.strip()!='':
            print(str)
            updata_time = datetime.datetime.now().strftime('%F %T')
            print(updata_time)
            return str,updata_time

要改的地方主要是串口,选择电脑上对应的串口:
在这里插入图片描述
运行程序,看一下输出:
在这里插入图片描述
这里增加了获取数据的时间,方便后续的存储

下面我们搭建一个本地的WEB服务器,使得局域网内的设备都可以获取传感器传回的数据

3. 搭建WEB服务器

下面我们新建一个Django项目,项目名称我写成WioTerminal

django-admin startproject WioTerminal

并在这个项目下新建一个名为IOT的app:

python manage.py startapp IOT

如果看过我前面关于Django的教程,这一步应该不成问题:
https://blog.csdn.net/zbp_12138/article/details/106074996

下面是项目的结构:
在这里插入图片描述
这里主要讲讲IOT\views.py:

from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse

import serial
import datetime

# Create your views here.
def getDatas():
    serialPort = "COM10"  # 串口
    baudRate = 9600  # 波特率
    ser = serial.Serial(serialPort, baudRate, timeout=0.5)
    # print("参数设置:串口=%s ,波特率=%d" % (serialPort, baudRate))
    while True:
        str = ser.readline().decode('utf-8')
        if str.strip()!='':
            print(str)
            updata_time = datetime.datetime.now().strftime('%F %T')
            print(updata_time)
            return str,updata_time


def index(request):
    datas = getDatas()[0] # 传感器数据
    updata_time = getDatas()[1] # 数据对应的时间
    content = {
        'data':datas,
        'date':updata_time
    }

    return render(request,"index.html",context=content)

把刚刚读取串口数据的方法放到这里,然后在index方法里调用

content里存放着前端页面需要展示的数据,用render方法返回,下面看一下前端页面:
在这里插入图片描述
主要代码就是h2标签的内容:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Wio Terminal</title>
</head>
<body>
    <h2>{{ date }}</h2>
    <h2>{{ data }}</h2>
</body>
</html>

这里我只实现了功能,没有美化界面,也就是最简单的形式,运行一下项目:
在这里插入图片描述
在Pycharm里只是在本机开服务,要想局域网内的设备都能访问的话,我们需要到settings.py里配置:

ALLOWED_HOSTS = ['*']

我们在命令行里把这个项目跑起来:
在这里插入图片描述

用手机访问:
在这里插入图片描述
成功!下一步,我将使用Wio Terminal访问这个界面,然后获取页面上的数据,并显示在液晶屏上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章