使用Raspberry Pi使用Python流行监控

尝试将DS18B20温度传感器连接到智能温室时 ,我发现Internet上没有通过Python编程语言连接该传感器的完整说明。 我使用它是因为我使用Raspberry Pi平台。 我决定解决此问题。 事实证明,使用TCP并不是那么困难,但是您需要了解我们在做什么以及为什么这么做。 用铃鼓进行的两个小时的舞蹈显然让我生气。 因此,在这里,除了软件部分本身,我还要从头到尾讲述整个算法。 我认为其他传感器的工作原理类似,因此大篇幅对每个人都是一样的。 我希望如果您想连接传感器,则不需要铃鼓:)因此,让我们开始吧,我要求您提供Habrokat。

带有传感器的萨满教


对于我们来说,我们需要连接传感器本身。 我将使用DS18B20温度传感器。 有关此主题的完整文章,我们将不再重复。 您可以在此处阅读有关连接的信息 。 然后我们需要从传感器获取数据。 我们将按照上述文章中的说明进行操作。 我喜欢一个很棒的Python示例。

import os tfile=open("/sys/bus/w1/devices/28-000000d7970b/w1_slave") ttext=tfile.read() tfile.close() temp=ttext.split("\n")[1].split(" ")[9] temperature=float(temp[2:])/1000 print temperature 

不要忘记用传感器替换数据。

如我们所见,温度是温度变量(本来会想到的),这是我们将进一步需要的。

联想监控


好吧,首先,您需要注册narodmon.ru ,那些还没有注册的人。 服务API使我们能够通过TCP传输数据。 因此,让我们开始吧。 我们被要求以以下格式传达文本:

 #MAC[#NAME][#LAT][#LNG][#ELE]\n #mac1#value1[#time1][#name1]\n ... #macN#valueN[#timeN][#nameN]\n ## 

但实际上,我们只需要传递三个参数:设备的MAC,传感器的名称及其值。 其余的部分是没有必要的,我们并不是真的需要它。

在第一行中,我们需要传递晶格,MAC和换行符\ n。
在第二行和后续行中,我们再次传输网格,传感器名称,网格和传感器读数。 我们以换行符\ n结尾。
在最后一行中,您需要传递两个网格以完成打包。

结果,格式保持如下:

 #MAC\n #mac1#value1\n #macN#valueN\n ## 

编写Python程序


我们将使用Python 2编写程序。算法将如下所示。 我们从传感器接收数据并将其写入温度变量。 然后,我们形成该程序包并将其发送到人员监视服务器。 我们将通过cron每10分钟运行一次脚本(发送读数的最小间隔为5分钟)。

发送发生如下(在监视站点上为示例):

提交脚本代码
 #!/usr/bin/env python2 # -*- coding: utf-8 -*- # by Roman Vishnevsky aka.x0x01 @ gmail.com import socket # MAC  .   ! DEVICE_MAC = '0123456789012' #  ,    01 (02)  mac  SENSOR_ID_1 = DEVICE_MAC + '01' SENSOR_ID_2 = DEVICE_MAC + '02' #  ,  float/integer sensor_value_1 = 20 sensor_value_2 = -20.25 #   sock = socket.socket() #   try: #    sock.connect(('narodmon.ru', 8283)) #       sock.send("#{}\n#{}#{}\n##".format(DEVICE_MAC, SENSOR_ID_1, sensor_value_1)) #       # sock.send("#{}\n#{}#{}\n#{}#{}\n##".format(DEVICE_MAC, SENSOR_ID_1, sensor_value_1, SENSOR_ID_2, sensor_value_2)) #   data = sock.recv(1024) sock.close() print data except socket.error, e: print('ERROR! Exception {}'.format(e)) 


我们已连接到服务器narodmon.ru:8283

结果,我们得到以下脚本:

完成脚本的代码
 #!/usr/bin/env python2 # -*- coding: utf-8 -*- import socket import os import fnmatch # MAC  .   ! DEVICE_MAC = 'FF:FF:FF:FF:FF:FF' #  SENSOR_ID_1 = 'T1' SENSOR_ID_2 = 'T2' #   temperature = [] IDs = [] for filename in os.listdir("/sys/bus/w1/devices"): if fnmatch.fnmatch(filename, '28-031652ddbdff'): with open("/sys/bus/w1/devices/" + filename + "/w1_slave") as fileobj: lines = fileobj.readlines() if lines[0].find("YES"): pok = lines[1].find('=') temperature.append(float(lines[1][pok+1:pok+7])/1000) IDs.append(filename) else: logger.error("Error reading sensor with ID: %s" % (filename)) temperature2 = [] for filename in os.listdir("/sys/bus/w1/devices"): if fnmatch.fnmatch(filename, '28-011563e8d2ff'): with open("/sys/bus/w1/devices/" + filename + "/w1_slave") as fileobj: lines = fileobj.readlines() if lines[0].find("YES"): pok = lines[1].find('=') temperature2.append(float(lines[1][pok+1:pok+7])/1000) IDs.append(filename) else: logger.error("Error reading sensor with ID: %s" % (filename)) sock = socket.socket() # try: sock.connect(('narodmon.ru', 8283)) # ,        sock.send("#{}\n#{}#{}\n#{}#{}\n##".format(DEVICE_MAC, SENSOR_ID_1, str(temperature)[1:-1], SENSOR_ID_2, str(temperature2)[1:-1])) #  data=sock.recv(1024) sock.close() print data except socket.error, e: print('ERROR! Exception {}'.format(e)) print str(temperature)[1:-1] print str(temperature2)[1:-1] 


这就是从两个传感器发送数据的样子。 如果给传感器起一个以T开头的名称,则服务器本身将确定它是温度传感器。

现在我们需要将传感器添加到cron中。 我们输入: crontab -e并在其中添加以下行:

 */10 * * * * sudo python /home/pi/narod.py 

我们正在等待脚本运行。

现在,我们转到narodmon.ru/ip ,查看是否已传输数据。 如果一切正常,则单击菜单主页上的“添加设备”按钮,然后指定MAC。 现在,我们可以自定义所有口味(名称,类型,位置等)。 您可以在证词传输开始的一天后将传感器公开。

仅此而已。 祝您连接传感器好运。 经常进行此操作,因为从家中可以很方便地提前查看要去的地方的温度。

再见:)

Source: https://habr.com/ru/post/zh-CN401313/


All Articles