ACKme WiFi module + Nucleo MEMS module example. Connect and publish sensor data to M2X.

Dependencies:   M2XStreamClient WiConnect Nucleo_Sensor_Shield jsonlite mbed

Fork of m2x-MEMS_ACKme_Wifi_demo by David Kwak

Committer:
davidkwak
Date:
Tue Dec 16 18:56:57 2014 +0000
Revision:
2:e277cdbabbb2
Parent:
1:276e4607719f
Child:
4:92883efd3686
Updated some of the console output.
; Added a message indicating network status.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davidkwak 0:db24f1dae4a4 1 #include "mbed.h"
davidkwak 0:db24f1dae4a4 2 // include target specific defines
davidkwak 0:db24f1dae4a4 3 #include "target_config.h"
davidkwak 0:db24f1dae4a4 4 // include X-CUBE-MEMS1 Library
davidkwak 0:db24f1dae4a4 5 #include "x_cube_mems.h"
davidkwak 0:db24f1dae4a4 6 // include the Wiconnect Host Library API header
davidkwak 0:db24f1dae4a4 7 #include "Wiconnect.h"
davidkwak 0:db24f1dae4a4 8 // include M2X Library
davidkwak 0:db24f1dae4a4 9 #include "M2XStreamClient.h"
davidkwak 0:db24f1dae4a4 10
davidkwak 0:db24f1dae4a4 11 /**
davidkwak 0:db24f1dae4a4 12 * Connect the ACKme WiFi module directly to the Nucleo board.
davidkwak 0:db24f1dae4a4 13 * Connect the X-NUCLEO-IKS01A1 module on top of the ACKme WiFi module.
davidkwak 0:db24f1dae4a4 14 */
davidkwak 0:db24f1dae4a4 15
davidkwak 0:db24f1dae4a4 16 /**
davidkwak 0:db24f1dae4a4 17 * Hyperterminal configuration
davidkwak 1:276e4607719f 18 * 9600 bauds, 8-bit data, no parity
davidkwak 0:db24f1dae4a4 19 */
davidkwak 0:db24f1dae4a4 20
davidkwak 0:db24f1dae4a4 21 /**
davidkwak 0:db24f1dae4a4 22 * This is the name of your WiFi network.
davidkwak 0:db24f1dae4a4 23 * Look for this name in your WiFi settings.
davidkwak 0:db24f1dae4a4 24 * (e.g. your phone's list of WiFi networks in the WiFi settings menu.)
davidkwak 0:db24f1dae4a4 25 * tip: add double-quotes around SSID to add spaces to name.
davidkwak 0:db24f1dae4a4 26 */
davidkwak 0:db24f1dae4a4 27 #define NETWORK_SSID "\"<YOUR NETWORK NAME HERE>\""
davidkwak 0:db24f1dae4a4 28
davidkwak 0:db24f1dae4a4 29 /**
davidkwak 0:db24f1dae4a4 30 * This is the password of your WiFi network.
davidkwak 0:db24f1dae4a4 31 * Leave as empty string (e.g "") to connect to OPEN network.
davidkwak 0:db24f1dae4a4 32 */
davidkwak 0:db24f1dae4a4 33 #define NETWORK_PASSWORD "\"<YOUR NETWORK PASSWORD HERE>\""
davidkwak 0:db24f1dae4a4 34
davidkwak 1:276e4607719f 35 const char key[] = "123ad8ee16ef56dfafd0c42a3a3ef109"; // Replace with your M2X API key
davidkwak 1:276e4607719f 36 const char feed[] = "d3ffd3ab9f659943e2302ba232acf198"; // Replace with your blueprint Feed ID
davidkwak 0:db24f1dae4a4 37 const char tempStream[] = "temperature"; // Replace with your stream name
davidkwak 0:db24f1dae4a4 38 const char humStream[] = "humidity"; // Replace with your stream name
davidkwak 0:db24f1dae4a4 39 const char accStream[] = "acceleration"; // Replace with your stream name
davidkwak 0:db24f1dae4a4 40
davidkwak 0:db24f1dae4a4 41 char name[] = "redmond_st_office"; // Name of current location of datasource
davidkwak 0:db24f1dae4a4 42 double latitude = 47.633889; // You can also read those values from a GPS
davidkwak 0:db24f1dae4a4 43 double longitude = -122.138611;
davidkwak 0:db24f1dae4a4 44 double elevation = 97.46;
davidkwak 0:db24f1dae4a4 45
davidkwak 0:db24f1dae4a4 46 /* Instantiate the serial console. */
davidkwak 0:db24f1dae4a4 47 Serial pc(SERIAL_TX, SERIAL_RX);
davidkwak 0:db24f1dae4a4 48
davidkwak 0:db24f1dae4a4 49 int main()
davidkwak 0:db24f1dae4a4 50 {
davidkwak 1:276e4607719f 51 /* Set the console terminal to 9600 bps. */
davidkwak 0:db24f1dae4a4 52 pc.baud(CONSOLE_BAUD);
davidkwak 0:db24f1dae4a4 53
davidkwak 0:db24f1dae4a4 54 /* Instantiate the X-CUBE-MEMS Library. */
davidkwak 0:db24f1dae4a4 55 static X_CUBE_MEMS *mems_expansion_board = X_CUBE_MEMS::Instance();
davidkwak 0:db24f1dae4a4 56
davidkwak 0:db24f1dae4a4 57 /* Read and output the humidity sensor id to confirm communication. */
davidkwak 0:db24f1dae4a4 58 uint8_t hts221_id = mems_expansion_board->hts221.ReadID();
davidkwak 0:db24f1dae4a4 59
davidkwak 0:db24f1dae4a4 60 pc.printf("HTS221_ID = 0x%x\n\t\r", hts221_id);
davidkwak 0:db24f1dae4a4 61
davidkwak 0:db24f1dae4a4 62 /**
davidkwak 0:db24f1dae4a4 63 * WIFI Setup
davidkwak 0:db24f1dae4a4 64 */
davidkwak 0:db24f1dae4a4 65
davidkwak 0:db24f1dae4a4 66 /* Setup wiconnect serial interface configuration. */
davidkwak 0:db24f1dae4a4 67
davidkwak 0:db24f1dae4a4 68 /**
davidkwak 0:db24f1dae4a4 69 * Here we only specify the rx buffer size and not rx buffer pointer, this means
davidkwak 0:db24f1dae4a4 70 * the serial RX buffer will be dynamically allocated.
davidkwak 0:db24f1dae4a4 71 */
davidkwak 0:db24f1dae4a4 72 SerialConfig serialConfig(WICONNECT_RX_PIN, WICONNECT_TX_PIN, 256, NULL);
davidkwak 0:db24f1dae4a4 73
davidkwak 0:db24f1dae4a4 74 /* Instantiate WiConnect Library. */
davidkwak 0:db24f1dae4a4 75
davidkwak 0:db24f1dae4a4 76 /**
davidkwak 0:db24f1dae4a4 77 * Here we only specify the buffer size and not buffer pointer, this means
davidkwak 0:db24f1dae4a4 78 * the internal buffer will be dynamically allocated.
davidkwak 0:db24f1dae4a4 79 */
davidkwak 0:db24f1dae4a4 80 Wiconnect wiconnect(serialConfig, 256, NULL, WICONNECT_RESET_PIN);
davidkwak 0:db24f1dae4a4 81
davidkwak 0:db24f1dae4a4 82 /* Initiate Communication with WiFi Module. */
davidkwak 0:db24f1dae4a4 83 pc.printf("Initializing WiConnect Library...\r\n");
davidkwak 0:db24f1dae4a4 84
davidkwak 0:db24f1dae4a4 85 WiconnectResult result;
davidkwak 0:db24f1dae4a4 86
davidkwak 2:e277cdbabbb2 87 if (WICONNECT_FAILED(result, wiconnect.init(true)))
davidkwak 0:db24f1dae4a4 88 {
davidkwak 2:e277cdbabbb2 89 if (result == WICONNECT_FIRMWARE_OUTDATED)
davidkwak 0:db24f1dae4a4 90 {
davidkwak 0:db24f1dae4a4 91 pc.printf("** The WiFi firmware is not supported. Run the ota example to update the firmware:\r\n");
davidkwak 0:db24f1dae4a4 92 pc.printf("https://developer.mbed.org/teams/ACKme/code/wiconnect-ota_example\r\n\r\n");
davidkwak 0:db24f1dae4a4 93 }
davidkwak 0:db24f1dae4a4 94 else
davidkwak 0:db24f1dae4a4 95 {
davidkwak 0:db24f1dae4a4 96 pc.printf("Failed to initialize communication with WiFi module!\r\n"
davidkwak 0:db24f1dae4a4 97 "Make sure the wires are connected correctly\r\n");
davidkwak 0:db24f1dae4a4 98 }
davidkwak 0:db24f1dae4a4 99
davidkwak 0:db24f1dae4a4 100 return -1;
davidkwak 0:db24f1dae4a4 101 }
davidkwak 0:db24f1dae4a4 102
davidkwak 2:e277cdbabbb2 103 wait(5);
davidkwak 2:e277cdbabbb2 104
davidkwak 2:e277cdbabbb2 105 /* Manually connected to the specified network (to ensure SDK backward compatibility). */
davidkwak 0:db24f1dae4a4 106 pc.printf("Setting network SSID: %s\r\n", NETWORK_SSID);
davidkwak 0:db24f1dae4a4 107
davidkwak 2:e277cdbabbb2 108 if (WICONNECT_FAILED(result, wiconnect.setSetting("wlan.ssid", NETWORK_SSID)))
davidkwak 0:db24f1dae4a4 109 {
davidkwak 0:db24f1dae4a4 110 pc.printf("Failed to set wlan.ssid setting\r\n");
davidkwak 0:db24f1dae4a4 111 return -1;
davidkwak 0:db24f1dae4a4 112 }
davidkwak 0:db24f1dae4a4 113
davidkwak 0:db24f1dae4a4 114 pc.printf("Setting network password\r\n");
davidkwak 0:db24f1dae4a4 115
davidkwak 2:e277cdbabbb2 116 if (WICONNECT_FAILED(result, wiconnect.setSetting("wlan.passkey", NETWORK_PASSWORD)))
davidkwak 0:db24f1dae4a4 117 {
davidkwak 0:db24f1dae4a4 118 pc.printf("Failed to set wlan.passkey setting\r\n");
davidkwak 0:db24f1dae4a4 119 return -1;
davidkwak 0:db24f1dae4a4 120 }
davidkwak 0:db24f1dae4a4 121
davidkwak 0:db24f1dae4a4 122 pc.printf("Saving settings to Non-volatile Memory\r\n");
davidkwak 0:db24f1dae4a4 123
davidkwak 2:e277cdbabbb2 124 if (WICONNECT_FAILED(result, wiconnect.saveSettings()))
davidkwak 0:db24f1dae4a4 125 {
davidkwak 0:db24f1dae4a4 126 pc.printf("Failed save settings\r\n");
davidkwak 0:db24f1dae4a4 127 return -1;
davidkwak 0:db24f1dae4a4 128 }
davidkwak 0:db24f1dae4a4 129
davidkwak 2:e277cdbabbb2 130 NetworkStatus status;
davidkwak 2:e277cdbabbb2 131
davidkwak 2:e277cdbabbb2 132 result = wiconnect.getNetworkStatus(&status);
davidkwak 2:e277cdbabbb2 133
davidkwak 2:e277cdbabbb2 134 switch (status)
davidkwak 2:e277cdbabbb2 135 {
davidkwak 2:e277cdbabbb2 136 case NETWORK_STATUS_DOWN:
davidkwak 2:e277cdbabbb2 137 {
davidkwak 2:e277cdbabbb2 138 pc.printf("NETWORK_STATUS_DOWN\r\n");
davidkwak 2:e277cdbabbb2 139
davidkwak 2:e277cdbabbb2 140 return -1;
davidkwak 2:e277cdbabbb2 141
davidkwak 2:e277cdbabbb2 142 break;
davidkwak 2:e277cdbabbb2 143 }
davidkwak 2:e277cdbabbb2 144 case NETWORK_STATUS_WIFI_ONLY:
davidkwak 2:e277cdbabbb2 145 {
davidkwak 2:e277cdbabbb2 146 pc.printf("NETWORK_STATUS_WIFI_ONLY\r\n");
davidkwak 2:e277cdbabbb2 147 break;
davidkwak 2:e277cdbabbb2 148 }
davidkwak 2:e277cdbabbb2 149 case NETWORK_STATUS_UP:
davidkwak 2:e277cdbabbb2 150 {
davidkwak 2:e277cdbabbb2 151 pc.printf("NETWORK_STATUS_UP\r\n");
davidkwak 2:e277cdbabbb2 152 break;
davidkwak 2:e277cdbabbb2 153 }
davidkwak 2:e277cdbabbb2 154 case NETWORK_STATUS_JOINING:
davidkwak 2:e277cdbabbb2 155 {
davidkwak 2:e277cdbabbb2 156 pc.printf("NETWORK_STATUS_JOINING\r\n");
davidkwak 2:e277cdbabbb2 157 break;
davidkwak 2:e277cdbabbb2 158 }
davidkwak 2:e277cdbabbb2 159 default:
davidkwak 2:e277cdbabbb2 160 {
davidkwak 2:e277cdbabbb2 161 pc.printf("UNKNOWN\r\n");
davidkwak 2:e277cdbabbb2 162 break;
davidkwak 2:e277cdbabbb2 163 }
davidkwak 2:e277cdbabbb2 164 }
davidkwak 2:e277cdbabbb2 165
davidkwak 0:db24f1dae4a4 166 pc.printf("IP Address: %s\r\n", wiconnect.getIpAddress());
davidkwak 0:db24f1dae4a4 167 pc.printf("Network joined!\r\n");
davidkwak 0:db24f1dae4a4 168
davidkwak 0:db24f1dae4a4 169 /**
davidkwak 0:db24f1dae4a4 170 * M2X Setup
davidkwak 0:db24f1dae4a4 171 */
davidkwak 0:db24f1dae4a4 172
davidkwak 0:db24f1dae4a4 173 /* Instantiate the M2X Stream Client. */
davidkwak 0:db24f1dae4a4 174 Client client;
davidkwak 0:db24f1dae4a4 175 M2XStreamClient m2xClient(&client, key);
davidkwak 0:db24f1dae4a4 176
davidkwak 0:db24f1dae4a4 177 /* Update device location. */
davidkwak 0:db24f1dae4a4 178 int m2x_response = m2xClient.updateLocation(feed, name, latitude, longitude, elevation);
davidkwak 0:db24f1dae4a4 179
davidkwak 0:db24f1dae4a4 180 pc.printf("updateLocation response code: %d\r\n", m2x_response);
davidkwak 0:db24f1dae4a4 181
davidkwak 2:e277cdbabbb2 182 if (m2x_response == -1)
davidkwak 2:e277cdbabbb2 183 {
davidkwak 2:e277cdbabbb2 184 printf("Location data update error\n");
davidkwak 2:e277cdbabbb2 185 }
davidkwak 2:e277cdbabbb2 186
davidkwak 0:db24f1dae4a4 187 /* Main loop */
davidkwak 0:db24f1dae4a4 188 while(1)
davidkwak 0:db24f1dae4a4 189 {
davidkwak 2:e277cdbabbb2 190 volatile float TEMPERATURE_Value_C;
davidkwak 2:e277cdbabbb2 191 volatile float TEMPERATURE_Value_F;
davidkwak 0:db24f1dae4a4 192 volatile float HUMIDITY_Value;
davidkwak 0:db24f1dae4a4 193 volatile float PRESSURE_Value;
davidkwak 0:db24f1dae4a4 194 volatile AxesRaw_TypeDef MAG_Value;
davidkwak 0:db24f1dae4a4 195 volatile AxesRaw_TypeDef ACC_Value;
davidkwak 0:db24f1dae4a4 196 volatile AxesRaw_TypeDef GYR_Value;
davidkwak 0:db24f1dae4a4 197
davidkwak 0:db24f1dae4a4 198 /* Update sensors. */
davidkwak 2:e277cdbabbb2 199 mems_expansion_board->hts221.GetTemperature((float *)&TEMPERATURE_Value_C);
davidkwak 0:db24f1dae4a4 200 mems_expansion_board->hts221.GetHumidity((float *)&HUMIDITY_Value);
davidkwak 0:db24f1dae4a4 201 mems_expansion_board->lps25h.GetPressure((float *)&PRESSURE_Value);
davidkwak 0:db24f1dae4a4 202 mems_expansion_board->lis3mdl.GetAxes((AxesRaw_TypeDef *)&MAG_Value);
davidkwak 0:db24f1dae4a4 203 mems_expansion_board->lsm6ds0.Acc_GetAxes((AxesRaw_TypeDef *)&ACC_Value);
davidkwak 0:db24f1dae4a4 204 mems_expansion_board->lsm6ds0.Gyro_GetAxes((AxesRaw_TypeDef *)&GYR_Value);
davidkwak 0:db24f1dae4a4 205
davidkwak 2:e277cdbabbb2 206 /* Convert temperature to degrees Farhenheit. */
davidkwak 2:e277cdbabbb2 207 TEMPERATURE_Value_F = (1.8f * TEMPERATURE_Value_C) + 32.0f;
davidkwak 2:e277cdbabbb2 208
davidkwak 0:db24f1dae4a4 209 /* Output sensor data. */
davidkwak 2:e277cdbabbb2 210 pc.printf("Temperature:\t\t %f C / %f F\r\n", TEMPERATURE_Value_C, TEMPERATURE_Value_F);
davidkwak 2:e277cdbabbb2 211 pc.printf("Humidity:\t\t %f%%\r\n", HUMIDITY_Value);
davidkwak 2:e277cdbabbb2 212 pc.printf("Pressure:\t\t %f hPa\r\n", PRESSURE_Value);
davidkwak 2:e277cdbabbb2 213 pc.printf("Magnetometer (mGauss):\t X: %d, Y: %d, Z: %d\r\n", MAG_Value.AXIS_X, MAG_Value.AXIS_Y, MAG_Value.AXIS_Z);
davidkwak 2:e277cdbabbb2 214 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);
davidkwak 2:e277cdbabbb2 215 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);
davidkwak 2:e277cdbabbb2 216 pc.printf("\r\n");
davidkwak 0:db24f1dae4a4 217
davidkwak 0:db24f1dae4a4 218 /* Post temperature to the m2x stream. */
davidkwak 2:e277cdbabbb2 219 m2x_response = m2xClient.updateStreamValue(feed, tempStream, TEMPERATURE_Value_F);
davidkwak 0:db24f1dae4a4 220
davidkwak 0:db24f1dae4a4 221 pc.printf("Temperature updateStreamValue response code: %d\r\n", m2x_response);
davidkwak 0:db24f1dae4a4 222
davidkwak 0:db24f1dae4a4 223 if (m2x_response == -1)
davidkwak 0:db24f1dae4a4 224 {
davidkwak 2:e277cdbabbb2 225 pc.printf("Temperature data update error\n");
davidkwak 0:db24f1dae4a4 226 }
davidkwak 0:db24f1dae4a4 227
davidkwak 0:db24f1dae4a4 228 /* Post humidity to the m2x stream. */
davidkwak 0:db24f1dae4a4 229 m2x_response = m2xClient.updateStreamValue(feed, humStream, HUMIDITY_Value);
davidkwak 0:db24f1dae4a4 230
davidkwak 0:db24f1dae4a4 231 pc.printf("Humidity updateStreamValue response code: %d\r\n", m2x_response);
davidkwak 0:db24f1dae4a4 232
davidkwak 0:db24f1dae4a4 233 if (m2x_response == -1)
davidkwak 0:db24f1dae4a4 234 {
davidkwak 2:e277cdbabbb2 235 pc.printf("Humidity data update error\n");
davidkwak 0:db24f1dae4a4 236 }
davidkwak 0:db24f1dae4a4 237
davidkwak 0:db24f1dae4a4 238 /* Post acceleration (x-axis) to the m2x stream. */
davidkwak 0:db24f1dae4a4 239 m2x_response = m2xClient.updateStreamValue(feed, accStream, ACC_Value.AXIS_X);
davidkwak 0:db24f1dae4a4 240
davidkwak 0:db24f1dae4a4 241 pc.printf("Acceleration updateStreamValue response code: %d\r\n", m2x_response);
davidkwak 0:db24f1dae4a4 242
davidkwak 0:db24f1dae4a4 243 if (m2x_response == -1)
davidkwak 0:db24f1dae4a4 244 {
davidkwak 2:e277cdbabbb2 245 pc.printf("Acceleration data update error\n");
davidkwak 0:db24f1dae4a4 246 }
davidkwak 0:db24f1dae4a4 247
davidkwak 0:db24f1dae4a4 248 pc.printf("\n");
davidkwak 0:db24f1dae4a4 249
davidkwak 0:db24f1dae4a4 250 wait(30); // 30 s
davidkwak 0:db24f1dae4a4 251 }
davidkwak 0:db24f1dae4a4 252 }
davidkwak 0:db24f1dae4a4 253