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
main.cpp@5:429135c8bae8, 2015-01-21 (annotated)
- 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?
User | Revision | Line number | New 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 |