Application that measures the temperature and humidity every 60s and sends it to a LoRa Gateway.
Dependencies: DHT LMiC SX1276Lib mbed
main.cpp@0:068b9b32e9e8, 2016-04-07 (annotated)
- Committer:
- Maarten_BE
- Date:
- Thu Apr 07 13:56:37 2016 +0000
- Revision:
- 0:068b9b32e9e8
Initial commit of temperature and humidity application that sends the measured values every 60s to a LoRa Gateway
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Maarten_BE | 0:068b9b32e9e8 | 1 | // License: Revised BSD License, see LICENSE.TXT, (c)2015 Semtech |
Maarten_BE | 0:068b9b32e9e8 | 2 | |
Maarten_BE | 0:068b9b32e9e8 | 3 | #include "mbed.h" |
Maarten_BE | 0:068b9b32e9e8 | 4 | #include "lmic.h" |
Maarten_BE | 0:068b9b32e9e8 | 5 | #include "debug.h" |
Maarten_BE | 0:068b9b32e9e8 | 6 | |
Maarten_BE | 0:068b9b32e9e8 | 7 | #include "DHT.h" |
Maarten_BE | 0:068b9b32e9e8 | 8 | |
Maarten_BE | 0:068b9b32e9e8 | 9 | #define LORAWAN_NET_ID (uint32_t) 0x00000000 |
Maarten_BE | 0:068b9b32e9e8 | 10 | // TODO: enter device address below, for TTN just set ??? |
Maarten_BE | 0:068b9b32e9e8 | 11 | #define LORAWAN_DEV_ADDR (uint32_t) 0x02033333 |
Maarten_BE | 0:068b9b32e9e8 | 12 | #define LORAWAN_ADR_ON 1 |
Maarten_BE | 0:068b9b32e9e8 | 13 | #define LORAWAN_CONFIRMED_MSG_ON 1 |
Maarten_BE | 0:068b9b32e9e8 | 14 | #define LORAWAN_APP_PORT 3//15 |
Maarten_BE | 0:068b9b32e9e8 | 15 | |
Maarten_BE | 0:068b9b32e9e8 | 16 | DHT sensor(A1, AM2302); |
Maarten_BE | 0:068b9b32e9e8 | 17 | |
Maarten_BE | 0:068b9b32e9e8 | 18 | static uint8_t NwkSKey[] = { |
Maarten_BE | 0:068b9b32e9e8 | 19 | // TODO: enter network, or use TTN default |
Maarten_BE | 0:068b9b32e9e8 | 20 | // e.g. for 2B7E151628AED2A6ABF7158809CF4F3C => |
Maarten_BE | 0:068b9b32e9e8 | 21 | 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, |
Maarten_BE | 0:068b9b32e9e8 | 22 | 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C |
Maarten_BE | 0:068b9b32e9e8 | 23 | }; |
Maarten_BE | 0:068b9b32e9e8 | 24 | |
Maarten_BE | 0:068b9b32e9e8 | 25 | static uint8_t ArtSKey[] = { |
Maarten_BE | 0:068b9b32e9e8 | 26 | // TODO: enter application key, or use TTN default |
Maarten_BE | 0:068b9b32e9e8 | 27 | // e.g. for 2B7E151628AED2A6ABF7158809CF4F3C => |
Maarten_BE | 0:068b9b32e9e8 | 28 | 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, |
Maarten_BE | 0:068b9b32e9e8 | 29 | 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C |
Maarten_BE | 0:068b9b32e9e8 | 30 | }; |
Maarten_BE | 0:068b9b32e9e8 | 31 | |
Maarten_BE | 0:068b9b32e9e8 | 32 | osjob_t initjob; |
Maarten_BE | 0:068b9b32e9e8 | 33 | osjob_t sendFrameJob; |
Maarten_BE | 0:068b9b32e9e8 | 34 | u1_t n = 0; |
Maarten_BE | 0:068b9b32e9e8 | 35 | |
Maarten_BE | 0:068b9b32e9e8 | 36 | void os_getArtEui (uint8_t *buf) {} // ignore |
Maarten_BE | 0:068b9b32e9e8 | 37 | void os_getDevEui (uint8_t *buf) {} // ignore |
Maarten_BE | 0:068b9b32e9e8 | 38 | void os_getDevKey (uint8_t *buf) {} // ignore |
Maarten_BE | 0:068b9b32e9e8 | 39 | |
Maarten_BE | 0:068b9b32e9e8 | 40 | void getTemperatureHumidity(float& temperature, float& humidity) { |
Maarten_BE | 0:068b9b32e9e8 | 41 | |
Maarten_BE | 0:068b9b32e9e8 | 42 | int err = 1; |
Maarten_BE | 0:068b9b32e9e8 | 43 | |
Maarten_BE | 0:068b9b32e9e8 | 44 | while(err != 0) { |
Maarten_BE | 0:068b9b32e9e8 | 45 | wait(2.0f); |
Maarten_BE | 0:068b9b32e9e8 | 46 | err = sensor.readData(); |
Maarten_BE | 0:068b9b32e9e8 | 47 | } |
Maarten_BE | 0:068b9b32e9e8 | 48 | |
Maarten_BE | 0:068b9b32e9e8 | 49 | temperature = sensor.ReadTemperature(CELCIUS); |
Maarten_BE | 0:068b9b32e9e8 | 50 | humidity = sensor.ReadHumidity(); |
Maarten_BE | 0:068b9b32e9e8 | 51 | } |
Maarten_BE | 0:068b9b32e9e8 | 52 | |
Maarten_BE | 0:068b9b32e9e8 | 53 | void onSendFrame (osjob_t* j) { |
Maarten_BE | 0:068b9b32e9e8 | 54 | |
Maarten_BE | 0:068b9b32e9e8 | 55 | char message[32]; |
Maarten_BE | 0:068b9b32e9e8 | 56 | |
Maarten_BE | 0:068b9b32e9e8 | 57 | float temperature; |
Maarten_BE | 0:068b9b32e9e8 | 58 | float humidity; |
Maarten_BE | 0:068b9b32e9e8 | 59 | |
Maarten_BE | 0:068b9b32e9e8 | 60 | getTemperatureHumidity(temperature, humidity); |
Maarten_BE | 0:068b9b32e9e8 | 61 | |
Maarten_BE | 0:068b9b32e9e8 | 62 | printf("Temperature is %4.2f \r\n", temperature); |
Maarten_BE | 0:068b9b32e9e8 | 63 | printf("Humidity is %4.2f \r\n", humidity); |
Maarten_BE | 0:068b9b32e9e8 | 64 | |
Maarten_BE | 0:068b9b32e9e8 | 65 | sprintf(message, "%4.2f;%4.2f", temperature, humidity); |
Maarten_BE | 0:068b9b32e9e8 | 66 | |
Maarten_BE | 0:068b9b32e9e8 | 67 | int frameLength = strlen(message); // keep it < 32 |
Maarten_BE | 0:068b9b32e9e8 | 68 | for (int i = 0; i < frameLength; i++) { |
Maarten_BE | 0:068b9b32e9e8 | 69 | LMIC.frame[i] = message[i]; |
Maarten_BE | 0:068b9b32e9e8 | 70 | } |
Maarten_BE | 0:068b9b32e9e8 | 71 | int result = LMIC_setTxData2(LORAWAN_APP_PORT, LMIC.frame, |
Maarten_BE | 0:068b9b32e9e8 | 72 | frameLength, LORAWAN_CONFIRMED_MSG_ON); // calls onEvent() |
Maarten_BE | 0:068b9b32e9e8 | 73 | |
Maarten_BE | 0:068b9b32e9e8 | 74 | os_setTimedCallback(j, os_getTime() + sec2osticks(60), onSendFrame); |
Maarten_BE | 0:068b9b32e9e8 | 75 | } |
Maarten_BE | 0:068b9b32e9e8 | 76 | |
Maarten_BE | 0:068b9b32e9e8 | 77 | void onInit (osjob_t* j) { |
Maarten_BE | 0:068b9b32e9e8 | 78 | LMIC_reset(); |
Maarten_BE | 0:068b9b32e9e8 | 79 | LMIC_setAdrMode(LORAWAN_ADR_ON); |
Maarten_BE | 0:068b9b32e9e8 | 80 | LMIC_setDrTxpow(DR_SF12, 14); |
Maarten_BE | 0:068b9b32e9e8 | 81 | LMIC_setSession(LORAWAN_NET_ID, LORAWAN_DEV_ADDR, NwkSKey, ArtSKey); |
Maarten_BE | 0:068b9b32e9e8 | 82 | onSendFrame(NULL); |
Maarten_BE | 0:068b9b32e9e8 | 83 | } |
Maarten_BE | 0:068b9b32e9e8 | 84 | |
Maarten_BE | 0:068b9b32e9e8 | 85 | void onEvent (ev_t ev) { // called by lmic.cpp, see also oslmic.h |
Maarten_BE | 0:068b9b32e9e8 | 86 | debug_event(ev); |
Maarten_BE | 0:068b9b32e9e8 | 87 | if (ev == EV_TXCOMPLETE) { |
Maarten_BE | 0:068b9b32e9e8 | 88 | os_setCallback(&sendFrameJob, onSendFrame); |
Maarten_BE | 0:068b9b32e9e8 | 89 | } |
Maarten_BE | 0:068b9b32e9e8 | 90 | } |
Maarten_BE | 0:068b9b32e9e8 | 91 | |
Maarten_BE | 0:068b9b32e9e8 | 92 | int main (void) { |
Maarten_BE | 0:068b9b32e9e8 | 93 | printf("Temperature Humidity IoT\r\n"); |
Maarten_BE | 0:068b9b32e9e8 | 94 | os_init(); |
Maarten_BE | 0:068b9b32e9e8 | 95 | os_setCallback(&initjob, onInit); |
Maarten_BE | 0:068b9b32e9e8 | 96 | os_runloop(); // blocking |
Maarten_BE | 0:068b9b32e9e8 | 97 | } |