設定您的 Raspberry Pi 和濕度感應器 - AWS IoT Core

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

設定您的 Raspberry Pi 和濕度感應器

將 microSD 卡插入 Raspberry Pi,連接顯示器、鍵盤、滑鼠,以及乙太網路纜線 (如果未使用 Wi-Fi)。還不要連接電源線。

將 JST 跳線纜線連接至濕度感應器。跳線的另一端有四條配線:

  • 綠色:I2C SCL

  • 白色:I2C SDA

  • 紅色:功率 (3.5 V)

  • 黑色:接地

按住 Raspberry Pi 與右側的乙太網路插孔。在此方向中,上方有兩列 GPIO 接腳。按照以下順序,將濕度感應器的配線連接到接腳的下方排。從最左側接腳開始,連接紅色 (電源)、白色 (SDA) 和綠色 (SCL)。略過一個接腳,然後連接黑色 (接地) 配線。如需詳細資訊,請參閱 Python Computer Wiring

將電源線連接至 Raspberry Pi,並將另一端插入牆上插座,以將其開啟。

設定您的 Raspberry Pi
  1. Welcome to Raspberry Pi (歡迎使用 Raspberry Pi) 上,選擇 Next (下一步)

  2. 選擇您的國家/地區、語言、時區及鍵盤配置。選擇 Next (下一步)。

  3. 輸入您的 Raspberry Pi 的密碼,然後選擇 Next (下一步)

  4. 選擇您的 Wi-Fi 網路,然後選擇 Next (下一步)。如果您不是使用 Wi-Fi 網路,請選擇 Skip (略過)

  5. 選擇 Next (下一步) 以檢查軟體更新。更新完成時,選擇 Restart (重新啟動) 以重新啟動您的 Raspberry Pi。

在 Raspberry Pi 啟動後,啟用 I2C 介面。

  1. 在 Raspbian 桌面的左上角,按一下 Raspberry 圖示,選擇 Preferences (偏好設定),然後選擇 Raspberry Pi Configuration (Raspberry Pi 組態)

  2. Interfaces (介面) 標籤上,針對 I2C,選擇 Enable (啟用)

  3. 選擇 確定

Adafruit STEMMA 濕度傳感器的庫是為了編寫的。 CircuitPython若要在 Raspberry Pi 上執行它們,您需要安裝最新版本的 Python 3。

  1. 從命令提示執行下列命令,以更新您的 Raspberry Pi 軟體:

    sudo apt-get update

    sudo apt-get upgrade

  2. 執行以下命令來更新您的 Python 3 安裝:

    sudo pip3 install --upgrade setuptools

  3. 執行以下命令來安裝 Raspberry Pi GPIO 程式庫:

    pip3 install RPI.GPIO

  4. 執行以下命令來安裝 Adafruit Blinka 程式庫:

    pip3 install adafruit-blinka

    如需詳細資訊,請參閱在 Raspberry Pi 上安裝 CircuitPython 程式庫

  5. 執行以下命令來安裝 Adafruit Seesaw 程式庫:

    sudo pip3 install adafruit-circuitpython-seesaw

  6. 執行下列命令以安裝適用於 Python 的裝 AWS IoT 置 SDK:

    pip3 install AWSIoTPythonSDK

您的 Raspberry Pi 現在擁有所有必要的程式庫。建立名為 moistureSensor.py 的檔案,並將下列 Python 程式碼複製到檔案:

from adafruit_seesaw.seesaw import Seesaw from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTShadowClient from board import SCL, SDA import logging import time import json import argparse import busio # Shadow JSON schema: # # { # "state": { # "desired":{ # "moisture":<INT VALUE>, # "temp":<INT VALUE> # } # } # } # Function called when a shadow is updated def customShadowCallback_Update(payload, responseStatus, token): # Display status and data from update request if responseStatus == "timeout": print("Update request " + token + " time out!") if responseStatus == "accepted": payloadDict = json.loads(payload) print("~~~~~~~~~~~~~~~~~~~~~~~") print("Update request with token: " + token + " accepted!") print("moisture: " + str(payloadDict["state"]["reported"]["moisture"])) print("temperature: " + str(payloadDict["state"]["reported"]["temp"])) print("~~~~~~~~~~~~~~~~~~~~~~~\n\n") if responseStatus == "rejected": print("Update request " + token + " rejected!") # Function called when a shadow is deleted def customShadowCallback_Delete(payload, responseStatus, token): # Display status and data from delete request if responseStatus == "timeout": print("Delete request " + token + " time out!") if responseStatus == "accepted": print("~~~~~~~~~~~~~~~~~~~~~~~") print("Delete request with token: " + token + " accepted!") print("~~~~~~~~~~~~~~~~~~~~~~~\n\n") if responseStatus == "rejected": print("Delete request " + token + " rejected!") # Read in command-line parameters def parseArgs(): parser = argparse.ArgumentParser() parser.add_argument("-e", "--endpoint", action="store", required=True, dest="host", help="Your device data endpoint") parser.add_argument("-r", "--rootCA", action="store", required=True, dest="rootCAPath", help="Root CA file path") parser.add_argument("-c", "--cert", action="store", dest="certificatePath", help="Certificate file path") parser.add_argument("-k", "--key", action="store", dest="privateKeyPath", help="Private key file path") parser.add_argument("-p", "--port", action="store", dest="port", type=int, help="Port number override") parser.add_argument("-n", "--thingName", action="store", dest="thingName", default="Bot", help="Targeted thing name") parser.add_argument("-id", "--clientId", action="store", dest="clientId", default="basicShadowUpdater", help="Targeted client id") args = parser.parse_args() return args # Configure logging # AWSIoTMQTTShadowClient writes data to the log def configureLogging(): logger = logging.getLogger("AWSIoTPythonSDK.core") logger.setLevel(logging.DEBUG) streamHandler = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') streamHandler.setFormatter(formatter) logger.addHandler(streamHandler) # Parse command line arguments args = parseArgs() if not args.certificatePath or not args.privateKeyPath: parser.error("Missing credentials for authentication.") exit(2) # If no --port argument is passed, default to 8883 if not args.port: args.port = 8883 # Init AWSIoTMQTTShadowClient myAWSIoTMQTTShadowClient = None myAWSIoTMQTTShadowClient = AWSIoTMQTTShadowClient(args.clientId) myAWSIoTMQTTShadowClient.configureEndpoint(args.host, args.port) myAWSIoTMQTTShadowClient.configureCredentials(args.rootCAPath, args.privateKeyPath, args.certificatePath) # AWSIoTMQTTShadowClient connection configuration myAWSIoTMQTTShadowClient.configureAutoReconnectBackoffTime(1, 32, 20) myAWSIoTMQTTShadowClient.configureConnectDisconnectTimeout(10) # 10 sec myAWSIoTMQTTShadowClient.configureMQTTOperationTimeout(5) # 5 sec # Initialize Raspberry Pi's I2C interface i2c_bus = busio.I2C(SCL, SDA) # Intialize SeeSaw, Adafruit's Circuit Python library ss = Seesaw(i2c_bus, addr=0x36) # Connect to AWS IoT myAWSIoTMQTTShadowClient.connect() # Create a device shadow handler, use this to update and delete shadow document deviceShadowHandler = myAWSIoTMQTTShadowClient.createShadowHandlerWithName(args.thingName, True) # Delete current shadow JSON doc deviceShadowHandler.shadowDelete(customShadowCallback_Delete, 5) # Read data from moisture sensor and update shadow while True: # read moisture level through capacitive touch pad moistureLevel = ss.moisture_read() # read temperature from the temperature sensor temp = ss.get_temp() # Display moisture and temp readings print("Moisture Level: {}".format(moistureLevel)) print("Temperature: {}".format(temp)) # Create message payload payload = {"state":{"reported":{"moisture":str(moistureLevel),"temp":str(temp)}}} # Update shadow deviceShadowHandler.shadowUpdate(json.dumps(payload), customShadowCallback_Update, 5) time.sleep(1)

將檔案儲存到您可以找到的位置。從命令列搭配下列參數執行 moistureSensor.py

端點

您的自訂 AWS IoT 端點。如需詳細資訊,請參閱 Device Shadow REST API

rootCA

AWS IoT 根 CA 憑證的完整路徑。

cert

AWS IoT 裝置憑證的完整路徑。

金錀

AWS IoT 裝置憑證私密金鑰的完整路徑。

thingName

您的物件名稱 (在此案例中為 RaspberryPi)。

clientId

MQTT 用戶端 ID。請使用 RaspberryPi

命令列看起來應該如下:

python3 moistureSensor.py --endpoint your-endpoint --rootCA ~/certs/AmazonRootCA1.pem --cert ~/certs/raspberrypi-certificate.pem.crt --key ~/certs/raspberrypi-private.pem.key --thingName RaspberryPi --clientId RaspberryPi

嘗試碰觸感應器、將其放入花盆中,或將其放入杯水中,以查看感應器如何回應各種濕度。如有需要,您可以在 MoistureSensorRule 中變更閾值。當濕度感測器讀數低於規則的 SQL 查詢陳述式中指定的值時,會向 Amazon SNS 主題 AWS IoT 發佈訊息。您應該會收到包含濕度和溫度資料的電子郵件訊息。

在您驗證收到來自 Amazon SNS 的電子郵件訊息後,請按 CTRL+C 來停止 Python 程式。Python 程式傳送的訊息量不足以產生費用,但最佳實務是在完成時停止程式。