

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Tutorial: Monitorando a umidade do solo com o AWS IoT Raspberry Pi
<a name="iot-moisture-tutorial"></a>

Este tutorial mostra como usar um [Raspberry Pi](https://www.raspberrypi.org/), um sensor de umidade, e AWS IoT monitorar o nível de umidade do solo de uma planta doméstica ou jardim. O Raspberry Pi executa um código que lê o nível de umidade e a temperatura do sensor e, em seguida, envia os dados para AWS IoT. Você cria uma regra AWS IoT que envia um e-mail para um endereço inscrito em um tópico do Amazon SNS quando o nível de umidade cai abaixo de um limite.

**nota**  
Este tutorial pode não estar atualizado. Algumas referências podem ter sido substituídas desde que este tópico foi publicado originalmente.

**Contents**
+ [Pré-requisitos](#iot-moisture-prereqs)
+ [Conf AWS IoT iguração](iot-moisture-setup.md)
  + [Etapa 1: criar a AWS IoT política](iot-moisture-policy.md)
  + [Etapa 2: criar a AWS IoT coisa, o certificado e a chave privada](iot-moisture-create-thing.md)
  + [Etapa 3: criar um tópico e uma assinatura do Amazon SNS](iot-moisture-create-sns-topic.md)
  + [Etapa 4: criar uma AWS IoT regra para enviar um e-mail](iot-moisture-create-rule.md)
+ [Configuração do Raspberry Pi e do sensor de umidade](iot-moisture-raspi-setup.md)

## Pré-requisitos
<a name="iot-moisture-prereqs"></a>

Para concluir este tutorial, é necessário:
+ Um Conta da AWS.
+ Um usuário do IAM com permissões de administrador.
+ Um computador de desenvolvimento que execute Windows, macOS, Linux ou Unix para acessar o [console do AWS IoT](https://console.aws.amazon.com/iot/home).
+ Um [Raspberry Pi 3B ou 4B](https://www.raspberrypi.com/products/) que execute a versão mais recente do [Raspberry Pi OS](https://www.raspberrypi.com/software/operating-systems/). Para acessar instruções de instalação, consulte [Install an operating system](https://www.raspberrypi.com/documentation/computers/getting-started.html#installing-the-operating-system) no site do Raspberry Pi. 
+ Um monitor, um teclado, um mouse e uma rede Wi-Fi ou conexão Ethernet para o Raspberry Pi.
+ Um sensor de umidade compatível com o Raspberry Pi. O sensor usado neste tutorial é um [Sensor capacitivo de umidade Adafruit STEMMA I2C](https://www.adafruit.com/product/4026) com um [JST de 4 pinos com conector de cabo de soquete fêmea](https://www.adafruit.com/product/3950). 

# Conf AWS IoT iguração
<a name="iot-moisture-setup"></a>

Para concluir este tutorial, é necessário criar os recursos a seguir. Para conectar um dispositivo AWS IoT, você cria uma coisa de IoT, um certificado de dispositivo e uma AWS IoT política. 
+ Qualquer AWS IoT coisa.

  Umo objeto representa um dispositivo físico (nesse caso, o Rasberry Pi) e contém metadados estáticos sobre o dispositivo. 
+ Um certificado de dispositivo.

  Todos os dispositivos devem ter um certificado de dispositivo para se conectar e autenticar com o AWS IoT.
+ Uma AWS IoT política.

  Cada certificado de dispositivo tem uma ou mais AWS IoT políticas associadas a ele. Essas políticas determinam quais AWS IoT recursos o dispositivo pode acessar. 
+ Um certificado CA AWS IoT raiz.

  Os dispositivos e outros clientes usam um certificado CA AWS IoT raiz para autenticar o AWS IoT servidor com o qual estão se comunicando. Para obter mais informações, consulte [Autenticação do servidor](server-authentication.md).
+ Uma AWS IoT regra.

  Uma regra contém uma consulta e uma ou mais ações de regra. A consulta extrai dados de mensagens do dispositivo para determinar se os dados da mensagem devem ser processados. A ação da regra especifica o que fazer se os dados corresponderem à consulta.
+ Uma assinatura e um tópico do Amazon SNS.

  A regra recebe dados de umidade do Raspberry Pi. Se o valor estiver abaixo de um limite, ele enviará uma mensagem ao tópico do Amazon SNS. O Amazon SNS envia essa mensagem para todos os endereços de e-mail assinantes do tópico.

 



# Etapa 1: criar a AWS IoT política
<a name="iot-moisture-policy"></a>

Crie uma AWS IoT política que permita que seu Raspberry Pi se conecte e envie mensagens para o. AWS IoT

1. No [console do AWS IoT](https://console.aws.amazon.com/iot), se um botão **Começar** for exibido, selecione-o. Caso contrário, no painel de navegação, expanda a opção **Proteger** e selecione a opção **Políticas**.

1. Se a caixa de diálogo **Você ainda não tem políticas**, selecione **Criar uma política**. Caso contrário, escolha a opção **Criar**.

1. Insira um nome para a AWS IoT política (por exemplo,**MoistureSensorPolicy**).

1. Na seção **Adicionar instruções**, substitua a política existente pelo JSON a seguir. *account*Substitua *region* e pelo seu Região da AWS Conta da AWS número e.  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "iot:Connect",
               "Resource": "arn:aws:iot:us-east-1:123456789012:client/RaspberryPi"
           },
           {
               "Effect": "Allow",
               "Action": "iot:Publish",
               "Resource": [
                   "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/RaspberryPi/shadow/update",
                   "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/RaspberryPi/shadow/delete",
                   "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/RaspberryPi/shadow/get"
               ]
           },
           {
               "Effect": "Allow",
               "Action": "iot:Receive",
               "Resource": [
                   "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/RaspberryPi/shadow/update/accepted",
                   "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/RaspberryPi/shadow/delete/accepted",
                   "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/RaspberryPi/shadow/get/accepted",
                   "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/RaspberryPi/shadow/update/rejected",
                   "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/RaspberryPi/shadow/delete/rejected"
               ]
           },
           {
               "Effect": "Allow",
               "Action": "iot:Subscribe",
               "Resource": [
                   "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/RaspberryPi/shadow/update/accepted",
                   "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/RaspberryPi/shadow/delete/accepted",
                   "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/RaspberryPi/shadow/get/accepted",
                   "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/RaspberryPi/shadow/update/rejected",
                   "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/RaspberryPi/shadow/delete/rejected"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "iot:GetThingShadow",
                   "iot:UpdateThingShadow",
                   "iot:DeleteThingShadow"
               ],
               "Resource": "arn:aws:iot:us-east-1:123456789012:thing/RaspberryPi"
           }
       ]
   }
   ```

1. Escolha **Criar**.

# Etapa 2: criar a AWS IoT coisa, o certificado e a chave privada
<a name="iot-moisture-create-thing"></a>

Crie uma coisa no AWS IoT registro para representar seu Raspberry Pi.

1. No [console do AWS IoT](https://console.aws.amazon.com/iot/home), no painel de navegação, selecione **Gerenciar** e **Objetos**.

1. Se uma caixa de diálogo **Você ainda não tem objetos** for exibida, selecione a opção **Registrar um objeto**. Caso contrário, escolha **Criar**.

1. Na página **Criando AWS IoT coisas**, escolha **Criar uma única coisa**.

1. Na página **Adicionar o dispositivo ao registro do dispositivo**, insira um nome para o objeto de IoT (por exemplo, **RaspberryPi**) e selecione **Próximo**. Você não pode alterar o nome de um objeto depois de criá-lo. Para alterar o nome de um objeto, é necessário criar um objeto, fornecer o novo nome e, depois, excluir o objeto antiga.

1. Na página **Adicionar um certificado ao objeto**, escolha **Criar certificado**.

1. Escolha os links **Download** para fazer download do certificado, da chave privada e do certificado CA raiz.
**Importante**  
Esta é a única vez que você pode fazer download do certificado e da chave privada.

1. Para ativar o certificado, selecione a opção **Ativar**. O certificado deve estar ativo para que um dispositivo se conecte ao AWS IoT.

1. Selecione a opção **Anexar uma política**.

1. Em **Adicionar uma política para sua coisa**, escolha e **MoistureSensorPolicy**, em seguida, escolha **Registrar coisa**.

# Etapa 3: criar um tópico e uma assinatura do Amazon SNS
<a name="iot-moisture-create-sns-topic"></a>

Criar um tópico e uma assinatura do Amazon SNS.

1. No console SNS do [AWS](https://console.aws.amazon.com/sns/home), no painel de navegação, selecione **Tópicos** e, em seguida, selecione **Criar tópico**.

1. Escolha o tipo como **Padrão** e insira um nome para o tópico (por exemplo, **MoistureSensorTopic**).

1. Insira um nome de exibição para o tópico (por exemplo, **Moisture Sensor Topic**). Esse é o nome exibido para o tópico no console do Amazon SNS .

1. Escolha **Criar tópico**.

1. Na página de detalhes do tópico do Amazon SNS, selecione **Criar assinatura**.

1. Em **Protocolo**, escolha **Email**.

1. Para **Endpoint**, insira seu endereço de e-mail.

1. Selecione **Criar assinatura**.

1. Abra o cliente de e-mail e procure uma mensagem com o assunto **MoistureSensorTopic**. Abra o e-mail e clique no link **Confirmar assinatura**.
**Importante**  
Você não receberá nenhum alerta por e-mail deste tópico do Amazon SNS até confirmar a assinatura.

Você deve receber uma mensagem de e-mail com o texto digitado.

# Etapa 4: criar uma AWS IoT regra para enviar um e-mail
<a name="iot-moisture-create-rule"></a>

Uma AWS IoT regra define uma consulta e uma ou mais ações a serem tomadas quando uma mensagem é recebida de um dispositivo. O mecanismo de AWS IoT regras escuta as mensagens enviadas pelos dispositivos e usa os dados nas mensagens para determinar se alguma ação deve ser tomada. Para obter mais informações, consulte [Regras para AWS IoT](iot-rules.md). 

Neste tutorial, o Raspberry Pi publica mensagens no `aws/things/RaspberryPi/shadow/update`. Este é um tópico MQTT interno usado por dispositivos e pelo serviço Thing Shadow. O Raspberry Pi publica mensagens que têm o seguinte formato:

```
{
    "reported": {
        "moisture" : moisture-reading,
        "temp" : temperature-reading
    }
}
```

Você cria uma consulta que extrai os dados de umidade e temperatura da mensagem recebida. Você também cria uma ação do Amazon SNS que usa os dados e os envia aos assinantes do tópico do Amazon SNS se a leitura de umidade estiver abaixo de um valor limite.

**Criar uma regra do Amazon SNS**

1. No [AWS IoT console](https://console.aws.amazon.com/iot/home), escolha **Encaminhamento de mensagens** e, em seguida, escolha **Regras**. Se uma caixa de diálogo **Você ainda não tem regras**, selecione **Criar uma regra**. Caso contrário, selecione **Criar regra**.

1. Na página **Propriedades da regra**, insira um **nome de regra** como **MoistureSensorRule**, e forneça uma breve **descrição da regra**, como**Sends an alert when soil moisture level readings are too low**.

1. Escolha **Próximo** e configure sua instrução SQL. Escolha a **versão SQL** como **2016-03-23** e insira a seguinte AWS IoT instrução de consulta SQL:

   ```
   SELECT * FROM '$aws/things/RaspberryPi/shadow/update/accepted' WHERE state.reported.moisture < 400
   ```

   Essa instrução aciona a ação da regra quando a leitura de `moisture` é menor que `400`.
**nota**  
Talvez seja necessário usar um valor diferente. Depois de ter o código em execução no Raspberry Pi, você poderá ver os valores obtidos do sensor tocando no sensor, colocando-o na água ou colocando-o em um vaso. 

1. Escolha a opção **Próximo** e anexe ações de regra. Para a **Ação 1**, escolha **Serviço de Notificação Simples**. A descrição dessa ação de regra é **Enviar uma mensagem como uma notificação push do SNS**.

1. Para o **tópico SNS**, escolha o tópico que você criou em [Etapa 3: criar um tópico e uma assinatura do Amazon SNS](iot-moisture-create-sns-topic.md) **MoistureSensorTopic**, e deixe o **formato da mensagem** como **RAW**. Em **Perfil do IAM**, selecione **Criar uma nova função**. Insira um nome para a função, por exemplo, **LowMoistureTopicRole**, e escolha **Criar função**.

1. Escolha **Próximo** para revisar e, em seguida, escolha **Criar** para criar a regra.

# Configuração do Raspberry Pi e do sensor de umidade
<a name="iot-moisture-raspi-setup"></a>



Insira o cartão microSD no Raspberry Pi, conecte o monitor, o teclado, o mouse e, se você não estiver usando a rede Wi-Fi, o cabo Ethernet. Não conecte o cabo de alimentação ainda.

Conecte o cabo jumper JST ao sensor de umidade. O outro lado do jumper tem quatro cabos:
+ Verde: I2C SCL
+ Branco: I2C SDA
+ Vermelho: alimentação (3,5 V)
+ Preto: terra

Mantenha o Raspberry Pi com o conector Ethernet à direita. Nessa orientação, há duas linhas de pinos GPIO na parte superior. Conecte os cabos do sensor de umidade à linha inferior de pinos na ordem a seguir. A partir do pino mais à esquerda, conecte o vermelho (alimentação), o branco (SDA) e o verde (SCL). Ignore um pino e conecte o fio preto (terra). Para obter mais informações, consulte [Cabeamento de computador Python](https://learn.adafruit.com/adafruit-stemma-soil-sensor-i2c-capacitive-moisture-sensor/python-circuitpython-test).

Conecte o cabo de alimentação ao Raspberry Pi e conecte a outra extremidade a uma tomada para ligá-lo.

**Configurar o Raspberry Pi**

1. Em **Boas-vindas ao Raspberry Pi**, selecione **Próximo**.

1. Escolha o país, o idioma, o fuso horário e o layout do teclado. Escolha **Próximo**.

1. Insira uma senha para o Raspberry Pi e selecione **Próximo**.

1. Escolha a rede Wi-Fi e selecione **Próximo**. Se você não estiver usando uma rede Wi-Fi, selecione **Ignorar**.

1. Escolha **Próximo** para verificar se há atualizações de software. Quando as atualizações forem concluídas, selecione **Reiniciar** para reiniciar o Raspberry Pi.

Depois que o Raspberry Pi for iniciado, habilite a interface I2C.

1. No canto superior esquerdo da área de trabalho do Raspbian, clique no ícone do Raspberry, selecione **Preferências** e **Configuração do Raspberry Pi**.

1. Na guia **Interfaces** para **I2C**, selecione **Habilitar**.

1. Escolha **OK**.

As bibliotecas do sensor de umidade Adafruit STEMMA foram criadas para. CircuitPython Para executá-las em um Raspberry Pi, é necessário instalar a versão mais recente do Python 3.

1. Execute os seguintes comandos em um prompt de comando para atualizar o software do Raspberry Pi:

   `sudo apt-get update`

   `sudo apt-get upgrade`

1. Execute o seguinte comando para atualizar a instalação do Python 3:

   `sudo pip3 install --upgrade setuptools`

1. Execute o seguinte comando para instalar as bibliotecas GPIO do Raspberry Pi:

   `pip3 install RPI.GPIO`

1. Execute o seguinte comando para instalar as bibliotecas Adafruit Blinka:

   `pip3 install adafruit-blinka`

   Para obter mais informações, consulte [Instalando CircuitPython bibliotecas no Raspberry Pi](https://learn.adafruit.com/circuitpython-on-raspberrypi-linux/installing-circuitpython-on-raspberry-pi).

1. Execute o seguinte comando para instalar as bibliotecas Adafruit Seesaw:

   `sudo pip3 install adafruit-circuitpython-seesaw`

1. Execute o comando a seguir para instalar o AWS IoT Device SDK para Python:

   `pip3 install AWSIoTPythonSDK`

Agora o Raspberry Pi tem todas as bibliotecas necessárias. Crie um arquivo chamado **moistureSensor.py** e copie o seguinte código Python no arquivo:

```
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)
```

Salve o arquivo em um local onde você possa encontrá-lo. Execute `moistureSensor.py` na linha de comando com os seguintes parâmetros:

endpoint  
Seu AWS IoT endpoint personalizado. Para obter mais informações, consulte [API REST da Sombra do Dispositivo](device-shadow-rest-api.md).

rootCA  
O caminho completo para seu certificado CA AWS IoT raiz.

cert  
O caminho completo para o certificado AWS IoT do seu dispositivo.

key  
O caminho completo para a chave privada AWS IoT do certificado do seu dispositivo.

thingName  
O nome do objeto (neste caso, `RaspberryPi`).

clientId  
O ID do cliente MQTT. Use `RaspberryPi`.

A linha de comando deve ser semelhante a esta:

`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`

Tente tocar no sensor, colocá-lo em um vaso ou em um copo de água para ver como o sensor responde a vários níveis de umidade. Se for necessário, você poderá alterar o valor limite no `MoistureSensorRule`. Quando a leitura do sensor de umidade fica abaixo do valor especificado na instrução de consulta SQL da sua regra, AWS IoT publica uma mensagem no tópico do Amazon SNS. Você deve receber uma mensagem de e-mail que contém os dados de umidade e temperatura.

Depois de verificar o recebimento de mensagens de e-mail do Amazon SNS, pressione **CTRL\$1C** para interromper o programa Python. É improvável que o programa Python envie mensagens suficientes para gerar cobranças, mas é uma prática recomendada interromper o programa ao concluir.