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@0:db24f1dae4a4, 2014-12-11 (annotated)
- Committer:
- davidkwak
- Date:
- Thu Dec 11 20:56:33 2014 +0000
- Revision:
- 0:db24f1dae4a4
- Child:
- 1:276e4607719f
Initial publish/commit of an example with the ACKme WiFi module and X-NUCLEO-IKS01A1 sensor board.
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 | 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 | 0:db24f1dae4a4 | 18 | * 115200 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 | 0:db24f1dae4a4 | 35 | const char key[] = "0a49487bc297bc061ca49ac01eb3755f"; // Replace with your M2X API key |
davidkwak | 0:db24f1dae4a4 | 36 | const char feed[] = "db817fd389c05eca79c331b4bb6daf8d"; // 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 | 0:db24f1dae4a4 | 51 | /* Set the console terminal to 115200 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 | 0:db24f1dae4a4 | 87 | if(WICONNECT_FAILED(result, wiconnect.init(true))) |
davidkwak | 0:db24f1dae4a4 | 88 | { |
davidkwak | 0:db24f1dae4a4 | 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 | 0:db24f1dae4a4 | 103 | /* Manually connected to the specified network (to ensure SDK backward compatibility. */ |
davidkwak | 0:db24f1dae4a4 | 104 | pc.printf("Setting network SSID: %s\r\n", NETWORK_SSID); |
davidkwak | 0:db24f1dae4a4 | 105 | |
davidkwak | 0:db24f1dae4a4 | 106 | if(WICONNECT_FAILED(result, wiconnect.setSetting("wlan.ssid", NETWORK_SSID))) |
davidkwak | 0:db24f1dae4a4 | 107 | { |
davidkwak | 0:db24f1dae4a4 | 108 | pc.printf("Failed to set wlan.ssid setting\r\n"); |
davidkwak | 0:db24f1dae4a4 | 109 | return -1; |
davidkwak | 0:db24f1dae4a4 | 110 | } |
davidkwak | 0:db24f1dae4a4 | 111 | |
davidkwak | 0:db24f1dae4a4 | 112 | pc.printf("Setting network password\r\n"); |
davidkwak | 0:db24f1dae4a4 | 113 | |
davidkwak | 0:db24f1dae4a4 | 114 | if(WICONNECT_FAILED(result, wiconnect.setSetting("wlan.passkey", NETWORK_PASSWORD))) |
davidkwak | 0:db24f1dae4a4 | 115 | { |
davidkwak | 0:db24f1dae4a4 | 116 | pc.printf("Failed to set wlan.passkey setting\r\n"); |
davidkwak | 0:db24f1dae4a4 | 117 | return -1; |
davidkwak | 0:db24f1dae4a4 | 118 | } |
davidkwak | 0:db24f1dae4a4 | 119 | |
davidkwak | 0:db24f1dae4a4 | 120 | pc.printf("Saving settings to Non-volatile Memory\r\n"); |
davidkwak | 0:db24f1dae4a4 | 121 | |
davidkwak | 0:db24f1dae4a4 | 122 | if(WICONNECT_FAILED(result, wiconnect.saveSettings())) |
davidkwak | 0:db24f1dae4a4 | 123 | { |
davidkwak | 0:db24f1dae4a4 | 124 | pc.printf("Failed save settings\r\n"); |
davidkwak | 0:db24f1dae4a4 | 125 | return -1; |
davidkwak | 0:db24f1dae4a4 | 126 | } |
davidkwak | 0:db24f1dae4a4 | 127 | |
davidkwak | 0:db24f1dae4a4 | 128 | pc.printf("IP Address: %s\r\n", wiconnect.getIpAddress()); |
davidkwak | 0:db24f1dae4a4 | 129 | pc.printf("Network joined!\r\n"); |
davidkwak | 0:db24f1dae4a4 | 130 | |
davidkwak | 0:db24f1dae4a4 | 131 | /** |
davidkwak | 0:db24f1dae4a4 | 132 | * M2X Setup |
davidkwak | 0:db24f1dae4a4 | 133 | */ |
davidkwak | 0:db24f1dae4a4 | 134 | |
davidkwak | 0:db24f1dae4a4 | 135 | /* Instantiate the M2X Stream Client. */ |
davidkwak | 0:db24f1dae4a4 | 136 | Client client; |
davidkwak | 0:db24f1dae4a4 | 137 | M2XStreamClient m2xClient(&client, key); |
davidkwak | 0:db24f1dae4a4 | 138 | |
davidkwak | 0:db24f1dae4a4 | 139 | /* Update device location. */ |
davidkwak | 0:db24f1dae4a4 | 140 | int m2x_response = m2xClient.updateLocation(feed, name, latitude, longitude, elevation); |
davidkwak | 0:db24f1dae4a4 | 141 | |
davidkwak | 0:db24f1dae4a4 | 142 | pc.printf("updateLocation response code: %d\r\n", m2x_response); |
davidkwak | 0:db24f1dae4a4 | 143 | |
davidkwak | 0:db24f1dae4a4 | 144 | /* Main loop */ |
davidkwak | 0:db24f1dae4a4 | 145 | while(1) |
davidkwak | 0:db24f1dae4a4 | 146 | { |
davidkwak | 0:db24f1dae4a4 | 147 | volatile float TEMPERATURE_Value; |
davidkwak | 0:db24f1dae4a4 | 148 | volatile float HUMIDITY_Value; |
davidkwak | 0:db24f1dae4a4 | 149 | volatile float PRESSURE_Value; |
davidkwak | 0:db24f1dae4a4 | 150 | volatile AxesRaw_TypeDef MAG_Value; |
davidkwak | 0:db24f1dae4a4 | 151 | volatile AxesRaw_TypeDef ACC_Value; |
davidkwak | 0:db24f1dae4a4 | 152 | volatile AxesRaw_TypeDef GYR_Value; |
davidkwak | 0:db24f1dae4a4 | 153 | |
davidkwak | 0:db24f1dae4a4 | 154 | /* Update sensors. */ |
davidkwak | 0:db24f1dae4a4 | 155 | mems_expansion_board->hts221.GetTemperature((float *)&TEMPERATURE_Value); |
davidkwak | 0:db24f1dae4a4 | 156 | mems_expansion_board->hts221.GetHumidity((float *)&HUMIDITY_Value); |
davidkwak | 0:db24f1dae4a4 | 157 | mems_expansion_board->lps25h.GetPressure((float *)&PRESSURE_Value); |
davidkwak | 0:db24f1dae4a4 | 158 | mems_expansion_board->lis3mdl.GetAxes((AxesRaw_TypeDef *)&MAG_Value); |
davidkwak | 0:db24f1dae4a4 | 159 | mems_expansion_board->lsm6ds0.Acc_GetAxes((AxesRaw_TypeDef *)&ACC_Value); |
davidkwak | 0:db24f1dae4a4 | 160 | mems_expansion_board->lsm6ds0.Gyro_GetAxes((AxesRaw_TypeDef *)&GYR_Value); |
davidkwak | 0:db24f1dae4a4 | 161 | |
davidkwak | 0:db24f1dae4a4 | 162 | /* Output sensor data. */ |
davidkwak | 0:db24f1dae4a4 | 163 | pc.printf("TEMP: %f HUMIDITY: %f PRESSURE: %f\t\r\n", TEMPERATURE_Value, HUMIDITY_Value, PRESSURE_Value); |
davidkwak | 0:db24f1dae4a4 | 164 | pc.printf("X_MAG: %d, Y_MAG: %d, Z_MAG: %d\t\r\n", MAG_Value.AXIS_X, MAG_Value.AXIS_Y, MAG_Value.AXIS_Z); |
davidkwak | 0:db24f1dae4a4 | 165 | pc.printf("X_ACC: %d, Y_ACC: %d, Z_ACC: %d\t\r\n", ACC_Value.AXIS_X, ACC_Value.AXIS_Y, ACC_Value.AXIS_Z); |
davidkwak | 0:db24f1dae4a4 | 166 | pc.printf("X_GYR: %d, Y_GYR: %d, Z_GYR: %d\t\r\n\n", GYR_Value.AXIS_X, GYR_Value.AXIS_Y, GYR_Value.AXIS_Z); |
davidkwak | 0:db24f1dae4a4 | 167 | |
davidkwak | 0:db24f1dae4a4 | 168 | /* Convert temperature to degrees Farhenheit. */ |
davidkwak | 0:db24f1dae4a4 | 169 | float temperature_f = (1.8f * TEMPERATURE_Value) + 32.0f; |
davidkwak | 0:db24f1dae4a4 | 170 | |
davidkwak | 0:db24f1dae4a4 | 171 | /* Post temperature to the m2x stream. */ |
davidkwak | 0:db24f1dae4a4 | 172 | m2x_response = m2xClient.updateStreamValue(feed, tempStream, temperature_f); |
davidkwak | 0:db24f1dae4a4 | 173 | |
davidkwak | 0:db24f1dae4a4 | 174 | pc.printf("Temperature updateStreamValue response code: %d\r\n", m2x_response); |
davidkwak | 0:db24f1dae4a4 | 175 | |
davidkwak | 0:db24f1dae4a4 | 176 | if (m2x_response == -1) |
davidkwak | 0:db24f1dae4a4 | 177 | { |
davidkwak | 0:db24f1dae4a4 | 178 | pc.printf("Temperature data transmit post error\n"); |
davidkwak | 0:db24f1dae4a4 | 179 | } |
davidkwak | 0:db24f1dae4a4 | 180 | |
davidkwak | 0:db24f1dae4a4 | 181 | /* Post humidity to the m2x stream. */ |
davidkwak | 0:db24f1dae4a4 | 182 | m2x_response = m2xClient.updateStreamValue(feed, humStream, HUMIDITY_Value); |
davidkwak | 0:db24f1dae4a4 | 183 | |
davidkwak | 0:db24f1dae4a4 | 184 | pc.printf("Humidity updateStreamValue response code: %d\r\n", m2x_response); |
davidkwak | 0:db24f1dae4a4 | 185 | |
davidkwak | 0:db24f1dae4a4 | 186 | if (m2x_response == -1) |
davidkwak | 0:db24f1dae4a4 | 187 | { |
davidkwak | 0:db24f1dae4a4 | 188 | pc.printf("Humidity data transmit post error\n"); |
davidkwak | 0:db24f1dae4a4 | 189 | } |
davidkwak | 0:db24f1dae4a4 | 190 | |
davidkwak | 0:db24f1dae4a4 | 191 | /* Post acceleration (x-axis) to the m2x stream. */ |
davidkwak | 0:db24f1dae4a4 | 192 | m2x_response = m2xClient.updateStreamValue(feed, accStream, ACC_Value.AXIS_X); |
davidkwak | 0:db24f1dae4a4 | 193 | |
davidkwak | 0:db24f1dae4a4 | 194 | pc.printf("Acceleration updateStreamValue response code: %d\r\n", m2x_response); |
davidkwak | 0:db24f1dae4a4 | 195 | |
davidkwak | 0:db24f1dae4a4 | 196 | if (m2x_response == -1) |
davidkwak | 0:db24f1dae4a4 | 197 | { |
davidkwak | 0:db24f1dae4a4 | 198 | pc.printf("Acceleration data transmit post error\n"); |
davidkwak | 0:db24f1dae4a4 | 199 | } |
davidkwak | 0:db24f1dae4a4 | 200 | |
davidkwak | 0:db24f1dae4a4 | 201 | pc.printf("\n"); |
davidkwak | 0:db24f1dae4a4 | 202 | |
davidkwak | 0:db24f1dae4a4 | 203 | wait(30); // 30 s |
davidkwak | 0:db24f1dae4a4 | 204 | } |
davidkwak | 0:db24f1dae4a4 | 205 | } |
davidkwak | 0:db24f1dae4a4 | 206 |