

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Configuración del dispositivo Raspberry Pi y el sensor de humedad
<a name="iot-moisture-raspi-setup"></a>



Inserte la tarjeta micro SD en el Raspberry Pi, conecte el monitor, el teclado, el ratón y, si no utiliza una conexión wifi, el cable Ethernet. No conecte aún el cable de alimentación.

Conecte el cable puente JST al sensor de humedad. El otro lado del puente tiene cuatro cables:
+ Verde: I2C SCL
+ Blanco: I2C SDA
+ Rojo: alimentación (3,5 V)
+ Negro: conexión a tierra

Sujete el dispositivo Raspberry Pi con el enchufe hembra Ethernet a la derecha. En esta orientación hay dos filas de clavijas GPIO en la parte superior. Conecte los cables del sensor de humedad a la fila inferior de clavijas en el orden que se indica a continuación. Comenzando por la clavija del extremo izquierdo, conecte el cable rojo (alimentación), el cable blanco (SDA) y el cable verde (SCL). Omita una clavija y, a continuación, conecte el cable negro (conexión a tierra). Para obtener más información, consulte [Cableado de equipos Python](https://learn.adafruit.com/adafruit-stemma-soil-sensor-i2c-capacitive-moisture-sensor/python-circuitpython-test).

Conecte el cable de alimentación al dispositivo Raspberry Pi y conecte el otro extremo a una toma de corriente para encenderlo.

**Configuración del dispositivo Raspberry Pi**

1. En **Welcome to Raspberry Pi (Bienvenido a Raspberry Pi)**, elija **Siguiente**.

1. Elija el país, el idioma, la zona horaria y la distribución del teclado. Elija **Siguiente**.

1. Escriba una contraseña para el dispositivo Raspberry Pi y, a continuación, elija **Siguiente**.

1. Elija una red wifi y, a continuación, elija **Siguiente**. Si no utiliza una red wifi, elija **Skip (Omitir)**.

1. Elija **Siguiente** para comprobar si hay actualizaciones de software. Cuando se completen las actualizaciones, elija **Restart (Reiniciar)** para reiniciar el dispositivo Raspberry Pi.

Una vez que se inicie el dispositivo Raspberry Pi, habilite la interfaz de I2C.

1. En la esquina superior izquierda del escritorio de Raspbian, elija el icono de Raspberry, elija **Preferencias** y, a continuación, elija **Configuración de Raspberry Pi**.

1. En la pestaña **Interfaces**, en **I2C**, elija **Habilitar**.

1. Seleccione **Aceptar**.

Las bibliotecas del sensor de humedad STEMMA de Adafruit están diseñadas para ello. CircuitPython Para ejecutarlas en un dispositivo Raspberry Pi, debe instalar la última versión de Python 3.

1. Ejecute los siguientes comandos desde un símbolo del sistema para actualizar el software del dispositivo Raspberry Pi:

   `sudo apt-get update`

   `sudo apt-get upgrade`

1. Ejecute el siguiente comando para actualizar la instalación de Python 3:

   `sudo pip3 install --upgrade setuptools`

1. Ejecute el siguiente comando para instalar las bibliotecas de GPIO de Raspberry Pi:

   `pip3 install RPI.GPIO`

1. Ejecute el siguiente comando para instalar las bibliotecas de Adafruit Blinka:

   `pip3 install adafruit-blinka`

   Para obtener más información, consulte [Instalación de CircuitPython bibliotecas en](https://learn.adafruit.com/circuitpython-on-raspberrypi-linux/installing-circuitpython-on-raspberry-pi) Raspberry Pi.

1. Ejecute el siguiente comando para instalar las bibliotecas de Adafruit Seesaw:

   `sudo pip3 install adafruit-circuitpython-seesaw`

1. Ejecute el siguiente comando para instalar el SDK de AWS IoT dispositivos para Python:

   `pip3 install AWSIoTPythonSDK`

El dispositivo Raspberry Pi ahora tiene todas las bibliotecas necesarias. Cree un archivo denominado **moistureSensor.py** y copie el siguiente código Python en el archivo:

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

Guarde el archivo en un lugar donde pueda encontrarlo. Ejecute `moistureSensor.py` desde la línea de comandos con los siguientes parámetros:

punto de conexión  
Tu AWS IoT punto final personalizado. Para obtener más información, consulte [API REST de sombra de dispositivo](device-shadow-rest-api.md).

rootCA  
La ruta completa a su certificado de CA AWS IoT raíz.

cert  
La ruta completa al certificado de su AWS IoT dispositivo.

clave  
La ruta completa a la clave privada AWS IoT del certificado de su dispositivo.

thingName  
El nombre de la cosa (en este caso, `RaspberryPi`).

clientId  
El ID de cliente de MQTT. Utilice `RaspberryPi`.

La línea de comandos debería tener este aspecto:

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

Pruebe a tocar el sensor, colocarlo en una maceta o ponerlo en un vaso de agua para ver cómo responde a distintos niveles de humedad. Si es necesario, puede cambiar el valor del umbral en la opción `MoistureSensorRule`. Cuando la lectura del sensor de humedad es inferior al valor especificado en la declaración de consulta SQL de la regla, AWS IoT publica un mensaje en el tema Amazon SNS. Debería recibir un mensaje de correo electrónico que incluya los datos de humedad y temperatura.

Una vez que haya verificado la recepción de los mensajes de correo electrónico de Amazon SNS, pulse **CTRL\+C** para detener el programa Python. Es poco probable que el programa Python envíe suficientes mensajes para incurrir en gastos, pero se recomienda detener el programa cuando haya terminado.