第 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 数据库。
一旦发生这种情况,我们就知道 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 项目集成。