5G Academy / Mbed 2 deprecated LoRaWAN

Dependencies:   mbed X_NUCLEO_IKS01A2

Committer:
reversi
Date:
Thu Apr 23 18:36:48 2020 +0000
Revision:
0:2da416334d69
Child:
1:57673ebedd58
Invio dati sensori come payload JSON codificato in hex su porte 15-20

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) {
reversi 0:2da416334d69 108 string port_msg;
reversi 0:2da416334d69 109 port_msg.reserve(5); // max port 2^16-1 = 65545
reversi 0:2da416334d69 110 sprintf(&port_msg[0], "%d", port);
reversi 0:2da416334d69 111
reversi 0:2da416334d69 112 string hex_payload = hex_encode(payload);
reversi 0:2da416334d69 113
reversi 0:2da416334d69 114 modem_at_cmd("AT+SEND=" + port_msg + "," + hex_payload + "," + (ack ? '1' : '0'));
reversi 0:2da416334d69 115 }
reversi 0:2da416334d69 116
reversi 0:2da416334d69 117 void modem_at_cmd(const string& buffer) {
reversi 0:2da416334d69 118 for(uint16_t i = 0; i < buffer.length(); i++) {
reversi 0:2da416334d69 119 lora.putc(buffer[i]);
reversi 0:2da416334d69 120 pc.putc(buffer[i]);
reversi 0:2da416334d69 121 }
reversi 0:2da416334d69 122 lora.putc(CR);
reversi 0:2da416334d69 123
reversi 0:2da416334d69 124 pc.putc(CR);
reversi 0:2da416334d69 125 pc.printf("\n");
reversi 0:2da416334d69 126
reversi 0:2da416334d69 127 char c = 0;
reversi 0:2da416334d69 128 do {
reversi 0:2da416334d69 129 if (lora.readable()) {
reversi 0:2da416334d69 130 c = lora.getc();
reversi 0:2da416334d69 131 pc.putc(c);
reversi 0:2da416334d69 132 }
reversi 0:2da416334d69 133 } while(c != ' ');
reversi 0:2da416334d69 134 }
reversi 0:2da416334d69 135
reversi 0:2da416334d69 136 void wait4join(){
reversi 0:2da416334d69 137 char c = 0;
reversi 0:2da416334d69 138 do {
reversi 0:2da416334d69 139 if (lora.readable()) {
reversi 0:2da416334d69 140 c = lora.getc();
reversi 0:2da416334d69 141 pc.putc(c);
reversi 0:2da416334d69 142 }
reversi 0:2da416334d69 143 } while(c != 'd');
reversi 0:2da416334d69 144 }
reversi 0:2da416334d69 145
reversi 0:2da416334d69 146 void connect_to_lora() {
reversi 0:2da416334d69 147 modem_at_cmd("AT");
reversi 0:2da416334d69 148 pc.printf("Establishing connection to LoRa\r\n");
reversi 0:2da416334d69 149 wait(1);
reversi 0:2da416334d69 150
reversi 0:2da416334d69 151 modem_at_cmd("AT+APPEUI=0000000000000001");
reversi 0:2da416334d69 152 pc.printf("Inviato EUI\r\n");
reversi 0:2da416334d69 153 wait(1);
reversi 0:2da416334d69 154
reversi 0:2da416334d69 155 modem_at_cmd("AT+AK=00000000000000000000000000000001");
reversi 0:2da416334d69 156 pc.printf("Inviato AK\r\n");
reversi 0:2da416334d69 157 wait(1);
reversi 0:2da416334d69 158
reversi 0:2da416334d69 159 modem_at_cmd("AT+JOIN=1");
reversi 0:2da416334d69 160 pc.printf("Inviato JOIN\r\n");
reversi 0:2da416334d69 161 wait4join();
reversi 0:2da416334d69 162
reversi 0:2da416334d69 163 modem_at_cmd("AT+DC=0");
reversi 0:2da416334d69 164 pc.printf("Disabled DC\r\n");
reversi 0:2da416334d69 165 wait(1);
reversi 0:2da416334d69 166
reversi 0:2da416334d69 167 modem_at_cmd("AT+ADR=1");
reversi 0:2da416334d69 168 pc.printf("Enabled ADR\r\n");
reversi 0:2da416334d69 169 wait(1);
reversi 0:2da416334d69 170 }
reversi 0:2da416334d69 171
reversi 0:2da416334d69 172 void enable_all_sensors() {
reversi 0:2da416334d69 173 presSensor->enable();
reversi 0:2da416334d69 174 magSensor->enable();
reversi 0:2da416334d69 175 tempSensor->enable();
reversi 0:2da416334d69 176 iNemo->enable_g();
reversi 0:2da416334d69 177 iNemo->enable_x();
reversi 0:2da416334d69 178 }
reversi 0:2da416334d69 179
reversi 0:2da416334d69 180 void get_pressure() {
reversi 0:2da416334d69 181 presSensor->get_pressure(&pressure);
reversi 0:2da416334d69 182 pc.printf("pressure [mbar]:\t%f\r\n", pressure);
reversi 0:2da416334d69 183 }
reversi 0:2da416334d69 184
reversi 0:2da416334d69 185 void get_magnetic_field() {
reversi 0:2da416334d69 186 magSensor->get_m_axes(assi_magnetometro);
reversi 0:2da416334d69 187 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 188 }
reversi 0:2da416334d69 189
reversi 0:2da416334d69 190 void get_temperature() {
reversi 0:2da416334d69 191 tempSensor->get_temperature(&temperature);
reversi 0:2da416334d69 192 pc.printf("temperature ['C]:\t%f\n\r", temperature);
reversi 0:2da416334d69 193 }
reversi 0:2da416334d69 194
reversi 0:2da416334d69 195 void get_humidity() {
reversi 0:2da416334d69 196 tempSensor->get_humidity(&humidity);
reversi 0:2da416334d69 197 pc.printf("humidity [%%]\t\t%f\r\n", humidity);
reversi 0:2da416334d69 198 }
reversi 0:2da416334d69 199
reversi 0:2da416334d69 200 void get_acceleration() {
reversi 0:2da416334d69 201 iNemo->get_x_axes(assi_accelerazione);
reversi 0:2da416334d69 202 pc.printf("acceleration [mg]:\t%d\t%d\t%d\n\r", assi_accelerazione[0] , assi_accelerazione[1] , assi_accelerazione[2]);
reversi 0:2da416334d69 203 }
reversi 0:2da416334d69 204
reversi 0:2da416334d69 205 void get_gyroscope() {
reversi 0:2da416334d69 206 iNemo->get_g_axes(assi_giroscopio);
reversi 0:2da416334d69 207 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 208 }