目录
将Raspberry Pi与Grove Base Hat连接到ThingsBoard
简介
ThingsBoard社区版是一款开源服务端平台,可用于监控和控制物联网设备。对个人和商业用途均免费,可在任意位置部署。若您尚未熟悉平台,建议先阅读 什么是ThingsBoard 和 快速入门指南,再继续本教程。本指南使用 thingsboard.cloud。本示例应用可让您通过ThingsBoard Web UI采集传感器信息并控制Raspberry Pi Grove Base Hat PCB上的舵机和LED。本应用旨在展示ThingsBoard与Grove Base Hat PCB的集成。Raspberry Pi将使用Python编写的简单应用,通过MQTT连接ThingsBoard服务器,发送传感器信息并监听RPC命令。ThingsBoard内置仪表板用于数据可视化及控制舵机和LED。最终效果如下:
<img src="/images/samples/raspberry/grove/grove-image.gif"alt="grove image">
前置条件
本教程需已部署并运行 ThingsBoard 服务器,本指南以 thingsboard.cloud 为例。
硬件与引脚:
Raspberry Pi 3 model B (也可使用 Raspberry Pi 4)
Grove Base Hat
本示例中我们连接了以下模块:

接线说明
本示例采用如下接线:
1
2
3
4
5
6
7
8
9
|
Module Pinouts on Grove Base Hat
Analog Servo PWM(12)
Mini PIR Motion Sensor v1.0 D5
Ultrasonic ranger v2.0 D16
RED Led Button v1.0 D18
Moisture Sensor v1.4 A0
Light sensor v1.2 A2
Temperature&Humidity Sensor v1.2 D22
|
树莓派编程
首先需配置树莓派,请参阅 此文。
完成配置后,需在树莓派上安装脚本所需的库。
以下命令将安装 ThingsBoard Python 客户端 SDK,用于与 ThingsBoard 服务器通信:
1
| pip3 install tb-MQTT-客户端
|
还需安装 Seeed-Studio 库以连接我们的模块:
1
| git clone git@github.com:Seeed-Studio/grove.py.git
|
1
| pip3 install ./grove.py/
|
若使用温湿度传感器(DHTXX),还需安装温湿度传感器库:
1
| git clone https://github.com/Seeed-Studio/Seeed_Python_DHT.git
|
1
| sudo python3 ./Seeed_Python_DHT/setup.py install
|
应用源代码
本应用由一份 Python 脚本 组成,脚本内附注释说明。 需将 THINGSBOARD_HOST 常量改为您 ThingsBoard 服务器安装的 IP 或主机名。
同时需在 ThingsBoard 中声明要连接该设备并获取设备 ACCESS_TOKEN,供脚本使用。
登录您的环境 — 设备组 — 添加设备组 — 添加新设备(例如:设备 1,类型为 grove)— 打开设备详情 — Copy access 令牌。

请将下方脚本中的 THINGSBOARD_HOST 和 ACCESS_TOKEN 替换为您自己的值。
若使用 ThingsBoard Cloud,将 THINGSBOARD_HOST 填为 MQTT.thingsboard.cloud(北美)或 MQTT.eu.thingsboard.cloud(欧洲地区)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
| #
# Copyright © 2019-2024 The Thingsboard Authors
#
# Licensed under the Apache License, Version 2.0 (the"License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# HTTP://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an"AS IS"BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import logging
import time
from tb_device_mqtt import TBDeviceMqttClient, TBPublishInfo
from grove.grove_mini_pir_motion_sensor import GroveMiniPIRMotionSensor
from grove.grove_ultrasonic_ranger import GroveUltrasonicRanger
from Seeed_Python_DHT.seeed_dht import DHT
from grove.grove_moisture_sensor import GroveMoistureSensor
from grove.button import Button
from grove.grove_ryb_led_button import GroveLedButton
from grove.grove_light_sensor_v1_2 import GroveLightSensor
from grove.grove_servo import GroveServo
# 日志配置,本例将输出到控制台
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(module)s - %(lineno)d - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
log = logging.getLogger(__name__)
THINGSBOARD_SERVER = 'THINGSBOARD_HOST'
ACCESS_TOKEN = 'ACCESS_TOKEN'
def main():
# Grove - Servo connected to PWM端口
servo = GroveServo(12)
servo_angle = 90
# Grove - mini PIR motion pir_sensor connected to端口D5
pir_sensor = GroveMiniPIRMotionSensor(5)
# Grove - Ultrasonic Ranger connected to端口D16
ultrasonic_sensor = GroveUltrasonicRanger(16)
# Grove - LED Button connected to端口D18
button = GroveLedButton(18)
# Grove - Moisture Sensor connected to端口A0
moisture_sensor = GroveMoistureSensor(0)
# Grove - Light Sensor connected to端口A2
light_sensor = GroveLightSensor(2)
light_state = False
# Grove - Temperature&Humidity Sensor connected to端口D22
dht_sensor = DHT('11', 22)
# 服务器 RPC 请求回调(用于控制舵机与 LED)
def on_server_side_rpc_request(client, request_id, request_body):
log.info('received rpc: {}, {}'.format(request_id, request_body))
if request_body['method'] == 'getLedState':
client.send_rpc_reply(request_id, light_state)
elif request_body['method'] == 'setLedState':
light_state = request_body['params']
button.led.light(light_state)
elif request_body['method'] == 'setServoAngle':
servo_angle = float(request_body['params'])
servo.setAngle(servo_angle)
elif request_body['method'] == 'getServoAngle':
client.send_rpc_reply(request_id, servo_angle)
# 连接 ThingsBoard
client = TBDeviceMqttClient(THINGSBOARD_SERVER, username=ACCESS_TOKEN)
client.set_server_side_rpc_request_handler(on_server_side_rpc_request)
client.connect()
# Callback on detect the motion from motion sensor
def on_detect():
log.info('motion detected')
telemetry = {"motion": True}
client.send_telemetry(telemetry)
time.sleep(5)
# 在仪表板中取消运动告警
client.send_telemetry({"motion": False})
log.info("Motion alert deactivated")
# Callback from button if it was pressed or unpressed
def on_event(index, event, tm):
if button._GroveLedButton__btn.is_pressed():
log.debug('button: single click')
telemetry = {"button_press": True}
client.send_telemetry(telemetry)
log.info("Pressed")
else:
log.debug('button: single click')
telemetry = {"button_press": False}
client.send_telemetry(telemetry)
log.info("Unpressed")
if event & Button.EV_SINGLE_CLICK:
button.led.light(True)
elif event & Button.EV_DOUBLE_CLICK:
button.led.blink()
elif event & Button.EV_LONG_PRESS:
button.led.light(False)
# Adding the callback to the motion sensor
pir_sensor.on_detect = on_detect
# Adding the callback to the button
button.on_event = on_event
try:
while True:
distance = ultrasonic_sensor.get_distance()
log.debug('distance: {} cm'.format(distance))
humidity, temperature = dht_sensor.read()
log.debug('temperature: {}C, humidity: {}%'.format(temperature, humidity))
moisture = moisture_sensor.moisture
log.debug('moisture: {}'.format(moisture))
log.debug('light: {}'.format(light_sensor.light))
# 格式化待发送至 ThingsBoard 的数据
telemetry = {'distance': distance,
'temperature': temperature,
'humidity': humidity,
'moisture': moisture,
'light': light_sensor.light}
# 发送数据
client.send_telemetry(telemetry).get()
time.sleep(.1)
except Exception as e:
raise e
finally:
client.disconnect()
if __name__ == '__main__':
main()
|
数据可视化与控制
配置仪表板前请先登录 ThingsBoard 环境。
进行本步骤时,请下载 grove_seeed_studio.json,其中包含本脚本的预配置仪表板。
登录后打开 Dashboards,点击屏幕右下角加号并选择「导入仪表板」图标,选择刚下载的仪表板配置文件。然后需编辑 Grove 部件的别名:点击铅笔图标,将 Filter 类型参数设为「Single entity」,类型设为「设备」,在设备列表中选中您的 GROVE 设备。
运行应用
使用以下命令启动应用:
脚本运行结果可在仪表板中查看。

也可在仪表板中控制舵机(旋转名称为「Servo」的旋钮)或 LED(点击「Button Led」触发器)。
另请参阅
浏览其他 示例 或查看 ThingsBoard 主要功能相关指南:
您的反馈
欢迎在 GitHub 上为 ThingsBoard 加星,帮助我们推广。
若对此示例有任何疑问,请在 Issues 中提出。
下一步
-
快速入门指南 - 快速了解ThingsBoard主要功能,约15-30分钟完成。
-
连接设备 - 根据连接技术或方案学习如何连接设备。
-
数据可视化 - 配置ThingsBoard复杂仪表盘的说明。
-
数据处理与操作 - 学习使用ThingsBoard规则引擎。
-
IoT数据分析 - 学习使用规则引擎执行基本分析任务。
-
高级功能 - 了解ThingsBoard高级功能。
-
贡献与开发 - 了解ThingsBoard贡献与开发。