Send DHT11 & SHT10 sensors data through LoRa SX1272 board.

Dependencies:   DHT11 SHTx SX1272Lib mbed

Fork of SX1272-Transmitter by Antoine Boisadam

Committer:
Antoine38
Date:
Mon Apr 03 15:10:40 2017 +0000
Revision:
23:711e46d8c9c6
Parent:
22:e6a5e6cf38cb
Fix some variables

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 21:3ea7ab726dd4 15 #define TRANSMISSION_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 21:3ea7ab726dd4 39 #define BUFFER_SIZE 6 // 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
Antoine38 18:1ee53f77b90d 58 // Air temperature and humidity sensor
Antoine38 19:e50e4a513de1 59 DHT11 airSensor(D6);
Antoine38 18:1ee53f77b90d 60 int DHT11_state;
Antoine38 18:1ee53f77b90d 61
Antoine38 19:e50e4a513de1 62 // Soil temperature and humidity sensor
Antoine38 21:3ea7ab726dd4 63 SHTx::SHT15 soilSensor(D9, D8);
Antoine38 19:e50e4a513de1 64
Antoine38 14:62c3fd006150 65 int main()
GregCr 0:1ed39951ab7b 66 {
Antoine38 14:62c3fd006150 67 debug( "\n\n\r iGreenhouse Application - Transmitter \n\n\r" );
mluis 10:7af820d1e1df 68
mluis 10:7af820d1e1df 69 // Initialize Radio driver
mluis 10:7af820d1e1df 70 RadioEvents.TxDone = OnTxDone;
mluis 10:7af820d1e1df 71 RadioEvents.TxTimeout = OnTxTimeout;
mluis 10:7af820d1e1df 72 Radio.Init( &RadioEvents );
Antoine38 14:62c3fd006150 73
GregCr 7:c1bbd6c56979 74 // verify the connection with the board
Antoine38 14:62c3fd006150 75 while( Radio.Read( REG_VERSION ) == 0x00 ) {
GregCr 7:c1bbd6c56979 76 debug( "Radio could not be detected!\n\r", NULL );
GregCr 7:c1bbd6c56979 77 wait( 1 );
GregCr 2:59e108728d71 78 }
Antoine38 14:62c3fd006150 79
GregCr 13:edb9b443c1dd 80 debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1272MB2XAS ) ) , "\n\r > Board Type: SX1272MB2xAS < \n\r" );
GregCr 0:1ed39951ab7b 81
Antoine38 14:62c3fd006150 82 Radio.SetChannel( RF_FREQUENCY );
Antoine38 14:62c3fd006150 83
Antoine38 14:62c3fd006150 84
GregCr 7:c1bbd6c56979 85 debug_if( LORA_FHSS_ENABLED, "\n\n\r > LORA FHSS Mode < \n\n\r");
GregCr 7:c1bbd6c56979 86 debug_if( !LORA_FHSS_ENABLED, "\n\n\r > LORA Mode < \n\n\r");
GregCr 7:c1bbd6c56979 87
GregCr 0:1ed39951ab7b 88 Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
Antoine38 14:62c3fd006150 89 LORA_SPREADING_FACTOR, LORA_CODINGRATE,
Antoine38 14:62c3fd006150 90 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
Antoine38 14:62c3fd006150 91 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
Antoine38 21:3ea7ab726dd4 92 LORA_IQ_INVERSION_ON, 2000000 );
Antoine38 19:e50e4a513de1 93
Antoine38 19:e50e4a513de1 94 // Soil sensor configuration
Antoine38 19:e50e4a513de1 95 soilSensor.setOTPReload(false);
Antoine38 19:e50e4a513de1 96 soilSensor.setResolution(true);
Antoine38 19:e50e4a513de1 97 soilSensor.setScale(false);
GregCr 0:1ed39951ab7b 98
Antoine38 14:62c3fd006150 99 debug_if( DEBUG_MESSAGE, "Starting sending loop\r\n" );
GregCr 0:1ed39951ab7b 100
GregCr 3:8b9e2a4df4b5 101 led = 0;
Antoine38 14:62c3fd006150 102
Antoine38 18:1ee53f77b90d 103 while(1) {
Antoine38 18:1ee53f77b90d 104 // Retrieving sensors data
Antoine38 19:e50e4a513de1 105 DHT11_state = airSensor.readData();
Antoine38 21:3ea7ab726dd4 106 soilSensor.update();
Antoine38 21:3ea7ab726dd4 107
Antoine38 18:1ee53f77b90d 108 if (DHT11_state == DHT11::OK) {
Antoine38 21:3ea7ab726dd4 109 msg[0] = airSensor.readTemperature(); // Temperature - Air
Antoine38 21:3ea7ab726dd4 110 msg[1] = airSensor.readHumidity(); // Humidity - Air
Antoine38 19:e50e4a513de1 111 } else {
Antoine38 21:3ea7ab726dd4 112 msg[0] = 0x00; // Temperature - Air
Antoine38 21:3ea7ab726dd4 113 msg[1] = 0x00; // Humidity - Air
Antoine38 18:1ee53f77b90d 114 }
Antoine38 23:711e46d8c9c6 115
Antoine38 21:3ea7ab726dd4 116 msg[2] = to_u8(soilSensor.getTemperature(), true); // Temperature - Soil
Antoine38 21:3ea7ab726dd4 117 msg[3] = to_u8(soilSensor.getHumidity(), false); // Humidity - Soil
Antoine38 21:3ea7ab726dd4 118 // Measurements types - Should be 0111 0010 -> 0x72
Antoine38 21:3ea7ab726dd4 119 msg[4] = 0x72;
Antoine38 21:3ea7ab726dd4 120 // Greenhouse num 1 and sensors in the middle - Should be 0001 0001
Antoine38 21:3ea7ab726dd4 121 msg[5] = 0x11; // id serre
Antoine38 18:1ee53f77b90d 122
Antoine38 18:1ee53f77b90d 123 // Sending a new packet
Antoine38 14:62c3fd006150 124 debug("\r\n========\r\nSending a new Packet\r\n========\r\n");
Antoine38 21:3ea7ab726dd4 125 for(int i = 0; i < BufferSize; i++) {
Antoine38 21:3ea7ab726dd4 126 debug("%x", msg[i]);
Antoine38 14:62c3fd006150 127 }
Antoine38 21:3ea7ab726dd4 128 debug_if( DEBUG_MESSAGE, "\n" );
Antoine38 21:3ea7ab726dd4 129 memcpy( Buffer, msg, BufferSize );
Antoine38 18:1ee53f77b90d 130 wait_ms(10);
Antoine38 18:1ee53f77b90d 131 Radio.Send(Buffer, BufferSize);
Antoine38 18:1ee53f77b90d 132
Antoine38 21:3ea7ab726dd4 133 // Switch the led state
Antoine38 16:80f027a8b2bc 134 led = 1-led;
Antoine38 18:1ee53f77b90d 135
Antoine38 21:3ea7ab726dd4 136 // wait X seconds before resend data
Antoine38 21:3ea7ab726dd4 137 //wait(TRANSMISSION_DELAY);
Antoine38 21:3ea7ab726dd4 138 wait(5);
GregCr 0:1ed39951ab7b 139 }
GregCr 0:1ed39951ab7b 140 }
GregCr 0:1ed39951ab7b 141
Antoine38 21:3ea7ab726dd4 142 // temperature: -30 < x < 70
Antoine38 21:3ea7ab726dd4 143 // humidity: 0 < x < 100
Antoine38 21:3ea7ab726dd4 144 uint8_t to_u8(float x, bool isTemp)
Antoine38 21:3ea7ab726dd4 145 {
Antoine38 23:711e46d8c9c6 146 float a = 0;
Antoine38 21:3ea7ab726dd4 147 float min = 0.0;
Antoine38 21:3ea7ab726dd4 148 float max = 100.0;
Antoine38 21:3ea7ab726dd4 149 if( isTemp) {
Antoine38 21:3ea7ab726dd4 150 min = -30.0;
Antoine38 21:3ea7ab726dd4 151 max = 70.0;
Antoine38 21:3ea7ab726dd4 152 a = 30.0;
Antoine38 21:3ea7ab726dd4 153 }
Antoine38 21:3ea7ab726dd4 154 // On passe le float entre 0 et 1.0
Antoine38 21:3ea7ab726dd4 155 if(x > min && x < max) {
Antoine38 21:3ea7ab726dd4 156 x = (x + a) / 100.0;
Antoine38 23:711e46d8c9c6 157 } else if(x <= min) {
Antoine38 21:3ea7ab726dd4 158 x = 0.0;
Antoine38 21:3ea7ab726dd4 159 } else {
Antoine38 21:3ea7ab726dd4 160 x = 1.0;
Antoine38 21:3ea7ab726dd4 161 }
Antoine38 21:3ea7ab726dd4 162 return rint(x * 255);
Antoine38 21:3ea7ab726dd4 163 }
Antoine38 21:3ea7ab726dd4 164
GregCr 0:1ed39951ab7b 165 void OnTxDone( void )
GregCr 0:1ed39951ab7b 166 {
GregCr 5:f2431c4fe3bb 167 Radio.Sleep( );
GregCr 7:c1bbd6c56979 168 debug_if( DEBUG_MESSAGE, "> OnTxDone\n\r" );
GregCr 0:1ed39951ab7b 169 }
GregCr 0:1ed39951ab7b 170
GregCr 0:1ed39951ab7b 171 void OnTxTimeout( void )
GregCr 0:1ed39951ab7b 172 {
GregCr 0:1ed39951ab7b 173 Radio.Sleep( );
GregCr 7:c1bbd6c56979 174 debug_if( DEBUG_MESSAGE, "> OnTxTimeout\n\r" );
GregCr 0:1ed39951ab7b 175 }
GregCr 0:1ed39951ab7b 176