在先前的教程中,我们讨论了有关MQTT协议的问题,并在Raspberry Pi上安装了本地MQTT服务器以本地控制GPIO。但是本地MQTT服务器的缺点是我们无法从世界任何地方控制GPIO,而仅在本地提供服务。但是,如果此MQTT服务器托管在某个云上,则可以全局控制连接到Raspberry Pi的任何设备。
在这里,在本教程中,我们将使用Adafruit IO作为MQTT代理来控制连接到Raspberry Pi GPIO的AC设备。另请查看其他物联网控制的家庭自动化教程:
- 使用ESP8266和Android App的基于物联网的语音控制家庭自动化
- 使用Arduino的智能手机控制的家庭自动化
- 使用PIC微控制器和Adafruit IO的基于IoT的Web控制的家庭自动化
- 使用Raspberry Pi的基于IoT的Web控制的家庭自动化
- 使用DIY Arduino Wi-Fi Shield的基于Google Assistant的语音控制家庭自动化
所需组件
- 安装了Raspbian Stretch的Raspberry Pi。
- 继电器模块
- 灯泡
- 跳线
在这里,我们将使用SSH访问笔记本电脑上的Raspberry Pi。您可以在笔记本电脑上使用VNC或远程桌面连接,也可以将Raspberry pi与显示器连接。在此处了解有关无显示器无头设置Raspberry Pi的更多信息。
电路原理图
带有MQTT云和Raspberry Pi的物联网受控家用电器的电路图很简单,只需将灯泡与继电器模块连接到Raspberry Pi的GPIO引脚35上即可。
在Raspberry Pi上安装MQTT Cloud库
在这里,Adafruit IO平台与Raspberry Pi一起用作MQTT代理。由于我们在以前的教程中已经多次使用Adafruit IO平台,因此类似地,我们可以在Raspberry Pi中使用它。
只需在Adafruit IO平台上创建一个帐户并创建一个提要,如果您不知道如何制作提要和自定义Adafruit仪表板,则请单击链接。
制作完仪表板后,请在Raspberry Pi中安装一些库以开始使用MQTT。
1.首先,通过发出以下命令来更新您的Pi和Python
sudo apt-get更新 sudo apt-get升级 sudo pip3 install --upgrade setuptools
2.现在,使用以下命令安装Rpi.gpio和Adafruit闪烁库
sudo pip3安装RPI.GPIO sudo pip3安装adafruit-blinka
3.使用以下命令安装Adafruit IO库
sudo pip3安装adafruit-io
4.使用以下命令从github复制adafruit示例
git clone https://github.com/adafruit/Adafruit_IO_Python.git
5.然后,通过在终端中输入以下命令,导航到examples文件夹:
cd Adafruit_IO_Python / examples / basics
如果不确定所在目录,可以通过运行pwd进行检查 。
6.对于此文件夹中的所有示例,您需要设置 ADAFRUIT_IO_KEY 和 ADAFRUIT_IO_USERNAME,可以从Adafruit仪表板找到它们。如下所示
切换Adafruit IO仪表板上的按钮,您应该在Pi的终端中看到以下内容。
7.现在,使用 nano 编辑器打开subscription.py文件。输入以下命令将其打开
须藤纳米subscribe.py
我们必须修改此程序以控制仪表板中的所有GPIO。
使用MQTT控制Raspberry Pi GPIO的编码说明
首先,导入所有必需的库以使用GPIO引脚和Adafruit MQTT客户端。
从Adafruit_IO导入RPi.GPIO作为GPIO导入sys 导入MQTTClient
现在,设置GPIO模式并定义LED引脚号并设置为输出。
GPIO.setmode(GPIO.BOARD) GPIO.setwarnings(False) ledPin = 12 GPIO.setup(ledPin,GPIO.OUT)
接下来,我们必须设置在创建仪表板时发现的AIO密钥和用户名。
ADAFRUIT_IO_KEY ='YOUR_AIO_KEY'ADAFRUIT_IO_USERNAME ='YOUR_AIO_USERNAME'
输入您要打开和关闭灯的提要名称。在这里,是 “光”。
FEED_ID ='轻'
现在,定义一个事件发生时将调用的函数。因此,我们将使用 client.subscribe(FEED_ID) 订阅Feed
def connected(client): client.subscribe(FEED_ID) print('正在等待提要数据…')
订阅Feed后,我们必须检查新值并将其存储到 有效负载 变量中。为此消息功能被调用。因此,只要有效负载变量中有“ 1”,就将引线引脚设为“高”,为“ 0”使其设为“低”。
def消息(客户端,feed_id,有效负载): print('Feed {0}收到新值:{1}'。format(feed_id,有效负载)) 如果有效负载== 1: GPIO.output(ledPin,GPIO.HIGH) 否则: GPIO.output(ledPin,GPIO.LOW)
现在,创建一个MQTT客户端以与Adafruit IO平台连接,并往返发送消息。
客户端= MQTTClient(ADAFRUIT_IO_USERNAME,ADAFRUIT_IO_KEY)客户端 .on_connect =已连接的 客户端.on_disconnect =已断开连接
另外,请注意代码中的缩进,否则会显示错误。本教程末尾提供了完整的python代码。
最后,使用ctrl + x保存程序,然后按Enter。现在,我们必须运行脚本以订阅消息。因此,在终端中输入python subscription.py,然后按Enter。
python subscription.py
您将看到一条消息 正在等待Feed数据 ,如下快照所示。
现在,确保将继电器模块与Raspberry Pi的GPIO引脚连接,然后转到Adafruit IO仪表板并更改照明灯。该灯泡应该打开时的“1”被接收,并且关断,如下所示,当“0”上接收。
通过这种方式,我们可以使用Raspberry Pi和MQTT云控制世界上任何地方的任何设备。