Introducción
La integración de la comunicación 4G en PLCs basados en ESP32 abre un sinfín de posibilidades para el IoT y la automatización industrial. En una entrada anterior del blog, "Cómo utilizar 4G con un ESP32 PLC", explicamos la configuración inicial para habilitar 4G en el ESP32 PLC. Esto incluye preparar la tarjeta SIM, configurar el APN e inicializar la librería NB (Narrowband IoT). Si eres nuevo en este proceso, te recomendamos comenzar con esa publicación antes de adentrarte en esta guía.
En este artículo, nos centraremos en aplicaciones prácticas: el envío de mensajes SMS y notificaciones de Telegram directamente desde el ESP32 PLC. El ejemplo de SMS que aquí se muestra está disponible en la librería de Industrial Shields, en Archivo -> Ejemplos -> Ejemplos para la familia de PLCs 14 IOs -> NB -> SendSMS.
Envío de mensajes SMS con un ESP32 PLC 14
La capacidad de enviar mensajes SMS es muy valiosa en la automatización industrial, ya sea para alarmas, notificaciones o comandos remotos. El siguiente ejemplo muestra cómo enviar mensajes SMS desde el ESP32 PLC 14 utilizando la librería NB.
Ejemplo de código: Envío de SMS
Este ejemplo se incluye en la librería de Industrial Shields en: Archivo -> Ejemplos -> Ejemplos para la familia de PLCs 14 IOs -> NB -> SendSMS. A continuación se muestra el código completo:
arduino_secrets.h (dependencia):
#define SECRET_PINNUMBER ""
#define SECRET_APN ""
#define SECRET_USERNAME ""
#define SECRET_PASSWORD ""
#define SECRET_PINNUMBER ""
#define SECRET_APN ""
#define SECRET_USERNAME ""
#define SECRET_PASSWORD ""
Código de ejemplo para enviar SMS:
#include <NB.h>
#include "arduino_secrets.h"
const char PINNUMBER[] = SECRET_PINNUMBER;
const char APN[] = SECRET_APN;
const char USERNAME[] = SECRET_USERNAME;
const char PASSWORD[] = SECRET_PASSWORD;
NB nbAccess(true);
NB_SMS sms;
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("SMS Messages Sender");
bool connected = false;
#ifdef MAKE_AUTOBAUD
if (nbAccess.autobaud()) {
Serial.println("Autobaud completed successfully");
nbAccess.shutdown();
} else {
Serial.println("Autobaud failed.");
while (1);
}
#endif
while (!connected) {
if (nbAccess.begin(PINNUMBER, APN, USERNAME, PASSWORD) == NB_READY) {
connected = true;
} else {
Serial.println("Not connected, retrying...");
delay(1000);
}
}
Serial.println("NB initialized");
}
void loop() {
Serial.print("Enter a mobile number: ");
char remoteNum[20];
readSerial(remoteNum);
Serial.print("Now, enter SMS content: ");
char txtMsg[200];
readSerial(txtMsg);
sms.beginSMS(remoteNum);
sms.print(txtMsg);
sms.endSMS();
Serial.println("Message sent!");
}
int readSerial(char result[]) {
int i = 0;
while (true) {
while (Serial.available() > 0) {
char inChar = Serial.read();
if (inChar == '\n') {
result[i] = '\0';
return 0;
}
if (inChar != '\r') {
result[i] = inChar;
i++;
}
}
}
}
#include <NB.h>
#include "arduino_secrets.h"
const char PINNUMBER[] = SECRET_PINNUMBER;
const char APN[] = SECRET_APN;
const char USERNAME[] = SECRET_USERNAME;
const char PASSWORD[] = SECRET_PASSWORD;
NB nbAccess(true);
NB_SMS sms;
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("SMS Messages Sender");
bool connected = false;
#ifdef MAKE_AUTOBAUD
if (nbAccess.autobaud()) {
Serial.println("Autobaud completed successfully");
nbAccess.shutdown();
} else {
Serial.println("Autobaud failed.");
while (1);
}
#endif
while (!connected) {
if (nbAccess.begin(PINNUMBER, APN, USERNAME, PASSWORD) == NB_READY) {
connected = true;
} else {
Serial.println("Not connected, retrying...");
delay(1000);
}
}
Serial.println("NB initialized");
}
void loop() {
Serial.print("Enter a mobile number: ");
char remoteNum[20];
readSerial(remoteNum);
Serial.print("Now, enter SMS content: ");
char txtMsg[200];
readSerial(txtMsg);
sms.beginSMS(remoteNum);
sms.print(txtMsg);
sms.endSMS();
Serial.println("Message sent!");
}
int readSerial(char result[]) {
int i = 0;
while (true) {
while (Serial.available() > 0) {
char inChar = Serial.read();
if (inChar == '\n') {
result[i] = '\0';
return 0;
}
if (inChar != '\r') {
result[i] = inChar;
i++;
}
}
}
}
Con este código, puedes enviar fácilmente mensajes SMS introduciendo el número de teléfono del destinatario y el mensaje deseado a través del Monitor Serial.
Puedes descargar el ejemplo aquí:
SendSMS
Envío de mensajes de Telegram con Call Me Bot
Aunque la librería no incluye actualmente un ejemplo para enviar mensajes de Telegram, puedes implementar esta funcionalidad utilizando el servicio Call Me Bot. Call Me Bot te permite enviar mensajes de Telegram sin lidiar con la complejidad de la API de Telegram. Antes de usar este ejemplo, debes otorgar permisos al bot a través de esta página de autenticación.
Ejemplo de código: Envío de mensajes de Telegram
A continuación se muestra el código para enviar mensajes de Telegram utilizando el servicio Call Me Bot:
arduino_secrets.h (dependencia):
#define SECRET_PINNUMBER ""
#define SECRET_APN ""
#define SECRET_USERNAME ""
#define SECRET_PASSWORD ""
#define SECRET_USER ""
#define SECRET_PINNUMBER ""
#define SECRET_APN ""
#define SECRET_USERNAME ""
#define SECRET_PASSWORD ""
#define SECRET_USER ""
Código de ejemplo para enviar mensajes de Telegram:
#include <NB.h>
#include "arduino_secrets.h"
const char PINNUMBER[] = SECRET_PINNUMBER;
const char APN[] = SECRET_APN;
const char USERNAME[] = SECRET_USERNAME;
const char PASSWORD[] = SECRET_PASSWORD;
const char USER[] = SECRET_USER;
NBClient client;
GPRS gprs;
NB nbAccess(true);
char server[] = "api.callmebot.com";
int port = 80;
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("Call Me Bot Messages Sender");
bool connected = false;
#ifdef MAKE_AUTOBAUD
if (nbAccess.autobaud()) {
Serial.println("Autobaud completed successfully");
nbAccess.shutdown();
} else {
Serial.println("Autobaud could not configure the module correctly. Trying again...");
if (nbAccess.autobaud()) {
Serial.println("Autobaud completed successfully");
nbAccess.shutdown();
} else {
Serial.println("Autobaud could not configure the module correctly. Blocking...");
while(1);
}
}
#endif
while (!connected) {
if ((nbAccess.begin(PINNUMBER, APN, USERNAME, PASSWORD) == NB_READY) && (gprs.attachGPRS() == GPRS_READY)) {
connected = true;
} else {
Serial.println("Not connected, retrying...");
delay(1000);
}
}
Serial.println("NB and GPRS initialized");
}
void loop() {
Serial.print("Enter the message to send: ");
char txtMsg[200];
readSerial(txtMsg);
String msgPayload = txtMsg;
msgPayload.replace(" ", "%20");
char path[500];
sprintf(path, "/text.php?source=web&user=@%s&text=%s", USER, msgPayload.c_str());
Serial.println("Connecting to Call Me Bot...");
if (client.connect(server, port)) {
Serial.println("Connected to Call Me Bot server");
client.print("GET ");
client.print(path);
client.println(" HTTP/1.1");
client.print("Host: ");
client.println(server);
client.println("Connection: close");
client.println();
} else {
Serial.println("Connection failed");
return;
}
while (client.connected()) {
while (client.available()) {
char c = client.read();
Serial.print(c);
}
}
Serial.println();
Serial.println("Disconnecting from server.");
client.stop();
}
int readSerial(char result[]) {
int i = 0;
while (1) {
while (Serial.available() > 0) {
char inChar = (char)Serial.read();
if (inChar == '\n') {
result[i] = '\0';
Serial.flush();
return 0;
}
if (inChar != '\r') {
result[i] = inChar;
i++;
}
}
}
}
#include <NB.h>
#include "arduino_secrets.h"
const char PINNUMBER[] = SECRET_PINNUMBER;
const char APN[] = SECRET_APN;
const char USERNAME[] = SECRET_USERNAME;
const char PASSWORD[] = SECRET_PASSWORD;
const char USER[] = SECRET_USER;
NBClient client;
GPRS gprs;
NB nbAccess(true);
char server[] = "api.callmebot.com";
int port = 80;
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("Call Me Bot Messages Sender");
bool connected = false;
#ifdef MAKE_AUTOBAUD
if (nbAccess.autobaud()) {
Serial.println("Autobaud completed successfully");
nbAccess.shutdown();
} else {
Serial.println("Autobaud could not configure the module correctly. Trying again...");
if (nbAccess.autobaud()) {
Serial.println("Autobaud completed successfully");
nbAccess.shutdown();
} else {
Serial.println("Autobaud could not configure the module correctly. Blocking...");
while(1);
}
}
#endif
while (!connected) {
if ((nbAccess.begin(PINNUMBER, APN, USERNAME, PASSWORD) == NB_READY) && (gprs.attachGPRS() == GPRS_READY)) {
connected = true;
} else {
Serial.println("Not connected, retrying...");
delay(1000);
}
}
Serial.println("NB and GPRS initialized");
}
void loop() {
Serial.print("Enter the message to send: ");
char txtMsg[200];
readSerial(txtMsg);
String msgPayload = txtMsg;
msgPayload.replace(" ", "%20");
char path[500];
sprintf(path, "/text.php?source=web&user=@%s&text=%s", USER, msgPayload.c_str());
Serial.println("Connecting to Call Me Bot...");
if (client.connect(server, port)) {
Serial.println("Connected to Call Me Bot server");
client.print("GET ");
client.print(path);
client.println(" HTTP/1.1");
client.print("Host: ");
client.println(server);
client.println("Connection: close");
client.println();
} else {
Serial.println("Connection failed");
return;
}
while (client.connected()) {
while (client.available()) {
char c = client.read();
Serial.print(c);
}
}
Serial.println();
Serial.println("Disconnecting from server.");
client.stop();
}
int readSerial(char result[]) {
int i = 0;
while (1) {
while (Serial.available() > 0) {
char inChar = (char)Serial.read();
if (inChar == '\n') {
result[i] = '\0';
Serial.flush();
return 0;
}
if (inChar != '\r') {
result[i] = inChar;
i++;
}
}
}
}
Con este código, puedes enviar fácilmente mensajes de Telegram introduciendo el mensaje deseado a través del Monitor Serial.
Puedes descargar el ejemplo aquí:
SendTelegram
Conclusión
El ESP32 PLC 14 con conectividad 4G demuestra ser una herramienta potente para el IoT y la automatización industrial. Utilizando la librería integrada, el envío de mensajes SMS es sencillo gracias al ejemplo proporcionado (SendSMS). Además, con una ligera personalización, es posible enviar notificaciones a Telegram a través del servicio Call Me Bot.
Para aquellos que deseen profundizar más en la configuración inicial del 4G, recomendamos revisar nuestra guía anterior: "Cómo utilizar 4G con un ESP32 PLC".