#9 Curso IoT con Arduino y ESP8266 WiFi: Ejemplo cliente -> Envió y recepción datos

Continuación de la entrada anterior: #8 Curso IoT con Arduino y ESP8266 WiFi: Ejemplo cliente -> Recepción datos

5.8.4) Cliente: Envió de correos electrónicos

Ya hemos aprendido a enviar datos, también a recibirlos, esta vez juntaremos ambos códigos para poder enviar correos electrónicos desde el Arduino y recibir la respuesta del servidor.

De nuevo el código se divide en dos partes, por un lado tenemos la parte del servidor que se encargara de recibir todos los datos que envié el Arduino, también nos autenticara con una key al igual que se hace en Thingspeak para que nadie use el servicio sin nuestro permiso, y por último enviara los correos electrónicos y nos devolverá una respuesta.

En el primer bloque de código primero se definen todas las constantes, en ellas está la key que deberá de ser igual a la enviada desde el Arduino, así como unos números que devolveremos como respuesta dependiendo del resultado de la ejecución.

El segundo bloque contiene las variables que almacenan la información enviada desde el Arduino.

Por ultimo en el tercer bloque se realizan ciertas validaciones, en el if se comprueba que la key no haya llegado vacía ni sea distinta de la del servicio. En el else if se comprueba que ninguno de los campos obligatorios haya llegado vacío. Y en el else se manda el correo y dependiendo de si la función mail devuelve true o false pues se devuelve el código correspondiente de los definidos como constantes.

En cuanto al código del Arduino hay dos bloques interesantes y diferentes respecto a los ejemplos anteriores.

El primero de ellos solo son unas constantes que almacenaran la información a enviar al servidor y que este a su vez enviara por correo electrónico.

Estos campos son el nombre y email del remitente, el email del destinatario y el asunto y mensaje del correo.

Si alguien quisiera enviar algún dato, como una lectura de un sensor, solo tendrá que concatenar la información en un String como se hace en la función addParameter y enviar ese contenido en vez del de la constante. Si en vez de eso se quisiera enviar otro tipo de información, como una imagen capturada con una cámara, sería necesario realizar una comunicación POST y mandar los bytes en la cabecera de la llamada. Esto es bastante más complejo pero lo comento para que os suena si lo necesitáis.

Esta vez la ejecución del código no se realiza cada cierto tiempo, si no cuando el sensor digital o el botón que tengamos conectado al pin pBTN activa una señal HIGH.

Tras llamar a la función send para enviar los datos y a la función receiveData para recoger la respuesta, se comprueba en un switch qué número ha devuelto el servicio y en consecuencia se muestra un mensaje concreto.

En la función send ha hecho falta añadir la línea de código superior, esta remplaza todos los caracteres de espacio por %20 antes de concatenar los parámetros con el comando a enviar al ESP8266. Esto es necesario debido a que las URLs y los espacios no se llevan especialmente bien y los textos se pueden cortar si no.

Y este es el resultado de la ejecución del ejemplo, se ejecutó dos veces, la primera con una key incorrecta y la segunda con todo correcto.

envio_recepcion_1

envio_recepcion_2

Para este ejemplo ha sido necesario cambiar el circuito añadiendo un botón en el pin digital 4, este es el montaje necesario:

envio_recepcion_3.png

Puede observarse que el pulsador no tiene una resistencia que haga de resistencia PULL-UP o PULL-DOWN, esto es porque en el setup del código se ha definido el pin pBTN como INPUT_PULLUP quedando así:  pinMode(pBTN, INPUT_PULLUP); así nos ahorramos la resistencia y un cable.

Escriba aquí su comentario