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.
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
}
}
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 —————