本文遵循有关 如何 使用Zerynth创建以Python编程并连接到The Things Network的 LoRa/LoraWAN 网络的教程。
从上一个项目的相同设置开始,我们将了解如何使用 Zerynth、The Things Network 和 Matplotlib(一个非常流行的 Python 绘图库)获取和可视化 LoRa 节点的传感器数据。
您将看到如何:
本质上,我们需要与之前项目相同的配置,外加一个温度和湿度传感器:
在执行 LoRa 网关配置和 LoRa 节点配置步骤后(参见之前的项目),我们将能够对设备进行编程以从 Temp&Hum Click 获取数据并将这些值发送到 The Things Network 控制台。
特别是,我们必须在 Zerynth Studio 上创建一个新项目并粘贴此代码:
# LoraWAN sensor data Logging
import streams
from microchip.rn2483 import rn2483
from stm.hts221 import hts221
streams.serial()
try:
rst = D16 # reset pin
# insert otaa credentials!
appeui = "YOUAPPEUI"
appkey = "YOUAPPKEY"
print("joining...")
if not rn2483.init(SERIAL1, appeui, appkey, rst): # LoRa Click on slot A
print("denied :(")
raise Exception
print("sending first message, res:")
print(rn2483.tx_uncnf('TTN'))
temp_hum = hts221.HTS221( I2C1,D31 ) # Temp Hum Click on slot C
while True:
temp, hum = temp_hum.get_temp_humidity()
print('temp: ', temp, 'hum: ', hum)
data = bytearray(4)
data[0:2] = bytearray([ int(temp) + 127, int((temp - int(temp)) * 100) ])
data[2:4] = bytearray([ int(hum) + 127, int((hum - int(hum)) * 100) ])
r = rn2483.tx_uncnf(data) # send data to TTN
sleep(5000)
except Exception as e:
print(e)
使用您可以在TTN 控制台的设备概述中找到的“ appeui ”和“ appkey ”值编辑行。
将代码上传到您的开发板,您就完成了!
现在单击 TTN 控制台的“数据”选项卡,您可以看到 LoRa 节点发送的传感器数据!
如您所见,此脚本与上一个项目中使用的“ping”示例非常相似。唯一的区别与Temp&Hum Click搭载的HTS221温湿度传感器的使用有关。感谢 Zerynth,您只需要几行Python ,就可以从传感器获取真实数据并将其发送到 LoRa 网络!
现在是从 TTN 控制台获取数据的时候了。为此,我们准备了一个非常简单的 Python 脚本,该脚本使用 Eclipse Paho MQTT Python 客户端库,该客户端库实现了MQTT协议的 3.1 和 3.1.1 版。
请注意,您必须在笔记本电脑上运行此脚本,因此您需要在 PC 上安装 Python (3.x)。
get_plot_data_TTN.py:
# Get and plot data from TTN Console using Python
import paho.mqtt.client as mqtt
import json
import base64
APPEUI = 'YOURAPPEUI'
APPID = 'YOUAPPID'
PSW = 'YOURPASSWORD'
import matplotlib.pyplot as plt
#import DataPlot and RealtimePlot from the file plot_data.py
from plot_data import DataPlot, RealtimePlot
fig, axes = plt.subplots()
plt.title('Data from TTN console')
data = DataPlot()
dataPlotting= RealtimePlot(axes)
count=0
def bytes_to_decimal(i,d):
xx = i - 127
dec = (-d if xx < 0 else d)/100
return xx + dec
def on_connect(client, userdata, flags, rc):
client.subscribe('+/devices/+/up'.format(APPEUI))
def on_message(client, userdata, msg):
j_msg = json.loads(msg.payload.decode('utf-8'))
dev_eui = j_msg['hardware_serial']
tmp_hum = base64.b64decode(j_msg['payload_raw'])
tmp = bytes_to_decimal(*tmp_hum[0:2])
hum = bytes_to_decimal(*tmp_hum[2:4])
# print data
print('---')
print('tmp:', tmp, ' hum:', hum)
print('dev eui: ', dev_eui)
# plot data
global count
count+=1
data.add(count, tmp , hum)
dataPlotting.plot(data)
plt.pause(0.001)
# set paho.mqtt callback
ttn_client = mqtt.Client()
ttn_client.on_connect = on_connect
ttn_client.on_message = on_message
ttn_client.username_pw_set(APPID, PSW)
ttn_client.connect("eu.thethings.network", 1883, 60) #MQTT port over TLS
try:
ttn_client.loop_forever()
except KeyboardInterrupt:
print('disconnect')
ttn_client.disconnect()
一旦你的计算机中有了数据,你就可以用它做各种各样的事情。在这种情况下,我们想要读取这些温度和湿度值并将它们绘制为时间的函数。
因为我们喜欢 Python,所以我们准备了一个名为“ plot_data.py ”的脚本,它为此使用了Matplotlib库。
plot_data.py:
import time
import math
from collections import deque , defaultdict
import matplotlib.animation as animation
from matplotlib import pyplot as plt
import threading
from random import randint
from statistics import *
class DataPlot:
def __init__(self, max_entries = 20):
self.axis_x = deque(maxlen=max_entries)
self.axis_y = deque(maxlen=max_entries)
self.axis_y2 = deque(maxlen=max_entries)
self.max_entries = max_entries
self.buf1=deque(maxlen=5)
self.buf2=deque(maxlen=5)
def add(self, x, y,y2):
self.axis_x.append(x)
self.axis_y.append(y)
self.axis_y2.append(y2)
class RealtimePlot:
def __init__(self, axes):
self.axes = axes
self.lineplot, = axes.plot([], [], "ro-")
self.lineplot2, = axes.plot([], [], "go-")
def plot(self, dataPlot):
self.lineplot.set_data(dataPlot.axis_x, dataPlot.axis_y)
self.lineplot2.set_data(dataPlot.axis_x, dataPlot.axis_y2)
self.axes.set_xlim(min(dataPlot.axis_x), max(dataPlot.axis_x))
ymin = min([min(dataPlot.axis_y), min(dataPlot.axis_y2)])-10
ymax = max([max(dataPlot.axis_y), max(dataPlot.axis_y2)])+10
self.axes.set_ylim(ymin,ymax)
self.axes.relim();
def main():
fig, axes = plt.subplots()
plt.title('Plotting Data')
data = DataPlot();
dataPlotting= RealtimePlot(axes)
try:
count=0
while True:
count+=1
data.add(count, 30 + 1/randint(1,5) , 35 + randint(1,5))
dataPlotting.plot(data)
plt.pause(0.001)
except KeyboardInterrupt:
print('\n\nKeyboard exception received. Exiting.')
plt.close()
ser.close()
exit()
if __name__ == "__main__": main()
请注意,您必须在之前的脚本中导入此文件才能正常工作。这就是情节的样子。随着数据的不断涌入,它会向右滚动。
以下列表包括一些LoRa 关键特性:
Zerynth Studio 的免费版本允许您使用LoRa解决方案原型所需的所有功能,但您最多可以免费为每个受支持的电路板编程 5 个单元。您可以使用Zerynth Studio PRO 版本(从 6 月 28 日开始提供,预购可享受高达 50% 的折扣)解锁此限制,该 版本还将包括工业级功能,例如:
通过Zerynth 学院
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !