Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed X_NUCLEO_IKS01A2
main.cpp
- Committer:
- reversi
- Date:
- 2020-04-23
- Revision:
- 0:2da416334d69
- Child:
- 1:57673ebedd58
File content as of revision 0:2da416334d69:
#include "mbed.h" #include "XNucleoIKS01A2.h" #include "string" #define CR 0x0D using namespace std; Serial pc(PA_2, PA_3, 115200); // seriale pc Serial lora(PB_6,PA_10,115200); static XNucleoIKS01A2 *board = XNucleoIKS01A2::instance(D14,D15,D4,D5); // scheda static LSM303AGRMagSensor *magSensor = board->magnetometer; // magnetoscopio static LPS22HBSensor *presSensor = board->pt_sensor; // pressione static HTS221Sensor *tempSensor= board->ht_sensor; // temperatura e umidita' static LSM6DSLSensor *iNemo = board->acc_gyro; // giroscopio enum DataType {PRESSURE = 0, MAG_FIELD, TEMPERATURE, HUMIDITY, ACCELERATION, ANG_VELOCITY, N_DATA_TYPES}; uint16_t ports[N_DATA_TYPES] = {15, 16, 17, 18, 19, 20}; void connect_to_lora(); void wait4join(); void modem_at_cmd(const string&); void at_send(uint16_t, const string&, bool); string hex_encode(const string&); void enable_all_sensors(); void get_pressure(); void get_magnetic_field(); void get_temperature(); void get_humidity(); void get_acceleration(); void get_gyroscope(); float pressure = 0; float temperature = 0; float humidity = 0; int assi_giroscopio[3]; int assi_accelerazione[3]; int assi_magnetometro[3]; int main() { enable_all_sensors(); connect_to_lora(); size_t counter = 0; int data_type = PRESSURE; char payload[256]; while (1) { memset(payload, 0, 256); switch (data_type) { case PRESSURE: get_pressure(); sprintf(payload, "{\"pressure\":%.6f}", pressure); break; case MAG_FIELD: get_magnetic_field(); sprintf(payload, "{\"magx\":%d, \"magy\":%d, \"magz\":%d}", assi_magnetometro[0] , assi_magnetometro[1] , assi_magnetometro[2]); break; case TEMPERATURE: get_temperature(); sprintf(payload, "{\"temperature\":%.6f}", temperature); break; case HUMIDITY: get_humidity(); sprintf(payload, "{\"humidity\":%.6f}", humidity); break; case ACCELERATION: get_acceleration(); sprintf(payload, "{\"accx\":%d, \"accy\":%d, \"accz\":%d}", assi_accelerazione[0] , assi_accelerazione[1] , assi_accelerazione[2]); break; case ANG_VELOCITY: get_gyroscope(); sprintf(payload, "{\"angvelx\":%d, \"angvely\":%d, \"angvelz\":%d}", assi_giroscopio[0] , assi_giroscopio[1] , assi_giroscopio[2]); break; } at_send(ports[data_type], payload, false); data_type = (data_type + 1) % N_DATA_TYPES; ++counter; wait(5.0); } } string hex_encode(const string& input) { static const char hex_digits[] = "0123456789ABCDEF"; string output; output.reserve(input.length() * 2); for (int i = 0; i < input.length(); i++) { output += hex_digits[input[i] >> 4]; output += hex_digits[input[i] & 15]; } return output; } void at_send(uint16_t port, const string& payload, bool ack = false) { string port_msg; port_msg.reserve(5); // max port 2^16-1 = 65545 sprintf(&port_msg[0], "%d", port); string hex_payload = hex_encode(payload); modem_at_cmd("AT+SEND=" + port_msg + "," + hex_payload + "," + (ack ? '1' : '0')); } void modem_at_cmd(const string& buffer) { for(uint16_t i = 0; i < buffer.length(); i++) { lora.putc(buffer[i]); pc.putc(buffer[i]); } lora.putc(CR); pc.putc(CR); pc.printf("\n"); char c = 0; do { if (lora.readable()) { c = lora.getc(); pc.putc(c); } } while(c != ' '); } void wait4join(){ char c = 0; do { if (lora.readable()) { c = lora.getc(); pc.putc(c); } } while(c != 'd'); } void connect_to_lora() { modem_at_cmd("AT"); pc.printf("Establishing connection to LoRa\r\n"); wait(1); modem_at_cmd("AT+APPEUI=0000000000000001"); pc.printf("Inviato EUI\r\n"); wait(1); modem_at_cmd("AT+AK=00000000000000000000000000000001"); pc.printf("Inviato AK\r\n"); wait(1); modem_at_cmd("AT+JOIN=1"); pc.printf("Inviato JOIN\r\n"); wait4join(); modem_at_cmd("AT+DC=0"); pc.printf("Disabled DC\r\n"); wait(1); modem_at_cmd("AT+ADR=1"); pc.printf("Enabled ADR\r\n"); wait(1); } void enable_all_sensors() { presSensor->enable(); magSensor->enable(); tempSensor->enable(); iNemo->enable_g(); iNemo->enable_x(); } void get_pressure() { presSensor->get_pressure(&pressure); pc.printf("pressure [mbar]:\t%f\r\n", pressure); } void get_magnetic_field() { magSensor->get_m_axes(assi_magnetometro); pc.printf("mag field [mgauss]:\t%d\t%d\t%d\n\r", assi_magnetometro[0] , assi_magnetometro[1] , assi_magnetometro[2]); } void get_temperature() { tempSensor->get_temperature(&temperature); pc.printf("temperature ['C]:\t%f\n\r", temperature); } void get_humidity() { tempSensor->get_humidity(&humidity); pc.printf("humidity [%%]\t\t%f\r\n", humidity); } void get_acceleration() { iNemo->get_x_axes(assi_accelerazione); pc.printf("acceleration [mg]:\t%d\t%d\t%d\n\r", assi_accelerazione[0] , assi_accelerazione[1] , assi_accelerazione[2]); } void get_gyroscope() { iNemo->get_g_axes(assi_giroscopio); pc.printf("ang velocity [rad/s]:\t%d\t%d\t%d\n\r", assi_giroscopio[0] , assi_giroscopio[1] , assi_giroscopio[2]); }