TX
Dependencies: mbed BufferedSerial SX1276GenericLib X_NUCLEO_IKS01A2
Revision 4:a0cfe0efcc5e, committed 2019-06-05
- Comitter:
- TMRL123
- Date:
- Wed Jun 05 00:27:24 2019 +0000
- Parent:
- 0:a73914f20498
- Commit message:
- Last to actualy work
Changed in this revision
BufferedSerial.lib | Show annotated file Show diff for this revision Revisions of this file |
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r a73914f20498 -r a0cfe0efcc5e BufferedSerial.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BufferedSerial.lib Wed Jun 05 00:27:24 2019 +0000 @@ -0,0 +1,1 @@ +https://mbed.org/users/sam_grove/code/BufferedSerial/#a0d37088b405
diff -r a73914f20498 -r a0cfe0efcc5e main.cpp --- a/main.cpp Thu Apr 18 13:56:50 2019 +0000 +++ b/main.cpp Wed Jun 05 00:27:24 2019 +0000 @@ -7,6 +7,9 @@ #include "PinMap.h" #include "sx1276-mbed-hal.h" +/* Serial communication include */ +#include "BufferedSerial.h" + /* LoRa definitions */ /* Set this flag to '1' to display debug messages on the console */ @@ -35,10 +38,11 @@ #endif -#define RX_TIMEOUT_VALUE 3500 // in ms +#define RX_TIMEOUT_VALUE 0 // In ms +#define TX_TIMEOUT_VALUE 1000000 // In ms //#define BUFFER_SIZE 32 // Define the payload size here -#define BUFFER_SIZE 512 // Define the payload size here +#define BUFFER_SIZE 64 // Define the payload size here /* Sensors instances */ @@ -52,44 +56,66 @@ static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro; static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer; -char buffer1[32], buffer2[32]; // buffers to help theprinting of doubles - -uint32_t dados[16]; //data vector +typedef struct { + float p; // Pressure + float temperatureHTS221; // Temperature from HTS221 + float humidity; // Humidity + float temperatureLPS22HB; // Temperature from LPS22HB + int32_t w[3]; // Angular velocity + int32_t a[3]; // Acceleration of the accelerometer LSM303AGR + int32_t ag[3]; // Acceleration of the accelerometer and gyroscope LSM6DSL + int32_t m [3]; // Heading +}Data; // Data struct + +Data data; /* LoRa modem instances and configurations */ static RadioEvents_t RadioEvents; // Calback functions struct -SX1276Generic *Radio; //Defenition of a Radio object +SX1276Generic *Radio; // Defenition of a Radio object -/*Configuration function*/ +/* Configuration function */ void SystemClock_Config(void); - bool transmited = true; +bool transmited = true;// Flag to indicate the and of transmission /* Callback functions prototypes */ + +// Brief Function to be executed on Radio Tx Done event void OnTxDone(void *radio, void *userThisPtr, void *userData); +// Brief Function to be executed on Radio Rx Done event void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ); +// Brief Function executed on Radio Tx Timeout event void OnTxTimeout(void *radio, void *userThisPtr, void *userData); +// Brief Function executed on Radio Rx Timeout event void OnRxTimeout(void *radio, void *userThisPtr, void *userData); +// Brief Function executed on Radio Rx Error event void OnRxError(void *radio, void *userThisPtr, void *userData); +// Brief Function executed on Radio Fhss Change Channel event void OnFhssChangeChannel(void *radio, void *userThisPtr, void *userData, uint8_t channelIndex); -void OnCadDone(void *radio, void *userThisPtr, void *userData); - /* Serial communication to debug program */ - -Serial pc(USBTX,USBRX); +BufferedSerial *ser; int main() { - /* General Header*/ + SystemClock_Config(); /* Synchronize clock for TX and RX boards*/ - pc.printf("Telemetry Tx inicial version program\r\n\r\n"); + /* Serial configuration */ + if (DEBUG_MESSAGE) { + ser = new BufferedSerial(USBTX, USBRX); + ser->baud(115200); + ser->format(8); + } + + /* General Header*/ + if (DEBUG_MESSAGE) + ser->printf("Telemetry Rx inicial version program\r\n\r\n"); uint8_t id; //Sensor id parameter for debug purpose @@ -100,132 +126,117 @@ accelerometer->enable(); acc_gyro->enable_x(); acc_gyro->enable_g(); - - pc.printf("\r\n--- Starting the sensors ---\r\n"); - hum_temp->read_id(&id); - pc.printf("HTS221 humidity & temperature = 0x%X\r\n", id); - press_temp->read_id(&id); - pc.printf("LPS22HB pressure & temperature = 0x%X\r\n", id); - magnetometer->read_id(&id); - pc.printf("LSM303AGR magnetometer = 0x%X\r\n", id); - accelerometer->read_id(&id); - pc.printf("LSM303AGR accelerometer = 0x%X\r\n", id); - acc_gyro->read_id(&id); - pc.printf("LSM6DSL accelerometer & gyroscope = 0x%X\r\n", id); - - pc.printf("\r\n"); - - /* Radio setup */ - pc.printf("\r\n--- Starting the modem LoRa ---\r\n"); + if (DEBUG_MESSAGE) { + ser->printf("\r\n--- Starting the sensors ---\r\n"); + + hum_temp->read_id(&id); + ser->printf("HTS221 humidity & temperature = 0x%X\r\n", id); + press_temp->read_id(&id); + ser->printf("LPS22HB pressure & temperature = 0x%X\r\n", id); + magnetometer->read_id(&id); + ser->printf("LSM303AGR magnetometer = 0x%X\r\n", id); + accelerometer->read_id(&id); + ser->printf("LSM303AGR accelerometer = 0x%X\r\n", id); + acc_gyro->read_id(&id); + ser->printf("LSM6DSL accelerometer & gyroscope = 0x%X\r\n", id); + + ser->printf("\r\n"); + } + /* Radio setup */ + if (DEBUG_MESSAGE) + ser->printf("\r\n--- Starting the modem LoRa ---\r\n"); Radio = new SX1276Generic(NULL, MURATA_SX1276, LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET, LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5, LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO); - pc.printf("SX1276 Simple transmission aplication\r\n" ); - pc.printf("Frequency: %.1f\r\n", (double)RF_FREQUENCY/1000000.0); - pc.printf("TXPower: %d dBm\r\n", TX_OUTPUT_POWER); - pc.printf("Bandwidth: %d Hz\r\n", LORA_BANDWIDTH); - pc.printf("Spreading factor: SF%d\r\n", LORA_SPREADING_FACTOR); - + if (DEBUG_MESSAGE) { + ser->printf("SX1276 Simple transmission aplication\r\n" ); + ser->printf("Frequency: %.1f\r\n", (double)RF_FREQUENCY/1000000.0); + ser->printf("TXPower: %d dBm\r\n", TX_OUTPUT_POWER); + ser->printf("Bandwidth: %d Hz\r\n", LORA_BANDWIDTH); + ser->printf("Spreading factor: SF%d\r\n", LORA_SPREADING_FACTOR); + } // Initialize Radio driver RadioEvents.TxDone = OnTxDone; RadioEvents.RxDone = OnRxDone; RadioEvents.RxError = OnRxError; RadioEvents.TxTimeout = OnTxTimeout; - RadioEvents.RxTimeout = OnRxTimeout; + RadioEvents.RxTimeout = OnRxTimeout; + while (Radio->Init( &RadioEvents ) == false) { - pc.printf("Radio could not be detected!\r\n"); + if (DEBUG_MESSAGE) + ser->printf("Radio could not be detected!\r\n"); wait( 1 ); } + // Display the board type switch(Radio->DetectBoardType()) { case SX1276MB1LAS: if (DEBUG_MESSAGE) - pc.printf(" > Board Type: SX1276MB1LAS <\r\n"); + ser->printf(" > Board Type: SX1276MB1LAS <\r\n"); break; case SX1276MB1MAS: if (DEBUG_MESSAGE) - pc.printf(" > Board Type: SX1276MB1LAS <\r\n"); + ser->printf(" > Board Type: SX1276MB1LAS <\r\n"); case MURATA_SX1276: if (DEBUG_MESSAGE) - pc.printf(" > Board Type: MURATA_SX1276_STM32L0 <\r\n"); + ser->printf(" > Board Type: MURATA_SX1276_STM32L0 <\r\n"); break; case RFM95_SX1276: if (DEBUG_MESSAGE) - pc.printf(" > HopeRF RFM95xx <\r\n"); + ser->printf(" > HopeRF RFM95xx <\r\n"); break; default: - pc.printf(" > Board Type: unknown <\r\n"); + if (DEBUG_MESSAGE) + ser->printf(" > Board Type: unknown <\r\n"); } - Radio->SetChannel(RF_FREQUENCY ); + Radio->SetChannel(RF_FREQUENCY ); // Sets the frequency of the communication - if (LORA_FHSS_ENABLED) - pc.printf(" > LORA FHSS Mode <\r\n"); - if (!LORA_FHSS_ENABLED) - pc.printf(" > LORA Mode <\r\n"); - - pc.printf("\r\n"); - + // Debug message of the state of fhss + if (LORA_FHSS_ENABLED) { + if (DEBUG_MESSAGE) + ser->printf(" > LORA FHSS Mode <\r\n"); + } + if (!LORA_FHSS_ENABLED) { + if (DEBUG_MESSAGE) + ser->printf(" > LORA Mode <\r\n"); + } + + // Sets the configuration of the transmission Radio->SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE, LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, LORA_IQ_INVERSION_ON, 2000 ); + // Sets the configuration of the reception Radio->SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, LORA_IQ_INVERSION_ON, true ); - Radio->Tx(1000000); + Radio->Tx(TX_TIMEOUT_VALUE); // Puts the device in transmission mode for a long period while(1) { - float p; //pressure - float temperatureHTS221; //temperature from HTS221 - float humidity; //humidity - float temperatureLPS22HB; //temperature from LPS22HB - int32_t w[3]; //angular velocity - int32_t a[3]; //acceleration of the accelerometer LSM303AGR - int32_t ag[3]; //acceleration of the accelerometer and gyroscope LSM6DSL - int32_t m [3]; //heading - - press_temp->get_pressure(&p); //get the pressure - press_temp->get_temperature(&temperatureLPS22HB); //get temperature from LPS22HB - accelerometer->get_x_axes(a);//get the acceleration - acc_gyro->get_x_axes(ag);//get the acceleration - acc_gyro->get_g_axes(w);//get the angular velocity - magnetometer->get_m_axes(m); //get the magnetometer heading - hum_temp->get_temperature(&temperatureHTS221); //get temperature from HTS221 - hum_temp->get_humidity(&humidity); //get humidity - + + press_temp->get_pressure(&data.p); // Get the pressure + press_temp->get_temperature(&data.temperatureLPS22HB); // Get temperature from LPS22HB + accelerometer->get_x_axes(data.a);// Get the acceleration + acc_gyro->get_x_axes(data.ag);// Get the acceleration + acc_gyro->get_g_axes(data.w);// Get the angular velocity + magnetometer->get_m_axes(data.m); // Get the magnetometer heading + hum_temp->get_temperature(&data.temperatureHTS221); // Get temperature from HTS221 + hum_temp->get_humidity(&data.humidity); // Get humidity - //sensors data - - dados[0] = a[0]; - dados[1] = a[1]; - dados[2] = a[2]; - dados[3] = ag[0]; - dados[4] = ag[1]; - dados[5] = ag[2]; - dados[6] = w[0]; - dados[7] = w[1]; - dados[8] = w[2]; - dados[9] = m[0]; - dados[10] = m[1]; - dados[11] = m[2]; - dados[12] = humidity; - dados[13] = temperatureHTS221; - dados[14] = temperatureLPS22HB; - dados[15] = p; - + // Only sends a new packet when the device already have transmited the previous one if (transmited==true) { transmited = false; wait_ms(10); - Radio->Send( dados, sizeof(dados) ); + Radio->Send( &data, sizeof(data) ); } } } @@ -275,49 +286,16 @@ } /* Helper function for printing floats & doubles */ -static char *print_double(char* str, double v, int decimalDigits=2) -{ - int i = 1; - int intPart, fractPart; - int len; - char *ptr; - /* prepare decimal digits multiplicator */ - for (;decimalDigits!=0; i*=10, decimalDigits--); - - /* calculate integer & fractinal parts */ - intPart = (int)v; - fractPart = (int)((v-(double)(int)v)*i); - - /* fill in integer part */ - sprintf(str, "%i.", intPart); - - /* prepare fill in of fractional part */ - len = strlen(str); - ptr = &str[len]; - - /* fill in leading fractional zeros */ - for (i/=10;i>1; i/=10, ptr++) { - if (fractPart >= i) { - break; - } - *ptr = '0'; - } - - /* fill in (rest of) fractional part */ - sprintf(ptr, "%i", fractPart); - - return str; -} void OnTxDone(void *radio, void *userThisPtr, void *userData) { Radio->Sleep( ); transmited = true; if (DEBUG_MESSAGE) { - pc.printf("> OnTxDone\r\n"); - pc.printf("I transmited %6ld, %6ld, %6ld, %6ld, %6ld, %6ld, %6ld, %6ld, %6ld\r\n", dados[0], dados[1], dados[2], dados[3], dados[4], dados[5], dados[6], dados[7], dados[8]); - pc.printf("and %6ld, %6ld, %6ld, %s, %7s, %7s %s\r\n", dados[9], dados[10], dados[11], print_double(buffer2, dados[12]), print_double(buffer1, dados[13]), print_double(buffer1, dados[14]), print_double(buffer2, dados[15])); + ser->printf("> OnTxDone\r\n"); + ser->printf("I transmited %d mg, %d mg, %d mg, %d mg, %d mg, %d mg, %d mdps, %d mdps, %d mdps\r\n", data.a[0], data.a[1], data.a[2], data.ag[0], data.ag[1], data.ag[2], data.w[0], data.w[1], data.w[2]); + ser->printf("and %d mG, %d mG, %d mG, %g %%, %g C, %g C, %g mBar\r\n", data.m[0], data.m[1], data.m[2], data.humidity, data.temperatureHTS221, data.temperatureLPS22HB, data.p); } } @@ -325,26 +303,26 @@ { Radio->Sleep( ); if (DEBUG_MESSAGE) - pc.printf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d\r\n", rssi, snr); + ser->printf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d\r\n", rssi, snr); } void OnTxTimeout(void *radio, void *userThisPtr, void *userData) { Radio->Sleep( ); if(DEBUG_MESSAGE) - pc.printf("> OnTxTimeout\r\n"); + ser->printf("> OnTxTimeout\r\n"); } void OnRxTimeout(void *radio, void *userThisPtr, void *userData) { Radio->Sleep( ); if (DEBUG_MESSAGE) - pc.printf("> OnRxTimeout\r\n"); + ser->printf("> OnRxTimeout\r\n"); } void OnRxError(void *radio, void *userThisPtr, void *userData) { Radio->Sleep( ); if (DEBUG_MESSAGE) - pc.printf("> OnRxError\r\n"); + ser->printf("> OnRxError\r\n"); }