Reads analog A0 AND A2 and transmit them thorugh lora (no encryption)

Dependencies:   BufferedSerial SX1276GenericLib mbed

Committer:
gabrio
Date:
Wed May 23 20:59:12 2018 +0000
Revision:
0:acd8e2ba10c5
Child:
1:247f19702edd
Reads from A0 AND A2 and transmit through lora (no encryption)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gabrio 0:acd8e2ba10c5 1 /*
gabrio 0:acd8e2ba10c5 2 * This file contains a copy of the master content sx1276PingPong
gabrio 0:acd8e2ba10c5 3 * with adaption for the SX1276Generic environment
gabrio 0:acd8e2ba10c5 4 * (c) 2017 Helmut Tschemernjak
gabrio 0:acd8e2ba10c5 5 * 30826 Garbsen (Hannover) Germany
gabrio 0:acd8e2ba10c5 6 */
gabrio 0:acd8e2ba10c5 7
gabrio 0:acd8e2ba10c5 8 #include "mbed.h"
gabrio 0:acd8e2ba10c5 9 #include "PinMap.h"
gabrio 0:acd8e2ba10c5 10 #include "Transmitter.h"
gabrio 0:acd8e2ba10c5 11 #include "sx1276-mbed-hal.h"
gabrio 0:acd8e2ba10c5 12 #include "main.h"
gabrio 0:acd8e2ba10c5 13
gabrio 0:acd8e2ba10c5 14 #ifdef FEATURE_LORA
gabrio 0:acd8e2ba10c5 15
gabrio 0:acd8e2ba10c5 16 /* Set this flag to '1' to display debug messages on the console */
gabrio 0:acd8e2ba10c5 17 #define DEBUG_MESSAGE 1
gabrio 0:acd8e2ba10c5 18
gabrio 0:acd8e2ba10c5 19 /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */
gabrio 0:acd8e2ba10c5 20 #define USE_MODEM_LORA 1
gabrio 0:acd8e2ba10c5 21 #define USE_MODEM_FSK !USE_MODEM_LORA
gabrio 0:acd8e2ba10c5 22 #define RF_FREQUENCY RF_FREQUENCY_868_1 // Hz
gabrio 0:acd8e2ba10c5 23 #define TX_OUTPUT_POWER 14 // 14 dBm
gabrio 0:acd8e2ba10c5 24
gabrio 0:acd8e2ba10c5 25 #if USE_MODEM_LORA == 1
gabrio 0:acd8e2ba10c5 26
gabrio 0:acd8e2ba10c5 27 #define LORA_BANDWIDTH 125000 // LoRa default, details in SX1276::BandwidthMap
gabrio 0:acd8e2ba10c5 28 #define LORA_SPREADING_FACTOR LORA_SF7
gabrio 0:acd8e2ba10c5 29 #define LORA_CODINGRATE LORA_ERROR_CODING_RATE_4_5
gabrio 0:acd8e2ba10c5 30
gabrio 0:acd8e2ba10c5 31 #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
gabrio 0:acd8e2ba10c5 32 #define LORA_SYMBOL_TIMEOUT 5 // Symbols
gabrio 0:acd8e2ba10c5 33 #define LORA_FIX_LENGTH_PAYLOAD_ON false
gabrio 0:acd8e2ba10c5 34 #define LORA_FHSS_ENABLED false
gabrio 0:acd8e2ba10c5 35 #define LORA_NB_SYMB_HOP 4
gabrio 0:acd8e2ba10c5 36 #define LORA_IQ_INVERSION_ON false
gabrio 0:acd8e2ba10c5 37 #define LORA_CRC_ENABLED true
gabrio 0:acd8e2ba10c5 38
gabrio 0:acd8e2ba10c5 39 #elif USE_MODEM_FSK == 1
gabrio 0:acd8e2ba10c5 40
gabrio 0:acd8e2ba10c5 41 #define FSK_FDEV 25000 // Hz
gabrio 0:acd8e2ba10c5 42 #define FSK_DATARATE 19200 // bps
gabrio 0:acd8e2ba10c5 43 #define FSK_BANDWIDTH 50000 // Hz
gabrio 0:acd8e2ba10c5 44 #define FSK_AFC_BANDWIDTH 83333 // Hz
gabrio 0:acd8e2ba10c5 45 #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx
gabrio 0:acd8e2ba10c5 46 #define FSK_FIX_LENGTH_PAYLOAD_ON false
gabrio 0:acd8e2ba10c5 47 #define FSK_CRC_ENABLED true
gabrio 0:acd8e2ba10c5 48
gabrio 0:acd8e2ba10c5 49 #else
gabrio 0:acd8e2ba10c5 50 #error "Please define a modem in the compiler options."
gabrio 0:acd8e2ba10c5 51 #endif
gabrio 0:acd8e2ba10c5 52
gabrio 0:acd8e2ba10c5 53
gabrio 0:acd8e2ba10c5 54 #define RX_TIMEOUT_VALUE 3500 // in ms
gabrio 0:acd8e2ba10c5 55
gabrio 0:acd8e2ba10c5 56 //#define BUFFER_SIZE 32 // Define the payload size here
gabrio 0:acd8e2ba10c5 57 #define BUFFER_SIZE 64 // Define the payload size here
gabrio 0:acd8e2ba10c5 58
gabrio 0:acd8e2ba10c5 59 /*
gabrio 0:acd8e2ba10c5 60 * Global variables declarations
gabrio 0:acd8e2ba10c5 61 */
gabrio 0:acd8e2ba10c5 62 typedef enum
gabrio 0:acd8e2ba10c5 63 {
gabrio 0:acd8e2ba10c5 64 LOWPOWER = 0,
gabrio 0:acd8e2ba10c5 65 IDLE,
gabrio 0:acd8e2ba10c5 66
gabrio 0:acd8e2ba10c5 67 RX,
gabrio 0:acd8e2ba10c5 68 RX_TIMEOUT,
gabrio 0:acd8e2ba10c5 69 RX_ERROR,
gabrio 0:acd8e2ba10c5 70
gabrio 0:acd8e2ba10c5 71 TX,
gabrio 0:acd8e2ba10c5 72 TX_TIMEOUT,
gabrio 0:acd8e2ba10c5 73
gabrio 0:acd8e2ba10c5 74 CAD,
gabrio 0:acd8e2ba10c5 75 CAD_DONE
gabrio 0:acd8e2ba10c5 76 } AppStates_t;
gabrio 0:acd8e2ba10c5 77
gabrio 0:acd8e2ba10c5 78 volatile AppStates_t State = LOWPOWER;
gabrio 0:acd8e2ba10c5 79
gabrio 0:acd8e2ba10c5 80 /*!
gabrio 0:acd8e2ba10c5 81 * Radio events function pointer
gabrio 0:acd8e2ba10c5 82 */
gabrio 0:acd8e2ba10c5 83 static RadioEvents_t RadioEvents;
gabrio 0:acd8e2ba10c5 84
gabrio 0:acd8e2ba10c5 85 /*
gabrio 0:acd8e2ba10c5 86 * Global variables declarations
gabrio 0:acd8e2ba10c5 87 */
gabrio 0:acd8e2ba10c5 88 SX1276Generic *Radio;
gabrio 0:acd8e2ba10c5 89
gabrio 0:acd8e2ba10c5 90
gabrio 0:acd8e2ba10c5 91 const uint8_t PingMsg[] = { 0xff, 0xff, 0x00, 0x00, 'P', 'I', 'N', 'G'};// "PING";
gabrio 0:acd8e2ba10c5 92 const uint8_t PongMsg[] = { 0xff, 0xff, 0x00, 0x00, 'P', 'O', 'N', 'G'};// "PONG";
gabrio 0:acd8e2ba10c5 93
gabrio 0:acd8e2ba10c5 94 uint16_t BufferSize = BUFFER_SIZE;
gabrio 0:acd8e2ba10c5 95 uint8_t *Buffer;
gabrio 0:acd8e2ba10c5 96
gabrio 0:acd8e2ba10c5 97 DigitalOut *led3;
gabrio 0:acd8e2ba10c5 98
gabrio 0:acd8e2ba10c5 99 AnalogIn analog0(A0);
gabrio 0:acd8e2ba10c5 100 AnalogIn analog2(A2);
gabrio 0:acd8e2ba10c5 101
gabrio 0:acd8e2ba10c5 102 int Transmitter()
gabrio 0:acd8e2ba10c5 103 {
gabrio 0:acd8e2ba10c5 104
gabrio 0:acd8e2ba10c5 105 Buffer = new uint8_t[BUFFER_SIZE];
gabrio 0:acd8e2ba10c5 106
gabrio 0:acd8e2ba10c5 107 #ifdef B_L072Z_LRWAN1_LORA
gabrio 0:acd8e2ba10c5 108 Radio = new SX1276Generic(NULL, MURATA_SX1276,
gabrio 0:acd8e2ba10c5 109 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
gabrio 0:acd8e2ba10c5 110 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5,
gabrio 0:acd8e2ba10c5 111 LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO);
gabrio 0:acd8e2ba10c5 112 #else // RFM95
gabrio 0:acd8e2ba10c5 113 Radio = new SX1276Generic(NULL, RFM95_SX1276,
gabrio 0:acd8e2ba10c5 114 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
gabrio 0:acd8e2ba10c5 115 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5);
gabrio 0:acd8e2ba10c5 116
gabrio 0:acd8e2ba10c5 117 #endif
gabrio 0:acd8e2ba10c5 118
gabrio 0:acd8e2ba10c5 119 dprintf("Transmitter Application, Be-P" );
gabrio 0:acd8e2ba10c5 120 dprintf("Freqency: %.1f", (double)RF_FREQUENCY/1000000.0);
gabrio 0:acd8e2ba10c5 121 dprintf("TXPower: %d dBm", TX_OUTPUT_POWER);
gabrio 0:acd8e2ba10c5 122 #if USE_MODEM_LORA == 1
gabrio 0:acd8e2ba10c5 123 dprintf("Bandwidth: %d Hz", LORA_BANDWIDTH);
gabrio 0:acd8e2ba10c5 124 dprintf("Spreading factor: SF%d", LORA_SPREADING_FACTOR);
gabrio 0:acd8e2ba10c5 125 #elif USE_MODEM_FSK == 1
gabrio 0:acd8e2ba10c5 126 dprintf("Bandwidth: %d kHz", FSK_BANDWIDTH);
gabrio 0:acd8e2ba10c5 127 dprintf("Baudrate: %d", FSK_DATARATE);
gabrio 0:acd8e2ba10c5 128 #endif
gabrio 0:acd8e2ba10c5 129
gabrio 0:acd8e2ba10c5 130 // Initialize Radio driver
gabrio 0:acd8e2ba10c5 131 RadioEvents.TxDone = OnTxDone;
gabrio 0:acd8e2ba10c5 132 RadioEvents.RxDone = OnRxDone;
gabrio 0:acd8e2ba10c5 133 RadioEvents.RxError = OnRxError;
gabrio 0:acd8e2ba10c5 134 RadioEvents.TxTimeout = OnTxTimeout;
gabrio 0:acd8e2ba10c5 135 RadioEvents.RxTimeout = OnRxTimeout;
gabrio 0:acd8e2ba10c5 136 if (Radio->Init( &RadioEvents ) == false) {
gabrio 0:acd8e2ba10c5 137 while(1) {
gabrio 0:acd8e2ba10c5 138 dprintf("Radio could not be detected!");
gabrio 0:acd8e2ba10c5 139 wait( 1 );
gabrio 0:acd8e2ba10c5 140 }
gabrio 0:acd8e2ba10c5 141 }
gabrio 0:acd8e2ba10c5 142
gabrio 0:acd8e2ba10c5 143
gabrio 0:acd8e2ba10c5 144 switch(Radio->DetectBoardType()) {
gabrio 0:acd8e2ba10c5 145 case SX1276MB1LAS:
gabrio 0:acd8e2ba10c5 146 if (DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 147 dprintf(" > Board Type: SX1276MB1LAS <");
gabrio 0:acd8e2ba10c5 148 break;
gabrio 0:acd8e2ba10c5 149 case SX1276MB1MAS:
gabrio 0:acd8e2ba10c5 150 if (DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 151 dprintf(" > Board Type: SX1276MB1LAS <");
gabrio 0:acd8e2ba10c5 152 case MURATA_SX1276:
gabrio 0:acd8e2ba10c5 153 if (DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 154 dprintf(" > Board Type: MURATA_SX1276_STM32L0 <");
gabrio 0:acd8e2ba10c5 155 break;
gabrio 0:acd8e2ba10c5 156 case RFM95_SX1276:
gabrio 0:acd8e2ba10c5 157 if (DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 158 dprintf(" > HopeRF RFM95xx <");
gabrio 0:acd8e2ba10c5 159 break;
gabrio 0:acd8e2ba10c5 160 default:
gabrio 0:acd8e2ba10c5 161 dprintf(" > Board Type: unknown <");
gabrio 0:acd8e2ba10c5 162 }
gabrio 0:acd8e2ba10c5 163
gabrio 0:acd8e2ba10c5 164 Radio->SetChannel(RF_FREQUENCY );
gabrio 0:acd8e2ba10c5 165
gabrio 0:acd8e2ba10c5 166 #if USE_MODEM_LORA == 1
gabrio 0:acd8e2ba10c5 167
gabrio 0:acd8e2ba10c5 168 if (LORA_FHSS_ENABLED)
gabrio 0:acd8e2ba10c5 169 dprintf(" > LORA FHSS Mode <");
gabrio 0:acd8e2ba10c5 170 if (!LORA_FHSS_ENABLED)
gabrio 0:acd8e2ba10c5 171 dprintf(" > LORA Mode <");
gabrio 0:acd8e2ba10c5 172
gabrio 0:acd8e2ba10c5 173 Radio->SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
gabrio 0:acd8e2ba10c5 174 LORA_SPREADING_FACTOR, LORA_CODINGRATE,
gabrio 0:acd8e2ba10c5 175 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
gabrio 0:acd8e2ba10c5 176 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
gabrio 0:acd8e2ba10c5 177 LORA_IQ_INVERSION_ON, 2000 );
gabrio 0:acd8e2ba10c5 178
gabrio 0:acd8e2ba10c5 179 Radio->SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
gabrio 0:acd8e2ba10c5 180 LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
gabrio 0:acd8e2ba10c5 181 LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
gabrio 0:acd8e2ba10c5 182 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
gabrio 0:acd8e2ba10c5 183 LORA_IQ_INVERSION_ON, true );
gabrio 0:acd8e2ba10c5 184
gabrio 0:acd8e2ba10c5 185 #elif USE_MODEM_FSK == 1
gabrio 0:acd8e2ba10c5 186
gabrio 0:acd8e2ba10c5 187 dprintf(" > FSK Mode <");
gabrio 0:acd8e2ba10c5 188 Radio->SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
gabrio 0:acd8e2ba10c5 189 FSK_DATARATE, 0,
gabrio 0:acd8e2ba10c5 190 FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
gabrio 0:acd8e2ba10c5 191 FSK_CRC_ENABLED, 0, 0, 0, 2000 );
gabrio 0:acd8e2ba10c5 192
gabrio 0:acd8e2ba10c5 193 Radio->SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
gabrio 0:acd8e2ba10c5 194 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
gabrio 0:acd8e2ba10c5 195 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED,
gabrio 0:acd8e2ba10c5 196 0, 0, false, true );
gabrio 0:acd8e2ba10c5 197
gabrio 0:acd8e2ba10c5 198 #else
gabrio 0:acd8e2ba10c5 199
gabrio 0:acd8e2ba10c5 200 #error "Please define a modem in the compiler options."
gabrio 0:acd8e2ba10c5 201
gabrio 0:acd8e2ba10c5 202 #endif
gabrio 0:acd8e2ba10c5 203
gabrio 0:acd8e2ba10c5 204 Radio->Rx( RX_TIMEOUT_VALUE );
gabrio 0:acd8e2ba10c5 205
gabrio 0:acd8e2ba10c5 206 //@START
gabrio 0:acd8e2ba10c5 207 float readed;
gabrio 0:acd8e2ba10c5 208 char readed_tostr[100]={0};
gabrio 0:acd8e2ba10c5 209
gabrio 0:acd8e2ba10c5 210 while(1){
gabrio 0:acd8e2ba10c5 211
gabrio 0:acd8e2ba10c5 212 //ANALOG0 READ AND SEND
gabrio 0:acd8e2ba10c5 213 readed = analog0.read();
gabrio 0:acd8e2ba10c5 214 snprintf(readed_tostr,sizeof(readed_tostr),"ALGG A0:%f",readed);
gabrio 0:acd8e2ba10c5 215
gabrio 0:acd8e2ba10c5 216 dprintf("sending:%s",readed_tostr);
gabrio 0:acd8e2ba10c5 217
gabrio 0:acd8e2ba10c5 218 Radio->Send(readed_tostr,strlen(readed_tostr));
gabrio 0:acd8e2ba10c5 219 wait_ms(1000);
gabrio 0:acd8e2ba10c5 220
gabrio 0:acd8e2ba10c5 221 //ANALOG3 READ AND SEND
gabrio 0:acd8e2ba10c5 222 readed = analog2.read();
gabrio 0:acd8e2ba10c5 223 snprintf(readed_tostr,sizeof(readed_tostr),"ALGG A2:%f",readed);
gabrio 0:acd8e2ba10c5 224
gabrio 0:acd8e2ba10c5 225 dprintf("sending:%s",readed_tostr);
gabrio 0:acd8e2ba10c5 226
gabrio 0:acd8e2ba10c5 227 Radio->Send(readed_tostr,strlen(readed_tostr));
gabrio 0:acd8e2ba10c5 228 wait_ms(1000);
gabrio 0:acd8e2ba10c5 229
gabrio 0:acd8e2ba10c5 230
gabrio 0:acd8e2ba10c5 231 }
gabrio 0:acd8e2ba10c5 232
gabrio 0:acd8e2ba10c5 233 }
gabrio 0:acd8e2ba10c5 234
gabrio 0:acd8e2ba10c5 235 void OnTxDone(void *radio, void *userThisPtr, void *userData)
gabrio 0:acd8e2ba10c5 236 {
gabrio 0:acd8e2ba10c5 237 Radio->Sleep( );
gabrio 0:acd8e2ba10c5 238 State = TX;
gabrio 0:acd8e2ba10c5 239 if (DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 240 dprintf("> OnTxDone");
gabrio 0:acd8e2ba10c5 241 }
gabrio 0:acd8e2ba10c5 242
gabrio 0:acd8e2ba10c5 243 void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
gabrio 0:acd8e2ba10c5 244 {
gabrio 0:acd8e2ba10c5 245 Radio->Sleep( );
gabrio 0:acd8e2ba10c5 246 BufferSize = size;
gabrio 0:acd8e2ba10c5 247 memcpy( Buffer, payload, BufferSize );
gabrio 0:acd8e2ba10c5 248 State = RX;
gabrio 0:acd8e2ba10c5 249 if (DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 250 dprintf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d", rssi, snr);
gabrio 0:acd8e2ba10c5 251 dump("Data:", payload, size);
gabrio 0:acd8e2ba10c5 252 }
gabrio 0:acd8e2ba10c5 253
gabrio 0:acd8e2ba10c5 254 void OnTxTimeout(void *radio, void *userThisPtr, void *userData)
gabrio 0:acd8e2ba10c5 255 {
gabrio 0:acd8e2ba10c5 256 *led3 = 0;
gabrio 0:acd8e2ba10c5 257 Radio->Sleep( );
gabrio 0:acd8e2ba10c5 258 State = TX_TIMEOUT;
gabrio 0:acd8e2ba10c5 259 if(DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 260 dprintf("> OnTxTimeout");
gabrio 0:acd8e2ba10c5 261 }
gabrio 0:acd8e2ba10c5 262
gabrio 0:acd8e2ba10c5 263 void OnRxTimeout(void *radio, void *userThisPtr, void *userData)
gabrio 0:acd8e2ba10c5 264 {
gabrio 0:acd8e2ba10c5 265 *led3 = 0;
gabrio 0:acd8e2ba10c5 266 Radio->Sleep( );
gabrio 0:acd8e2ba10c5 267 Buffer[BufferSize-1] = 0;
gabrio 0:acd8e2ba10c5 268 State = RX_TIMEOUT;
gabrio 0:acd8e2ba10c5 269 if (DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 270 dprintf("> OnRxTimeout");
gabrio 0:acd8e2ba10c5 271 }
gabrio 0:acd8e2ba10c5 272
gabrio 0:acd8e2ba10c5 273 void OnRxError(void *radio, void *userThisPtr, void *userData)
gabrio 0:acd8e2ba10c5 274 {
gabrio 0:acd8e2ba10c5 275 Radio->Sleep( );
gabrio 0:acd8e2ba10c5 276 State = RX_ERROR;
gabrio 0:acd8e2ba10c5 277 if (DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 278 dprintf("> OnRxError");
gabrio 0:acd8e2ba10c5 279 }
gabrio 0:acd8e2ba10c5 280
gabrio 0:acd8e2ba10c5 281 #endif