最近在做基于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访问这个界面,然后获取页面上的数据,并显示在液晶屏上