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.
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
Tarjeta SIM Monogoto para acceso global
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:
Y los datos recibidos en Ubidots:
Variable de humedad: