Invio payload JSON hex encoded su porte 15-20.

Dependencies:   mbed X_NUCLEO_IKS01A2

Gruppo 3 - De Luca, De Vivo, Luongo

Committer:
rschiano75
Date:
Thu Apr 23 19:55:53 2020 +0000
Revision:
1:57673ebedd58
Parent:
0:2da416334d69
Corretto mancata stampa del port

Who changed what in which revision?

UserRevisionLine numberNew contents of line
reversi 0:2da416334d69 1 #include "mbed.h"
reversi 0:2da416334d69 2 #include "XNucleoIKS01A2.h"
reversi 0:2da416334d69 3 #include "string"
reversi 0:2da416334d69 4
reversi 0:2da416334d69 5 #define CR 0x0D
reversi 0:2da416334d69 6
reversi 0:2da416334d69 7 using namespace std;
reversi 0:2da416334d69 8
reversi 0:2da416334d69 9 Serial pc(PA_2, PA_3, 115200); // seriale pc
reversi 0:2da416334d69 10 Serial lora(PB_6,PA_10,115200);
reversi 0:2da416334d69 11
reversi 0:2da416334d69 12 static XNucleoIKS01A2 *board = XNucleoIKS01A2::instance(D14,D15,D4,D5); // scheda
reversi 0:2da416334d69 13 static LSM303AGRMagSensor *magSensor = board->magnetometer; // magnetoscopio
reversi 0:2da416334d69 14 static LPS22HBSensor *presSensor = board->pt_sensor; // pressione
reversi 0:2da416334d69 15 static HTS221Sensor *tempSensor= board->ht_sensor; // temperatura e umidita'
reversi 0:2da416334d69 16 static LSM6DSLSensor *iNemo = board->acc_gyro; // giroscopio
reversi 0:2da416334d69 17
reversi 0:2da416334d69 18 enum DataType {PRESSURE = 0, MAG_FIELD, TEMPERATURE, HUMIDITY, ACCELERATION, ANG_VELOCITY, N_DATA_TYPES};
reversi 0:2da416334d69 19 uint16_t ports[N_DATA_TYPES] = {15, 16, 17, 18, 19, 20};
reversi 0:2da416334d69 20
reversi 0:2da416334d69 21
reversi 0:2da416334d69 22 void connect_to_lora();
reversi 0:2da416334d69 23 void wait4join();
reversi 0:2da416334d69 24 void modem_at_cmd(const string&);
reversi 0:2da416334d69 25 void at_send(uint16_t, const string&, bool);
reversi 0:2da416334d69 26
reversi 0:2da416334d69 27 string hex_encode(const string&);
reversi 0:2da416334d69 28
reversi 0:2da416334d69 29 void enable_all_sensors();
reversi 0:2da416334d69 30 void get_pressure();
reversi 0:2da416334d69 31 void get_magnetic_field();
reversi 0:2da416334d69 32 void get_temperature();
reversi 0:2da416334d69 33 void get_humidity();
reversi 0:2da416334d69 34 void get_acceleration();
reversi 0:2da416334d69 35 void get_gyroscope();
reversi 0:2da416334d69 36
reversi 0:2da416334d69 37
reversi 0:2da416334d69 38 float pressure = 0;
reversi 0:2da416334d69 39 float temperature = 0;
reversi 0:2da416334d69 40 float humidity = 0;
reversi 0:2da416334d69 41 int assi_giroscopio[3];
reversi 0:2da416334d69 42 int assi_accelerazione[3];
reversi 0:2da416334d69 43 int assi_magnetometro[3];
reversi 0:2da416334d69 44
reversi 0:2da416334d69 45 int main() {
reversi 0:2da416334d69 46
reversi 0:2da416334d69 47 enable_all_sensors();
reversi 0:2da416334d69 48 connect_to_lora();
reversi 0:2da416334d69 49
reversi 0:2da416334d69 50 size_t counter = 0;
reversi 0:2da416334d69 51 int data_type = PRESSURE;
reversi 0:2da416334d69 52
reversi 0:2da416334d69 53 char payload[256];
reversi 0:2da416334d69 54 while (1) {
reversi 0:2da416334d69 55
reversi 0:2da416334d69 56 memset(payload, 0, 256);
reversi 0:2da416334d69 57
reversi 0:2da416334d69 58 switch (data_type) {
reversi 0:2da416334d69 59 case PRESSURE:
reversi 0:2da416334d69 60 get_pressure();
reversi 0:2da416334d69 61 sprintf(payload, "{\"pressure\":%.6f}", pressure);
reversi 0:2da416334d69 62 break;
reversi 0:2da416334d69 63 case MAG_FIELD:
reversi 0:2da416334d69 64 get_magnetic_field();
reversi 0:2da416334d69 65 sprintf(payload, "{\"magx\":%d, \"magy\":%d, \"magz\":%d}", assi_magnetometro[0] , assi_magnetometro[1] , assi_magnetometro[2]);
reversi 0:2da416334d69 66 break;
reversi 0:2da416334d69 67 case TEMPERATURE:
reversi 0:2da416334d69 68 get_temperature();
reversi 0:2da416334d69 69 sprintf(payload, "{\"temperature\":%.6f}", temperature);
reversi 0:2da416334d69 70 break;
reversi 0:2da416334d69 71 case HUMIDITY:
reversi 0:2da416334d69 72 get_humidity();
reversi 0:2da416334d69 73 sprintf(payload, "{\"humidity\":%.6f}", humidity);
reversi 0:2da416334d69 74 break;
reversi 0:2da416334d69 75 case ACCELERATION:
reversi 0:2da416334d69 76 get_acceleration();
reversi 0:2da416334d69 77 sprintf(payload, "{\"accx\":%d, \"accy\":%d, \"accz\":%d}", assi_accelerazione[0] , assi_accelerazione[1] , assi_accelerazione[2]);
reversi 0:2da416334d69 78 break;
reversi 0:2da416334d69 79 case ANG_VELOCITY:
reversi 0:2da416334d69 80 get_gyroscope();
reversi 0:2da416334d69 81 sprintf(payload, "{\"angvelx\":%d, \"angvely\":%d, \"angvelz\":%d}", assi_giroscopio[0] , assi_giroscopio[1] , assi_giroscopio[2]);
reversi 0:2da416334d69 82 break;
reversi 0:2da416334d69 83 }
reversi 0:2da416334d69 84
reversi 0:2da416334d69 85 at_send(ports[data_type], payload, false);
reversi 0:2da416334d69 86
reversi 0:2da416334d69 87 data_type = (data_type + 1) % N_DATA_TYPES;
reversi 0:2da416334d69 88 ++counter;
reversi 0:2da416334d69 89
reversi 0:2da416334d69 90 wait(5.0);
reversi 0:2da416334d69 91 }
reversi 0:2da416334d69 92 }
reversi 0:2da416334d69 93
reversi 0:2da416334d69 94
reversi 0:2da416334d69 95 string hex_encode(const string& input) {
reversi 0:2da416334d69 96 static const char hex_digits[] = "0123456789ABCDEF";
reversi 0:2da416334d69 97 string output;
reversi 0:2da416334d69 98 output.reserve(input.length() * 2);
reversi 0:2da416334d69 99 for (int i = 0; i < input.length(); i++)
reversi 0:2da416334d69 100 {
reversi 0:2da416334d69 101 output += hex_digits[input[i] >> 4];
reversi 0:2da416334d69 102 output += hex_digits[input[i] & 15];
reversi 0:2da416334d69 103 }
reversi 0:2da416334d69 104 return output;
reversi 0:2da416334d69 105 }
reversi 0:2da416334d69 106
reversi 0:2da416334d69 107 void at_send(uint16_t port, const string& payload, bool ack = false) {
rschiano75 1:57673ebedd58 108 //string port_msg;
rschiano75 1:57673ebedd58 109 char port_pref[12] = {"AT+SEND="};
rschiano75 1:57673ebedd58 110 //port_msg.reserve(5); // max port 2^16-1 = 65545
rschiano75 1:57673ebedd58 111 sprintf(port_pref + 8, "%d", port);
rschiano75 1:57673ebedd58 112 //pc.printf(port_pref);
reversi 0:2da416334d69 113 string hex_payload = hex_encode(payload);
rschiano75 1:57673ebedd58 114 //string test = (string)port_pref + "," + hex_payload + "," + (ack ? '1' : '0');
rschiano75 1:57673ebedd58 115 //pc.printf(&test[0]);
rschiano75 1:57673ebedd58 116 modem_at_cmd((string)port_pref + "," + hex_payload + "," + (ack ? '1' : '0'));
reversi 0:2da416334d69 117 }
reversi 0:2da416334d69 118
reversi 0:2da416334d69 119 void modem_at_cmd(const string& buffer) {
reversi 0:2da416334d69 120 for(uint16_t i = 0; i < buffer.length(); i++) {
reversi 0:2da416334d69 121 lora.putc(buffer[i]);
reversi 0:2da416334d69 122 pc.putc(buffer[i]);
reversi 0:2da416334d69 123 }
reversi 0:2da416334d69 124 lora.putc(CR);
reversi 0:2da416334d69 125
reversi 0:2da416334d69 126 pc.putc(CR);
reversi 0:2da416334d69 127 pc.printf("\n");
reversi 0:2da416334d69 128
reversi 0:2da416334d69 129 char c = 0;
reversi 0:2da416334d69 130 do {
reversi 0:2da416334d69 131 if (lora.readable()) {
reversi 0:2da416334d69 132 c = lora.getc();
reversi 0:2da416334d69 133 pc.putc(c);
reversi 0:2da416334d69 134 }
reversi 0:2da416334d69 135 } while(c != ' ');
reversi 0:2da416334d69 136 }
reversi 0:2da416334d69 137
reversi 0:2da416334d69 138 void wait4join(){
reversi 0:2da416334d69 139 char c = 0;
reversi 0:2da416334d69 140 do {
reversi 0:2da416334d69 141 if (lora.readable()) {
reversi 0:2da416334d69 142 c = lora.getc();
reversi 0:2da416334d69 143 pc.putc(c);
reversi 0:2da416334d69 144 }
reversi 0:2da416334d69 145 } while(c != 'd');
reversi 0:2da416334d69 146 }
reversi 0:2da416334d69 147
reversi 0:2da416334d69 148 void connect_to_lora() {
reversi 0:2da416334d69 149 modem_at_cmd("AT");
reversi 0:2da416334d69 150 pc.printf("Establishing connection to LoRa\r\n");
reversi 0:2da416334d69 151 wait(1);
reversi 0:2da416334d69 152
reversi 0:2da416334d69 153 modem_at_cmd("AT+APPEUI=0000000000000001");
reversi 0:2da416334d69 154 pc.printf("Inviato EUI\r\n");
reversi 0:2da416334d69 155 wait(1);
reversi 0:2da416334d69 156
reversi 0:2da416334d69 157 modem_at_cmd("AT+AK=00000000000000000000000000000001");
reversi 0:2da416334d69 158 pc.printf("Inviato AK\r\n");
reversi 0:2da416334d69 159 wait(1);
reversi 0:2da416334d69 160
reversi 0:2da416334d69 161 modem_at_cmd("AT+JOIN=1");
reversi 0:2da416334d69 162 pc.printf("Inviato JOIN\r\n");
reversi 0:2da416334d69 163 wait4join();
reversi 0:2da416334d69 164
reversi 0:2da416334d69 165 modem_at_cmd("AT+DC=0");
reversi 0:2da416334d69 166 pc.printf("Disabled DC\r\n");
reversi 0:2da416334d69 167 wait(1);
reversi 0:2da416334d69 168
reversi 0:2da416334d69 169 modem_at_cmd("AT+ADR=1");
reversi 0:2da416334d69 170 pc.printf("Enabled ADR\r\n");
reversi 0:2da416334d69 171 wait(1);
reversi 0:2da416334d69 172 }
reversi 0:2da416334d69 173
reversi 0:2da416334d69 174 void enable_all_sensors() {
reversi 0:2da416334d69 175 presSensor->enable();
reversi 0:2da416334d69 176 magSensor->enable();
reversi 0:2da416334d69 177 tempSensor->enable();
reversi 0:2da416334d69 178 iNemo->enable_g();
reversi 0:2da416334d69 179 iNemo->enable_x();
reversi 0:2da416334d69 180 }
reversi 0:2da416334d69 181
reversi 0:2da416334d69 182 void get_pressure() {
reversi 0:2da416334d69 183 presSensor->get_pressure(&pressure);
reversi 0:2da416334d69 184 pc.printf("pressure [mbar]:\t%f\r\n", pressure);
reversi 0:2da416334d69 185 }
reversi 0:2da416334d69 186
reversi 0:2da416334d69 187 void get_magnetic_field() {
reversi 0:2da416334d69 188 magSensor->get_m_axes(assi_magnetometro);
reversi 0:2da416334d69 189 pc.printf("mag field [mgauss]:\t%d\t%d\t%d\n\r", assi_magnetometro[0] , assi_magnetometro[1] , assi_magnetometro[2]);
reversi 0:2da416334d69 190 }
reversi 0:2da416334d69 191
reversi 0:2da416334d69 192 void get_temperature() {
reversi 0:2da416334d69 193 tempSensor->get_temperature(&temperature);
reversi 0:2da416334d69 194 pc.printf("temperature ['C]:\t%f\n\r", temperature);
reversi 0:2da416334d69 195 }
reversi 0:2da416334d69 196
reversi 0:2da416334d69 197 void get_humidity() {
reversi 0:2da416334d69 198 tempSensor->get_humidity(&humidity);
reversi 0:2da416334d69 199 pc.printf("humidity [%%]\t\t%f\r\n", humidity);
reversi 0:2da416334d69 200 }
reversi 0:2da416334d69 201
reversi 0:2da416334d69 202 void get_acceleration() {
reversi 0:2da416334d69 203 iNemo->get_x_axes(assi_accelerazione);
reversi 0:2da416334d69 204 pc.printf("acceleration [mg]:\t%d\t%d\t%d\n\r", assi_accelerazione[0] , assi_accelerazione[1] , assi_accelerazione[2]);
reversi 0:2da416334d69 205 }
reversi 0:2da416334d69 206
reversi 0:2da416334d69 207 void get_gyroscope() {
reversi 0:2da416334d69 208 iNemo->get_g_axes(assi_giroscopio);
reversi 0:2da416334d69 209 pc.printf("ang velocity [rad/s]:\t%d\t%d\t%d\n\r", assi_giroscopio[0] , assi_giroscopio[1] , assi_giroscopio[2]);
reversi 0:2da416334d69 210 }