Ir al contenido principal
Todas las coleccionesConecta tus dispositivos
Integrar un LilyGo TTGO T-Call a Ubidots usando Monogoto
Integrar un LilyGo TTGO T-Call a Ubidots usando Monogoto

```html <p>Aprende a conectar la placa TTGO T-Call a Internet utilizando un plan de datos de tarjeta SIM Monogoto y publicar datos en Ubidots.</p> ```

Santiago Pachon Robayo avatar
Escrito por Santiago Pachon Robayo
Actualizado hace más de 2 meses

El LilyGo TTGO T-Call es un módulo basado en ESP32 con conectividad a través de la red celular GSM. En este tutorial aprenderás cómo enviar datos del sensor BME280 a Ubidots utilizando la red de conectividad IoT/M2M mundial de Monogoto.

image

Aprende cómo conectar la placa TTGO T-Call ESP32 SIM800L a Internet utilizando un plan de datos de tarjeta SIM de Monogoto y publicar datos en la nube. Programaremos esta placa con Arduino IDE. Este tutorial asume que puedes crear un proyecto de Arduino y agregarle bibliotecas.

Requisitos

1. Acceso a datos de la tarjeta SIM Monogoto

Monogoto proporciona acceso global a redes celulares en más de 180 países. Tiene un portal de autoservicio intuitivo para gestionar tus dispositivos conectados. Consulta esta guía de inicio rápido para activar tu tarjeta SIM y la configuración del dispositivo necesaria para conectar el TTGO T-Call.
​​

2. Configuración de Arduino

Bibliotecas necesarias: TinyGSM, Adafruit BME280, ArduinoJson, y asegúrate de instalar todas las demás bibliotecas necesarias para el Adafruit BME280.

Nota importante: El TTGO T-Call solo funciona en redes 2G. Asegúrate de tener acceso a una red 2G en tu país.

Define el tamaño de tu objeto JSON:

Para enviar datos a Ubidots, hacemos una solicitud HTTP POST y enviamos un “cuerpo” válido, como se indica en nuestra documentación aquí. Para ello, utilizamos la biblioteca Arduino JSON, donde necesitas determinar el tamaño en bytes de ese cuerpo. Usa el Asistente de ArduinoJson para que, al definir la estructura de tu carga útil utilizando valores ficticios, te dé el tamaño recomendado del código para el objeto JSON y el serializador, como se ve en el GIF a continuación.


Código de salida:

StaticJsonDocument<48> doc;doc["temperature"] = 45;doc["humidity"] = 12.3;doc["pressure"] = 1234;serializeJson(doc, output);

La variable StaticJsonDocument doc tiene un tamaño de 48 bytes. Ten en cuenta que la “salida” de la función serializeJson() es una cadena.

3. Conectar el sensor BME280

Así es como debes conectar los sensores al LilyGo:

Una vez conectado, aquí está el código de ejemplo para tu proyecto. Ten en cuenta que puedes usar el token de tu cuenta de Ubidots para una prueba rápida, pero se recomienda encarecidamente un token de dispositivo en su lugar.

#define TINY_GSM_MODEM_SIM800      // El módem es SIM800#define TINY_GSM_RX_BUFFER   1024  // Establecer el búfer RX a 1Kb#include <Wire.h>#include <ArduinoJson.h>#include <TinyGsmClient.h>#include <Adafruit_Sensor.h>#include <Adafruit_BME280.h>const char apn[]      = "data.mono"; // APN https://docs.monogoto.io/getting-started/initial-configuration#device-configurationconst char gprsUser[] = ""; // Usuario GPRSconst char gprsPass[] = ""; // Contraseña GPRS// PIN de la tarjeta SIM (dejar vacío si no está definido)const char simPIN[]   = ""; // Detalles del servidor// La variable del servidor puede ser solo un nombre de dominio o puede tener un subdominio. Depende del servicio que estés utilizandoconst char server[] = "industrial.api.ubidots.com";const char resource[] = "/api/v1.6/devices/lilygo"; // ruta del recurso "/api/v1.6/devices/<etiqueta del dispositivo>"const int  port = 80;// número de puerto del servidor// Mantén este valor de clave API para ser compatible con el código PHP proporcionado en la página del proyecto. // Si cambias el valor de apiKeyValue, el archivo PHP /post-data.php también necesita tener la misma clave String token = "<Token de cuenta de Ubidots>";StaticJsonDocument<48> doc;  //Reserva espacio para el objeto JSON#define MODEM_RST            5#define MODEM_PWKEY          4#define MODEM_POWER_ON       23#define MODEM_TX             27#define MODEM_RX             26#define I2C_SDA              21#define I2C_SCL              22#define I2C_SDA_2            18#define I2C_SCL_2            19       // Establecer serie para la consola de depuración (al Monitor Serial, velocidad predeterminada 115200)#define SerialMon Serial// Establecer serie para comandos AT (al módulo SIM800)#define SerialAT Serial1// Configurar la biblioteca TinyGSM// Definir la consola serie para impresiones de depuración, si es necesario//#define DUMP_AT_COMMANDS#ifdef DUMP_AT_COMMANDS  #include <StreamDebugger.h>  StreamDebugger debugger(SerialAT, SerialMon);  TinyGsm modem(debugger);#else  TinyGsm modem(SerialAT);#endif// I2C para SIM800 (para mantenerlo funcionando cuando se alimenta de batería)TwoWire I2CPower = TwoWire(0); TwoWire I2CBME = TwoWire(1);Adafruit_BME280 bme; // Cliente TinyGSM para conexión a InternetTinyGsmClient client(modem);#define uS_TO_S_FACTOR 1000000UL   /* Factor de conversión de microsegundos a segundos */#define TIME_TO_SLEEP  3600        /* Tiempo que el ESP32 estará en sueño (en segundos) 3600 segundos = 1 hora */#define IP5306_ADDR          0x75#define IP5306_REG_SYS_CTL0  0x00bool setPowerBoostKeepOn(int en){  I2CPower.beginTransmission(IP5306_ADDR);  I2CPower.write(IP5306_REG_SYS_CTL0);  if (en) {    I2CPower.write(0x37); // Establecer bit1: 1 habilitar 0 deshabilitar aumento mantener encendido  } else {    I2CPower.write(0x35); // 0x37 es el valor predeterminado del registro  }  return I2CPower.endTransmission() == 0;}void setup() {  // Establecer la velocidad de la ventana de depuración del monitor serie a 115200  SerialMon.begin(115200);  // Iniciar comunicación I2C  uint32_t frq = 400000;  I2CPower.begin(I2C_SDA, I2C_SCL, frq);  I2CBME.begin(I2C_SDA_2, I2C_SCL_2, frq);   // Mantener la energía cuando se ejecuta con batería  bool isOk = setPowerBoostKeepOn(1);  SerialMon.println(String("IP5306 KeepOn ") + (isOk ? "OK" : "FAIL"));  // Establecer pines de reinicio, habilitación y alimentación del módem  pinMode(MODEM_PWKEY, OUTPUT);  pinMode(MODEM_RST, OUTPUT);  pinMode(MODEM_POWER_ON, OUTPUT);  digitalWrite(MODEM_PWKEY, LOW);  digitalWrite(MODEM_RST, HIGH);  digitalWrite(MODEM_POWER_ON, HIGH);  // Establecer la velocidad de baudios del módulo GSM y pines UART  SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);  delay(3000);  // Reiniciar el módulo SIM800, toma bastante tiempo  // Para omitirlo, llama a init() en lugar de restart()  SerialMon.println("Inicializando módem...");  modem.restart();  // usa modem.init() si no necesitas el reinicio completo  // Desbloquear tu tarjeta SIM con un PIN si es necesario  if (strlen(simPIN) && modem.getSimStatus() != 3 ) {    modem.simUnlock(simPIN);  }  if (!bme.begin(0x76, &I2CBME)) {    Serial.println("No se pudo encontrar un sensor BME280 válido, ¡verifica el cableado!");    while (1);  }    // Puede que necesites cambiar la dirección I2C del BME280, en nuestro caso es 0x76  // Configurar la fuente de activación como activación por temporizador    //esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);}void loop() {  String json;    //Construir objeto JSON  doc["humidity"] = bme.readHumidity();  doc["temperature"] = bme.readTemperature();  doc["pressure"] = bme.readPressure()/100;    //Serializar tu objeto JSON  serializeJson(doc, json);  SerialMon.print("Conectando a APN: ");  SerialMon.print(apn);  if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {    SerialMon.println(" falló");  }  else {    SerialMon.println(" OK");        SerialMon.print("Conectando a ");    SerialMon.print(server);    if (!client.connect(server, port)) {      SerialMon.println(" falló");    }    else {      SerialMon.println(" OK");          // Realizando una solicitud HTTP POST      SerialMon.println("Realizando solicitud HTTP POST...");          client.print(String("POST ") + resource + " HTTP/1.1\r\n");      client.print(String("Host: ") + server + "\r\n");      client.println("User-Agent: ESP32");      client.println("Connection: close");      client.println("Content-Type: application/json");      client.print("X-Auth-Token: " + token + "\r\n");      client.print("Content-Length: ");      client.println(json.length());      client.println();      client.println(json);      unsigned long timeout = millis();      while (client.connected() && millis() - timeout < 10000L) {        // Imprimir respuesta HTTP del servidor        while (client.available()) {          char c = client.read();          SerialMon.print(c);          timeout = millis();        }      }      SerialMon.println();          // Cerrar cliente y desconectar      client.stop();      SerialMon.println(F("Servidor desconectado"));      modem.gprsDisconnect();      SerialMon.println(F("GPRS desconectado"));    }  }  delay(5000);}

4. Salida del monitor serie y el resultado final

Una vez que el dispositivo ha sido compilado y cargado, la salida del monitor serie es esta:

image.png

Y los datos recibidos en Ubidots:

image.png

Variable de humedad:

image.png
¿Ha quedado contestada tu pregunta?