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

Dependencies:   DHT LMiC SX1276Lib mbed

Files at this revision

API Documentation at this revision

Comitter:
Maarten_BE
Date:
Thu Apr 07 13:56:37 2016 +0000
Commit message:
Initial commit of temperature and humidity application that sends the measured values every 60s to a LoRa Gateway

Changed in this revision

DHT.lib Show annotated file Show diff for this revision Revisions of this file
LMiC.lib Show annotated file Show diff for this revision Revisions of this file
SX1276Lib.lib Show annotated file Show diff for this revision Revisions of this file
debug.cpp Show annotated file Show diff for this revision Revisions of this file
debug.h Show annotated file Show diff for this revision Revisions of this file
hal.cpp Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 068b9b32e9e8 DHT.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DHT.lib	Thu Apr 07 13:56:37 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/Wimpie/code/DHT/#9b5b3200688f
diff -r 000000000000 -r 068b9b32e9e8 LMiC.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LMiC.lib	Thu Apr 07 13:56:37 2016 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/Maarten_BE/code/LMiC/#3a2c29e4d38c
diff -r 000000000000 -r 068b9b32e9e8 SX1276Lib.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SX1276Lib.lib	Thu Apr 07 13:56:37 2016 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/Semtech/code/SX1276Lib/#79c5b50b2b9c
diff -r 000000000000 -r 068b9b32e9e8 debug.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debug.cpp	Thu Apr 07 13:56:37 2016 +0000
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 IBM Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    IBM Zurich Research Lab - initial API, implementation and documentation
+ *    Semtech Apps Team       - Adapted for MBED
+ *******************************************************************************/
+#include <stdio.h>
+#include "lmic.h"
+#include "debug.h"
+
+void debug_init () {
+    // print banner
+    debug_str("\r\n============== DEBUG STARTED ==============\r\n");
+}
+
+void debug_led (u1_t val) {
+    debug_val( "LED = ", val );
+}
+
+void debug_char (u1_t c) {
+    fprintf(stderr, "%c", c );
+}
+
+void debug_hex (u1_t b) {
+    fprintf(stderr, "%02X", b );
+}
+
+void debug_buf (const u1_t* buf, u2_t len) {
+    while( len-- ) {
+        debug_hex( *buf++ );
+        debug_char( ' ' );
+    }
+    debug_char( '\r' );
+    debug_char( '\n' );
+}
+
+void debug_uint (u4_t v) {
+    for( s1_t n = 24; n >= 0; n -= 8 ) {
+        debug_hex( v >> n );
+    }
+}
+
+void debug_str (const u1_t* str) {
+    while( *str ) {
+        debug_char( *str++ );
+    }
+}
+
+void debug_val (const u1_t* label, u4_t val) {
+    debug_str( label );
+    debug_uint( val );
+    debug_char( '\r' );
+    debug_char( '\n' );
+}
+
+void debug_event (int ev) {
+    static const u1_t* evnames[] = {
+        [EV_SCAN_TIMEOUT]   = "SCAN_TIMEOUT",
+        [EV_BEACON_FOUND]   = "BEACON_FOUND",
+        [EV_BEACON_MISSED]  = "BEACON_MISSED",
+        [EV_BEACON_TRACKED] = "BEACON_TRACKED",
+        [EV_JOINING]        = "JOINING",
+        [EV_JOINED]         = "JOINED",
+        [EV_RFU1]           = "RFU1",
+        [EV_JOIN_FAILED]    = "JOIN_FAILED",
+        [EV_REJOIN_FAILED]  = "REJOIN_FAILED",
+        [EV_TXCOMPLETE]     = "TXCOMPLETE",
+        [EV_LOST_TSYNC]     = "LOST_TSYNC",
+        [EV_RESET]          = "RESET",
+        [EV_RXCOMPLETE]     = "RXCOMPLETE",
+        [EV_LINK_DEAD]      = "LINK_DEAD",
+        [EV_LINK_ALIVE]     = "LINK_ALIVE",
+    };
+    debug_str(evnames[ev]);
+    debug_char('\r');
+    debug_char('\n');
+}
diff -r 000000000000 -r 068b9b32e9e8 debug.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debug.h	Thu Apr 07 13:56:37 2016 +0000
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 IBM Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    IBM Zurich Research Lab - initial API, implementation and documentation
+ *    Semtech Apps Team       - Adapted for MBED
+ *******************************************************************************/
+#ifndef _debug_hpp_
+#define _debug_hpp_
+
+// intialize debug library
+void debug_init (void);
+
+// set LED state
+void debug_led (u1_t val);
+
+// write character to USART
+void debug_char (u1_t c);
+
+// write byte as two hex digits to USART
+void debug_hex (u1_t b);
+
+// write buffer as hex dump to USART
+void debug_buf (const u1_t* buf, u2_t len);
+
+// write 32-bit integer as eight hex digits to USART
+void debug_uint (u4_t v);
+
+// write nul-terminated string to USART
+void debug_str (const u1_t* str);
+
+// write LMiC event name to USART
+void debug_event (int ev);
+
+// write label and 32-bit value as hex to USART
+void debug_val (const u1_t* label, u4_t val);
+
+#endif // _debug_hpp_
diff -r 000000000000 -r 068b9b32e9e8 hal.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hal.cpp	Thu Apr 07 13:56:37 2016 +0000
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2014 IBM Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    IBM Zurich Research Lab - initial API, implementation and documentation
+ *    Semtech Apps Team       - Modified to support the MBED sx1276 driver
+ *                              library.
+ *                              Possibility to use original or Semtech's MBED
+ *                              radio driver. The selection is done by setting
+ *                              USE_SMTC_RADIO_DRIVER preprocessing directive
+ *                              in lmic.h
+ *******************************************************************************/
+#include "mbed.h"
+#include "lmic.h"
+#include "mbed_debug.h"
+
+#if !USE_SMTC_RADIO_DRIVER
+
+extern void radio_irq_handler( u1_t dio );
+
+static DigitalOut nss( D10 );
+static SPI spi( D11, D12, D13 ); // ( mosi, miso, sclk )
+ 
+static DigitalInOut rst( A0 );
+static DigitalOut rxtx( A4 );
+ 
+static InterruptIn dio0( D2 );
+static InterruptIn dio1( D3 );
+static InterruptIn dio2( D4 ); 
+
+static void dio0Irq( void ) {
+    radio_irq_handler( 0 );
+}
+
+static void dio1Irq( void ) {
+    radio_irq_handler( 1 );
+}
+
+static void dio2Irq( void ) {
+    radio_irq_handler( 2 );
+}
+
+#endif
+
+static u1_t irqlevel = 0;
+static u4_t ticks = 0;
+
+static Timer timer;
+static Ticker ticker;
+
+static void reset_timer( void ) {
+    ticks += timer.read_us( ) >> 6;
+    timer.reset( );
+}
+
+void hal_init( void ) {
+     __disable_irq( );
+     irqlevel = 0;
+
+#if !USE_SMTC_RADIO_DRIVER
+    // configure input lines
+    dio0.mode( PullDown );
+    dio0.rise( dio0Irq );
+    dio0.enable_irq( );
+    dio1.mode( PullDown );   
+    dio1.rise( dio1Irq );
+    dio1.enable_irq( );
+    dio2.mode( PullDown );
+    dio2.rise( dio2Irq );
+    dio2.enable_irq( );
+    // configure reset line
+    rst.input( );
+    // configure spi
+    spi.frequency( 8000000 );
+    spi.format( 8, 0 );
+    nss = 1;
+#endif
+    // configure timer
+    timer.start( );
+    ticker.attach_us( reset_timer, 10000000 ); // reset timer every 10sec
+     __enable_irq( );
+}
+
+#if !USE_SMTC_RADIO_DRIVER
+
+void hal_pin_rxtx( u1_t val ) {
+    rxtx = !val;
+}
+
+void hal_pin_nss( u1_t val ) {
+    nss = val;
+}
+
+void hal_pin_rst( u1_t val ) {
+    if( val == 0 || val == 1 )
+    { // drive pin
+        rst.output( );
+        rst = val;
+    } 
+    else
+    { // keep pin floating
+        rst.input( );
+    }
+}
+
+u1_t hal_spi( u1_t out ) {
+    return spi.write( out );
+}
+
+#endif
+
+void hal_disableIRQs( void ) {
+    __disable_irq( );
+    irqlevel++;
+}
+
+void hal_enableIRQs( void ) {
+    if( --irqlevel == 0 )
+    {
+        __enable_irq( );
+    }
+}
+
+void hal_sleep( void ) {
+    // NOP
+}
+
+u4_t hal_ticks( void ) {
+    hal_disableIRQs( );
+    int t = ticks + ( timer.read_us( ) >> 6 );
+    hal_enableIRQs( );
+    return t;
+}
+
+static u2_t deltaticks( u4_t time ) {
+    u4_t t = hal_ticks( );
+    s4_t d = time - t;
+    if( d <= 0 ) {
+        return 0;    // in the past
+    }
+    if( ( d >> 16 ) != 0 ) {
+        return 0xFFFF; // far ahead
+    }
+    return ( u2_t )d;
+}
+
+void hal_waitUntil( u4_t time ) {
+    while( deltaticks( time ) != 0 ); // busy wait until timestamp is reached
+}
+
+u1_t hal_checkTimer( u4_t time ) {
+    return ( deltaticks( time ) < 2 );
+}
+
+void hal_failed( void ) {
+    while( 1 );
+}
diff -r 000000000000 -r 068b9b32e9e8 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Apr 07 13:56:37 2016 +0000
@@ -0,0 +1,97 @@
+// License: Revised BSD License, see LICENSE.TXT, (c)2015 Semtech
+
+#include "mbed.h"
+#include "lmic.h"
+#include "debug.h"
+
+#include "DHT.h"
+
+#define LORAWAN_NET_ID (uint32_t) 0x00000000
+// TODO: enter device address below, for TTN just set ???
+#define LORAWAN_DEV_ADDR (uint32_t) 0x02033333
+#define LORAWAN_ADR_ON 1
+#define LORAWAN_CONFIRMED_MSG_ON 1
+#define LORAWAN_APP_PORT 3//15
+
+DHT sensor(A1, AM2302);
+
+static uint8_t NwkSKey[] = {
+    // TODO: enter network, or use TTN default
+    // e.g. for 2B7E151628AED2A6ABF7158809CF4F3C =>
+    0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 
+    0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C
+};
+
+static uint8_t ArtSKey[] = {
+    // TODO: enter application key, or use TTN default
+    // e.g. for 2B7E151628AED2A6ABF7158809CF4F3C =>
+    0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 
+    0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C
+};
+
+osjob_t initjob;
+osjob_t sendFrameJob;
+u1_t n = 0;
+
+void os_getArtEui (uint8_t *buf) {} // ignore
+void os_getDevEui (uint8_t *buf) {} // ignore
+void os_getDevKey (uint8_t *buf) {} // ignore
+
+void getTemperatureHumidity(float& temperature, float& humidity) {
+
+    int err = 1;
+  
+    while(err != 0) {
+        wait(2.0f);
+        err = sensor.readData();
+    }
+    
+    temperature = sensor.ReadTemperature(CELCIUS);
+    humidity = sensor.ReadHumidity();
+}
+
+void onSendFrame (osjob_t* j) {
+ 
+    char message[32];
+    
+    float temperature;
+    float humidity;
+
+    getTemperatureHumidity(temperature, humidity);
+    
+    printf("Temperature is %4.2f \r\n", temperature);
+    printf("Humidity is %4.2f \r\n", humidity);
+    
+    sprintf(message, "%4.2f;%4.2f", temperature, humidity);
+    
+    int frameLength = strlen(message); // keep it < 32
+    for (int i = 0; i < frameLength; i++) {
+        LMIC.frame[i] = message[i];
+    }
+    int result = LMIC_setTxData2(LORAWAN_APP_PORT, LMIC.frame, 
+        frameLength, LORAWAN_CONFIRMED_MSG_ON); // calls onEvent()
+        
+    os_setTimedCallback(j, os_getTime() + sec2osticks(60), onSendFrame);
+}
+
+void onInit (osjob_t* j) {
+    LMIC_reset();
+    LMIC_setAdrMode(LORAWAN_ADR_ON);
+    LMIC_setDrTxpow(DR_SF12, 14);
+    LMIC_setSession(LORAWAN_NET_ID, LORAWAN_DEV_ADDR, NwkSKey, ArtSKey);
+    onSendFrame(NULL);
+}
+
+void onEvent (ev_t ev) { // called by lmic.cpp, see also oslmic.h
+    debug_event(ev);
+    if (ev == EV_TXCOMPLETE) {
+        os_setCallback(&sendFrameJob, onSendFrame);
+    }
+}
+
+int main (void) {
+    printf("Temperature Humidity IoT\r\n");
+    os_init();
+    os_setCallback(&initjob, onInit);
+    os_runloop(); // blocking
+}
diff -r 000000000000 -r 068b9b32e9e8 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Apr 07 13:56:37 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/6f327212ef96
\ No newline at end of file