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
Inicia sesión en tu cuenta de mbed y ve a Plataformas.
Selecciona MultiTech bajo el proveedor de la plataforma.
Haz clic en MultiTech mDot y luego haz clic en Agregar a tu compilador mbed.
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;}