//////////////////////////////////////////////////////////////////////////////// //Headers #include "mbed.h" #include "main.h" #include "sx1276-hal.h" #include "debug.h" //////////////////////////////////////////////////////////////////////////////// #define DEBUG_MESSAGE 0 //////////////////////////////////////////////////////////////////////////////// //Modulation LoRa active #define USE_MODEM_LORA 1 #define USE_MODEM_FSK !USE_MODEM_LORA //Paramètres #define RF_FREQUENCY 868000000 //Hz : Fréquence de travail pour UE #define TX_OUTPUT_POWER 14 //dBm : puissance de sortie du signal #define LORA_BANDWIDTH 1 // 0:125 kHz de BP #define LORA_SPREADING_FACTOR 10 // [SF7..SF12] Portée du débit. grande portée inutile #define LORA_CODINGRATE 1 #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx #define LORA_SYMBOL_TIMEOUT 5 // Symbols #define LORA_FIX_LENGTH_PAYLOAD_ON false #define LORA_FHSS_ENABLED true #define LORA_NB_SYMB_HOP 4 #define LORA_IQ_INVERSION_ON false #define LORA_CRC_ENABLED true #define RX_TIMEOUT_VALUE 3500 // in ms #define BUFFER_SIZE 32 // Define the payload size here #define TRAME_SIZE 13 //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //Variables globales typedef enum { LOWPOWER = 0, IDLE, RX, RX_TIMEOUT, RX_ERROR, TX, TX_TIMEOUT, CAD, CAD_DONE }AppStates_t; volatile AppStates_t State = LOWPOWER; static RadioEvents_t RadioEvents; SX1276MB1xAS Radio( NULL ); uint16_t BufferSize = BUFFER_SIZE; uint8_t Buffer[BUFFER_SIZE]; int16_t RssiValue = 0.0; int8_t SnrValue = 0.0; uint8_t testMsg[TRAME_SIZE]; //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void TrameCreation() { //Création d'une trame /* [1...] : ID de l'emetteur [...] : ID du recepteur cible [...] : Température communiquée */ //Converti en ASCII testMsg[0] = 0x46; //emetteur F testMsg[1] = 0x33; //emetteur 3 testMsg[2] = 0x30; //emetteur 0 testMsg[3] = 0x33; //emetteur 3 testMsg[4] = 0x52; //emetteur R testMsg[5] = 0x45; //emetteur E // testMsg[6] = 0x46; //recepteur F testMsg[7] = 0x30; //recepteur 0 testMsg[8] = 0x39; //recepteur 9 testMsg[9] = 0x31; //recepteur 1 testMsg[10] = 0x43; //recepteur C // testMsg[11] = 0x32; //temperature 2 dizaines testMsg[12] = 0x30; //temperature 0 unités } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //Fonctions utiles //Debug pour savoir si le message a été transmis void OnTxDone( void ) { Radio.SetChannel( HoppingFrequencies[0] ); Radio.Sleep( ); State = TX; debug_if( DEBUG_MESSAGE, "\nEnvoye \n\r" ); } //Time out de transmission. Échec de l'envoi void OnTxTimeout( void ) { Radio.SetChannel(HoppingFrequencies[0]); Radio.Sleep( ); State = TX_TIMEOUT; debug_if( DEBUG_MESSAGE, "Echec de l'envoi \n\r"); } //Modification du canal d'emission void OnFhssChangeChannel( uint8_t channelIndex ) { Radio.SetChannel(HoppingFrequencies[channelIndex]); debug_if(DEBUG_MESSAGE, "F%d-", channelIndex); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //Main emission int main( void ) { uint8_t i; debug("\nEmetteur SX1276 \n\n\r"); // Initialize Radio driver RadioEvents.TxDone = OnTxDone; RadioEvents.TxTimeout = OnTxTimeout; RadioEvents.FhssChangeChannel = OnFhssChangeChannel; Radio.Init(&RadioEvents); //Véification de la connexion avec la carte while(Radio.Read(REG_VERSION) == 0x00) { debug("Aucune radio detectee\n\r", NULL); wait(1); } //Checking du matériel connecté debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1LAS ) ), "\n\r Materiel detecte : SX1276MB1LAS \n\r" ); debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1MAS ) ), "\n\r Materiel detecte : SX1276MB1MAS \n\r" ); //Paramétrage du canal Radio.SetChannel( HoppingFrequencies[0] ); #if USE_MODEM_LORA == 1 debug_if( LORA_FHSS_ENABLED, "\n\n\r LORA FHSS Mode \n\n\r" ); debug_if( !LORA_FHSS_ENABLED, "\n\n\r LORA Mode \n\n\r" ); //Configuration du modem 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, 4000 ); #else #error "Aucun modem defini" #endif debug_if( DEBUG_MESSAGE, "Procedure d'emission lancee\r\n" ); //Boucle d'émission infinie while(1) { //On génère la trame TrameCreation(); debug("\nTentative d'envoi... \r\n"); strcpy((char*)Buffer, (char*)testMsg); for(i=TRAME_SIZE; i