Envio de notificaciones desde NodeMcu con Pushbullet

Este es un tema que ya había tratado previamente cuando estábamos trabajando con MicroPython, pero en esta ocasión quiero abordar el tema si estamos trabajando directamente con el IDE de Arduino.

Veremos como enviar mensajes simples desde NodeMCU a un telefono por medio de la API de PushBullet.

En primer lugar comenzaremos instalando la aplicacion Pushbullet en el teléfono, luego que se encuentre instalada y se cree una cuenta, debemos obtener el API Key para poder conectarnos a los servidores de Pushbullet:

Primero vamos a Setting, y luego hacemos clic en el botón «Create Access Token», nos va a mostrar una caja de texto con una cadena de caracteres que será nuestro token para poder conectarnos.

Cada vez que ingresemos en esa pantalla Pushbullet crea un nuevo Token y se descarta el anterior, por lo que es conveniente copiarlo en un bloc de notas. No compartan el token.

Construiremos un sencillo circuito para enviar mensajes cada vez que presionamos un botón:

El botón tiene conectado un pin a GND y el otro a D2.

Respecto al código del ejemplo, simplemente debemos realizar una petición a la API de Pushbullet de la siguiente manera:

const char* host = "api.pushbullet.com"; 
const char* apiKey = "TOKEN";
void enviarMensaje(String titulo,String mensaje) {
  
  WiFiClientSecure client;
  client.setInsecure();
  if(!client.connect(host,443)) {
    Serial.println("No se pudo conectar con el servidor");
    return;
  }

String url = "/v2/pushes";
  String message = "{\"type\": \"note\", \"title\": \""+titulo+"\", \"body\": \""+mensaje+"\"}\r\n";
  Serial.print("requesting URL: ");
  Serial.println(url);
  //send a simple note
  client.print(String("POST ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Authorization: Bearer " + apiKey + "\r\n" +
               "Content-Type: application/json\r\n" +
               "Content-Length: " +
               String(message.length()) + "\r\n\r\n");
  client.print(message);

  delay(2000);
  while (client.available() == 0);

  while (client.available()) {
    String line = client.readStringUntil('\n');
    Serial.println(line);
  }  
}

Luego desde loop() invocamos a la función definida de la siguiente manera:

void loop() {

  if(digitalRead(pinBoton) == LOW) {
    Serial.println("Presionado");

    enviarMensaje("NodeMCU","Mensaje enviado desde NodeMCU");
    delay(2000);
    
  }

  delay(100);
}

Cada vez que presionemos el botón, el dispositivo enviara un mensaje. Es recomendable implementar algún mecanismo/procedimiento para que no se envíen múltiples mensajes al mismo tiempo; para el ejemplo simplemente hice esperar al dispositivo por 2 segundos.

Aquí pueden encontrar el ejemplo del código.

2 respuestas a «Envio de notificaciones desde NodeMcu con Pushbullet»

  1. hola buena Guillermo te hago una consulta ice un proyecto, tengo un problema cuando se subió y en el programa y pruebo no me funciona el reedwitch como que el sensor de gas me lo bloquea dejo el código para ver si me podes ayudar.
    #include
    #include
    #include
    #include
    #include
    #include

    #include «ESP32_MailClient.h»

    //Cambiar por los datos de tu red wifi

    const char* ssid = «AILIN 1»; //tu_red_wifi
    const char* password = «1985211574»; //tu_clave_wifi

    // Para enviar correos electrónicos usando Gmail, use el puerto 465 (SSL) y el servidor SMTP smtp.gmail.com
    //Hay que habilitar la opción de aplicación menos segura https://myaccount.google.com/u/1/security
    // El objeto SMTPData contiene configuración y datos para enviar

    //*************** Declaración de variables ***************************

    //***************** Del proyecto 1 *******************************

    SMTPData datosSMTP;
    int boton=0;
    int cuenta=0;
    void(* Resetea) (void) = 0;//Función de reseteo por software del esp32

    //***************** Del proyecto 2 *******************************

    const int led_1 = 14;
    const int reedwitch = 2;
    bool val = LOW;

    //***************** Del proyecto 3 *******************************

    const int pulsador = 25;
    const int led_2 = 26;
    bool estado = LOW;

    //***************** Del proyecto 4 *******************************

    const int led_3 = 17; // salida Digital del led_3 del arduino
    const int sensor= A0; // entrada analógica para el sensor conectada al pin A0 del Arduino
    const int buzzer = 12;
    int sensorValue = 0; // pones a cero el valor que estará leyendo el sensor

    //***************************** Configuración general ******************

    void setup() {

    //************** acá ponemos lo del proyecto 1 ******************

    Serial.begin(115200);//Velocidad del puerto serial
    pinMode(4, OUTPUT);//Led onboard
    pinMode(23, OUTPUT);//Led en pin 23
    pinMode(22, INPUT_PULLUP);//boton de ayuda

    Serial.println();
    Serial.print(«Conentando»);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
    //30 intentos antes de conexión antes de reiniciar el esp32
    cuenta=cuenta+1;
    Serial.print(«Intento: «);
    Serial.println(cuenta);
    if(cuenta==30){
    Serial.println(«Reinciando x software al esp32!!!»);
    Resetea();//Llama a la función de reinicio
    }
    delay(200);
    }
    Serial.println();
    Serial.println(«Red Wifi conectada!!!»);
    Serial.println();
    digitalWrite(4, HIGH);//Enciende un led cuando el módulo esp32 se conecta a la red wifi

    //************** acá ponemos lo del proyecto 2 ******************

    pinMode(reedwitch,INPUT_PULLUP); // sensor es entrada
    pinMode(led_1,OUTPUT); // led_1 es salida
    digitalWrite(led_1,LOW); // al led_1 lo inicio en apagado

    //************** acá ponemos lo del proyecto 3 ******************

    pinMode(pulsador,INPUT_PULLUP); // pulsador es entrada
    pinMode(led_2,OUTPUT); // led_2 es salida
    digitalWrite(led_2,LOW); // led_2 lo inicio apagado por eso

    //************** acá ponemos lo del proyecto 4 ******************

    pinMode(led_3,OUTPUT); // led_3 es salida digital
    pinMode(buzzer,OUTPUT); // buzzer es salida
    Serial.begin(9600); // configuro al puerto serial en 9600 baudios

    }

    //************************ Secuencia del bucle infinito de lectura **************

    void loop() {

    proyecto1(); // llamada a subrutina 1 = proyecto 1
    proyecto2(); // llamada a subrutina 1 = proyecto 2
    proyecto3(); // llamadas a subrutina 1 = proyecto 3
    proyecto4(); // llamadas a subrutina 1 = proyecto 4
    }

    //************** acá ponemos lo del proyecto 4 ******************

    void proyecto1(){
    boton=digitalRead(22);
    if(boton==0){
    Serial.print(«Iniciando correo!!!»);
    delay(200);
    correo();
    }
    //Serial.print(«Estado: «);
    //Serial.println(boton);
    //delay(200);
    }
    void correo(){
    digitalWrite(23, HIGH);
    //Configuración del servidor de correo electrónico SMTP, host, puerto, cuenta y contraseña
    datosSMTP.setLogin(«smtp.gmail.com», 465, «jesusfigue036@gmail.com», «12345hola»);
    // Establecer el nombre del remitente y el correo electrónico
    datosSMTP.setSender(«ESP32», «jesusfigue036@gmail.com»);
    // Establezca la prioridad o importancia del correo electrónico High, Normal, Low o 1 a 5 (1 es el más alto)
    datosSMTP.setPriority(«High»);
    // Establecer el asunto
    datosSMTP.setSubject(«Probando envio de correo con ESP32»);
    // Establece el mensaje de correo electrónico en formato de texto (sin formato)
    datosSMTP.setMessage(«Ayuda! Llamar al 911», false);
    // Agregar destinatarios, se puede agregar más de un destinatario
    datosSMTP.addRecipient(«jesusfigue307@gmail.com»);
    //Comience a enviar correo electrónico.
    if (!MailClient.sendMail(datosSMTP))
    Serial.println(«Error enviando el correo, » + MailClient.smtpErrorReason());
    //Borrar todos los datos del objeto datosSMTP para liberar memoria
    datosSMTP.empty();
    delay(10000);
    digitalWrite(23, LOW);
    }

    void proyecto2() {
    val = digitalRead(reedwitch); // guardo el valor leído del sensor en una variable booleana (LOW o HIGH)
    if(val == LOW){ // si este valor que guardo al leer el sensor es LOW
    digitalWrite(led_1,HIGH); // entonces prendo led_1
    digitalWrite(led_1,LOW); // y al cabo de 200ms lo apaga

    }
    else{
    digitalWrite(led_1,LOW); // en caso que no pasa nada por defecto será apagado

    }
    }
    void proyecto3() {
    if(digitalRead(pulsador)==HIGH){ // si presiono pulsador
    digitalWrite(led_2, HIGH); // led_2 enciende
    }
    else{
    digitalWrite(led_2, LOW); // SiNo apaga

    }
    }
    void proyecto4(){
    if(digitalRead(pulsador)==HIGH){ // si presiono pulsador
    digitalWrite(led_2, HIGH); // led_2 enciende
    }
    else{
    digitalWrite(led_2, LOW); // SiNo apaga

    }

    }

    void proyecto4(){

    sensorValue = analogRead(sensor); // guarda el valor que lee el sensor va de 0 a 1023
    Serial.println(sensorValue, DEC); // muestra ese valor
    if(sensorValue > 130){ // pero si es mayor a 130 ese valor
    digitalWrite(led_3,LOW); // pone en alto la salida digital led_3 del Arduino
    digitalWrite(buzzer,LOW); // entonces prende led_3 y buzzer
    }
    else{
    digitalWrite(led_3,HIGH);
    digitalWrite(buzzer,HIGH); // y sino no pasa nada
    }
    }

  2. Hi Gulliermo.
    I copied your code as is and changed just wifi data and token but, when i pus the button i get a exeption (9). I use a ESP8266 12F, below you can find debug code, I hope you can help me

    19:12:43.647 -> Exception (9):
    19:12:43.647 -> epc1=0x40207a90 epc2=0x00000000 epc3=0x00000000 excvaddr=0x0000000b depc=0x00000000
    19:12:43.647 ->
    19:12:43.647 -> >>>stack>>>
    19:12:43.647 ->
    19:12:43.647 -> ctx: cont
    19:12:43.647 -> sp: 3ffffc30 end: 3fffffc0 offset: 0190
    19:12:43.647 -> 3ffffdc0: 3ffe8740 3fff115c 3ffffe50 40203bbf
    19:12:43.647 -> 3ffffdd0: 0000001b 3ffee724 00000001 40205adc
    19:12:43.647 -> 3ffffde0: 00000000 00000000 00000000 402060d6
    19:12:43.647 -> 3ffffdf0: 00000000 3ffffe50 3ffef4f4 40202888
    19:12:43.774 -> 3ffffe00: 3ffee620 00000d50 3ffffebc 3fffff8c
    19:12:43.774 -> 3ffffe10: 000001bb 3ffffe50 3ffe8740 3fffff8c
    19:12:43.774 -> 3ffffe20: 000001bb 3ffffe50 3ffe8740 40203d95
    19:12:43.774 -> 3ffffe30: 40208040 b3b4fa8e 40208040 b3b4fa8e
    19:12:43.774 -> 3ffffe40: 3fffff80 3ffe84cc 3ffee688 40201147
    19:12:43.774 -> 3ffffe50: 40207ee0 00000000 00003a98 3fffc278
    19:12:43.774 -> 3ffffe60: 00000000 3ffef4f4 3fff115c 3ffef60c
    19:12:43.774 -> 3ffffe70: 00000000 00000000 3fff115c 00000000
    19:12:43.774 -> 3ffffe80: 00000000 3fff6264 3ffef6a4 00000000
    19:12:43.774 -> 3ffffe90: 00000000 3fff1eb4 3ffef7e4 3fff6004
    19:12:43.774 -> 3ffffea0: 3ffef68c 00000000 00000000 00000000
    19:12:43.774 -> 3ffffeb0: 00004145 00000255 00000000 00000000
    19:12:43.774 -> 3ffffec0: 00000000 00000000 00000000 00000000
    19:12:43.774 -> 3ffffed0: 00000000 00000000 3ffe0001 3ffee6c8
    19:12:43.774 -> 3ffffee0: b191a400 fe751b2a feefeffe 00000000
    19:12:43.774 -> 3ffffef0: 00000000 00000020 00000000 00000000
    19:12:43.774 -> 3fffff00: 3ffe8700 00000000 00000000 40206995
    19:12:43.774 -> 3fffff10: 0000000b 00000000 654d006f 40206995
    19:12:43.774 -> 3fffff20: 3ffe8721 a4d76761 00000000 3ffee6c8
    19:12:43.774 -> 3fffff30: 3ffe8722 0000001d 3fffff80 402056cb
    19:12:43.774 -> 3fffff40: 0000001d 3ffee640 3ffe8714 402050d1
    19:12:43.774 -> 3fffff50: 3fffdad0 0000001d 3fffff80 40205714
    19:12:43.986 -> 3fffff60: 3fffdad0 3fffff80 3ffe8722 3ffee6c8
    19:12:43.986 -> 3fffff70: 3fffdad0 00000000 3ffee688 4020131a
    19:12:43.986 -> 3fffff80: 3ffef40c 001d001f 00000001 65646f4e
    19:12:43.986 -> 3fffff90: 0055434d 87000000 3ffee688 40100175
    19:12:43.986 -> 3fffffa0: feefeffe 00000000 3ffee688 40205bf4
    19:12:43.986 -> 3fffffb0: feefeffe feefeffe 3ffe84f8 40100bbd
    19:12:43.986 -> <<<stack<<
    19:12:43.986 -> ————— CUT HERE FOR EXCEPTION DECODER —————

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *