Ir al contenido principal
Todas las coleccionesConecta tus dispositivos
MultiTech MultiConnect mDot y Ubidots
MultiTech MultiConnect mDot y Ubidots

Comienza con el mDot (independiente) y Ubidots.

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

MultiTech MultiConnect mDot y Ubidots

El MultiConnect® mDot™ es un módulo listo para LoRaWAN™, capaz de comunicación bidireccional a distancias superiores a 10 millas / 16 km al aire libre.

El mDot cuenta con un procesador ARM® Cortex®-M4 de bajo consumo, que ejecuta el sistema operativo mbed™ de ARM, junto con bibliotecas amigables para desarrolladores. Este ejemplo se beneficia de su procesador a bordo para leer datos de entradas analógicas y enviarlos a Ubidots.

Requisitos

Para poder ver los datos transmitidos por el mDot necesitarás un gateway LoRa. Consulta nuestro tutorial de LoRa MultiTech MultiConnect Conduit aquí

Configuración

  • Haz clic en el botón Compilador en la esquina superior derecha.

  • Crea un nuevo proyecto, selecciona MultiTech mDot como tu plataforma, luego selecciona la plantilla Conectando al gateway y enviando paquete con un MultiTech mDot y haz clic en OK.

  • Ve a main.cpp, borra su contenido y pega los códigos de muestra correspondientes que se encuentran a continuación en esta guía.

Enviar un valor a Ubidots

Para enviar un valor desde un Pin Analógico copia este código y pégalo en main.cpp. No olvides cambiar el nombre de la red LoRa, Sub-Banda de Frecuencia y Frase de Paso. Haz clic en “compilar” y luego simplemente pega el archivo .bin resultante en el Kit de Desarrollo Micro MultiConnect® mDot™, que verás como una unidad de almacenamiento USB en tu computadora.

#include "mbed.h"#include "mDot.h"#include "MTSLog.h"#include #include #include #include AnalogIn value(PB_1);// estas opciones deben coincidir con la configuración de tu Conduit// descomenta las siguientes líneas y edita sus valores para que coincidan con tu configuraciónstatic std::string config_network_name = "Network_Name_of_Conduit";static std::string config_network_pass = "Network_Pass_of_Conduit";static uint8_t config_frequency_sub_band = 1;int main() {    int32_t ret;    mDot* dot;    std::vector data;    int inValue;    char* str = new char[3];    float sensorValue;        sensorValue = value.read();    inValue = int(sensorValue*1000);    sprintf(str, "%d", inValue );    // obtener un manejador de mDot    dot = mDot::getInstance();        // imprimir información de la versión de la biblioteca    logInfo("version: %s", dot->getId().c_str());    //*******************************************    // configuración    //*******************************************    // restablecer a la configuración predeterminada para saber en qué estado estamos    dot->resetConfig();        dot->setLogLevel(mts::MTSLog::INFO_LEVEL);    // configurar el mDot con nuestra información de red: sub banda de frecuencia, nombre de red y contraseña de red    // todos estos pueden guardarse en NVM para que no necesiten configurarse cada vez - ver mDot::saveConfig()        // la sub banda de frecuencia solo es aplicable en la banda de frecuencia 915 (EE. UU.)    // si usas un gateway MultiTech Conduit, usa la misma sub banda que tu Conduit (1-8) - el mDot usará los 8 canales en esa sub banda    // si usas un gateway que soporta los 64 canales, usa la sub banda 0 - el mDot usará los 64 canales        if ((ret = dot->setPublicNetwork(true)) != mDot::MDOT_OK) {        logError("failed to set public network %d:%s", ret, mDot::getReturnCodeString(ret).c_str());    }    logInfo("setting frequency sub band");        if ((ret = dot->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) {        logError("failed to set frequency sub band %d:%s", ret, mDot::getReturnCodeString(ret).c_str());    }        logInfo("setting network name");    if ((ret = dot->setNetworkName(config_network_name)) != mDot::MDOT_OK) {        logError("failed to set network name %d:%s", ret, mDot::getReturnCodeString(ret).c_str());    }        logInfo("setting network password");    if ((ret = dot->setNetworkPassphrase(config_network_pass)) != mDot::MDOT_OK) {        logError("failed to set network password %d:%s", ret, mDot::getReturnCodeString(ret).c_str());    }        // un factor de expansión más alto permite un mayor alcance pero menor rendimiento    // en la banda de frecuencia 915 (EE. UU.), los factores de expansión 7 - 10 están disponibles    // en la banda de frecuencia 868 (UE), los factores de expansión 7 - 12 están disponibles    logInfo("setting TX spreading factor");    if ((ret = dot->setTxPower(20)) != mDot::MDOT_OK) {        logError("failed to set TX datarate %d:%s", ret, mDot::getReturnCodeString(ret).c_str());    }    logInfo("setting TX power");    if ((ret = dot->setTxDataRate(mDot::SF_9)) != mDot::MDOT_OK) {        logError("failed to set TX datarate %d:%s", ret, mDot::getReturnCodeString(ret).c_str());    }            // solicitar confirmación de recepción de paquetes del gateway    logInfo("enabling ACKs");    if ((ret = dot->setAck(1)) != mDot::MDOT_OK) {        logError("failed to enable ACKs %d:%s", ret, mDot::getReturnCodeString(ret).c_str());    }       // guardar esta configuración en la NVM del mDot    logInfo("saving config");    if (! dot->saveConfig()) {        logError("failed to save configuration");    }    //*******************************************    // fin de la configuración    //*******************************************    // intentar unirse a la red    logInfo("joining network");    while ((ret = dot->joinNetwork()) != mDot::MDOT_OK) {        logError("failed to join network %d:%s", ret, mDot::getReturnCodeString(ret).c_str());        // en la banda de frecuencia 868 (UE), necesitamos esperar hasta que otro canal esté disponible antes de transmitir nuevamente        osDelay(std::max((uint32_t)1000, (uint32_t)dot->getNextTxMs()));    }    // formatear datos para enviar al gateway    for (int i = 0; i send(data)) != mDot::MDOT_OK) {            logError("failed to send", ret, mDot::getReturnCodeString(ret).c_str());        } else {            logInfo("successfully sent data to gateway");        }        // en la banda de frecuencia 868 (UE), necesitamos esperar hasta que otro canal esté disponible antes de transmitir nuevamente        osDelay(std::max((uint32_t)5000, (uint32_t)dot->getNextTxMs()));    }    return 0;}

Enviar múltiples valores a Ubidots

Para enviar tres valores desde los Pines Analógicos A0, A1 y A2, copia el siguiente código y pégalo en main.cpp. No olvides cambiar el nombre de la red LoRa, Sub-Banda de Frecuencia y Frase de Paso. Haz clic en “compilar” y luego simplemente pega el archivo .bin resultante en el Kit de Desarrollo Micro MultiConnect® mDot™, que verás como una unidad de almacenamiento USB en tu computadora.

#include "mbed.h"#include "mDot.h"#include "MTSLog.h"#include #include #include #include AnalogIn value(PB_1);AnalogIn value2(PB_2);AnalogIn value3(PB_3);// estas opciones deben coincidir con la configuración de tu Conduit// descomenta las siguientes líneas y edita sus valores para que coincidan con tu configuraciónstatic std::string config_network_name = "UbidotsLora";static std::string config_network_pass = "clave123456789";static uint8_t config_frequency_sub_band = 1;int main() {    int32_t ret;    mDot* dot;    std::vector data;    std::vector data2;    std::vector data3;    int inValue, inValue2, inValue3;    char* str = new char[3];    char* str2 = new char[3];    char* str3 = new char[3];    float sensorValue, sensorValue2, sensorValue3;        sensorValue = value.read();    sensorValue = value2.read();    sensorValue = value3.read();    inValue = int(sensorValue*1000);    inValue2 = int(sensorValue*1000);    inValue3 = int(sensorValue*1000);    sprintf(str, "%d", inValue );    sprintf(str2, "%d", inValue2 );    sprintf(str3, "%d", inValue3 );    // obtener un manejador de mDot    dot = mDot::getInstance();        // imprimir información de la versión de la biblioteca    logInfo("version: %s", dot->getId().c_str());    //*******************************************    // configuración    //*******************************************    // restablecer a la configuración predeterminada para saber en qué estado estamos    dot->resetConfig();        dot->setLogLevel(mts::MTSLog::INFO_LEVEL);    // configurar el mDot con nuestra información de red: sub banda de frecuencia, nombre de red y contraseña de red    // todos estos pueden guardarse en NVM para que no necesiten configurarse cada vez - ver mDot::saveConfig()        // la sub banda de frecuencia solo es aplicable en la banda de frecuencia 915 (EE. UU.)    // si usas un gateway MultiTech Conduit, usa la misma sub banda que tu Conduit (1-8) - el mDot usará los 8 canales en esa sub banda    // si usas un gateway que soporta los 64 canales, usa la sub banda 0 - el mDot usará los 64 canales        if ((ret = dot->setPublicNetwork(true)) != mDot::MDOT_OK) {        logError("failed to set public network %d:%s", ret, mDot::getReturnCodeString(ret).c_str());    }    logInfo("setting frequency sub band");        if ((ret = dot->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) {        logError("failed to set frequency sub band %d:%s", ret, mDot::getReturnCodeString(ret).c_str());    }        logInfo("setting network name");    if ((ret = dot->setNetworkName(config_network_name)) != mDot::MDOT_OK) {        logError("failed to set network name %d:%s", ret, mDot::getReturnCodeString(ret).c_str());    }        logInfo("setting network password");    if ((ret = dot->setNetworkPassphrase(config_network_pass)) != mDot::MDOT_OK) {        logError("failed to set network password %d:%s", ret, mDot::getReturnCodeString(ret).c_str());    }        // un factor de expansión más alto permite un mayor alcance pero menor rendimiento    // en la banda de frecuencia 915 (EE. UU.), los factores de expansión 7 - 10 están disponibles    // en la banda de frecuencia 868 (UE), los factores de expansión 7 - 12 están disponibles    logInfo("setting TX spreading factor");    if ((ret = dot->setTxPower(20)) != mDot::MDOT_OK) {        logError("failed to set TX datarate %d:%s", ret, mDot::getReturnCodeString(ret).c_str());    }    logInfo("setting TX power");    if ((ret = dot->setTxDataRate(mDot::SF_9)) != mDot::MDOT_OK) {        logError("failed to set TX datarate %d:%s", ret, mDot::getReturnCodeString(ret).c_str());    }            // solicitar confirmación de recepción de paquetes del gateway    logInfo("enabling ACKs");    if ((ret = dot->setAck(1)) != mDot::MDOT_OK) {        logError("failed to enable ACKs %d:%s", ret, mDot::getReturnCodeString(ret).c_str());    }       // guardar esta configuración en la NVM del mDot    logInfo("saving config");    if (! dot->saveConfig()) {        logError("failed to save configuration");    }    //*******************************************    // fin de la configuración    //*******************************************    // intentar unirse a la red    logInfo("joining network");    while ((ret = dot->joinNetwork()) != mDot::MDOT_OK) {        logError("failed to join network %d:%s", ret, mDot::getReturnCodeString(ret).c_str());        // en la banda de frecuencia 868 (UE), necesitamos esperar hasta que otro canal esté disponible antes de transmitir nuevamente        osDelay(std::max((uint32_t)1000, (uint32_t)dot->getNextTxMs()));    }    // formatear datos para enviar al gateway    // datos uno    for (int i = 0; i send(data)) != mDot::MDOT_OK) {            logError("failed to send", ret, mDot::getReturnCodeString(ret).c_str());        } else {            logInfo("successfully sent data to gateway");        }        if ((ret = dot->send(data2)) != mDot::MDOT_OK) {            logError("failed to send", ret, mDot::getReturnCodeString(ret).c_str());        } else {            logInfo("successfully sent data to gateway");        }        if ((ret = dot->send(data3)) != mDot::MDOT_OK) {            logError("failed to send", ret, mDot::getReturnCodeString(ret).c_str());        } else {            logInfo("successfully sent data to gateway");        }        // en la banda de frecuencia 868 (UE), necesitamos esperar hasta que otro canal esté disponible antes de transmitir nuevamente        osDelay(std::max((uint32_t)5000, (uint32_t)dot->getNextTxMs()));    }    return 0;}
¿Ha quedado contestada tu pregunta?