|
| 1 | +/* Heltec Automation send communication test example |
| 2 | + * |
| 3 | + * Function: |
| 4 | + * 1. Send data from a CubeCell device over hardware |
| 5 | + * 2. LoRa sending set frequency via serial |
| 6 | + * |
| 7 | + * this example must work with Heltec ESP32 LoRaWAN library: |
| 8 | + * https://github.com/HelTecAutomation/ESP32_LoRaWAN |
| 9 | + * */ |
| 10 | + |
| 11 | +#include <ESP32_LoRaWAN.h> |
| 12 | +#include "Arduino.h" |
| 13 | + |
| 14 | +uint32_t license[4] = {0x947025A9, 0x7E6C7FE4, 0x943C2CDA, 0xE04CD68B}; |
| 15 | + |
| 16 | +#define RF_FREQUENCY 868000000 // Hz |
| 17 | + |
| 18 | +#define TX_OUTPUT_POWER 14 // dBm |
| 19 | + |
| 20 | +#define LORA_BANDWIDTH 0 // [0: 125 kHz, |
| 21 | + // 1: 250 kHz, |
| 22 | + // 2: 500 kHz, |
| 23 | + // 3: Reserved] |
| 24 | +#define LORA_SPREADING_FACTOR 7 // [SF7..SF12] |
| 25 | +#define LORA_CODINGRATE 1 // [1: 4/5, |
| 26 | + // 2: 4/6, |
| 27 | + // 3: 4/7, |
| 28 | + // 4: 4/8] |
| 29 | +#define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx |
| 30 | +#define LORA_SYMBOL_TIMEOUT 0 // Symbols |
| 31 | +#define LORA_FIX_LENGTH_PAYLOAD_ON false |
| 32 | +#define LORA_IQ_INVERSION_ON false |
| 33 | + |
| 34 | + |
| 35 | +#define RX_TIMEOUT_VALUE 1000 |
| 36 | +#define BUFFER_SIZE 30 // Define the payload size here |
| 37 | + |
| 38 | +char txpacket[BUFFER_SIZE]; |
| 39 | +char rxpacket[BUFFER_SIZE]; |
| 40 | + |
| 41 | +static RadioEvents_t RadioEvents; |
| 42 | + |
| 43 | +double txNumber; |
| 44 | + |
| 45 | +int16_t rssi,rxSize; |
| 46 | +void DoubleToString( char *str, double double_num,unsigned int len); |
| 47 | + |
| 48 | +void setup() { |
| 49 | + Serial.begin(115200); |
| 50 | + while (!Serial); |
| 51 | + |
| 52 | + SPI.begin(SCK,MISO,MOSI,SS); |
| 53 | + Mcu.init(SS,RST_LoRa,DIO0,DIO1,license); |
| 54 | + txNumber=0; |
| 55 | + rssi=0; |
| 56 | + |
| 57 | + Radio.Init( &RadioEvents ); |
| 58 | + Radio.SetChannel( RF_FREQUENCY ); |
| 59 | + Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, |
| 60 | + LORA_SPREADING_FACTOR, LORA_CODINGRATE, |
| 61 | + LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, |
| 62 | + true, 0, 0, LORA_IQ_INVERSION_ON, 3000 ); |
| 63 | + } |
| 64 | + |
| 65 | + |
| 66 | +uint32_t starttime = 0; |
| 67 | +uint8_t data[128]; |
| 68 | +uint8_t dataIndex = 0; |
| 69 | + |
| 70 | +uint32_t freq = 868000000; |
| 71 | +void loop() |
| 72 | +{ |
| 73 | + starttime = millis(); |
| 74 | + while( (millis() - starttime ) < 6000 ) |
| 75 | + { |
| 76 | + if(Serial.available()) |
| 77 | + { |
| 78 | + dataIndex = 0; |
| 79 | + while(Serial.available()) |
| 80 | + { |
| 81 | + data[dataIndex++]=Serial.read(); |
| 82 | + if(dataIndex == 128) |
| 83 | + { |
| 84 | + break; |
| 85 | + } |
| 86 | + } |
| 87 | + |
| 88 | + if(dataIndex == 5 && data[3] == '.') |
| 89 | + { |
| 90 | + if( data[0] <= '9' && data[0] >= '0' && data[1] <= '9' && data[1] >= '0' && data[2] <= '9' && data[2] >= '0' && data[4] <= '9' && data[4] >= '0' ) |
| 91 | + { |
| 92 | + uint32_t freq = (data[0]-'0')*100*1000000 + (data[1]-'0')*10*1000000+(data[2]-'0')*1000000+(data[4]-'0')*100000; |
| 93 | + Serial.print("Freq set to "); |
| 94 | +// Serial.println(freq); |
| 95 | + Serial.write(data,dataIndex); |
| 96 | + Serial.println("MHz"); |
| 97 | + Radio.Sleep(); |
| 98 | + Radio.SetChannel( freq ); |
| 99 | + Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, |
| 100 | + LORA_SPREADING_FACTOR, LORA_CODINGRATE, |
| 101 | + LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, |
| 102 | + true, 0, 0, LORA_IQ_INVERSION_ON, 3000 ); |
| 103 | + } |
| 104 | + else |
| 105 | + { |
| 106 | + Serial.println("Input Error. Input example : 868.1"); |
| 107 | + } |
| 108 | + } |
| 109 | + else |
| 110 | + { |
| 111 | + Serial.println("Input Error. Input example : 868.1"); |
| 112 | + } |
| 113 | + } |
| 114 | + } |
| 115 | + |
| 116 | + txNumber += 0.01; |
| 117 | + sprintf(txpacket,"%s","Hello world number"); //start a package |
| 118 | +// sprintf(txpacket+strlen(txpacket),"%d",txNumber); //add to the end of package |
| 119 | + |
| 120 | +// DoubleToString(txpacket,txNumber,3); //add to the end of package |
| 121 | + |
| 122 | +// Serial.printf("\r\nsending packet \"%s\" , length %d\r\n",txpacket, strlen(txpacket)); |
| 123 | + |
| 124 | +// Serial.println( Radio.TimeOnAir(MODEM_LORA, strlen(txpacket)) ); |
| 125 | + Radio.Send( (uint8_t *)txpacket, strlen(txpacket) ); //send the package out |
| 126 | +} |
| 127 | + |
| 128 | +/** |
| 129 | + * @brief Double To String |
| 130 | + * @param str: Array or pointer for storing strings |
| 131 | + * @param double_num: Number to be converted |
| 132 | + * @param len: Fractional length to keep |
| 133 | + * @retval None |
| 134 | + */ |
| 135 | +void DoubleToString( char *str, double double_num,unsigned int len) { |
| 136 | + double fractpart, intpart; |
| 137 | + fractpart = modf(double_num, &intpart); |
| 138 | + fractpart = fractpart * (pow(10,len)); |
| 139 | + sprintf(str + strlen(str),"%d", (int)(intpart)); //Integer part |
| 140 | + sprintf(str + strlen(str), ".%d", (int)(fractpart)); //Decimal part |
| 141 | +} |
0 commit comments