在本教程中,我們將使用 Adafruit IO 作為 MQTT 代理來控制連接到 Raspberry Pi GPIO 的 AC 設(shè)備。
所需組件
安裝了 Raspbian Stretch 的 Raspberry Pi。
繼電器模塊
電燈泡
跳線
在這里,我們將使用 SSH 訪問筆記本電腦上的 Raspberry Pi。您可以在筆記本電腦上使用 VNC 或遠(yuǎn)程桌面連接,或者可以將您的 Raspberry pi 連接到顯示器。
電路原理圖
這個帶有 MQTT 云和樹莓派的物聯(lián)網(wǎng)控制家電的電路圖很簡單,只需在樹莓派的 GPIO 引腳 35 上連接一個帶有繼電器模塊的燈泡。
在樹莓派上安裝 MQTT 云庫
這里Adafruit IO 平臺與 Raspberry Pi 一起用作 MQTT 代理。正如我們在之前的教程中多次使用Adafruit IO平臺一樣,我們可以在 Raspberry Pi 中使用它。
制作儀表板后,在 Raspberry Pi 中安裝一些庫以開始使用 MQTT。
1.首先,通過發(fā)出以下命令更新您的 Pi 和 Python
sudo apt-get update
sudo apt-get upgrade
sudo pip3 install --upgrade setuptools
2. 現(xiàn)在,使用以下命令安裝 Rpi.gpio 和 Adafruit blink 庫
sudo pip3 install RPI.GPIO
sudo pip3 install adafruit-blinka
3. 使用以下命令安裝 Adafruit IO 庫
sudo pip3 安裝 adafruit-io
4. 使用以下命令從 github 克隆 adafruit 示例
git 克隆 https://github.com/adafruit/Adafruit_IO_Python.git
5. 然后,通過在終端中輸入以下命令導(dǎo)航到示例文件夾:
cd Adafruit_IO_Python/examples/basics
如果你不確定你在哪個目錄,你可以通過運(yùn)行 pwd來檢查。
6. 對于此文件夾中的所有示例,您需要設(shè)置 ADAFRUIT_IO_KEY 和 ADAFRUIT_IO_USERNAME,這可以從 Adafruit 儀表板中找到。如下所示
切換 Adafruit IO 儀表板上的按鈕,您應(yīng)該在 Pi 的終端中看到以下內(nèi)容。
7. 現(xiàn)在,使用nano編輯器打開subscribe.py文件。輸入以下命令打開它
須藤納米訂閱.py
我們必須修改這個程序來控制儀表板上的任何 GPIO。
MQTT控制樹莓派GPIO的編碼說明
首先,導(dǎo)入所有必需的庫以使用 GPIO 引腳和 Adafruit MQTT 客戶端。
將 RPi.GPIO 導(dǎo)入為 GPIO 從 Adafruit_IO 導(dǎo)入sys導(dǎo)入 MQTTClient
現(xiàn)在,設(shè)置 GPIO 模式并定義 LED 引腳號并設(shè)置為輸出。
GPIO.setmode(GPIO.BOARD) GPIO.setwarnings(False) ledPin = 12 GPIO.setup(ledPin, GPIO.OUT)
接下來,我們必須設(shè)置在創(chuàng)建儀表板時找到的 AIO 密鑰和用戶名。
ADAFRUIT_IO_KEY = 'YOUR_AIO_KEY' ADAFRUIT_IO_USERNAME = 'YOUR_AIO_USERNAME'
輸入您為打開和關(guān)閉燈而提供的提要名稱。在這里,它是“光”。
FEED_ID = '光'
現(xiàn)在,定義一個在有事件發(fā)生時將被調(diào)用的函數(shù)。因此,我們將使用client.subscribe(FEED_ID)訂閱 Feed
def connected(client): client.subscribe(FEED_ID) print('Waiting for feed data...')
訂閱提要后,我們必須檢查新值并將其存儲到有效負(fù)載變量中。為此消息函數(shù)被調(diào)用。因此,每當(dāng)有效載荷變量中有“1”時,將 LED 引腳設(shè)為高電平,“0”將其設(shè)為低電平。
def message(client, feed_id, payload): print('Feed {0} received new value: {1}'.format(feed_id, payload)) if payload == 1: GPIO.output(ledPin, GPIO.HIGH) else : GPIO.輸出(ledPin,GPIO.LOW)
現(xiàn)在,創(chuàng)建一個 MQTT 客戶端來連接 Adafruit IO 平臺并來回發(fā)送消息。
client = MQTTClient(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY) client.on_connect = 已連接 client.on_disconnect = 已斷開
另外,請注意代碼中的正確縮進(jìn),否則會顯示錯誤。教程末尾給出了完整的 Python 代碼。
最后,使用 ctrl+x 保存程序并回車?,F(xiàn)在,我們必須運(yùn)行腳本才能訂閱消息。所以在終端輸入python subscribe.py并回車。
python訂閱.py
您將看到一條消息正在等待 Feed 數(shù)據(jù)。..,如下圖所示。
現(xiàn)在,確保繼電器模塊與 Raspberry Pi 的 GPIO 引腳連接,然后轉(zhuǎn)到 Adafruit IO 儀表板并更改光饋。收到“ 1”時燈泡應(yīng)打開,收到“0”時應(yīng)關(guān)閉,如下圖所示。
通過這種方式,我們可以使用 Raspberry Pi 和 MQTT 云從世界任何地方控制任何設(shè)備
將 RPi.GPIO 作為 GPIO
導(dǎo)入 sys
從 Adafruit_IO 導(dǎo)入 MQTTClient
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
ledPin = 12
GPIO.setup(ledPin, GPIO.OUT)
ADAFRUIT_IO_KEY = 'YOUR_AIO_KEY'
ADAFRUIT_IO_USERNAME = 'YOUR_AIO_USERNAME'
FEED_ID = 'light'
def connected(client):
# 訂閱名為 Counter 的提要的更改。
print('訂閱 Feed {0}'.format(FEED_ID))
client.subscribe(FEED_ID)
print('正在等待 Feed 數(shù)據(jù)...')
def 斷開連接(客戶端):
sys.exit(1)
def message(client, feed_id, payload):
print('Feed {0} received new value: {1}'.format(feed_id, payload))
if payload == 1:
GPIO.output(ledPin, GPIO.HIGH)
else :
GPIO.output(ledPin, GPIO.LOW)
# 創(chuàng)建一個 MQTT 客戶端實例。
client = MQTTClient(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY)
# 設(shè)置上面定義的回調(diào)函數(shù)。
client.on_connect = 已連接
client.on_disconnect = 已斷開
client.on_message = 消息
# 連接到 Adafruit IO 服務(wù)器。
client.connect()
client.loop_blocking()
-
GPIO
+關(guān)注
關(guān)注
16文章
1184瀏覽量
51752 -
MQTT
+關(guān)注
關(guān)注
5文章
641瀏覽量
22362
發(fā)布評論請先 登錄
相關(guān)推薦
評論