Go Down

Topic: Arduino Mega with Dragino LoraShield Sending HC-SR04 Sensor Data to TTN (Read 42 times) previous topic - next topic

Philipp_Schupeck

Hi, i am trying to send sensor data from the HC-SR04 with an Arduino mega and a lora shield to The Things Network. I can send text messages like Hello World but it doesn't work with the sensor data. I am also not too expirienced with programming so would be great if someone could help me.
This is my code:

#include <HCSR04.h>

#include <arduino_lmic_user_configuration.h>
#include <arduino_lmic_hal_configuration.h>
#include <lmic.h>
#include <arduino_lmic.h>
#include <arduino_lmic_hal_boards.h>


#include <lmic.h>
#include <hal/hal.h>
#include <SPI.h>

//init HC SR04
int triggerPin = 2;
int echoPin = 3;
UltraSonicDistanceSensor distanceSensor(triggerPin, echoPin);

#ifdef COMPILE_REGRESSION_TEST
# define FILLMEIN 0
#else
# warning "You must replace the values marked FILLMEIN with real values from the TTN control panel!"
# define FILLMEIN (#dont edit this, edit the lines that use FILLMEIN)
#endif

// This EUI must be in little-endian format, so least-significant-byte
// first. When copying an EUI from ttnctl output, this means to reverse
// the bytes. For TTN issued EUIs the last bytes should be 0xD5, 0xB3,
// 0x70.
static const u1_t PROGMEM APPEUI[8]={xx};
void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI, 8);}

// This should also be in little endian format, see above.
static const u1_t PROGMEM DEVEUI[8]={xx};
void os_getDevEui (u1_t* buf) { memcpy_P(buf, DEVEUI, 8);}

// This key should be in big endian format (or, since it is not really a
// number but a block of memory, endianness does not really apply). In
// practice, a key taken from ttnctl can be copied as-is.
static const u1_t PROGMEM APPKEY[16] = {xx};
void os_getDevKey (u1_t* buf) {  memcpy_P(buf, APPKEY, 16);}
static osjob_t sendjob;

// Schedule TX every this many seconds (might become longer due to duty
// cycle limitations).
const unsigned TX_INTERVAL = 30;

// Pin mapping
const lmic_pinmap lmic_pins = {
   .nss = 10,
   .rxtx = LMIC_UNUSED_PIN,
   .rst = 9,
   .dio = {2, 6, 7 },
};


void onEvent (ev_t ev) {
   Serial.print(os_getTime());
   Serial.print(": ");
   switch(ev) {
       case EV_SCAN_TIMEOUT:
           Serial.println(F("EV_SCAN_TIMEOUT"));
           break;
       case EV_BEACON_FOUND:
           Serial.println(F("EV_BEACON_FOUND"));
           break;
       case EV_BEACON_MISSED:
           Serial.println(F("EV_BEACON_MISSED"));
           break;
       case EV_BEACON_TRACKED:
           Serial.println(F("EV_BEACON_TRACKED"));
           break;
       case EV_JOINING:
           Serial.println(F("EV_JOINING"));
           break;
       case EV_JOINED:
           Serial.println(F("EV_JOINED"));
           {
             u4_t netid = 0;
             devaddr_t devaddr = 0;
             u1_t nwkKey[16];
             u1_t artKey[16];
             LMIC_getSessionKeys(&netid, &devaddr, nwkKey, artKey);
             Serial.print("netid: ");
             Serial.println(netid, DEC);
             Serial.print("devaddr: ");
             Serial.println(devaddr, HEX);
             Serial.print("artKey: ");
             for (int i=0; i<sizeof(artKey); ++i) {
               Serial.print(artKey, HEX);
             }
             Serial.println("");
             Serial.print("nwkKey: ");
             for (int i=0; i<sizeof(nwkKey); ++i) {
               Serial.print(nwkKey, HEX);
             }
             Serial.println("");
           }
           // Disable link check validation (automatically enabled
           // during join, but because slow data rates change max TX
   // size, we don't use it in this example.
           LMIC_setLinkCheckMode(0);
           break;
       /*
       || This event is defined but not used in the code. No
       || point in wasting codespace on it.
       ||
       || case EV_RFU1:
       ||     Serial.println(F("EV_RFU1"));
       ||     break;
       */
       case EV_JOIN_FAILED:
           Serial.println(F("EV_JOIN_FAILED"));
           break;
       case EV_REJOIN_FAILED:
           Serial.println(F("EV_REJOIN_FAILED"));
           break;
       case EV_TXCOMPLETE:
           Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
           if (LMIC.txrxFlags & TXRX_ACK)
             Serial.println(F("Received ack"));
           if (LMIC.dataLen) {
             Serial.print(F("Received "));
             Serial.print(LMIC.dataLen);
             Serial.println(F(" bytes of payload"));
           }
           // Schedule next transmission
           os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send);
           break;
       case EV_LOST_TSYNC:
           Serial.println(F("EV_LOST_TSYNC"));
           break;
       case EV_RESET:
           Serial.println(F("EV_RESET"));
           break;
       case EV_RXCOMPLETE:
           // data received in ping slot
           Serial.println(F("EV_RXCOMPLETE"));
           break;
       case EV_LINK_DEAD:
           Serial.println(F("EV_LINK_DEAD"));
           break;
       case EV_LINK_ALIVE:
           Serial.println(F("EV_LINK_ALIVE"));
           break;
       /*
       || This event is defined but not used in the code. No
       || point in wasting codespace on it.
       ||
       || case EV_SCAN_FOUND:
       ||    Serial.println(F("EV_SCAN_FOUND"));
       ||    break;
       */
       case EV_TXSTART:
           Serial.println(F("EV_TXSTART"));
           break;
       default:
           Serial.print(F("Unknown event: "));
           Serial.println((unsigned) ev);
           break;
   }
}
void do_send(osjob_t* j){
   // Check if there is not a current TX/RX job running
   if (LMIC.opmode & OP_TXRXPEND) {
       Serial.println(F("OP_TXRXPEND, not sending"));
   } else {
     //read distance from HC-SR04
      uint32_t mydistance = distanceSensor.measureDistanceCm() * 100;
     Serial.println("Distance: " + String(mydistance));
   byte payload[2];
   payload[0] = highByte(mydistance);
   payload[1] = lowByte(mydistance);
     
       // Prepare upstream data transmission at the next possible time.
       LMIC_setTxData2(1, (uint8_t*)payload, sizeof(payload), 0);
       Serial.println(F("Packet queued"));
   }
   // Next TX is scheduled after TX_COMPLETE event.
}

void setup() {
 delay(5000);
 while (! Serial);
   Serial.begin(9600);
   Serial.println(F("Starting"));
 
   
/*
   #ifdef VCC_ENABLE
   // For Pinoccio Scout boards
   pinMode(VCC_ENABLE, OUTPUT);
   digitalWrite(VCC_ENABLE, HIGH);
   delay(1000);
   #endif
*/
   // LMIC init
   os_init();
   // Reset the MAC state. Session and pending data transfers will be discarded.
   LMIC_reset();

   // Start job (sending automatically starts OTAA too)
   do_send(&sendjob);
}

void loop() {

   os_runloop_once();
}

Thank you :)

Go Up