Send DHT11 & SHT10 sensors data through LoRa SX1272 board.

Dependencies:   DHT11 SHTx SX1272Lib mbed

Fork of SX1272-Transmitter by Antoine Boisadam

Committer:
Antoine38
Date:
Tue Mar 28 12:20:45 2017 +0000
Revision:
19:e50e4a513de1
Parent:
18:1ee53f77b90d
Child:
20:c4f5299fa99d
Compatibility with SHT10 Soil sensor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GregCr 0:1ed39951ab7b 1 #include "mbed.h"
GregCr 4:5ece30264cd9 2 #include "main.h"
Antoine38 18:1ee53f77b90d 3 // SX1272 Lib
GregCr 13:edb9b443c1dd 4 #include "sx1272-hal.h"
GregCr 8:f956dee63a56 5 #include "debug.h"
Antoine38 18:1ee53f77b90d 6 // DHT11 Lib (air temperature and humidity)
Antoine38 18:1ee53f77b90d 7 #include "DHT11.h"
Antoine38 19:e50e4a513de1 8 // SHT10 (soil temperature and humidity)
Antoine38 19:e50e4a513de1 9 #include "SHTx/sht15.hpp"
GregCr 0:1ed39951ab7b 10
GregCr 0:1ed39951ab7b 11 /* Set this flag to '1' to display debug messages on the console */
GregCr 13:edb9b443c1dd 12 #define DEBUG_MESSAGE 1
GregCr 0:1ed39951ab7b 13
Antoine38 19:e50e4a513de1 14 /* DELAY between two transmission (in seconds) */
Antoine38 19:e50e4a513de1 15 #define DELAY 1800
GregCr 0:1ed39951ab7b 16
Antoine38 14:62c3fd006150 17 #define RF_FREQUENCY 868000000 // Hz
Antoine38 14:62c3fd006150 18 #define TX_OUTPUT_POWER 14 // 14 dBm
GregCr 0:1ed39951ab7b 19
Antoine38 14:62c3fd006150 20 #define LORA_BANDWIDTH 2 // [0: 125 kHz,
Antoine38 15:24dc42e5d7bf 21 // 1: 250 kHz,
Antoine38 15:24dc42e5d7bf 22 // 2: 500 kHz,
Antoine38 15:24dc42e5d7bf 23 // 3: Reserved]
Antoine38 15:24dc42e5d7bf 24
Antoine38 14:62c3fd006150 25 #define LORA_SPREADING_FACTOR 7 // [SF7..SF12]
Antoine38 14:62c3fd006150 26 #define LORA_CODINGRATE 1 // [1: 4/5,
Antoine38 15:24dc42e5d7bf 27 // 2: 4/6,
Antoine38 15:24dc42e5d7bf 28 // 3: 4/7,
Antoine38 15:24dc42e5d7bf 29 // 4: 4/8]
Antoine38 15:24dc42e5d7bf 30
Antoine38 14:62c3fd006150 31 #define LORA_PREAMBLE_LENGTH 8
Antoine38 14:62c3fd006150 32 #define LORA_SYMBOL_TIMEOUT 5 // Symbols
Antoine38 14:62c3fd006150 33 #define LORA_FIX_LENGTH_PAYLOAD_ON false
Antoine38 14:62c3fd006150 34 #define LORA_FHSS_ENABLED false
Antoine38 14:62c3fd006150 35 #define LORA_NB_SYMB_HOP 4
Antoine38 14:62c3fd006150 36 #define LORA_IQ_INVERSION_ON false
Antoine38 14:62c3fd006150 37 #define LORA_CRC_ENABLED true
GregCr 0:1ed39951ab7b 38
Antoine38 17:cd37e3e63cec 39 #define BUFFER_SIZE 1024 // Define the payload size here
GregCr 0:1ed39951ab7b 40
GregCr 3:8b9e2a4df4b5 41 DigitalOut led(LED1);
GregCr 3:8b9e2a4df4b5 42
mluis 10:7af820d1e1df 43 /*!
mluis 10:7af820d1e1df 44 * Radio events function pointer
mluis 10:7af820d1e1df 45 */
mluis 10:7af820d1e1df 46 static RadioEvents_t RadioEvents;
mluis 10:7af820d1e1df 47
mluis 10:7af820d1e1df 48 /*
mluis 10:7af820d1e1df 49 * Global variables declarations
mluis 10:7af820d1e1df 50 */
GregCr 13:edb9b443c1dd 51 SX1272MB2xAS Radio( NULL );
GregCr 0:1ed39951ab7b 52
Antoine38 18:1ee53f77b90d 53 uint8_t msg[BUFFER_SIZE];
GregCr 0:1ed39951ab7b 54
GregCr 0:1ed39951ab7b 55 uint16_t BufferSize = BUFFER_SIZE;
GregCr 0:1ed39951ab7b 56 uint8_t Buffer[BUFFER_SIZE];
GregCr 0:1ed39951ab7b 57
GregCr 5:f2431c4fe3bb 58 int16_t RssiValue = 0.0;
GregCr 5:f2431c4fe3bb 59 int8_t SnrValue = 0.0;
GregCr 0:1ed39951ab7b 60
Antoine38 17:cd37e3e63cec 61 int msglen = 0;
Antoine38 17:cd37e3e63cec 62
Antoine38 18:1ee53f77b90d 63 // Air temperature and humidity sensor
Antoine38 19:e50e4a513de1 64 DHT11 airSensor(D6);
Antoine38 18:1ee53f77b90d 65 int DHT11_state;
Antoine38 18:1ee53f77b90d 66
Antoine38 19:e50e4a513de1 67 // Soil temperature and humidity sensor
Antoine38 19:e50e4a513de1 68 SHTx::SHT15 soilSensor(D9, D8);
Antoine38 19:e50e4a513de1 69
Antoine38 14:62c3fd006150 70 int main()
GregCr 0:1ed39951ab7b 71 {
GregCr 0:1ed39951ab7b 72 uint8_t i;
Antoine38 14:62c3fd006150 73
Antoine38 14:62c3fd006150 74 debug( "\n\n\r iGreenhouse Application - Transmitter \n\n\r" );
mluis 10:7af820d1e1df 75
mluis 10:7af820d1e1df 76 // Initialize Radio driver
mluis 10:7af820d1e1df 77 RadioEvents.TxDone = OnTxDone;
mluis 10:7af820d1e1df 78 RadioEvents.TxTimeout = OnTxTimeout;
mluis 10:7af820d1e1df 79 Radio.Init( &RadioEvents );
Antoine38 14:62c3fd006150 80
GregCr 7:c1bbd6c56979 81 // verify the connection with the board
Antoine38 14:62c3fd006150 82 while( Radio.Read( REG_VERSION ) == 0x00 ) {
GregCr 7:c1bbd6c56979 83 debug( "Radio could not be detected!\n\r", NULL );
GregCr 7:c1bbd6c56979 84 wait( 1 );
GregCr 2:59e108728d71 85 }
Antoine38 14:62c3fd006150 86
GregCr 13:edb9b443c1dd 87 debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1272MB2XAS ) ) , "\n\r > Board Type: SX1272MB2xAS < \n\r" );
GregCr 0:1ed39951ab7b 88
Antoine38 14:62c3fd006150 89 Radio.SetChannel( RF_FREQUENCY );
Antoine38 14:62c3fd006150 90
Antoine38 14:62c3fd006150 91
GregCr 7:c1bbd6c56979 92 debug_if( LORA_FHSS_ENABLED, "\n\n\r > LORA FHSS Mode < \n\n\r");
GregCr 7:c1bbd6c56979 93 debug_if( !LORA_FHSS_ENABLED, "\n\n\r > LORA Mode < \n\n\r");
GregCr 7:c1bbd6c56979 94
GregCr 0:1ed39951ab7b 95 Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
Antoine38 14:62c3fd006150 96 LORA_SPREADING_FACTOR, LORA_CODINGRATE,
Antoine38 14:62c3fd006150 97 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
Antoine38 14:62c3fd006150 98 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
Antoine38 14:62c3fd006150 99 LORA_IQ_INVERSION_ON, 2000000 );
Antoine38 19:e50e4a513de1 100
Antoine38 19:e50e4a513de1 101 // Soil sensor configuration
Antoine38 19:e50e4a513de1 102 soilSensor.setOTPReload(false);
Antoine38 19:e50e4a513de1 103 soilSensor.setResolution(true);
Antoine38 19:e50e4a513de1 104 soilSensor.setScale(false);
GregCr 0:1ed39951ab7b 105
Antoine38 14:62c3fd006150 106 debug_if( DEBUG_MESSAGE, "Starting sending loop\r\n" );
GregCr 0:1ed39951ab7b 107
GregCr 3:8b9e2a4df4b5 108 led = 0;
Antoine38 14:62c3fd006150 109
Antoine38 18:1ee53f77b90d 110 while(1) {
Antoine38 18:1ee53f77b90d 111 // Retrieving sensors data
Antoine38 19:e50e4a513de1 112 DHT11_state = airSensor.readData();
Antoine38 18:1ee53f77b90d 113 if (DHT11_state == DHT11::OK) {
Antoine38 19:e50e4a513de1 114 sprintf((char*) msg, "TempA=%d \r\nHumiA=%d \r\nTempS=%3.2f \r\nHumiS=%3.2f \r\n", airSensor.readTemperature(), airSensor.readHumidity(), soilSensor.getTemperature(), soilSensor.getHumidity());
Antoine38 19:e50e4a513de1 115 } else {
Antoine38 19:e50e4a513de1 116 sprintf((char*) msg, "TempS=%3.2f \r\nHumiS=%3.2f \r\n", soilSensor.getTemperature(), soilSensor.getHumidity());
Antoine38 18:1ee53f77b90d 117 }
Antoine38 18:1ee53f77b90d 118
Antoine38 18:1ee53f77b90d 119 // Sending a new packet
Antoine38 14:62c3fd006150 120 debug("\r\n========\r\nSending a new Packet\r\n========\r\n");
Antoine38 17:cd37e3e63cec 121 strcpy( ( char* )Buffer, ( char* ) msg );
Antoine38 14:62c3fd006150 122 // We fill the buffer with numbers for the payload
Antoine38 17:cd37e3e63cec 123 msglen = strlen((char *) msg);
Antoine38 17:cd37e3e63cec 124 for( i = msglen; i < BufferSize; i++ ) {
Antoine38 17:cd37e3e63cec 125 Buffer[i] = i - msglen;
Antoine38 14:62c3fd006150 126 }
Antoine38 18:1ee53f77b90d 127 wait_ms(10);
Antoine38 18:1ee53f77b90d 128 Radio.Send(Buffer, BufferSize);
Antoine38 18:1ee53f77b90d 129
Antoine38 18:1ee53f77b90d 130 // Reversing the led state
Antoine38 16:80f027a8b2bc 131 led = 1-led;
Antoine38 18:1ee53f77b90d 132
Antoine38 19:e50e4a513de1 133 // wait DELAY seconds before resend data
Antoine38 19:e50e4a513de1 134 wait(DELAY);
GregCr 0:1ed39951ab7b 135 }
GregCr 0:1ed39951ab7b 136 }
GregCr 0:1ed39951ab7b 137
GregCr 0:1ed39951ab7b 138 void OnTxDone( void )
GregCr 0:1ed39951ab7b 139 {
GregCr 5:f2431c4fe3bb 140 Radio.Sleep( );
GregCr 7:c1bbd6c56979 141 debug_if( DEBUG_MESSAGE, "> OnTxDone\n\r" );
GregCr 0:1ed39951ab7b 142 }
GregCr 0:1ed39951ab7b 143
GregCr 0:1ed39951ab7b 144 void OnTxTimeout( void )
GregCr 0:1ed39951ab7b 145 {
GregCr 0:1ed39951ab7b 146 Radio.Sleep( );
GregCr 7:c1bbd6c56979 147 debug_if( DEBUG_MESSAGE, "> OnTxTimeout\n\r" );
GregCr 0:1ed39951ab7b 148 }
GregCr 0:1ed39951ab7b 149