Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MbedJSONValue mbed mtsas
Fork of UUU_MultiTech_Dragonfly_Sprint_SF by
main.cpp
- Committer:
- BlueShadow
- Date:
- 2016-04-15
- Revision:
- 8:e78dcfad254b
- Parent:
- 7:dd550a829ece
- Child:
- 9:6475e1b83491
File content as of revision 8:e78dcfad254b:
/*************************************************************************
* Dragonfly Example program for 2016 Sprint Exosite Training
*
* 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)
* - Rohm Electronics Sensor Board
* - Expansion board (LSM6DS0
* 3-axis accelerometer + 3-axis gyroscope, LIS3MDL 3-axis
* magnetometer, HTS221 humidity and temperature sensor and LPS25HB
* pressure sensor)
*
* What this program does:
* - reads data from all sensors on board
* - prints all sensor data to debug port on a periodic basis
* - optionally send data to Exosite
* - All data is sent to a specific location determined by the student login.
* - Exosite cloud platform (user must create own account and configure a device
* - you need to set the "VENDOR" and "MODEL"
* - you need to set the "do_cloud_post" flag to true for this to
* 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"
* - Stack the Base Shield on the UDK2 Arduino headers
* - 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)
*
* 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.
Data will then be output to the UART Debug Terminal every 1 second.
Sample Program Author:
ROHM USDC
Additional Resources:
ROHM Sensor Shield GitHub Repository: https://github.com/ROHMUSDC/ROHM_SensorPlatform_Multi-Sensor-Shield
*/
#include "mbed.h"
#include "mtsas.h"
#include <string>
#include <sstream>
#define EXOSITE_CIK "1e05228e50762cc29cf414bc518259a3ab5dc247"
char EXOSITE_HEADER[] = "X-Exosite-CIK: " EXOSITE_CIK "\r\nAccept: application/x-www-form-urlencoded; charset=utf-8\r\n";
const char EXOSITE_URL[] = "https://m2.exosite.com:443/onep:v1/stack/alias";
DigitalOut Led1Out(LED1);
// 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 = "b2b.tmobile.com";
// set to true if you want to post to the cloud
//bool do_cloud_post = false;
bool do_cloud_post = true;
// variables for sensor data
float temp_celsius;
float humidity_percent;
float pressure_mbar;
float moisture_percent;
int32_t mag_mgauss[3];
int32_t acc_mg[3];
int32_t gyro_mdps[3];
// misc variables
static int post_interval_ms = 30000;
int debug_baud = 115200;
/****************************************************************************************************
****************************************************************************************************/
//Macros for checking each of the different Sensor Devices
#define AnalogTemp //BDE0600
#define AnalogUV //ML8511
#define HallSensor //BU52011
#define RPR0521 //RPR0521
#define KMX62 //KMX61, Accel/Mag
#define COLOR //BH1745
#define KX022 //KX022, Accel Only
#define Pressure //BM1383
//Define Pins for I2C Interface
I2C i2c(I2C_SDA, I2C_SCL);
bool RepStart = true;
bool NoRepStart = false;
//Define Sensor Variables
#ifdef AnalogTemp
AnalogIn BDE0600_Temp(PC_4); //Mapped to A2
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 HallSensor
DigitalIn Hall_GPIO0(PC_8);
DigitalIn Hall_GPIO1(PB_5);
int Hall_Return1;
int Hall_Return0;
int32_t Hall_Return[2];
#endif
#ifdef RPR0521
int RPR0521_addr_w = 0x70; //7bit addr = 0x38, with write bit 0
int RPR0521_addr_r = 0x71; //7bit addr = 0x38, with read bit 1
char RPR0521_ModeControl[2] = {0x41, 0xE6};
char RPR0521_ALSPSControl[2] = {0x42, 0x03};
char RPR0521_Persist[2] = {0x43, 0x20};
char RPR0521_Addr_ReadData = 0x44;
char RPR0521_Content_ReadData[6];
int RPR0521_PS_RAWOUT = 0; //this is an output
float RPR0521_PS_OUT = 0;
int RPR0521_ALS_D0_RAWOUT = 0;
int RPR0521_ALS_D1_RAWOUT = 0;
float RPR0521_ALS_DataRatio = 0;
float RPR0521_ALS_OUT = 0; //this is an output
float RPR0521_ALS[2]; // is this ok taking an int to the [0] value and float to [1]???????????
#endif
#ifdef KMX62
int KMX62_addr_w = 0x1C; //7bit addr = 0x38, with write bit 0
int KMX62_addr_r = 0x1D; //7bit addr = 0x38, with read bit 1
char KMX62_CNTL2[2] = {0x3A, 0x5F};
char KMX62_Addr_Accel_ReadData = 0x0A;
char KMX62_Content_Accel_ReadData[6];
char KMX62_Addr_Mag_ReadData = 0x10;
char KMX62_Content_Mag_ReadData[6];
short int MEMS_Accel_Xout = 0;
short int MEMS_Accel_Yout = 0;
short int MEMS_Accel_Zout = 0;
double MEMS_Accel_Conv_Xout = 0;
double MEMS_Accel_Conv_Yout = 0;
double MEMS_Accel_Conv_Zout = 0;
short int MEMS_Mag_Xout = 0;
short int MEMS_Mag_Yout = 0;
short int MEMS_Mag_Zout = 0;
float MEMS_Mag_Conv_Xout = 0;
float MEMS_Mag_Conv_Yout = 0;
float MEMS_Mag_Conv_Zout = 0;
double MEMS_Accel[3];
float MEMS_Mag[3];
#endif
#ifdef COLOR
int BH1745_addr_w = 0x72; //write
int BH1745_addr_r = 0x73; //read
char BH1745_persistence[2] = {0x61, 0x03};
char BH1745_mode1[2] = {0x41, 0x00};
char BH1745_mode2[2] = {0x42, 0x92};
char BH1745_mode3[2] = {0x43, 0x02};
char BH1745_Content_ReadData[6];
char BH1745_Addr_color_ReadData = 0x50;
int BH1745_Red;
int BH1745_Blue;
int BH1745_Green;
int32_t BH1745[3]; //Red, Blue Green matrix
#endif
#ifdef KX022
int KX022_addr_w = 0x3C; //write
int KX022_addr_r = 0x3D; //read
char KX022_Accel_CNTL1[2] = {0x18, 0x41};
char KX022_Accel_ODCNTL[2] = {0x1B, 0x02};
char KX022_Accel_CNTL3[2] = {0x1A, 0xD8};
char KX022_Accel_TILT_TIMER[2] = {0x22, 0x01};
char KX022_Accel_CNTL2[2] = {0x18, 0xC1};
char KX022_Content_ReadData[6];
char KX022_Addr_Accel_ReadData = 0x06;
float KX022_Accel_X;
float KX022_Accel_Y;
float KX022_Accel_Z;
short int KX022_Accel_X_RawOUT = 0;
short int KX022_Accel_Y_RawOUT = 0;
short int KX022_Accel_Z_RawOUT = 0;
int KX022_Accel_X_LB = 0;
int KX022_Accel_X_HB = 0;
int KX022_Accel_Y_LB = 0;
int KX022_Accel_Y_HB = 0;
int KX022_Accel_Z_LB = 0;
int KX022_Accel_Z_HB = 0;
float KX022_Accel[3];
#endif
#ifdef Pressure
int Press_addr_w = 0xBA; //write
int Press_addr_r = 0xBB; //read
char PWR_DOWN[2] = {0x12, 0x01};
char SLEEP[2] = {0x13, 0x01};
char Mode_Control[2] = {0x14, 0xC4};
char Press_Content_ReadData[6];
char Press_Addr_ReadData =0x1A;
int BM1383_Temp_highByte;
int BM1383_Temp_lowByte;
int BM1383_Pres_highByte;
int BM1383_Pres_lowByte;
int BM1383_Pres_leastByte;
short int BM1383_Temp_Out;
float BM1383_Temp_Conv_Out;
float BM1383_Pres_Conv_Out;
float_t BM1383[2]; // Temp is 0 and Pressure is 1
float BM1383_Var;
float BM1383_Deci;
#endif
/****************************************************************************************************
// function prototypes
****************************************************************************************************/
bool init_mtsas();
void ReadAnalogTemp();
void ReadAnalogUV ();
void ReadHallSensor ();
void ReadCOLOR ();
void ReadRPR0521_ALS ();
void ReadKMX62_Accel ();
void ReadKMX62_Mag ();
void ReadPressure ();
void ReadKX022();
char* httpResToStr(HTTPResult res);
namespace patch
{
template < typename T > std::string to_string( const T& n )
{
std::ostringstream stm ;
stm << n ;
return stm.str() ;
}
}
/****************************************************************************************************
// main
****************************************************************************************************/
int main()
{
mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL);
debug.baud(debug_baud);
// Initialization Radio Section **********************************************************
logInfo("initializing cellular radio");
if (!init_mtsas()) {
while (true) {
logError("failed to initialize cellular radio");
wait(1);
}
}
logInfo("Configuring http...\r\n");
HTTPClient http;
HTTPResult result;
http.setHeader(EXOSITE_HEADER);
char http_rx_buf[1024];
// IHTTPDataIn object - will contain data received from server.
HTTPText http_rx(http_rx_buf, sizeof(http_rx_buf));
// IHTTPDataOut object - contains data to be posted to server.
HTTPMap http_tx;
//****************************************************************************************************
// Initialize I2C Devices ************
//****************************************************************************************************/
//****************************************************************************************************/
//End I2C Initialization Section **********************************************************
//****************************************************************************************************/
Timer post_timer;
post_timer.start();
logInfo("Setup complete.");
logInfo("Waiting for %d ms to trigger connect...", post_interval_ms);
while (true) {
if (post_timer.read_ms() > post_interval_ms && do_cloud_post) {
logInfo("bringing up the link");
if (radio->connect()) {
float sensor_data = RPR0521_ALS_OUT;
logDebug("posting sensor data");
logDebug("%f",sensor_data);
http_tx.put("ALS", patch::to_string(sensor_data).c_str());
// Make HTTP POST request
result = http.post(EXOSITE_URL, http_tx, &http_rx);
if (result != HTTP_OK) {
logError("HTTP POST failed [%d][%s]", result, httpResToStr(result));
} else {
logInfo("HTTP POST succeeded [%d]\r\n%s", http.getHTTPResponseCode(), http_rx_buf);
}
radio->disconnect();
} else {
logError("establishing PPP link failed");
}
post_timer.reset();
logInfo("Waiting for %d ms to trigger connect...", post_interval_ms);
}
}
}
// 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;
}
char* httpResToStr(HTTPResult result) {
switch(result) {
case HTTP_PROCESSING:
return "HTTP_PROCESSING";
case HTTP_PARSE:
return "HTTP_PARSE";
case HTTP_DNS:
return "HTTP_DNS";
case HTTP_PRTCL:
return "HTTP_PRTCL";
case HTTP_NOTFOUND:
return "HTTP_NOTFOUND";
case HTTP_REFUSED:
return "HTTP_REFUSED";
case HTTP_ERROR:
return "HTTP_ERROR";
case HTTP_TIMEOUT:
return "HTTP_TIMEOUT";
case HTTP_CONN:
return "HTTP_CONN";
case HTTP_CLOSED:
return "HTTP_CLOSED";
case HTTP_REDIRECT:
return "HTTP_REDIRECT";
case HTTP_OK:
return "HTTP_OK";
default:
return "HTTP Result unknown";
}
}
