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.

Una respuesta 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
    }
    }

Deja una respuesta

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