Application that measures the temperature and humidity every 60s and sends it to a LoRa Gateway.
Dependencies: DHT LMiC SX1276Lib mbed
Revision 0:068b9b32e9e8, committed 2016-04-07
- 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
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