Example of using the mDot UDK with the X-NUCLEO-IKS01A1 shield

Dependencies:   mDot_X_NUCLEO_IKS01A1 libmDot-dev-mbed5-deprecated

Hardware

Hardware List

Setup

  • Install the mDot on the developer board.
  • Install the IKS01A1 on the developer board.
  • If using a MTUDK-ST-CELL (white board) plug in the AC power adapter
  • Connect the microusb power to your development PC
    • if using a MTUDK-ST-CELL there are 2 microusb ports. Use the one closest to the serial port.

Your developer board should look like the following:

/media/uploads/pferland/udk_iks01a1.jpg

Software

This example program uses LoRa utility functions from Dot-Examples and the IKS01A1 library from ST Micro.

LoRa Configuration

Senet

By default this program is configured to connect to the Senet network. To connect to Senet you will need to register your mDot's Node ID with the Senet developer portal and change the network_key array in main.cpp.

Others

To connect to a different LoRa gateway change the arrays network_id and network_key. If you are using passphrases, edit the strings network_name and network_key, uncomment the function "update_ota_config_name_phrase" and comment out the function "update_ota_config_id_key".

Committer:
pferland
Date:
Fri Dec 09 15:56:42 2016 +0000
Revision:
0:9e88a9018fc0
Child:
2:d0873bb1255f
Added logging functions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pferland 0:9e88a9018fc0 1 #include "mbed.h"
pferland 0:9e88a9018fc0 2 #include "mDot.h"
pferland 0:9e88a9018fc0 3 #include "x_nucleo_iks01a1.h"
pferland 0:9e88a9018fc0 4 #include "dot_util.h"
pferland 0:9e88a9018fc0 5 #include "RadioEvent.h"
pferland 0:9e88a9018fc0 6
pferland 0:9e88a9018fc0 7 static std::string network_name = "TestTest";
pferland 0:9e88a9018fc0 8 static std::string network_passphrase = "TestTest";
pferland 0:9e88a9018fc0 9 static uint8_t frequency_sub_band = 1;
pferland 0:9e88a9018fc0 10 static bool public_network = false;
pferland 0:9e88a9018fc0 11 static uint8_t ack = 0;
pferland 0:9e88a9018fc0 12
pferland 0:9e88a9018fc0 13 mDot *dot = NULL;
pferland 0:9e88a9018fc0 14 Serial pc(USBTX, USBRX);
pferland 0:9e88a9018fc0 15
pferland 0:9e88a9018fc0 16 int main()
pferland 0:9e88a9018fc0 17 {
pferland 0:9e88a9018fc0 18 // Custom event handler for automatically displaying RX data
pferland 0:9e88a9018fc0 19 RadioEvent events;
pferland 0:9e88a9018fc0 20 pc.baud(115200);
pferland 0:9e88a9018fc0 21
pferland 0:9e88a9018fc0 22 /* Initialize mDot */
pferland 0:9e88a9018fc0 23
pferland 0:9e88a9018fc0 24 mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL);
pferland 0:9e88a9018fc0 25 dot = mDot::getInstance();
pferland 0:9e88a9018fc0 26 dot->setEvents(&events);
pferland 0:9e88a9018fc0 27
pferland 0:9e88a9018fc0 28
pferland 0:9e88a9018fc0 29 /* Instantiate the expansion board */
pferland 0:9e88a9018fc0 30 X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15);
pferland 0:9e88a9018fc0 31
pferland 0:9e88a9018fc0 32 /* Retrieve the composing elements of the expansion board */
pferland 0:9e88a9018fc0 33 GyroSensor *gyroscope = mems_expansion_board->GetGyroscope();
pferland 0:9e88a9018fc0 34 MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer();
pferland 0:9e88a9018fc0 35 MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
pferland 0:9e88a9018fc0 36 HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;
pferland 0:9e88a9018fc0 37 PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor;
pferland 0:9e88a9018fc0 38 TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor;
pferland 0:9e88a9018fc0 39 TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor;
pferland 0:9e88a9018fc0 40
pferland 0:9e88a9018fc0 41
pferland 0:9e88a9018fc0 42 if (!dot->getStandbyFlag()) {
pferland 0:9e88a9018fc0 43 logInfo("mbed-os library version: %d", MBED_LIBRARY_VERSION);
pferland 0:9e88a9018fc0 44 // start from a well-known state
pferland 0:9e88a9018fc0 45 logInfo("defaulting Dot configuration");
pferland 0:9e88a9018fc0 46 dot->resetConfig();
pferland 0:9e88a9018fc0 47 dot->resetNetworkSession();
pferland 0:9e88a9018fc0 48
pferland 0:9e88a9018fc0 49 // update configuration if necessary
pferland 0:9e88a9018fc0 50 // in AUTO_OTA mode the session is automatically saved, so saveNetworkSession and restoreNetworkSession are not needed
pferland 0:9e88a9018fc0 51 if (dot->getJoinMode() != mDot::AUTO_OTA) {
pferland 0:9e88a9018fc0 52 logInfo("changing network join mode to AUTO_OTA");
pferland 0:9e88a9018fc0 53 if (dot->setJoinMode(mDot::AUTO_OTA) != mDot::MDOT_OK) {
pferland 0:9e88a9018fc0 54 logError("failed to set network join mode to AUTO_OTA");
pferland 0:9e88a9018fc0 55 }
pferland 0:9e88a9018fc0 56 }
pferland 0:9e88a9018fc0 57 // in OTA and AUTO_OTA join modes, the credentials can be passed to the library as a name and passphrase or an ID and KEY
pferland 0:9e88a9018fc0 58 // only one method or the other should be used!
pferland 0:9e88a9018fc0 59 // network ID = crc64(network name)
pferland 0:9e88a9018fc0 60 // network KEY = cmac(network passphrase)
pferland 0:9e88a9018fc0 61 update_ota_config_name_phrase(network_name, network_passphrase, frequency_sub_band, public_network, ack);
pferland 0:9e88a9018fc0 62
pferland 0:9e88a9018fc0 63 // configure network link checks
pferland 0:9e88a9018fc0 64 // network link checks are a good alternative to requiring the gateway to ACK every packet and should allow a single gateway to handle more Dots
pferland 0:9e88a9018fc0 65 // check the link every count packets
pferland 0:9e88a9018fc0 66 // declare the Dot disconnected after threshold failed link checks
pferland 0:9e88a9018fc0 67 // for count = 3 and threshold = 5, the Dot will be considered disconnected after 15 missed packets in a row
pferland 0:9e88a9018fc0 68 update_network_link_check_config(3, 5);
pferland 0:9e88a9018fc0 69
pferland 0:9e88a9018fc0 70 // save changes to configuration
pferland 0:9e88a9018fc0 71 logInfo("saving configuration");
pferland 0:9e88a9018fc0 72 if (!dot->saveConfig()) {
pferland 0:9e88a9018fc0 73 logError("failed to save configuration");
pferland 0:9e88a9018fc0 74 }
pferland 0:9e88a9018fc0 75
pferland 0:9e88a9018fc0 76 // display configuration
pferland 0:9e88a9018fc0 77 display_config();
pferland 0:9e88a9018fc0 78 } else {
pferland 0:9e88a9018fc0 79 // restore the saved session if the dot woke from deepsleep mode
pferland 0:9e88a9018fc0 80 // useful to use with deepsleep because session info is otherwise lost when the dot enters deepsleep
pferland 0:9e88a9018fc0 81 logInfo("restoring network session from NVM");
pferland 0:9e88a9018fc0 82 dot->restoreNetworkSession();
pferland 0:9e88a9018fc0 83 }
pferland 0:9e88a9018fc0 84
pferland 0:9e88a9018fc0 85 while (true) {
pferland 0:9e88a9018fc0 86 std::vector<uint8_t> tx_data;
pferland 0:9e88a9018fc0 87
pferland 0:9e88a9018fc0 88 // join network if not joined
pferland 0:9e88a9018fc0 89 if (!dot->getNetworkJoinStatus()) {
pferland 0:9e88a9018fc0 90 join_network();
pferland 0:9e88a9018fc0 91 }
pferland 0:9e88a9018fc0 92 // Retrieve sensor data and prepare the packet.
pferland 0:9e88a9018fc0 93 //temp floats
pferland 0:9e88a9018fc0 94 float value1, value2;
pferland 0:9e88a9018fc0 95 // HTS221 Humidity sensor
pferland 0:9e88a9018fc0 96 temp_sensor1->GetTemperature(&value1);
pferland 0:9e88a9018fc0 97 humidity_sensor->GetHumidity(&value2);
pferland 0:9e88a9018fc0 98 //serialize data and append to packet
pferland 0:9e88a9018fc0 99 tx_data.push_back(uint8_t(0xFF & *((uint32_t*)(&value1))));
pferland 0:9e88a9018fc0 100 tx_data.push_back(uint8_t((0xFF << 2 ) & *((uint32_t*)(&value1))));
pferland 0:9e88a9018fc0 101 tx_data.push_back(uint8_t((0xFF << 4 ) & *((uint32_t*)(&value1))));
pferland 0:9e88a9018fc0 102 tx_data.push_back(uint8_t((0xFF << 6 ) & *((uint32_t*)(&value1))));
pferland 0:9e88a9018fc0 103 logInfo("Temperature data %d", value1);
pferland 0:9e88a9018fc0 104 send_data(tx_data);
pferland 0:9e88a9018fc0 105
pferland 0:9e88a9018fc0 106 // if going into deepsleep mode, save the session so we don't need to join again after waking up
pferland 0:9e88a9018fc0 107 // not necessary if going into sleep mode since RAM is retained
pferland 0:9e88a9018fc0 108 logInfo("saving network session to NVM");
pferland 0:9e88a9018fc0 109 dot->saveNetworkSession();
pferland 0:9e88a9018fc0 110
pferland 0:9e88a9018fc0 111
pferland 0:9e88a9018fc0 112 // ONLY ONE of the three functions below should be uncommented depending on the desired wakeup method
pferland 0:9e88a9018fc0 113 //sleep_wake_rtc_only(deep_sleep);
pferland 0:9e88a9018fc0 114 //sleep_wake_interrupt_only(deep_sleep);
pferland 0:9e88a9018fc0 115 sleep_wake_rtc_or_interrupt(false);
pferland 0:9e88a9018fc0 116
pferland 0:9e88a9018fc0 117 }
pferland 0:9e88a9018fc0 118
pferland 0:9e88a9018fc0 119 return 0;
pferland 0:9e88a9018fc0 120 }