mDot processor with ROHM sensor board on UDK2.

Dependencies:   MbedJSONValue libmDot mbed-rtos mbed

Fork of VVV_MultiTech_Dragonfly_ATT_Dallas by Paul Jaeger

Files at this revision

API Documentation at this revision

Comitter:
BlueShadow
Date:
Fri Feb 26 02:42:23 2016 +0000
Parent:
7:dd550a829ece
Child:
9:10082fc85d18
Commit message:
was working, started to add the LoRa Connect code to the device and thought best to create a quick reference.;

Changed in this revision

libmDot.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
mtsas.lib Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libmDot.lib	Fri Feb 26 02:42:23 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/MultiTech/code/libmDot/#0b4eb17d07ae
--- a/main.cpp	Fri Dec 11 16:00:08 2015 +0000
+++ b/main.cpp	Fri Feb 26 02:42:23 2016 +0000
@@ -1,13 +1,16 @@
 /*************************************************************************
+ * Originally this was a 
  * Dragonfly Example program for 2015 AT&T Government Solutions Hackathon
  *
+ * This is in process of being convertered to a mDot processor.  mDot has a
+ * limited set of IO that are available to the ROHM board.  Most of the
+ * Sensors will be used but the ones that can't have been commented out.
+ *
  * The following hardware is required to successfully run this program:
  *   - MultiTech UDK2 (4" square white PCB with Arduino headers, antenna
  *     connector, micro USB ports, and 40-pin connector for Dragonfly)
- *   - MultiTech Dragonfly (1"x2" green PCB with Telit radio)
- *   - Seeed Studio Base Shield
- *   - Grove moisture sensor (to connect to Base Shield)
- *   - Grove button (to connect to Base Shield)
+ *   - MultiTech mDot with a LoRa radio
+ *   - Seeed Studio Base Shield to elevate the ROHM board connectors away from mDOt
  *   - MEMs Inertial and Environmental Nucleo Expansion board (LSM6DS0
  *     3-axis accelerometer + 3-axis gyroscope, LIS3MDL 3-axis
  *     magnetometer, HTS221 humidity and temperature sensor and LPS25HB
@@ -17,9 +20,8 @@
  *   - reads data from all sensors on MEMs board and moisture sensor on a
  *     periodic basis
  *   - prints all sensor data to debug port on a periodic basis
- *   - optionally send a SMS containing sensor data when the Grove Button
- *     is pushed
- *       - you need to set the "phone_number" field
+ *   - optionally sends LoRa sensor data when the timer expires
+ *        THis needs to be written yet.
  *   - optionally sends sensor data to AT&T M2X cloud platform (user must
  *     create own M2X account and configure a device)
  *       - you need to set the "m2x_api_key" field and the "m2x_device_id"
@@ -28,27 +30,22 @@
  *         work
  *
  * Setup:
- *   - Correctly insert SIM card into Dragonfly
- *   - Seat the Dragonfly on the UDK2 board
- *   - Connect an antenna to the connector on the Dragonfly labled "M"
+ *   - Seat the mDot on the UDK2 board
  *   - Stack the Base Shield on the UDK2 Arduino headers
- *   - Connect the Grove button to the D8 socket on the Base Shield
- *   - Connect the Grove moisture sensor to the A0 socket on the Base
- *     Shield
  *   - Make sure the reference voltage selector switch (next to the A0
- *     socket) is switched to 5V so you get accurate analog readings
+ *     socket) is switched to 3.3V so you don't blow the mDot analog converter
+  *    accuracy will suffer as a result when compared to 5V.
  *   - Stack the MEMs board on top of the Base Shield
  *   - Plug in the power cable
- *   - Plug a micro USB cable into the port below and slightly to the
- *     left of the Dragonfly (NOT the port on the Dragonfly)
+ *   - Plug a micro USB cable away from the multiple LED String
  *
  * Go have fun and make something cool!
  *
  ************************************************************************/
 /*
 Sample Program Description:
-   This Program will enable to Multi-Tech Dragonfly platform to utilize ROHM's Multi-sensor Shield Board.
-   This program will initialize all sensors on the shield and then read back the sensor data.
+   This Program will enable to Multi-Tech mDot platform to utilize ROHM's Multi-sensor Shield Board.
+   This program will initialize most of the sensors on the shield and then read back the sensor data.
    Data will then be output to the UART Debug Terminal every 1 second.
 
 Sample Program Author:
@@ -61,29 +58,21 @@
 
 
 #include "mbed.h"
-#include "mtsas.h"
 #include "MbedJSONValue.h"
-#include "HTTPJson.h"
+// #include "HTTPJson.h"
 #include <string>
 
+//  added the following help files for a mDot not required for Dragonfly.
+#include "mDot.h"
+#include "MTSLog.h"
+#include <vector>
+#include <algorithm>
+#include "rtos.h"
+
+
 // Debug serial port
 static Serial debug(USBTX, USBRX);
 
-// MTSSerialFlowControl - serial link between processor and radio
-static MTSSerialFlowControl* io;
-
-// Cellular - radio object for cellular operations (SMS, TCP, etc)
-Cellular* radio;
-
-// APN associated with SIM card
-// this APN should work for the AT&T SIM that came with your Dragonfly
-//static const std::string apn = "";
-static const std::string apn = "";
-
-// Phone number to send SMS messages to
-// just change the x digits - the 1 needs to stay!
-static const std::string phone_number = "1xxxxxxxxxx";
-
 // see https://m2x.att.com/developer/documentation/v2/overview for M2X API documentation
 // M2X device ID
 static const std::string m2x_device_id = "";
@@ -93,8 +82,8 @@
 
 // set to true if you want to post to the cloud
 // you need to have you M2X account set up properly for this to work?
-//bool do_cloud_post = false;
-bool do_cloud_post = true;
+bool do_cloud_post = false;
+//bool do_cloud_post = true;
 
 std::string url = "http://api-m2x.att.com/v2/devices/" + m2x_device_id + "/update";
 
@@ -119,15 +108,13 @@
 int debug_baud = 115200;
 
 
-
-
 /****************************************************************************************************
 
  ****************************************************************************************************/
 
 //Macros for checking each of the different Sensor Devices
 #define AnalogTemp  //BDE0600
-#define AnalogUV    //ML8511
+// #define AnalogUV    //ML8511  // analog pin A4 on Arduino connector is not connected to the mDot on the UDK.
 #define HallSensor  //BU52011
 #define RPR0521     //RPR0521
 #define KMX62       //KMX61, Accel/Mag         
@@ -145,20 +132,20 @@
 
 //Define Sensor Variables
 #ifdef AnalogTemp
-AnalogIn    BDE0600_Temp(PC_4); //Mapped to A2
+AnalogIn    BDE0600_Temp(PC_1); //Mapped to A2  pin 15 on the mDot
 uint16_t    BDE0600_Temp_value;
 float       BDE0600_output;
 #endif
 
-#ifdef AnalogUV
-AnalogIn    ML8511_UV(PC_1);    //Mapped to A4
-uint16_t    ML8511_UV_value;
-float       ML8511_output;
-#endif
+//#ifdef AnalogUV                // analog pin A4 on Arduino connector is not connected to the mDot on the UDK.
+//AnalogIn    ML8511_UV(PA_7);    //Mapped to A4  not a pin routed on the UDK to the mDot
+//uint16_t    ML8511_UV_value;
+//float       ML8511_output;
+//#endif
 
 #ifdef HallSensor
-DigitalIn   Hall_GPIO0(PC_8);
-DigitalIn   Hall_GPIO1(PB_5);
+DigitalIn   Hall_GPIO0(PA_4);       // assigned to D10 on Arduino, mapped to pin 17 on mDot
+DigitalIn   Hall_GPIO1(PA_7);       // assigned to D11 on Arduino, mapped to pin 11 on mDot
 int         Hall_Return1;
 int         Hall_Return0;
 int32_t     Hall_Return[2];
@@ -273,7 +260,7 @@
  ****************************************************************************************************/
 bool init_mtsas();
 void ReadAnalogTemp();
-void ReadAnalogUV ();
+// void ReadAnalogUV ();   // analog pin A4 on Arduino connector is not connected to the mDot on the UDK.
 void ReadHallSensor ();
 void ReadCOLOR ();
 void ReadRPR0521_ALS ();
@@ -282,12 +269,18 @@
 void ReadPressure ();
 void ReadKX022();
 
+// these options must match the settings on your Conduit
+// uncomment the following lines and edit their values to match your configuration
+static std::string config_network_name = "Arrow123";
+static std::string config_network_pass = "Arrow123";
+static uint8_t config_frequency_sub_band = 1;
+
 /****************************************************************************************************
 // main
  ****************************************************************************************************/
 int main()
 {
-    mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL);
+    mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL);  //NONE_, FATAL_, ERROR_, WARNING_, INFO_, DEBUG_, TRACE_
     debug.baud(debug_baud);
     logInfo("starting...");
 
@@ -328,19 +321,83 @@
 #endif
 //End I2C Initialization Section **********************************************************
 
+//Initialize the mDot  ********************************************************************
+    int32_t ret;
+    mDot* dot;
+    std::vector<uint8_t> data;
+    std::string data_str = "hello! Jeff";
+    
+    // get a mDot handle
+    dot = mDot::getInstance();
+    
+    // print library version information
+    logInfo("version: %s", dot->getId().c_str());
 
-// Initialization Radio Section **********************************************************
+    //*******************************************
+    // configuration
+    //*******************************************
+    // reset to default config so we know what state we're in
+    dot->resetConfig();
+    
+    dot->setLogLevel(mts::MTSLog::TRACE_LEVEL);  //INFO_LEVEL
 
-    radio_ok = init_mtsas();
-    if (! radio_ok)
-        logError("MTSAS init failed");
-    else
-        logInfo("MTSAS is ok");
+    // set up the mDot with our network information: frequency sub band, network name, and network password
+    // these can all be saved in NVM so they don't need to be set every time - see mDot::saveConfig()
+    
+    // frequency sub band is only applicable in the 915 (US) frequency band
+    // if using a MultiTech Conduit gateway, use the same sub band as your Conduit (1-8) - the mDot will use the 8 channels in that sub band
+    // if using a gateway that supports all 64 channels, use sub band 0 - the mDot will use all 64 channels
+    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());
+    }
+    
+    // a higher spreading factor allows for longer range but lower throughput
+    // in the 915 (US) frequency band, spreading factors 7 - 10 are available
+    // in the 868 (EU) frequency band, spreading factors 7 - 12 are available
+    logInfo("setting TX spreading factor");
+    if ((ret = dot->setTxDataRate(mDot::SF_10)) != mDot::MDOT_OK) {
+        logError("failed to set TX datarate %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
+    }
+    
+    // request receive confirmation of packets from the 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());
+    }
+    
+    // save this configuration to the mDot's NVM
+    logInfo("saving config");
+    if (! dot->saveConfig()) {
+        logError("failed to save configuration");
+    }
+    //*******************************************
+    // end of configuration
+    //*******************************************
 
-//End Radio Initialization Section **********************************************************
+    // attempt to join the network
+    logInfo("joining network");
+    while ((ret = dot->joinNetwork()) != mDot::MDOT_OK) {
+        logError("failed to join network %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
+        // in the 868 (EU) frequency band, we need to wait until another channel is available before transmitting again
+        osDelay(std::max((uint32_t)1000, (uint32_t)dot->getNextTxMs()));
+    }
 
-//    button.fall(&button_irq);
+    // format data for sending to the gateway
+    for (std::string::iterator it = data_str.begin(); it != data_str.end(); it++)
+        data.push_back((uint8_t) *it);
 
+// END Initialization of mDot  ******************************************************************
 
     Timer thpm_timer;
     thpm_timer.start();         // Timer data is set in the Variable seciton see misc variables    Timer motion_timer;
@@ -353,6 +410,7 @@
     Timer sms_timer;
     sms_timer.start();
 #endif
+
 #ifdef Web
     Timer post_timer;
     post_timer.start();
@@ -364,9 +422,9 @@
             ReadAnalogTemp ();
 #endif
 
-#ifdef AnalogUV
-            ReadAnalogUV ();
-#endif
+//#ifdef AnalogUV       // analog pin A4 on Arduino connector is not connected to the mDot on the UDK.
+//            ReadAnalogUV ();
+//#endif
 
 #ifdef HallSensor
             ReadHallSensor ();
@@ -402,7 +460,7 @@
             logDebug("%s", wall_of_dash);
             logDebug("SENSOR DATA");
             logDebug("temperature: %0.2f C", BM1383[0]);
-            logDebug("analog uv: %.1f mW/cm2", ML8511_output);
+//            logDebug("analog uv: %.1f mW/cm2", ML8511_output);  // analog pin A4 on Arduino connector is not connected to the mDot on the UDK.
             logDebug("ambient Light  %0.3f", RPR0521_ALS[0]);
             logDebug("proximity count  %0.3f", RPR0521_ALS[1]);
             logDebug("hall effect: South %d\t North %d",  Hall_Return[0],Hall_Return[1]);
@@ -421,14 +479,14 @@
             sms_timer.reset();
             logInfo("SMS Send Routine");
 printf("  In sms routine \r\n");
-            if (radio_ok) {
-                MbedJSONValue sms_json;
-                string sms_str;
-
+//            if (radio_ok) {
+//                MbedJSONValue sms_json;
+//                string sms_str;
+//
 //                sms_json["temp_C"] = BDE0600_output;
 //                sms_json["UV"] = ML8511_output;
-                sms_json["Ambient Light"] = RPR0521_ALS[0];
-                sms_json["Prox"]      = RPR0521_ALS[1];
+//                sms_json["Ambient Light"] = RPR0521_ALS[0];
+//                sms_json["Prox"]      = RPR0521_ALS[1];
 //                sms_json["pressure_hPa"] = BM1383[1];
 //                sms_json["mag_mgauss"]["x"] = MEMS_Mag[0];
 //                sms_json["mag_mgauss"]["y"] = MEMS_Mag[1];
@@ -439,81 +497,63 @@
 //                sms_json["Red"]   = BH1745[0];
 //                sms_json["Green"] = BH1745[1];
 //                sms_json["Blue"]  = BH1745[2];
-
-                sms_str = "SENSOR DATA:\n";
-                sms_str += sms_json.serialize();
-
-                logDebug("sending SMS to %s:\r\n%s", phone_number.c_str(), sms_str.c_str());
-                Code ret = radio->sendSMS(phone_number, sms_str);
-                if (ret != MTS_SUCCESS)
-                    logError("sending SMS failed");
-            }
+//
+//                sms_str = "SENSOR DATA:\n";
+//                sms_str += sms_json.serialize();
+//
+//                logDebug("sending SMS to %s:\r\n%s", phone_number.c_str(), sms_str.c_str());
+//                Code ret = radio->sendSMS(phone_number, sms_str);
+//                if (ret != MTS_SUCCESS)
+//                    logError("sending SMS failed");
+//            }
         }
 #endif
+
 #ifdef Web
         if (post_timer.read_ms() > post_interval_ms && do_cloud_post) {
     printf("in web\n\r");
-            if (radio->connect()) {
-                logDebug("posting sensor data");
-
-                HTTPClient http;
-                MbedJSONValue http_json_data;
-                std::string http_json_str;
-                std::string m2x_header = "X-M2X-KEY: " + m2x_api_key + "\r\n";
-                int ret;
-                char http_response_buf[256];
-                HTTPText http_response(http_response_buf, sizeof(http_response_buf));
-
-                // temp_c, temp_f, humidity, pressure, and moisture are all stream IDs for my device in M2X
-                // modify these to match your streams or give your streams the same name
-                http_json_data["values"]["temp_c"] = BDE0600_output;
-                http_json_data["values"]["UV"] = ML8511_output;
-                http_json_data["values"]["Ambient Light"] = RPR0521_ALS[0];
-                http_json_data["values"]["Prox"] = RPR0521_ALS[1];
-                http_json_str = http_json_data.serialize();
-
-                // add extra header with M2X API key
-                http.setHeader(m2x_header.c_str());
-
-                HTTPJson http_json((char*)  http_json_str.c_str());
-                ret = http.post(url.c_str(), http_json, &http_response);
-                if (ret != HTTP_OK)
-                    logError("posting data to cloud failed: [%d][%s]", ret, http_response_buf);
-                else
-                    logDebug("post result [%d][%s]", http.getHTTPResponseCode(), http_response_buf);
-
-                radio->disconnect();
-            } else {
-                logError("establishing PPP link failed");
-            }
+//            if (radio->connect()) {
+//                logDebug("posting sensor data");
+//
+//                HTTPClient http;
+//                MbedJSONValue http_json_data;
+//                std::string http_json_str;
+//                std::string m2x_header = "X-M2X-KEY: " + m2x_api_key + "\r\n";
+//                int ret;
+//                char http_response_buf[256];
+//                HTTPText http_response(http_response_buf, sizeof(http_response_buf));
+//
+//                // temp_c, temp_f, humidity, pressure, and moisture are all stream IDs for my device in M2X
+//                // modify these to match your streams or give your streams the same name
+//                http_json_data["values"]["temp_c"] = BDE0600_output;
+//                http_json_data["values"]["UV"] = ML8511_output;
+//                http_json_data["values"]["Ambient Light"] = RPR0521_ALS[0];
+//                http_json_data["values"]["Prox"] = RPR0521_ALS[1];
+//                http_json_str = http_json_data.serialize();
+//
+//                // add extra header with M2X API key
+//                http.setHeader(m2x_header.c_str());
+//
+//                HTTPJson http_json((char*)  http_json_str.c_str());
+//                ret = http.post(url.c_str(), http_json, &http_response);
+//                if (ret != HTTP_OK)
+//                    logError("posting data to cloud failed: [%d][%s]", ret, http_response_buf);
+//                else
+//                    logDebug("post result [%d][%s]", http.getHTTPResponseCode(), http_response_buf);
+//
+//                radio->disconnect();
+//            } else {
+//                logError("establishing PPP link failed");
+//            }
 
             post_timer.reset();
         }
 #endif
+
         wait_ms(10);
     }
 }
 
-// init functions
-bool init_mtsas()
-{
-    io = new MTSSerialFlowControl(RADIO_TX, RADIO_RX, RADIO_RTS, RADIO_CTS);
-    if (! io)
-        return false;
-
-    io->baud(115200);
-    radio = CellularFactory::create(io);
-    if (! radio)
-        return false;
-
-    Code ret = radio->setApn(apn);
-    if (ret != MTS_SUCCESS)
-        return false;
-
-    Transport::setTransport(radio);
-
-    return true;
-}
 
 
 // Sensor data acquisition functions
@@ -531,18 +571,18 @@
 }
 #endif
 
-#ifdef AnalogUV
-void ReadAnalogUV ()
-{
-    ML8511_UV_value = ML8511_UV.read_u16();
-    ML8511_output = (float)ML8511_UV_value * (float)0.000050354; //(value * (3.3V/65535))   //Note to self: when playing with this, a negative value is seen... Honestly, I think this has to do with my ADC converstion...
-    ML8511_output = (ML8511_output-(float)2.2)/((float)0.129) + 10;                           // Added +5 to the offset so when inside (aka, no UV, readings show 0)... this is the wrong approach... and the readings don't make sense... Fix this.
+//#ifdef AnalogUV       // analog pin A4 on Arduino connector is not connected to the mDot on the UDK.
+//void ReadAnalogUV ()
+//{
+//    ML8511_UV_value = ML8511_UV.read_u16();
+//    ML8511_output = (float)ML8511_UV_value * (float)0.000050354; //(value * (3.3V/65535))   //Note to self: when playing with this, a negative value is seen... Honestly, I think this has to do with my ADC converstion...
+//    ML8511_output = (ML8511_output-(float)2.2)/((float)0.129) + 10;                           // Added +5 to the offset so when inside (aka, no UV, readings show 0)... this is the wrong approach... and the readings don't make sense... Fix this.
 
 //    printf("ML8511 Analog UV Sensor Data:\r\n");
 //    printf(" UV = %.1f mW/cm2\r\n", ML8511_output);
 
-}
-#endif
+//}
+//#endif
 
 
 #ifdef HallSensor
@@ -753,10 +793,3 @@
     printf(" Pressure   = %0.2f hPa\r\n", BM1383[1]);
 
  **********************************************************************************/
-
-
-
-
-
-
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Fri Feb 26 02:42:23 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#07314541bd12
--- a/mbed.bld	Fri Dec 11 16:00:08 2015 +0000
+++ b/mbed.bld	Fri Feb 26 02:42:23 2016 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/165afa46840b
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/252557024ec3
\ No newline at end of file
--- a/mtsas.lib	Fri Dec 11 16:00:08 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://developer.mbed.org/teams/MultiTech/code/mtsas/#1667a524c7a3