使用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訪問這個界面,然後獲取頁面上的數據,並顯示在液晶屏上

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