mDot processor with ROHM sensor board on UDK2.
Dependencies: MbedJSONValue libmDot mbed-rtos mbed
Fork of VVV_MultiTech_Dragonfly_ATT_Dallas by
Revision 8:720595aa7bfd, committed 2016-02-26
- 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
--- /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
