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

Dependencies:   BufferedSerial SX1276GenericLib mbed

Committer:
gabrio
Date:
Thu May 31 13:13:41 2018 +0000
Revision:
5:2ac61718bfd8
Parent:
4:182eacdfbf7d

        

Who changed what in which revision?

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