Ir al contenido principal
Todas las coleccionesConecta tus dispositivos
Conectar un Adafruit Feather 32u4 FONA a Ubidots a través de TCP/UDP
Conectar un Adafruit Feather 32u4 FONA a Ubidots a través de TCP/UDP

Visualiza los datos de un sistema o entorno con el Feather 32u4 FONA y Ubidots.

Sergio M avatar
Escrito por Sergio M
Actualizado hace más de una semana

El Adafruit Feather 32u4 FONA - una placa celular 'todo en uno' compatible con Arduino + capaz de audio/sms/datos con USB integrado y carga de batería es una solución integral para la mayor parte de las soluciones de IoT celular. Para una lista completa de características y especificaciones del dispositivo, consulta la página del producto Feather.

En el siguiente tutorial, Ubidots demostrará cómo configurar y programar el Adafruit Feather 32u4 FONA utilizando el IDE de Arduino para mostrar datos en tu cuenta de Ubidots donde se pueden utilizar.

Requisitos

Paso a Paso

  1. Configuración de Feather FONA usando el IDE de Arduino

  2. Configuración de Hardware

  3. Envío (POST) de Datos a Ubidots

  4. Resumen

1. Configuración de Feather FONA usando el IDE de Arduino

Para comenzar a trabajar con el Adafruit Feather 32u4 FONA necesitas configurar la placa usando el IDE de Arduino. Para esto, consulta el paso "3. Gestión de Placas y Plataformas" de la siguiente guía:

1. Para asegurar el correcto funcionamiento del IDE de Arduino con la placa Adafruit Feather, sube el ejemplo Blink proporcionado desde Archivos > Ejemplos > Básico > Blink. Una vez que la placa esté correctamente configurada, continúa con esta guía.

NOTA: Si tienes problemas al subir el sketch de ejemplo a la placa, esta guía te ayudará a iniciar la placa manualmente. Además, si estás trabajando en Ubuntu o Linux, visita esta guía para recursos adicionales de solución de problemas.

2. Ve al repositorio de la biblioteca de Adafruit para descargar la biblioteca Adafruit FONA. Para descargar esta biblioteca, haz clic en el botón verde llamado "Clonar o descargar" y selecciona "Descargar ZIP".

3. Ahora, de vuelta en el IDE de Arduino, haz clic en Sketch -> Incluir Biblioteca -> Agregar Biblioteca .ZIP y selecciona el archivo .ZIP de Adafruit_FONA-master.zip y luego “Aceptar” o “Elegir”. Una vez que la biblioteca se haya incluido correctamente, recibirás el mensaje "Biblioteca añadida a tus bibliotecas".

2. Configuración de Hardware

1. Batería + Alimentación USB: A diferencia de otras placas Feather que pueden funcionar directamente con 3.3V USB o batería, la Feather FONA gestiona la batería y la alimentación USB de manera diferente. Con esta placa debes tener una BATERÍA Lipoly/Lilon CONECTADA EN TODO MOMENTO. Para documentación adicional, consulta esta sección de ayuda.

2. Inserta una micro SIM, conecta una antena GSM y conecta la batería y el micro USB.

3. Conecta la placa a tu computadora.

3. Envío (POST) de Datos a Ubidots

Con el siguiente código de ejemplo podrás publicar las lecturas ANALÓGICAS tomadas del pin A0 de la Feather 32u4 FONA a Ubidots.

1. Para publicar tu primer valor en Ubidots, abre el IDE de Arduino y pega el código de ejemplo a continuación. Una vez que hayas pegado el código, necesitarás asignar tu TOKEN único de Ubidots y el APN (Nombre del Punto de Acceso) de tu proveedor celular con nombre de usuario y contraseña.

/******************************** * Bibliotecas incluidas *******************************/#include <SoftwareSerial.h>#include <stdlib.h>#include "Arduino.h" /******************************** * Constantes y objetos *******************************/ #define DEFAULT_BUFFER_SIZE      64#define FONA_RX  9#define FONA_TX  8#define FONA_RST 4#define SERVER "industrial.api.ubidots.com"#define PORT "9012"#define APN  "...."  // El APN de tu operador#define USER ""  // si tu apn no tiene nombre de usuario, déjalo en ""#define PASS ""  // si tu apn no tiene contraseña, déjalo en ""#define TOKEN "...."  // Reemplázalo con tu token de Ubidots#define METHOD "POST"#define USER_AGENT  "adafruit"#define VERSION  "1.0"#define DEVICE_LABEL  "feather-fona"#define VARIABLE_LABEL  "temperature"bool _debug = true; char buffer[DEFAULT_BUFFER_SIZE]; SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);/******************************** * Funciones Principales *******************************/void setup() {    Serial.begin(115200);    pinMode(A0, INPUT);    delay(2000);    while(!setApn(APN, USER, PASS));}void loop() {    char* request = (char *) malloc(sizeof(char) * 300);    char str_val[15];        float sensor_value = analogRead(A0);    dtostrf(sensor_value, 4, 2, str_val);    sprintf(request, "%s/%s|%s|%s|%s=>%s:%s|end", USER_AGENT, VERSION, METHOD, TOKEN, DEVICE_LABEL, VARIABLE_LABEL, str_val);    //sprintf(request, "%s|%s|%s","adafruit/1.0|POST", TOKEN, "fona=>test:17.00|end");    sendToUbidots(request);    free(request);}/******************************** * Funciones Auxiliares *******************************/bool sendMessageAndwaitForOK(char* message, uint16_t timeout = 4000) {    fonaSS.println(message);    if (strstr(readData(timeout), "OK") == NULL) {        if (_debug) {            Serial.println(F("Error"));        }            return false;        }    return true;}bool setApn(char* apn, char* user, char* pwd) {    checkFona();    fonaSS.println(F("AT"));    if (strstr(readData(2000), "OK") == NULL) {        if (_debug) {            Serial.println(F("Error con AT"));        }        return false;    }    fonaSS.println(F("AT+CREG?"));    if (strstr(readData(2000), "+CREG:") == NULL) {        if (_debug) {            Serial.println(F("Error con AT"));        }        return false;    }    fonaSS.println(F("AT+CSQ"));    if (strstr(readData(2000), "OK") == NULL) {        if (_debug) {            Serial.println(F("Error con AT+CSQ"));        }        return false;    }    fonaSS.println(F("AT+CGATT?"));    if (strstr(readData(10000), "OK") == NULL) {        if (_debug) {            Serial.println(F("Error con AT+CGATT"));        }        return false;    }    fonaSS.println(F("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\""));    if (strstr(readData(10000), "OK") == NULL) {        if (_debug) {            Serial.println(F("Error con AT+SAPBR CONTYPE"));        }        return false;    }    fonaSS.print(F("AT+SAPBR=3,1,\"APN\",\""));    fonaSS.print(apn);    fonaSS.println(F("\""));    if (strstr(readData(3000), "OK") == NULL) {        if (_debug) {            Serial.println(F("Error con AT+SAPBR APN"));        }        return false;    }    fonaSS.print(F("AT+SAPBR=3,1,\"USER\",\""));    fonaSS.print(user);    fonaSS.println(F("\""));    if (strstr(readData(10000), "OK") == NULL) {        if (_debug) {            Serial.println(F("Error con AT+SAPBR USER"));        }        return false;    }    fonaSS.print(F("AT+SAPBR=3,1,\"PWD\",\""));    fonaSS.print(pwd);    fonaSS.println("\"");    if (strstr(readData(3000), "OK") == NULL) {        if (_debug) {            Serial.println(F("Error con AT+SAPBR PASSWORD"));        }        return false;    }    fonaSS.println(F("AT+SAPBR=1,1"));    if (strstr(readData(4000), "OK") == NULL) {        if (_debug) {            Serial.println(F("Error con AT+SAPBR=1,1 Conexión ip"));        }        return false;    }    fonaSS.println(F("AT+SAPBR=2,1"));    if (strstr(readData(4000), "+SAPBR:") == NULL) {        if (_debug) {            Serial.println(F("Error con AT+SAPBR=2,1 sin IP para mostrar"));        }        return false;    }    return true;}bool module_begin() {    pinMode(FONA_RST, OUTPUT);    digitalWrite(FONA_RST, HIGH);    delay(500);    digitalWrite(FONA_RST, LOW);    delay(500);    digitalWrite(FONA_RST, HIGH);    delay(500);    Serial.println(F("Intentando abrir comunicación con ATs"));    int16_t timeout = 10000;    while (timeout > 0) {        if (sendMessageAndwaitForOK("AT"))            break;        delay(500);        timeout -= 500;    }    if (timeout <= 0) {        Serial.println(F("Timeout: Sin respuesta a AT... último intento."));        sendMessageAndwaitForOK("AT");        delay(100);        sendMessageAndwaitForOK("AT");        delay(100);        sendMessageAndwaitForOK("AT");        delay(100);        return false;    }    sendMessageAndwaitForOK("ATE0");    delay(100);    return true;}bool sendToUbidots(char* request) {      fonaSS.println(F("AT+CIPMUX=0"));    if (strstr(readData(4000), "OK") == NULL) {        if (_debug) {            Serial.println(F("Error con AT+CIPMUX"));        }        return false;    }    fonaSS.print(F("AT+CIPSTART=\"TCP\",\""));    fonaSS.print(SERVER);    fonaSS.print(F("\",\""));    fonaSS.print(PORT);    fonaSS.println(F("\""));    if (strstr(readData(4000), "CONNECT OK") == NULL) {        if (_debug) {            Serial.println(F("Error con AT+CIPSTART"));        }        return false;    }    fonaSS.print(F("AT+CIPSEND="));    fonaSS.println(dataLen(request));    if (strstr(readData(4000), ">") == NULL) {        if (_debug) {            Serial.println(F("Error con AT+CIPSEND"));        }        return false;    }    fonaSS.write(request);    if (strstr(readData(4000), "SEND OK") == NULL) {        if (_debug) {            Serial.println(F("Error enviando variables"));        }        return false;    }    fonaSS.println(F("AT+CIPCLOSE"));    if (strstr(readData(4000), "CLOSE OK") == NULL) {        if (_debug) {            Serial.println(F("Error con AT+CIPCLOSE"));        }        return false;    }    fonaSS.println(F("AT+CIPSHUT"));    if (strstr(readData(4000), "SHUT OK") == NULL) {        if (_debug) {            Serial.println(F("Error con AT+CIPSHUT"));        }        return false;    }    return true;}int dataLen(char* variable) {  uint8_t dataLen = 0;  for (int i = 0; i <= 250; i++) {    if (variable[i] != '\0') {      dataLen++;    } else {      break;    }  }  return dataLen;}bool checkFona() {    fonaSS.begin(4800);    delay(2000);    module_begin();    if (!sendMessageAndwaitForOK("ATE0", 6000)) {        Serial.print("No se pudo encontrar FONA");        while (1) {            Serial.println("ERROR");        }        return false;    }    return true;}char* readData(uint16_t timeout) {    uint16_t replyidx = 0;    char replybuffer[254];    int secconds = 0;    while (!fonaSS.available() && secconds < timeout) {        secconds++;    }    while (timeout--) {        if (replyidx >= 254) {            break;        }        while (fonaSS.available()) {            char c =  fonaSS.read();            if (c == '\r') continue;            if (c == 0xA) {                if (replyidx == 0)   // el primer 0x0A se ignora                    continue;            }            replybuffer[replyidx] = c;            replyidx++;        }        while (!fonaSS.available() && timeout > 0) {            timeout--;            delay(1);        }        if (timeout == 0) {            if (fonaSS.available()) {                timeout = 1000;            } else {                break;            }        }    }    replybuffer[replyidx] = '\0';  // terminación nula    if (_debug) {        Serial.println("Respuesta de FONA:");        Serial.println(replybuffer);    }    return replybuffer;}

2. Verifica tu código dentro del IDE de Arduino. Para hacer esto, en la esquina superior izquierda de nuestro IDE de Arduino verás el ícono de "Marca de Verificación", presiona para verificar tu código.

3. Sube el código a tu Feather 32u4 FONA. Para hacer esto, elige el ícono de "flecha derecha" al lado del ícono de "marca de verificación".

4. Para verificar la conectividad del dispositivo y los datos enviados, abre el monitor serial seleccionando el ícono de "lupa" en la esquina superior derecha del IDE de Arduino.

5. Confirma tus datos en Ubidots. Ahora deberías ver los datos publicados en tu cuenta de Ubidots, localiza el dispositivo llamado "adafruit" y visualiza tus datos.

4. Resumen

Con este simple tutorial podemos enviar datos a Ubidots con la facilidad del IDE de Arduino y un Feather 32u4 FONA. Si deseas enviar más de una variable a Ubidots, consulta Ubidots REST API para aprender a construir la solicitud correctamente. :)

Ahora es momento de crear Tableros de Ubidots para visualizar tus datos y desplegar tu solución de monitoreo conectada a internet. ¡Feliz Hackeo! :)

Otros lectores también han encontrado útil...

¿Ha quedado contestada tu pregunta?