最近在做基於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. 設備端獲取數據
這一部分很簡單,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訪問這個界面,然後獲取頁面上的數據,並顯示在液晶屏上