Includes support for IKS01A1 per HelloWorld_IKS01A1

Dependencies:   NetworkSocketAPI X_NUCLEO_IDW01M1v2 X_NUCLEO_IKS01A1 mbed

Fork of Nucleo_read_a0_thingspace by Tom Amershek

Committer:
tamershek
Date:
Fri Nov 04 11:26:16 2016 +0000
Revision:
2:553393c6c088
Parent:
1:c0a277c96fd6
Fixed buffer issue with receive data, now using last 6 digits of MAC, and now clocking serial at 115200 for better performance

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tamershek 0:45e9e04829d0 1 // read analog0 and send to thingspace.io
tamershek 0:45e9e04829d0 2 // toma 2016-11-01
tamershek 0:45e9e04829d0 3
tamershek 0:45e9e04829d0 4 #include "mbed.h"
tamershek 0:45e9e04829d0 5 #include "stdio.h"
tamershek 0:45e9e04829d0 6 #include "SpwfInterface.h"
tamershek 0:45e9e04829d0 7 #include "TCPSocket.h"
tamershek 0:45e9e04829d0 8 #include <string>
tamershek 1:c0a277c96fd6 9 #include "x_nucleo_iks01a1.h"
tamershek 0:45e9e04829d0 10
tamershek 0:45e9e04829d0 11 /*************************************
tamershek 0:45e9e04829d0 12 //FRDM-K64: D9->UART1_TX, D7->UART1_RX
tamershek 0:45e9e04829d0 13 Pin connections:
tamershek 0:45e9e04829d0 14 FRDM IDW01M1
tamershek 0:45e9e04829d0 15 ------ ---------
tamershek 0:45e9e04829d0 16 +3v3 <--> +3v3
tamershek 0:45e9e04829d0 17 GND <--> GND
tamershek 0:45e9e04829d0 18 D9 <--> D8
tamershek 0:45e9e04829d0 19 D7 <--> D2
tamershek 0:45e9e04829d0 20
tamershek 0:45e9e04829d0 21 SpwfSAInterface spwf(D9, D7, false);
tamershek 0:45e9e04829d0 22 *************************************/
tamershek 0:45e9e04829d0 23 /*************************************
tamershek 0:45e9e04829d0 24 //LPCXpresso11U68: D9->UART1_TX, D7->UART1_RX
tamershek 0:45e9e04829d0 25 Pin connections:
tamershek 0:45e9e04829d0 26 LPC IDW01M1
tamershek 0:45e9e04829d0 27 ------ ---------
tamershek 0:45e9e04829d0 28 +3v3 <--> +3v3
tamershek 0:45e9e04829d0 29 GND <--> GND
tamershek 0:45e9e04829d0 30 A1 <--> D8
tamershek 0:45e9e04829d0 31 A2 <--> D2
tamershek 0:45e9e04829d0 32
tamershek 0:45e9e04829d0 33 SpwfSAInterface spwf(A1, A2, false);
tamershek 0:45e9e04829d0 34 *************************************/
tamershek 0:45e9e04829d0 35
tamershek 0:45e9e04829d0 36 //NUCLEO: D8->UART1_TX (PA_9), D2->UART1_RX (PA_10)
tamershek 0:45e9e04829d0 37
tamershek 0:45e9e04829d0 38 using namespace std;
tamershek 0:45e9e04829d0 39
tamershek 0:45e9e04829d0 40 AnalogIn analog_input_A0(A0);
tamershek 0:45e9e04829d0 41 Serial serial_port(USBTX, USBRX);
tamershek 0:45e9e04829d0 42 DigitalOut myLed(LED1);
tamershek 0:45e9e04829d0 43 SpwfSAInterface spwf(D8, D2, false);
tamershek 0:45e9e04829d0 44
tamershek 1:c0a277c96fd6 45 /* Instantiate the expansion board */
tamershek 1:c0a277c96fd6 46 static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15);
tamershek 1:c0a277c96fd6 47
tamershek 1:c0a277c96fd6 48 /* Retrieve the composing elements of the expansion board */
tamershek 1:c0a277c96fd6 49 static GyroSensor *gyroscope = mems_expansion_board->GetGyroscope();
tamershek 1:c0a277c96fd6 50 static MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer();
tamershek 1:c0a277c96fd6 51 static MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
tamershek 1:c0a277c96fd6 52 static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;
tamershek 1:c0a277c96fd6 53 static PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor;
tamershek 1:c0a277c96fd6 54 static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor;
tamershek 1:c0a277c96fd6 55 static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor;
tamershek 1:c0a277c96fd6 56
tamershek 0:45e9e04829d0 57 int errConnect;
tamershek 0:45e9e04829d0 58 int errSend;
tamershek 0:45e9e04829d0 59
tamershek 1:c0a277c96fd6 60 /* Helper function for printing floats & doubles */
tamershek 1:c0a277c96fd6 61 static char *printDouble(char* str, double v, int decimalDigits=2)
tamershek 1:c0a277c96fd6 62 {
tamershek 1:c0a277c96fd6 63 int i = 1;
tamershek 1:c0a277c96fd6 64 int intPart, fractPart;
tamershek 1:c0a277c96fd6 65 int len;
tamershek 1:c0a277c96fd6 66 char *ptr;
tamershek 1:c0a277c96fd6 67
tamershek 1:c0a277c96fd6 68 /* prepare decimal digits multiplicator */
tamershek 1:c0a277c96fd6 69 for (;decimalDigits!=0; i*=10, decimalDigits--);
tamershek 1:c0a277c96fd6 70
tamershek 1:c0a277c96fd6 71 /* calculate integer & fractinal parts */
tamershek 1:c0a277c96fd6 72 intPart = (int)v;
tamershek 1:c0a277c96fd6 73 fractPart = (int)((v-(double)(int)v)*i);
tamershek 1:c0a277c96fd6 74
tamershek 1:c0a277c96fd6 75 /* fill in integer part */
tamershek 1:c0a277c96fd6 76 sprintf(str, "%i.", intPart);
tamershek 1:c0a277c96fd6 77
tamershek 1:c0a277c96fd6 78 /* prepare fill in of fractional part */
tamershek 1:c0a277c96fd6 79 len = strlen(str);
tamershek 1:c0a277c96fd6 80 ptr = &str[len];
tamershek 1:c0a277c96fd6 81
tamershek 1:c0a277c96fd6 82 /* fill in leading fractional zeros */
tamershek 1:c0a277c96fd6 83 for (i/=10;i>1; i/=10, ptr++) {
tamershek 1:c0a277c96fd6 84 if(fractPart >= i) break;
tamershek 1:c0a277c96fd6 85 *ptr = '0';
tamershek 1:c0a277c96fd6 86 }
tamershek 1:c0a277c96fd6 87
tamershek 1:c0a277c96fd6 88 /* fill in (rest of) fractional part */
tamershek 1:c0a277c96fd6 89 sprintf(ptr, "%i", fractPart);
tamershek 1:c0a277c96fd6 90
tamershek 1:c0a277c96fd6 91 return str;
tamershek 1:c0a277c96fd6 92 }
tamershek 1:c0a277c96fd6 93
tamershek 0:45e9e04829d0 94 int main()
tamershek 0:45e9e04829d0 95 {
tamershek 1:c0a277c96fd6 96 uint8_t id;
tamershek 1:c0a277c96fd6 97 float value1, value2;
tamershek 1:c0a277c96fd6 98 char buffer1[32], buffer2[32];
tamershek 1:c0a277c96fd6 99 int32_t axes[3];
tamershek 1:c0a277c96fd6 100
tamershek 0:45e9e04829d0 101 float panel_voltage;
tamershek 0:45e9e04829d0 102 DigitalOut led(LED1);
tamershek 2:553393c6c088 103 serial_port.baud(115200);
tamershek 0:45e9e04829d0 104
tamershek 0:45e9e04829d0 105 printf("\r\n\r\n*** system restart");
tamershek 0:45e9e04829d0 106 printf("\r\n\r\nanalog0 example using thingspace.io ...\n");
tamershek 0:45e9e04829d0 107
tamershek 0:45e9e04829d0 108 char *ssid = "";
tamershek 0:45e9e04829d0 109 char *seckey = "";
tamershek 0:45e9e04829d0 110 const char *mac;
tamershek 0:45e9e04829d0 111
tamershek 0:45e9e04829d0 112 printf("X-NUCLEO-IDW01M1v2 mbed application\r\n");
tamershek 0:45e9e04829d0 113
tamershek 0:45e9e04829d0 114 int spwfResponse;
tamershek 0:45e9e04829d0 115 spwfResponse = 0;
tamershek 0:45e9e04829d0 116
tamershek 0:45e9e04829d0 117 while(spwfResponse != 1) {
tamershek 0:45e9e04829d0 118 printf("connecting to access point ...\r\n");
tamershek 0:45e9e04829d0 119 spwfResponse = spwf.connect(ssid, seckey, NSAPI_SECURITY_WPA2);//WPA
tamershek 0:45e9e04829d0 120 printf("\nresponse: %i\n", spwfResponse);
tamershek 0:45e9e04829d0 121 if(spwfResponse != 1)
tamershek 0:45e9e04829d0 122 {
tamershek 0:45e9e04829d0 123 printf("error making connecting to access point\r\n");
tamershek 0:45e9e04829d0 124 }
tamershek 0:45e9e04829d0 125 else
tamershek 0:45e9e04829d0 126 {
tamershek 0:45e9e04829d0 127 printf("success connecting to access point\r\n");
tamershek 0:45e9e04829d0 128 const char *ip = spwf.get_ip_address();
tamershek 0:45e9e04829d0 129 mac = spwf.get_mac_address();
tamershek 0:45e9e04829d0 130 printf("\r\nip address = %s\r\n", (ip) ? ip : "error getting ip address");
tamershek 0:45e9e04829d0 131 printf("mac address = %s\r\n", (mac) ? mac : "error getting the mac address\n");
tamershek 0:45e9e04829d0 132 }
tamershek 0:45e9e04829d0 133 }
tamershek 0:45e9e04829d0 134
tamershek 0:45e9e04829d0 135 SocketAddress addrDweetServer(&spwf, "thingspace.io");
tamershek 0:45e9e04829d0 136 printf("\r\nthingspace.verizon.com resolved to: %s\r\n\r\n", addrDweetServer.get_ip_address());
tamershek 0:45e9e04829d0 137
tamershek 0:45e9e04829d0 138 TCPSocket socket(&spwf);
tamershek 0:45e9e04829d0 139
tamershek 0:45e9e04829d0 140 // connect socket
tamershek 0:45e9e04829d0 141 errConnect = socket.connect("thingspace.io", 80);
tamershek 0:45e9e04829d0 142 if(errConnect!=0) {
tamershek 0:45e9e04829d0 143 printf("\r\ncould not connect to socket; error = %d\r\n", errConnect);
tamershek 0:45e9e04829d0 144 } else {
tamershek 0:45e9e04829d0 145 printf("socket connected\r\n");
tamershek 0:45e9e04829d0 146 }
tamershek 0:45e9e04829d0 147
tamershek 0:45e9e04829d0 148 // get the last 2 bytes of the mac for the thing name
tamershek 0:45e9e04829d0 149 std::string macString = mac;
tamershek 0:45e9e04829d0 150 macString.erase(0,9);
tamershek 0:45e9e04829d0 151 macString.erase(2,1);
tamershek 0:45e9e04829d0 152 macString.erase(4,1);
tamershek 0:45e9e04829d0 153 const char *macBytes = macString.c_str();
tamershek 1:c0a277c96fd6 154
tamershek 1:c0a277c96fd6 155 humidity_sensor->ReadID(&id);
tamershek 1:c0a277c96fd6 156 pressure_sensor->ReadID(&id);
tamershek 1:c0a277c96fd6 157 magnetometer->ReadID(&id);
tamershek 1:c0a277c96fd6 158 gyroscope->ReadID(&id);
tamershek 1:c0a277c96fd6 159 wait(3);
tamershek 0:45e9e04829d0 160
tamershek 0:45e9e04829d0 161 while(1) {
tamershek 1:c0a277c96fd6 162
tamershek 1:c0a277c96fd6 163 std::string readings = "";
tamershek 1:c0a277c96fd6 164 temp_sensor1->GetTemperature(&value1);
tamershek 1:c0a277c96fd6 165 humidity_sensor->GetHumidity(&value2);
tamershek 1:c0a277c96fd6 166
tamershek 1:c0a277c96fd6 167 readings = readings + "&temperature1=";
tamershek 1:c0a277c96fd6 168 readings = readings + printDouble(buffer1,value1);
tamershek 1:c0a277c96fd6 169 readings = readings + "&humidity=";
tamershek 1:c0a277c96fd6 170 readings = readings + printDouble(buffer2,value2);
tamershek 1:c0a277c96fd6 171
tamershek 1:c0a277c96fd6 172 temp_sensor2->GetFahrenheit(&value1);
tamershek 1:c0a277c96fd6 173 pressure_sensor->GetPressure(&value2);
tamershek 1:c0a277c96fd6 174
tamershek 1:c0a277c96fd6 175 readings = readings + "&temperature2=";
tamershek 1:c0a277c96fd6 176 readings = readings + printDouble(buffer1,value1);
tamershek 1:c0a277c96fd6 177 readings = readings + "&pressure=";
tamershek 1:c0a277c96fd6 178 readings = readings + printDouble(buffer2,value2);
tamershek 1:c0a277c96fd6 179
tamershek 1:c0a277c96fd6 180 char magBuff[64] = "";
tamershek 1:c0a277c96fd6 181 magnetometer->Get_M_Axes(axes);
tamershek 1:c0a277c96fd6 182 sprintf(magBuff, "&magnometer0=%ld&magnometer1=%ld&magnometer2=%ld", axes[0], axes[1], axes[2]);
tamershek 1:c0a277c96fd6 183 readings = readings + magBuff;
tamershek 1:c0a277c96fd6 184
tamershek 1:c0a277c96fd6 185 char accBuff[64] = "";
tamershek 1:c0a277c96fd6 186 accelerometer->Get_X_Axes(axes);
tamershek 1:c0a277c96fd6 187 sprintf(accBuff, "&accelerometer0=%ld&accelerometer1=%ld&accelerometer2=%ld", axes[0], axes[1], axes[2]);
tamershek 1:c0a277c96fd6 188 readings = readings + accBuff;
tamershek 1:c0a277c96fd6 189
tamershek 1:c0a277c96fd6 190 char gyroBuff[64] = "";
tamershek 1:c0a277c96fd6 191 gyroscope->Get_G_Axes(axes);
tamershek 1:c0a277c96fd6 192 sprintf(gyroBuff, "&gyroscope0=%ld&gyroscope1=%ld&gyroscope2=%ld", axes[0], axes[1], axes[2]);
tamershek 1:c0a277c96fd6 193 readings = readings + gyroBuff;
tamershek 1:c0a277c96fd6 194
tamershek 2:553393c6c088 195 // printf(readings.c_str());
tamershek 1:c0a277c96fd6 196
tamershek 0:45e9e04829d0 197 panel_voltage = analog_input_A0.read();
tamershek 1:c0a277c96fd6 198 // printf("voltage: %f\r\n", panel_voltage);
tamershek 2:553393c6c088 199
tamershek 0:45e9e04829d0 200 // A0 is voltage tolerant to 3.3V, and analog read returns a percentage of the maximum
tamershek 0:45e9e04829d0 201 // need to convert the percentage back to a representative number
tamershek 0:45e9e04829d0 202 panel_voltage = panel_voltage * 3300; // change the value to be in the 0 to 3300 range
tamershek 0:45e9e04829d0 203 // printf("a0 reads %.3f mV\n", panel_voltage); // use 3 decimals of precision
tamershek 0:45e9e04829d0 204
tamershek 0:45e9e04829d0 205 // enable LED if voltage exceeds 2000 mV
tamershek 0:45e9e04829d0 206 if (panel_voltage > 2000) {
tamershek 0:45e9e04829d0 207 myLed = 1;
tamershek 0:45e9e04829d0 208 }
tamershek 0:45e9e04829d0 209 else {
tamershek 0:45e9e04829d0 210 myLed = 0;
tamershek 0:45e9e04829d0 211 }
tamershek 0:45e9e04829d0 212
tamershek 0:45e9e04829d0 213 // don't bother if never connected ...
tamershek 0:45e9e04829d0 214 if (spwfResponse == 1) {
tamershek 0:45e9e04829d0 215 // get length of jsonContent as string without streams
tamershek 0:45e9e04829d0 216 // adapted from http://codereview.stackexchange.com/questions/51270/socket-http-post-request
tamershek 0:45e9e04829d0 217
tamershek 1:c0a277c96fd6 218 char dweetBuffer[512] = "";
tamershek 0:45e9e04829d0 219
tamershek 0:45e9e04829d0 220 // create GET HTTP header for dweeting
tamershek 0:45e9e04829d0 221 strcpy(dweetBuffer, "GET /dweet/for/nucleo-");
tamershek 1:c0a277c96fd6 222 // uncomment to use the last 6 digits of WiFi MAC
tamershek 2:553393c6c088 223 strcat(dweetBuffer, macBytes);
tamershek 2:553393c6c088 224 char valueRead[16];
tamershek 2:553393c6c088 225 sprintf(valueRead, "?a0=%f", panel_voltage);
tamershek 0:45e9e04829d0 226 strcat(dweetBuffer, valueRead);
tamershek 1:c0a277c96fd6 227 strcat(dweetBuffer, readings.c_str());
tamershek 0:45e9e04829d0 228 strcat(dweetBuffer, " HTTP/1.1\r\n\r\n");
tamershek 0:45e9e04829d0 229
tamershek 0:45e9e04829d0 230 serial_port.printf("\r\n%s", dweetBuffer);
tamershek 0:45e9e04829d0 231
tamershek 2:553393c6c088 232 char bufferRx[1024] = "";
tamershek 0:45e9e04829d0 233 int countRx = 0;
tamershek 0:45e9e04829d0 234 serial_port.printf("sending and receiving data ...\r\n");
tamershek 0:45e9e04829d0 235 errSend = socket.send(dweetBuffer, strlen(dweetBuffer));
tamershek 0:45e9e04829d0 236 countRx = socket.recv(bufferRx, sizeof bufferRx);
tamershek 1:c0a277c96fd6 237 printf("sent %d bytes and received %d bytes\r\n\r\n", errSend, countRx);
tamershek 0:45e9e04829d0 238 printf(bufferRx);
tamershek 1:c0a277c96fd6 239 printf("\r\n\r\n*** 5-second pause ...\r\n\r\n");
tamershek 0:45e9e04829d0 240 }
tamershek 0:45e9e04829d0 241 wait(5.0); // 5000 ms delay before looping to next read
tamershek 0:45e9e04829d0 242 }
tamershek 0:45e9e04829d0 243 }