第4部分:如何在Google Cloud Platform上使用TICK Stack创建一个物联网项目
作者:Todd Persen / 产品,用例
2016年2月26日
导航至
第4部分:将InfluxDB集成到物联网项目中
到目前为止,本系列已经介绍了InfluxDB是什么,如何在Google Compute Engine上设置InfluxDB主机,并编写了一个可以与之交互的Python应用程序。
本部分现在将上一节中编写的Python客户端应用程序代码与一个实际使用Arduino、温度传感器和InfluxDB作为数据库存储所有收集到的温度读数的物联网项目相结合。
首先,让我解释最终目标是什么,以及这是该过程中的第一步。目标是建立一系列低成本的气候/环境模块,捕获各种类型的数据,如温度、湿度等。然后将所有这些数据放入云中,我们最终可以构建仪表板、警报等。云中的所有好东西都将由InfluxDB提供支持。
现在,我们将解释一个设置,其中我们创建了一个由Arduino Uno、温度传感器、可以读取Arduino Uno数据的Python应用程序以及将数据发布到云中的系统。
硬件设置
我使用了以下设备
- Arduino Uno 微控制器
- LM35 温度传感器
- 最终我们将有一个与Arduino接口以读取和传输值的Raspberry Pi,但为了验证事情,现在通过安装了Python的笔记本电脑/台式机为Uno供电。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)
这完成了集成。现在我们有一个端到端的物联网原型应用,它能够每10秒收集一次温度读数并将其存储在InfluxDB中。这只是天气站读取数据的一个例子。我们现在可以在整个城市部署多个这样的天气站。每个天气站都将有这个设置和代码,唯一的变化将是站名
,它将被设置为特定的站名
。
因为我们已将站名
作为标签创建,所以我们的InfluxDB设置现在可以帮助我们存储数据以及查询所有站点的数据,多个站点以及更多。
这完成了设置InfluxDB并将其与物联网项目集成的教程。