
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
main.cpp@4:92883efd3686, 2014-12-17 (annotated)
- Committer:
- davidkwak
- Date:
- Wed Dec 17 21:51:46 2014 +0000
- Revision:
- 4:92883efd3686
- Parent:
- 2:e277cdbabbb2
Remove extra information from comments.
Who changed what in which revision?
User | Revision | Line number | New 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 | 4:92883efd3686 | 13 | * Connect the Nucleo sensor 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 |