Training Material using MultiTech Socket Modem-H5, Aeris AerCloud, and ST X-Nucleo-IKS01A1

Dependencies:   AerCloud_MutliTech_Socket_Modem_Example MQTT Nucleo_Sensor_Shield mbed

Fork of AerCloud_MutliTech_Socket_Modem_Example by AerCloud

Committer:
BlueShadow
Date:
Wed Jan 21 04:39:46 2015 +0000
Revision:
5:429135c8bae8
Parent:
4:81c6b9d73cb1
MultiTech Modem, Aeris AerCloud, and ST IKS01A1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Vanger 1:76498fdfbecf 1 /* This is an example program which reads in the 3-axis acceleration, pressure, and temperature data from
Vanger 1:76498fdfbecf 2 * a FRDM-FXS-MULTI sensor board. It then uses an MTSAS SocketModem Shield board to send the read data over
mchowla 4:81c6b9d73cb1 3 * a cellular connection to Aeris AerCloud using an MQTT client protocol.
Vanger 1:76498fdfbecf 4 */
Vanger 1:76498fdfbecf 5
mfiore 0:b8d93d878bcb 6 #include "mbed.h"
mfiore 0:b8d93d878bcb 7 #include "mtsas.h"
mfiore 0:b8d93d878bcb 8 #include "PubSubClient.h"
BlueShadow 5:429135c8bae8 9 #include "x_cube_mems.h"
mfiore 0:b8d93d878bcb 10
mchowla 4:81c6b9d73cb1 11 //
mchowla 4:81c6b9d73cb1 12 // PLEASE READ THIS!
mchowla 4:81c6b9d73cb1 13 //
mchowla 4:81c6b9d73cb1 14 // Example was created for the following hardware:
mchowla 4:81c6b9d73cb1 15 // ST Nucleo F401RE http://developer.mbed.org/platforms/ST-Nucleo-F401RE/
BlueShadow 5:429135c8bae8 16 // ST Sensor Board http://developer.mbed.org/teams/ST-Americas-mbed-Team/wiki/Getting-Started-with-Nucleo-Sensors
mchowla 4:81c6b9d73cb1 17 // MultiTech Socket Modem Shield: http://developer.mbed.org/components/Multi-Tech-SocketModem-Arduino-Shield-MT/
mchowla 4:81c6b9d73cb1 18 // MultiTech MTSMC-H5 GSM Socket Modem http://www.multitech.com/models/92503252LF#gsc.tab=0
mchowla 4:81c6b9d73cb1 19 //
mchowla 4:81c6b9d73cb1 20 // To get the sample running, you'll need to fill in the following parameters below
mchowla 4:81c6b9d73cb1 21 // Your cellular provider's APN: _APN
mchowla 4:81c6b9d73cb1 22 // AerCloud API Key: _AERCLOUD_API_APIKEY
mchowla 4:81c6b9d73cb1 23 // AerCloud Account ID: _AERCLOUD_ACCOUNT_ID
mchowla 4:81c6b9d73cb1 24 // AerCloud Container: _ACERCLOUD_CONTAINER
mchowla 4:81c6b9d73cb1 25 //
mchowla 4:81c6b9d73cb1 26 // The AerCloud container needa a Data Model with the following schema:
mchowla 4:81c6b9d73cb1 27 // accel_x FLOAT
mchowla 4:81c6b9d73cb1 28 // accel_y FLOAT
mchowla 4:81c6b9d73cb1 29 // accel-Z FLOAT
mchowla 4:81c6b9d73cb1 30 // pressure FLOAT
mchowla 4:81c6b9d73cb1 31 // temperature FLOAT
mchowla 4:81c6b9d73cb1 32 //
mchowla 4:81c6b9d73cb1 33 // To check if data has made it in the container, create a long polling subscription in AerPort and they use the following url in your browswer
mchowla 4:81c6b9d73cb1 34 //
mchowla 4:81c6b9d73cb1 35 // http://longpoll.aercloud.aeris.com/v1/1/containers/subscriptions/<subscrption_name>/notificationChannels/longPoll?apiKey=<api_key>
mchowla 4:81c6b9d73cb1 36 //
mchowla 4:81c6b9d73cb1 37 // You should see the something that looks like this in the browser:
mchowla 4:81c6b9d73cb1 38 // {"sclContentInstances":[{"sclId":"nucleo-0001","containerId":"Nucleo_Test","contentInstance":{"id":"a40c8e60-8248-11e4-8b38-0677f0dfdf5e","contentSize":90,"creationTime":1418420922950,"content":{"contentType":"application/json","contentTypeBinary":"{\"x\":0.005615,\"y\":-0.041260,\"z\":1.015137,\"pressure\":101098.500000,\"temperature\":25.125000}"}}},
mchowla 4:81c6b9d73cb1 39 //
BlueShadow 5:429135c8bae8 40
BlueShadow 5:429135c8bae8 41
BlueShadow 5:429135c8bae8 42
BlueShadow 5:429135c8bae8 43 char _APN[] = "Set_carrier_APN";
mfiore 0:b8d93d878bcb 44
BlueShadow 5:429135c8bae8 45 char _AERCLOUD_API_KEY[] ="_Click_On_KEY_AerCloud_Tab";
BlueShadow 5:429135c8bae8 46 char _AERCLOUD_ACCOUNT_ID[] = "_Company_Number_Top_of_Page";
BlueShadow 5:429135c8bae8 47 char _AERCLOUD_CONTAINER[] = "_From_Container_Page";
BlueShadow 5:429135c8bae8 48 char _AERCLOUD_DEVICE_ID[] = "_Random_Title";
mfiore 0:b8d93d878bcb 49
mfiore 0:b8d93d878bcb 50
mchowla 4:81c6b9d73cb1 51 char _host[] = "mqtt.aercloud.aeris.com";
mfiore 0:b8d93d878bcb 52 int _port = 1883;
mfiore 0:b8d93d878bcb 53
Vanger 1:76498fdfbecf 54 #define DATA_INTERVAL 30
Vanger 1:76498fdfbecf 55
mfiore 0:b8d93d878bcb 56 void callback(char* topic, char* payload, unsigned int len) {
mfiore 0:b8d93d878bcb 57 logInfo("topic: [%s]\r\npayload: [%s]", topic, payload);
mfiore 0:b8d93d878bcb 58 }
mfiore 0:b8d93d878bcb 59
BlueShadow 5:429135c8bae8 60 DigitalOut myled(LED1);
BlueShadow 5:429135c8bae8 61 Serial pc(SERIAL_TX, SERIAL_RX);
BlueShadow 5:429135c8bae8 62 volatile float TEMPERATURE_Value_C;
BlueShadow 5:429135c8bae8 63 volatile float TEMPERATURE_Value_F;
BlueShadow 5:429135c8bae8 64 volatile float HUMIDITY_Value;
BlueShadow 5:429135c8bae8 65 volatile float PRESSURE_Value;
BlueShadow 5:429135c8bae8 66 volatile AxesRaw_TypeDef MAG_Value;
BlueShadow 5:429135c8bae8 67 volatile AxesRaw_TypeDef ACC_Value;
BlueShadow 5:429135c8bae8 68 volatile AxesRaw_TypeDef GYR_Value;
BlueShadow 5:429135c8bae8 69
mfiore 0:b8d93d878bcb 70 int main() {
BlueShadow 5:429135c8bae8 71 printf("Hello FUTURE!\r\n");
mfiore 0:b8d93d878bcb 72 MTSLog::setLogLevel(MTSLog::TRACE_LEVEL);
mfiore 0:b8d93d878bcb 73
mfiore 0:b8d93d878bcb 74 // for Nucleo boards
BlueShadow 5:429135c8bae8 75 MTSSerialFlowControl io(D8, D2, D3, D13); // Modified Flow control for ST Sensor Board D13
mfiore 0:b8d93d878bcb 76 io.baud(115200);
mfiore 0:b8d93d878bcb 77
mfiore 0:b8d93d878bcb 78 Cellular* radio = CellularFactory::create(&io);
mfiore 0:b8d93d878bcb 79 if (! radio) {
mfiore 0:b8d93d878bcb 80 logFatal("failed to create Cellular object - exiting");
mfiore 0:b8d93d878bcb 81 return 1;
mfiore 0:b8d93d878bcb 82 }
mfiore 0:b8d93d878bcb 83
BlueShadow 5:429135c8bae8 84 radio->configureSignals(D11,D7,RESET); // Modified Flow Control for ST Sensor Board D11
BlueShadow 5:429135c8bae8 85 Transport::setTransport(radio); // Required to control Cell Radio vs WiFi solution
mfiore 0:b8d93d878bcb 86
mfiore 0:b8d93d878bcb 87 while (radio->setApn(_APN) != MTS_SUCCESS) {
mfiore 0:b8d93d878bcb 88 logError("failed to set APN [%s]", _APN);
mfiore 0:b8d93d878bcb 89 wait(2);
mfiore 0:b8d93d878bcb 90 }
mfiore 0:b8d93d878bcb 91
mfiore 0:b8d93d878bcb 92 while (! radio->connect()) {
mfiore 0:b8d93d878bcb 93 logError("failed to bring up PPP link");
mfiore 0:b8d93d878bcb 94 wait(2);
mfiore 0:b8d93d878bcb 95 }
mfiore 0:b8d93d878bcb 96
mchowla 4:81c6b9d73cb1 97 printf("Signal Strength: %d\n\r", radio->getSignalStrength()); //Check the signal strength should be above 8
mchowla 4:81c6b9d73cb1 98
mchowla 4:81c6b9d73cb1 99 // If you suspect a connectivity issue, uncomment the code below and if ping works. If you are not getting a
mchowla 4:81c6b9d73cb1 100 // valid ping, there's a connectivity problem. First step is to verify you've got the right APN set
mchowla 4:81c6b9d73cb1 101 //
mchowla 4:81c6b9d73cb1 102 // Try pinging default server "8.8.8.8" (Google's DNS)
BlueShadow 5:429135c8bae8 103 // int ping_valid = 0;
BlueShadow 5:429135c8bae8 104 // while (ping_valid == 0) {
BlueShadow 5:429135c8bae8 105 // ping_valid = radio->ping();
BlueShadow 5:429135c8bae8 106 // printf("Ping Valid: %s\n\r", ping_valid ? "true" : "false");
mchowla 4:81c6b9d73cb1 107 //
BlueShadow 5:429135c8bae8 108 // if (ping_valid == 0) {
BlueShadow 5:429135c8bae8 109 // wait(3);
BlueShadow 5:429135c8bae8 110 // printf("wait 33");
BlueShadow 5:429135c8bae8 111 // wait(33);
BlueShadow 5:429135c8bae8 112
mchowla 4:81c6b9d73cb1 113 // }
mchowla 4:81c6b9d73cb1 114 //}
mchowla 4:81c6b9d73cb1 115
mfiore 0:b8d93d878bcb 116 PubSubClient mqtt(_host, _port, callback);
mfiore 0:b8d93d878bcb 117
Vanger 1:76498fdfbecf 118 char buf[128];
mfiore 0:b8d93d878bcb 119
BlueShadow 5:429135c8bae8 120 static X_CUBE_MEMS *mems_expansion_board = X_CUBE_MEMS::Instance();
BlueShadow 5:429135c8bae8 121
BlueShadow 5:429135c8bae8 122
BlueShadow 5:429135c8bae8 123 /* Get data from all sensors */
BlueShadow 5:429135c8bae8 124 mems_expansion_board->hts221.GetTemperature((float *)&TEMPERATURE_Value_C);
BlueShadow 5:429135c8bae8 125 mems_expansion_board->hts221.GetHumidity((float *)&HUMIDITY_Value);
BlueShadow 5:429135c8bae8 126 mems_expansion_board->lps25h.GetPressure((float *)&PRESSURE_Value);
BlueShadow 5:429135c8bae8 127 mems_expansion_board->lis3mdl.GetAxes((AxesRaw_TypeDef *)&MAG_Value);
BlueShadow 5:429135c8bae8 128 mems_expansion_board->lsm6ds0.Acc_GetAxes((AxesRaw_TypeDef *)&ACC_Value);
BlueShadow 5:429135c8bae8 129 mems_expansion_board->lsm6ds0.Gyro_GetAxes((AxesRaw_TypeDef *)&GYR_Value);
BlueShadow 5:429135c8bae8 130
BlueShadow 5:429135c8bae8 131 TEMPERATURE_Value_F = (TEMPERATURE_Value_C * 1.8f) + 32.0f;
BlueShadow 5:429135c8bae8 132 pc.printf("Temperature:\t\t %f C\r\n", TEMPERATURE_Value_C );
BlueShadow 5:429135c8bae8 133 // pc.printf("Humidity:\t\t %f%%\r\n", HUMIDITY_Value);
BlueShadow 5:429135c8bae8 134 pc.printf("Pressure:\t\t %f hPa\r\n", PRESSURE_Value);
BlueShadow 5:429135c8bae8 135 // pc.printf("Magnetometer (mGauss):\t mX: %d, Y: %d, mZ: %d\r\n", MAG_Value.AXIS_X, MAG_Value.AXIS_Y, MAG_Value.AXIS_Z);
BlueShadow 5:429135c8bae8 136 pc.printf("Accelerometer (mg):\t X: %d, Y: %d, Z: %d\r\n", ACC_Value.AXIS_X, ACC_Value.AXIS_Y, ACC_Value.AXIS_Z);
BlueShadow 5:429135c8bae8 137 // pc.printf("Gyroscope (mdps):\t X: %d, Y: %d, Z: %d\r\n", GYR_Value.AXIS_X, GYR_Value.AXIS_Y, GYR_Value.AXIS_Z);
BlueShadow 5:429135c8bae8 138 pc.printf("\r\n");
BlueShadow 5:429135c8bae8 139
BlueShadow 5:429135c8bae8 140
mfiore 0:b8d93d878bcb 141 while (true) {
BlueShadow 5:429135c8bae8 142 if (! mqtt.connect(_AERCLOUD_DEVICE_ID, _AERCLOUD_ACCOUNT_ID, _AERCLOUD_API_KEY)) {
mchowla 4:81c6b9d73cb1 143 logError("failed to connect to AerCloud Server");
mchowla 4:81c6b9d73cb1 144 wait(5);
mfiore 0:b8d93d878bcb 145 continue;
mfiore 0:b8d93d878bcb 146 }
BlueShadow 5:429135c8bae8 147
BlueShadow 5:429135c8bae8 148 // get new data
BlueShadow 5:429135c8bae8 149 myled = 1; // LED is ON
BlueShadow 5:429135c8bae8 150 wait(0.2); // 200 ms
BlueShadow 5:429135c8bae8 151 myled = 0; // LED is OFF
Vanger 1:76498fdfbecf 152
BlueShadow 5:429135c8bae8 153 mems_expansion_board->hts221.GetTemperature((float *)&TEMPERATURE_Value_C);
BlueShadow 5:429135c8bae8 154 // mems_expansion_board->hts221.GetHumidity((float *)&HUMIDITY_Value);
BlueShadow 5:429135c8bae8 155 mems_expansion_board->lps25h.GetPressure((float *)&PRESSURE_Value);
BlueShadow 5:429135c8bae8 156 // mems_expansion_board->lis3mdl.GetAxes((AxesRaw_TypeDef *)&MAG_Value);
BlueShadow 5:429135c8bae8 157 mems_expansion_board->lsm6ds0.Acc_GetAxes((AxesRaw_TypeDef *)&ACC_Value);
BlueShadow 5:429135c8bae8 158 // mems_expansion_board->lsm6ds0.Gyro_GetAxes((AxesRaw_TypeDef *)&GYR_Value);
BlueShadow 5:429135c8bae8 159 pc.printf("Accelerometer (mg):\t X: %d, Y: %d, Z: %d\r\n\n", ACC_Value.AXIS_X, ACC_Value.AXIS_Y, ACC_Value.AXIS_Z);
BlueShadow 5:429135c8bae8 160
BlueShadow 5:429135c8bae8 161 snprintf(buf, sizeof(buf), "{\"xxx\":%d,\"yyy\":%d,\"zzz\":%d,\"pressure\":%f,\"temperature\":%f}",ACC_Value.AXIS_X, ACC_Value.AXIS_Y, ACC_Value.AXIS_Z, PRESSURE_Value, TEMPERATURE_Value_C);
mfiore 0:b8d93d878bcb 162 logInfo("publishing: [%s]", buf);
mchowla 4:81c6b9d73cb1 163 if (! mqtt.publish(_AERCLOUD_CONTAINER, buf)) {
mfiore 0:b8d93d878bcb 164 logError("failed to publish: [%s]", buf);
mfiore 0:b8d93d878bcb 165 }
mfiore 0:b8d93d878bcb 166 wait(1);
mfiore 0:b8d93d878bcb 167 mqtt.loop();
mfiore 0:b8d93d878bcb 168 mqtt.disconnect();
Vanger 1:76498fdfbecf 169 wait(DATA_INTERVAL);
BlueShadow 5:429135c8bae8 170
mfiore 0:b8d93d878bcb 171 }
mfiore 0:b8d93d878bcb 172
BlueShadow 5:429135c8bae8 173 }
BlueShadow 5:429135c8bae8 174