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 /*******************************************************************************
Maarten_BE 0:068b9b32e9e8 2 * Copyright (c) 2014 IBM Corporation.
Maarten_BE 0:068b9b32e9e8 3 * All rights reserved. This program and the accompanying materials
Maarten_BE 0:068b9b32e9e8 4 * are made available under the terms of the Eclipse Public License v1.0
Maarten_BE 0:068b9b32e9e8 5 * which accompanies this distribution, and is available at
Maarten_BE 0:068b9b32e9e8 6 * http://www.eclipse.org/legal/epl-v10.html
Maarten_BE 0:068b9b32e9e8 7 *
Maarten_BE 0:068b9b32e9e8 8 * Contributors:
Maarten_BE 0:068b9b32e9e8 9 * IBM Zurich Research Lab - initial API, implementation and documentation
Maarten_BE 0:068b9b32e9e8 10 * Semtech Apps Team - Modified to support the MBED sx1276 driver
Maarten_BE 0:068b9b32e9e8 11 * library.
Maarten_BE 0:068b9b32e9e8 12 * Possibility to use original or Semtech's MBED
Maarten_BE 0:068b9b32e9e8 13 * radio driver. The selection is done by setting
Maarten_BE 0:068b9b32e9e8 14 * USE_SMTC_RADIO_DRIVER preprocessing directive
Maarten_BE 0:068b9b32e9e8 15 * in lmic.h
Maarten_BE 0:068b9b32e9e8 16 *******************************************************************************/
Maarten_BE 0:068b9b32e9e8 17 #include "mbed.h"
Maarten_BE 0:068b9b32e9e8 18 #include "lmic.h"
Maarten_BE 0:068b9b32e9e8 19 #include "mbed_debug.h"
Maarten_BE 0:068b9b32e9e8 20
Maarten_BE 0:068b9b32e9e8 21 #if !USE_SMTC_RADIO_DRIVER
Maarten_BE 0:068b9b32e9e8 22
Maarten_BE 0:068b9b32e9e8 23 extern void radio_irq_handler( u1_t dio );
Maarten_BE 0:068b9b32e9e8 24
Maarten_BE 0:068b9b32e9e8 25 static DigitalOut nss( D10 );
Maarten_BE 0:068b9b32e9e8 26 static SPI spi( D11, D12, D13 ); // ( mosi, miso, sclk )
Maarten_BE 0:068b9b32e9e8 27
Maarten_BE 0:068b9b32e9e8 28 static DigitalInOut rst( A0 );
Maarten_BE 0:068b9b32e9e8 29 static DigitalOut rxtx( A4 );
Maarten_BE 0:068b9b32e9e8 30
Maarten_BE 0:068b9b32e9e8 31 static InterruptIn dio0( D2 );
Maarten_BE 0:068b9b32e9e8 32 static InterruptIn dio1( D3 );
Maarten_BE 0:068b9b32e9e8 33 static InterruptIn dio2( D4 );
Maarten_BE 0:068b9b32e9e8 34
Maarten_BE 0:068b9b32e9e8 35 static void dio0Irq( void ) {
Maarten_BE 0:068b9b32e9e8 36 radio_irq_handler( 0 );
Maarten_BE 0:068b9b32e9e8 37 }
Maarten_BE 0:068b9b32e9e8 38
Maarten_BE 0:068b9b32e9e8 39 static void dio1Irq( void ) {
Maarten_BE 0:068b9b32e9e8 40 radio_irq_handler( 1 );
Maarten_BE 0:068b9b32e9e8 41 }
Maarten_BE 0:068b9b32e9e8 42
Maarten_BE 0:068b9b32e9e8 43 static void dio2Irq( void ) {
Maarten_BE 0:068b9b32e9e8 44 radio_irq_handler( 2 );
Maarten_BE 0:068b9b32e9e8 45 }
Maarten_BE 0:068b9b32e9e8 46
Maarten_BE 0:068b9b32e9e8 47 #endif
Maarten_BE 0:068b9b32e9e8 48
Maarten_BE 0:068b9b32e9e8 49 static u1_t irqlevel = 0;
Maarten_BE 0:068b9b32e9e8 50 static u4_t ticks = 0;
Maarten_BE 0:068b9b32e9e8 51
Maarten_BE 0:068b9b32e9e8 52 static Timer timer;
Maarten_BE 0:068b9b32e9e8 53 static Ticker ticker;
Maarten_BE 0:068b9b32e9e8 54
Maarten_BE 0:068b9b32e9e8 55 static void reset_timer( void ) {
Maarten_BE 0:068b9b32e9e8 56 ticks += timer.read_us( ) >> 6;
Maarten_BE 0:068b9b32e9e8 57 timer.reset( );
Maarten_BE 0:068b9b32e9e8 58 }
Maarten_BE 0:068b9b32e9e8 59
Maarten_BE 0:068b9b32e9e8 60 void hal_init( void ) {
Maarten_BE 0:068b9b32e9e8 61 __disable_irq( );
Maarten_BE 0:068b9b32e9e8 62 irqlevel = 0;
Maarten_BE 0:068b9b32e9e8 63
Maarten_BE 0:068b9b32e9e8 64 #if !USE_SMTC_RADIO_DRIVER
Maarten_BE 0:068b9b32e9e8 65 // configure input lines
Maarten_BE 0:068b9b32e9e8 66 dio0.mode( PullDown );
Maarten_BE 0:068b9b32e9e8 67 dio0.rise( dio0Irq );
Maarten_BE 0:068b9b32e9e8 68 dio0.enable_irq( );
Maarten_BE 0:068b9b32e9e8 69 dio1.mode( PullDown );
Maarten_BE 0:068b9b32e9e8 70 dio1.rise( dio1Irq );
Maarten_BE 0:068b9b32e9e8 71 dio1.enable_irq( );
Maarten_BE 0:068b9b32e9e8 72 dio2.mode( PullDown );
Maarten_BE 0:068b9b32e9e8 73 dio2.rise( dio2Irq );
Maarten_BE 0:068b9b32e9e8 74 dio2.enable_irq( );
Maarten_BE 0:068b9b32e9e8 75 // configure reset line
Maarten_BE 0:068b9b32e9e8 76 rst.input( );
Maarten_BE 0:068b9b32e9e8 77 // configure spi
Maarten_BE 0:068b9b32e9e8 78 spi.frequency( 8000000 );
Maarten_BE 0:068b9b32e9e8 79 spi.format( 8, 0 );
Maarten_BE 0:068b9b32e9e8 80 nss = 1;
Maarten_BE 0:068b9b32e9e8 81 #endif
Maarten_BE 0:068b9b32e9e8 82 // configure timer
Maarten_BE 0:068b9b32e9e8 83 timer.start( );
Maarten_BE 0:068b9b32e9e8 84 ticker.attach_us( reset_timer, 10000000 ); // reset timer every 10sec
Maarten_BE 0:068b9b32e9e8 85 __enable_irq( );
Maarten_BE 0:068b9b32e9e8 86 }
Maarten_BE 0:068b9b32e9e8 87
Maarten_BE 0:068b9b32e9e8 88 #if !USE_SMTC_RADIO_DRIVER
Maarten_BE 0:068b9b32e9e8 89
Maarten_BE 0:068b9b32e9e8 90 void hal_pin_rxtx( u1_t val ) {
Maarten_BE 0:068b9b32e9e8 91 rxtx = !val;
Maarten_BE 0:068b9b32e9e8 92 }
Maarten_BE 0:068b9b32e9e8 93
Maarten_BE 0:068b9b32e9e8 94 void hal_pin_nss( u1_t val ) {
Maarten_BE 0:068b9b32e9e8 95 nss = val;
Maarten_BE 0:068b9b32e9e8 96 }
Maarten_BE 0:068b9b32e9e8 97
Maarten_BE 0:068b9b32e9e8 98 void hal_pin_rst( u1_t val ) {
Maarten_BE 0:068b9b32e9e8 99 if( val == 0 || val == 1 )
Maarten_BE 0:068b9b32e9e8 100 { // drive pin
Maarten_BE 0:068b9b32e9e8 101 rst.output( );
Maarten_BE 0:068b9b32e9e8 102 rst = val;
Maarten_BE 0:068b9b32e9e8 103 }
Maarten_BE 0:068b9b32e9e8 104 else
Maarten_BE 0:068b9b32e9e8 105 { // keep pin floating
Maarten_BE 0:068b9b32e9e8 106 rst.input( );
Maarten_BE 0:068b9b32e9e8 107 }
Maarten_BE 0:068b9b32e9e8 108 }
Maarten_BE 0:068b9b32e9e8 109
Maarten_BE 0:068b9b32e9e8 110 u1_t hal_spi( u1_t out ) {
Maarten_BE 0:068b9b32e9e8 111 return spi.write( out );
Maarten_BE 0:068b9b32e9e8 112 }
Maarten_BE 0:068b9b32e9e8 113
Maarten_BE 0:068b9b32e9e8 114 #endif
Maarten_BE 0:068b9b32e9e8 115
Maarten_BE 0:068b9b32e9e8 116 void hal_disableIRQs( void ) {
Maarten_BE 0:068b9b32e9e8 117 __disable_irq( );
Maarten_BE 0:068b9b32e9e8 118 irqlevel++;
Maarten_BE 0:068b9b32e9e8 119 }
Maarten_BE 0:068b9b32e9e8 120
Maarten_BE 0:068b9b32e9e8 121 void hal_enableIRQs( void ) {
Maarten_BE 0:068b9b32e9e8 122 if( --irqlevel == 0 )
Maarten_BE 0:068b9b32e9e8 123 {
Maarten_BE 0:068b9b32e9e8 124 __enable_irq( );
Maarten_BE 0:068b9b32e9e8 125 }
Maarten_BE 0:068b9b32e9e8 126 }
Maarten_BE 0:068b9b32e9e8 127
Maarten_BE 0:068b9b32e9e8 128 void hal_sleep( void ) {
Maarten_BE 0:068b9b32e9e8 129 // NOP
Maarten_BE 0:068b9b32e9e8 130 }
Maarten_BE 0:068b9b32e9e8 131
Maarten_BE 0:068b9b32e9e8 132 u4_t hal_ticks( void ) {
Maarten_BE 0:068b9b32e9e8 133 hal_disableIRQs( );
Maarten_BE 0:068b9b32e9e8 134 int t = ticks + ( timer.read_us( ) >> 6 );
Maarten_BE 0:068b9b32e9e8 135 hal_enableIRQs( );
Maarten_BE 0:068b9b32e9e8 136 return t;
Maarten_BE 0:068b9b32e9e8 137 }
Maarten_BE 0:068b9b32e9e8 138
Maarten_BE 0:068b9b32e9e8 139 static u2_t deltaticks( u4_t time ) {
Maarten_BE 0:068b9b32e9e8 140 u4_t t = hal_ticks( );
Maarten_BE 0:068b9b32e9e8 141 s4_t d = time - t;
Maarten_BE 0:068b9b32e9e8 142 if( d <= 0 ) {
Maarten_BE 0:068b9b32e9e8 143 return 0; // in the past
Maarten_BE 0:068b9b32e9e8 144 }
Maarten_BE 0:068b9b32e9e8 145 if( ( d >> 16 ) != 0 ) {
Maarten_BE 0:068b9b32e9e8 146 return 0xFFFF; // far ahead
Maarten_BE 0:068b9b32e9e8 147 }
Maarten_BE 0:068b9b32e9e8 148 return ( u2_t )d;
Maarten_BE 0:068b9b32e9e8 149 }
Maarten_BE 0:068b9b32e9e8 150
Maarten_BE 0:068b9b32e9e8 151 void hal_waitUntil( u4_t time ) {
Maarten_BE 0:068b9b32e9e8 152 while( deltaticks( time ) != 0 ); // busy wait until timestamp is reached
Maarten_BE 0:068b9b32e9e8 153 }
Maarten_BE 0:068b9b32e9e8 154
Maarten_BE 0:068b9b32e9e8 155 u1_t hal_checkTimer( u4_t time ) {
Maarten_BE 0:068b9b32e9e8 156 return ( deltaticks( time ) < 2 );
Maarten_BE 0:068b9b32e9e8 157 }
Maarten_BE 0:068b9b32e9e8 158
Maarten_BE 0:068b9b32e9e8 159 void hal_failed( void ) {
Maarten_BE 0:068b9b32e9e8 160 while( 1 );
Maarten_BE 0:068b9b32e9e8 161 }