第 4 部分:如何在 Google Cloud Platform 上使用 TICK Stack 创建 IoT 项目
作者:Todd Persen / 产品, 用例
2016 年 2 月 26 日
导航至
第 4 部分:将 InfluxDB 集成到 IoT 项目中
到目前为止,在本系列中,我们已经了解了 InfluxDB 是什么,在 Google Compute Engine 上设置了 InfluxDB 主机,并编写了一个可以与之交互的 Python 应用程序。
本部分现在将我们在上一节中编写的 Python 客户端应用程序代码与一个实际的 IoT 项目集成,该项目使用 Arduino、温度传感器和 InfluxDB 作为我们的数据库来存储我们收集的所有温度读数。
首先,让我解释一下最终目标是什么,以及这如何是该过程的第一步。目标是建立一系列低成本的气候/环境模块,以捕获各种类型的数据,如温度、湿度等。然后将所有这些数据放入云端,在那里我们最终可以构建仪表板、警报等。云端的所有优秀功能都将由 InfluxDB 提供支持。
我们现在将解释一个设置,其中我们创建一个系统,该系统包括 Arduino Uno、温度传感器、可以从 Arduino Uno 读取数据的 Python 应用程序(是的,我没有使用 Arduino Internet Shield)并将数据发布到云端。
硬件设置
我使用了以下设备
- Arduino Uno 微控制器
- LM35 温度传感器
- 最终,我们将使用 Raspberry Pi 与 Arduino 接口来读取和传输值,但为了现在验证,Uno 通过安装了 Python 的笔记本电脑/台式机供电。Uno 和 PC 之间的通信通过串口通信。
Arduino Uno + 温度传感器设置
以下是 LM35 传感器如何连接到 Arduino Uno 板的。
当然,我们使用了一个面包板将所有这些连接在一起,但我在这里简化了图表,以便您了解哪些连接到哪个引脚。
LM35 有 3 个引脚
- 第一个引脚连接到 Arduino 上的 5V 电源引脚
- 第三个引脚是 GND
- 中间的引脚是 VOUT,它发出我们需要捕获的值。我们将其连接到 Arduino 上的模拟引脚 (A0)。然后我们可以编写我们的 Arduino 代码来读取该值,如下所示。
Arduino 代码
Arduino 代码很简单,如下所示
float temp;
int tempPin = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
temp = analogRead(tempPin);
temp = temp * 0.48828125;
Serial.print(temp);
Serial.println();
delay(10000);
}
您会注意到在循环中,每 10 秒,我们都会打印出从模拟引脚 (#0) 读取的温度值。
如果您运行 Arduino IDE 自带的串口监视器,并且 Arduino 已按所示图表通电和连接,那么您会发现温度值正在串口监视器上打印,如下所示
一旦发生这种情况,我们就知道 Arduino 设置看起来不错,我们现在需要做的就是在 PC 上编写一个客户端程序,该程序与此 Arduino 接口,通过串口读取值,然后将这些值写入 InfluxDB 数据库。
我们现在可以将我们在上一节中使用的代码集成起来以写入 InfluxDB 数据库。集成代码如下所示
import serial
import datetime
from influxdb import InfluxDBClient
#Setup some constants with InfluxDB Host and Database name
INFLUXDB_HOST = '<PublicIPInfluxDBHost>'
INFLUXDB_NAME = 'temperature_db'
#Connect to Serial Port for communication
ser = serial.Serial('COM15', 9600, timeout=0)
#Setup a loop to send Temperature values at fixed intervals
#in seconds
fixed_interval = 10
while 1:
try:
#temperature value obtained from Arduino + LM35 Temp Sensor
temperature_c = ser.readline()
#Timestamp
timestamp = datetime.datetime.utcnow().isoformat()
#Station Name that is recording the temperature
station_name = "S2"
#Initialize the InfluxDB Client
client = InfluxDBClient(INFLUXDB_HOST,'8086','','',INFLUXDB_NAME)
#Write a record
json_data = [
{
"measurement":"temperature",
"time":timestamp,
"tags": {
"Station":station_name
},
"fields": {
"value":temperature_c
}
}
]
bResult = client.write_points(json_data)
print("Result of Write Data : ",bResult)
time.sleep(fixed_interval)
except ser.SerialTimeoutException:
print('Error! Could not read the Temperature Value from unit')
time.sleep(fixed_interval)
这样就完成了集成。我们现在有了一个端到端的 IoT 原型应用程序,它能够每 10 秒收集一次温度读数并将其存储在 InfluxDB 中。这只是一个气象站读取此数据。我们现在可以配置和部署城市中的多个此类气象站。每个气象站都将具有此设置和代码,唯一的更改将是“气象站名称”,它将设置为特定的“气象站名称”。
由于我们已将“气象站名称”创建为标签,因此我们的 InfluxDB 设置现在可以帮助我们存储数据以及查询所有气象站、多个气象站等的数据。
本教程总结了如何设置 InfluxDB 并将其与 IoT 项目集成。