Application that measures the temperature and humidity every 60s and sends it to a LoRa Gateway.

Dependencies:   DHT LMiC SX1276Lib mbed

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?

UserRevisionLine numberNew 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 }