Para este applet, crearemos un activador de notificación para su gadget IoT, que se activará cada vez que se reciba un correo electrónico en su cuenta de gmail. Si un tono de llamada y una notificación de vibración no fueran suficientes, ¡ahora puede agregar una notificación de olor para los mensajes entrantes!
Ahora que sus activadores están configurados, trabajemos en su código ESP8266.
Básicamente, su gadget se conectará a una red wi-fi y esperará hasta que se reciba un nuevo comando en Arduino.IO. Cada vez que se recibe un mensaje, el renovador de aire IoT realizará sus acciones (mover un servo motor para liberar un poco de perfume, cambiar los colores del LED) y regresar para el estado inactivo. El circuito también usará un botón como entrada.
Para cargar su código, seleccione NodeMCU 0.9 (Módulo ESP-12) (si está utilizando un NodeMCU) con una velocidad de carga de 11520 kbps.Desconecte el servomotor del NodeMCU, conecte NodeMCU al puerto USB de su computadora y cargue el código.
Llevará un tiempo (mucho más que completar y cargar un boceto para un Arduino … tenga paciencia …). ¡Ahora es un buen momento para que le des un mecano de instrucciones mientras esperas! :RE
Después de completar la carga, desenchufe el cable USB, conecte el servomotor y alimente su circuito desde un cargador USB.
Código explicado:
Para la configuración de IO de Adafruit, deberá reemplazar el nombre de usuario ( XXXXXXXXXX ) y la tecla io ( YYYYYYYYY ).
Visite adafruit.io, inicie sesión en su cuenta y copie la clave io (tal como se describió en los pasos anteriores).
/************************ Adafruit IO Configuration *******************************/
// visit io.adafruit.com if you need to create an account, or if you need your Adafruit IO key.
#define IO_USERNAME «XXXXXXXXXX»
#define IO_KEY «YYYYYYYYY»
También deberá especificar el SSID y la contraseña de su enrutador Wi-Fi.Reemplace WWWWWWWWWW y ZZZZZZZZZZ para configurar su conexión Wi-Fi.
/******************************* Configuración de WIFI ***************** ********************* /
#define WIFI_SSID «WWWWWWWWWW»
#define WIFI_PASS «ZZZZZZZZZZ»
#include «AdafruitIO_WiFi.h»
AdafruitIO_WiFi io (IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS);
Se usarán las siguientes bibliotecas (como se describe en los pasos anteriores).Deberá agregarlos en el ide de Arduino antes de compilar el código.
/ ************************ El programa principal comienza aquí ********************* ********* /
#include <ESP6266WiFi.h>
#include <AdafruitIO.h>
#include <AdafruitMQTT.h>
#include <ArduinoHttpClient.h>
#include «Servo.h»
Varias cosas (pines y parámetros de LED) se definen antes de la configuración:
#define SERV1 12 // Pin conectado al Servomotor
Servo s1;
#define BUTTON_PIN 14 // Pin conectado al pulsador
#define PIXELS_PIN 15 // Pin conectado a la entrada de datos NeoPixel
#define NUM_LEDS 16 // Número de NeoPixels
#define BRILLO 30
#define PIXEL_TYPE NEO_GRB + NEO_KHZ800 // Tipo de NeoPixels (vea el ejemplo de strandtest).
Anillo Adafruit_NeoPixel = Adafruit_NeoPixel (NUM_LEDS, PIXELS_PIN, PIXEL_TYPE); // + NEO_KHZ800);
AdafruitIO_Feed * command = io.feed («iot-air-freshner-command»); // configura el feed ‘comando’
Durante la configuración, el NodeMCU inicializará los LED (apague y encienda), inicie el puerto de comunicación en serie y conéctese a Adafruit.io. Se mostrará una animación mientras intenta conectarse.
Las entradas (pulsador) y las salidas (servomotor) también se configuran durante la configuración.
void setup () {
ring.setBrightness (BRILLO);
ring.begin ();
ring.show (); // Inicializa todos los píxeles a ‘off’
// inicia la conexión en serie </ p> Serial.begin (115200);
// conectarse a io.adafruit.com
Serial.print («Conectando a Adafruit IO»);
io.connect ();
// configuramos un manejador de mensajes para el feed ‘comando’.
// la función handleMessage (definida a continuación)
// se llamará cada vez que se envíe un mensaje
// recibido de adafruit io.
command-> onMessage (handleMessage);
// espera una conexión
int i = NUM_LEDS – 1;
int color = 255;
// anima los LED mientras espera la conexión
while (io.status () <AIO_CONNECTED) {
Serial.print («.»);
ring.setPixelColor (i, 0, 0, color);
ring.show ();
i = i – 1;
if (i <0)
{ if (color == 255) {
color = 0; }
else
{ color = 255;
}
i = NUM_LEDS – 1;
} delay (50); }
lightPixels (ring.Color (0, 0, 0, 0)); // restablecer todos los píxeles a apagado cuando está conectado
// Estamos conectados
Serial.println ();
Serial.println (io.statusText ());
// mover el servomotor a la posición neutral s1.attach (SERV1);
s1.write (90); retraso (500);
s1.detach (); // establecer el pin del botón como entrada pinMode (BUTTON_PIN, INPUT_PULLUP);
}
El ciclo principal es bastante corto. Verifica si hay datos entrantes de Adafruit.io, y verifica si se presionó el botón. Si uno presiona el botón, envía datos a Adafruit.io.
void loop ()
{ // io.run (); es requerido para todos los bocetos.
// siempre debe estar presente en la parte superior de tu ciclo // función. mantiene al cliente conectado a
// io.adafruit.com, y procesa cualquier información entrante.
io.run ();
if(digitalRead(BUTTON_PIN) == LOW) {
command->save(«button»);
}
}
Cada vez que se recibe un mensaje, se llama a la función handleMessage .Esta función lee los últimos datos recibidos en una fuente dada en Adafruit.io, y verifica si se recibió una de las cadenas de comandos conocidas (‘botón’, ‘temporizador’, ‘ubicación’ o ‘correo’).
Según el comando recibido, los LED parpadearán con diferentes colores y el servomotor se activará.
// esta función se invoca cada vez que se recibe un mensaje
// de Adafruit IO. estaba adjunto a
// la alimentación en la función setup () arriba.
void handleMessage (AdafruitIO_Data * data) {
lightPixels (ring.Color (0, 0, 0, 0)); // restablecer todos los píxeles a apagado cuando se recibe nueva información
String commandStr = data-> toString (); // almacena los comandos entrantes en una cadena
Serial.print («recibido <-«);
Serial.println (commandStr);
// Estas declaraciones if comparan la variable meteorológica entrante con las condiciones almacenadas, y controlan las NeoPixels en consecuencia.
// si se presionó el botón virtual
if (commandStr.equalsIgnoreCase («button»)) {
Serial.println («Botón virtual»);
rotatingPixels (ring.Color (255, 255, 0, 0)); // mostrar animación
lightPixels (ring.Color (255, 255, 0, 0)); // mostrar animación
launch (1);
lightPixels (ring.Color (0, 0, 0, 0)); // restablecer todos los píxeles a apagado cuando se recibe nueva información
}
// si es hora
if (commandStr.equalsIgnoreCase («timer»)) {
Serial.println («es hora»);
rotatingPixels (ring.Color (0, 0, 255, 0)); // mostrar animación
lightPixels (ring.Color (0, 0, 255, 0)); // mostrar animación
launch (2);
lightPixels (ring.Color (0, 0, 0, 0)); // restablecer todos los píxeles a apagado cuando se recibe nueva información
}
// si se alcanzó la ubicación
if (commandStr.equalsIgnoreCase («ubicación»)) {
Serial.println («Bienvenido a casa!»);
rotatingPixels (ring.Color (0, 255, 0, 0)); // mostrar animación
lightPixels (ring.Color (0, 255, 0, 0)); // mostrar animación
launch (2);
lightPixels (ring.Color (0, 0, 0, 0)); // restablecer todos los píxeles a apagado cuando se recibe nueva información
}
// si tiene correo
if (commandStr.equalsIgnoreCase («mail»)) {
Serial.println («¡tienes correo!»);
rotatingPixels (ring.Color (255, 0, 0, 0)); // mostrar animación
lightPixels (ring.Color (255, 0, 0, 0)); // mostrar animación
launch (1);
lightPixels (ring.Color (0, 0, 0, 0)); // restablecer todos los píxeles a apagado cuando se recibe nueva información
}
}
//La función auxiliar rotatingPixels fue desarrollada para mostrar una animación.El color se recibe como una entrada para esta variable.
// Rotación completa de Funcion NeoPixels
void rotatingPixels (uint32_t color) {
for (int j = 0; j <3; j ++) { for (int i = NUM_LEDS-1; i> = 0; i–) {
ring.setPixelColor (i, color);
ring.show ();
delay (50);
ring.setPixelColor (i, 0, 0, 0);
ring.show ();
}
}
}
//la función de inicio se usa para controlar el servomotor. Ciclos su posición de //90 ° a 175 ° una cantidad determinada de veces.
// Actúa el servomotor
void launch (int number) {
s1.attach (SERV1);
para (int i = 0; i <number; i ++) {
s1.write (175);
delay (1000);
s1.write (90);
delay (1000);
}
s1.detach ();
}
Código completo Arduino aqui; iot-air-freshner-code.ino
Debe estar conectado para enviar un comentario.