Lorawan Impuls Zähler

Hallo Zusammen,

ich bin neu hier und habe bei mir in der Firma ein Projekt bezüglich Lorawan bekommen. Meine Aufgabe ist es diverse Strom und Wasserzähler über Lorawan an TTN zu schicken. Ein Gateway habe ich schon erfolgreich aufgebaut und eingerichtet. Nun war meine Überlegung per Arduino One und einem RF96 Lora Sender die Impulse von einem Stromzähler zu übertragen. Ist das mit dieser Hardware überhaupt möglich? Oder benötige ich zum Arduino One ein richtiges Lora Shield? Noch dazu weiß ich nicht wie der Code dafür aussehen kann. Habe mir schon die MIIC Lorawan LMIC Libary angeschaut bekomme aber den Arduino in TTN nicht eingebunden obwohl keine Fehlermeldungen kommen. Habe es anhand der Anleitung gemacht.

Vielleicht gibt es ja hier ein paar Lora Profis

LG Mauritos

Mauritos:
.....
Vielleicht gibt es ja hier ein paar Lora Profis

Sicher gibt es hier auch welche.

Nur wie sollen die helfen, wenn du deinen Sketch verschweigst.

Was ist ein "Arduino One" ? Hast Du einen Link darauf?
Grüße Uwe

Hier das Sketch wo ich zum allgemeinen testen genommen habe:

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


#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

// LoRaWAN NwkSKey, network session key
// This should be in big-endian (aka msb).
static const PROGMEM u1_t NWKSKEY[16] = { 0x56, 0x79, 0x27, 0xFD, 0xBC, 0xA3, 0xF6, 0x94, 0xA4, 0x4F, 0xD6, 0x17, 0xE9, 0x4B, 0x73, 0x70 };

// LoRaWAN AppSKey, application session key
// This should also be in big-endian (aka msb).
static const u1_t PROGMEM APPSKEY[16] = { 0xDD, 0xCF, 0x9D, 0x1A, 0xEE, 0xEF, 0x82, 0xB6, 0x9E, 0x38, 0xC4, 0xDE, 0xE4, 0xAB, 0xD5, 0xD8 };

// LoRaWAN end-device address (DevAddr)
// See http://thethingsnetwork.org/wiki/AddressSpace
// The library converts the address to network byte order as needed, so this should be in big-endian (aka msb) too.
static const u4_t DEVADDR = 0x26011573 ; // <-- Change this address for every node!

// These callbacks are only used in over-the-air activation, so they are
// left empty here (we cannot leave them out completely unless
// DISABLE_JOIN is set in arduino-lmic/project_config/lmic_project_config.h,
// otherwise the linker will complain).
void os_getArtEui (u1_t* buf) { }
void os_getDevEui (u1_t* buf) { }
void os_getDevKey (u1_t* buf) { }

static uint8_t mydata[] = "Hello, world!";
static osjob_t sendjob;

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

// Pin mapping
// Adapted for Feather M0 per p.10 of [feather]
const lmic_pinmap lmic_pins = {
    .nss = 10,                       // chip select on feather (rf95module) CS
    .rxtx = LMIC_UNUSED_PIN,
    .rst = 5,                       // reset pin
    .dio = {2, 36, LMIC_UNUSED_PIN}, // assumes external jumpers [feather_lora_jumper]
                                    // DIO1 is on JP1-1: is io1 - we connect to GPO6
                                    // DIO1 is on JP5-3: is D2 - we connect to GPO5
};

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"));
            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.println(F("Received "));
              Serial.println(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 {
        // Prepare upstream data transmission at the next possible time.
        LMIC_setTxData2(1, mydata, sizeof(mydata)-1, 0);
        Serial.println(F("Packet queued"));
    }
    // Next TX is scheduled after TX_COMPLETE event.
}

void setup() {
//    pinMode(13, OUTPUT);
    while (!Serial); // wait for Serial to be initialized
    Serial.begin(115200);
    delay(100);     // per sample code on RF_95 test
    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();

    // Set static session parameters. Instead of dynamically establishing a session
    // by joining the network, precomputed session parameters are be provided.
    #ifdef PROGMEM
    // On AVR, these values are stored in flash and only copied to RAM
    // once. Copy them to a temporary buffer here, LMIC_setSession will
    // copy them into a buffer of its own again.
    uint8_t appskey[sizeof(APPSKEY)];
    uint8_t nwkskey[sizeof(NWKSKEY)];
    memcpy_P(appskey, APPSKEY, sizeof(APPSKEY));
    memcpy_P(nwkskey, NWKSKEY, sizeof(NWKSKEY));
    LMIC_setSession (0x13, DEVADDR, nwkskey, appskey);
    #else
    // If not running an AVR with PROGMEM, just use the arrays directly
    LMIC_setSession (0x13, DEVADDR, NWKSKEY, APPSKEY);
    #endif

    #if defined(CFG_eu868)
    
    LMIC_setupChannel(0, 868100000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(1, 868300000, DR_RANGE_MAP(DR_SF12, DR_SF7B), BAND_CENTI);      // g-band
    LMIC_setupChannel(2, 868500000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(3, 867100000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(4, 867300000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(5, 867500000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(6, 867700000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(7, 867900000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
    LMIC_setupChannel(8, 868800000, DR_RANGE_MAP(DR_FSK,  DR_FSK),  BAND_MILLI);      // g2-band
    // TTN defines an additional channel at 869.525Mhz using SF9 for class B
    // devices' ping slots. LMIC does not have an easy way to define set this
    // frequency and support for class B is spotty and untested, so this
    // frequency is not configured here.
    #elif defined(CFG_us915)
    // NA-US channels 0-71 are configured automatically
    // but only one group of 8 should (a subband) should be active
    // TTN recommends the second sub band, 1 in a zero based count.
    // https://github.com/TheThingsNetwork/gateway-conf/blob/master/US-global_conf.json
    LMIC_selectSubBand(1);
    #endif

    // Disable link check validation
    LMIC_setLinkCheckMode(0);

    // TTN uses SF9 for its RX2 window.
    LMIC.dn2Dr = DR_SF9;

    // Set data rate and transmit power for uplink
    LMIC_setDrTxpow(DR_SF7,14);

    // Start job
    do_send(&sendjob);
}

void loop() {
  /*
    unsigned long now;
    now = millis();
    if ((now & 512) != 0) {
      digitalWrite(13, HIGH);
    }
    else {
      digitalWrite(13, LOW);
    }
*/
    os_runloop_once();

}

Die Fehlermeldungen wo kommen habe ich als Bild angehängt.

Und warum beantwortest du nicht alle Fragen ?

Die Fehlermeldungen kannst du besser in Code-Tags posten, dann sind die besser zu lesen.
Und da steht doch drin, wo du ein Problem hast.

Überarbeite den Sketch, damit du ausreichend Speicher zur Verfügung hast.

Und du solltest beschreiben, was genau funktioniert und was nicht.

HotSystems:
Und warum beantwortest du nicht alle Fragen ?

Die Fehlermeldungen kannst du besser in Code-Tags posten, dann sind die besser zu lesen.
Und da steht doch drin, wo du ein Problem hast.

Überarbeite den Sketch, damit du ausreichend Speicher zur Verfügung hast.

Und du solltest beschreiben, was genau funktioniert und was nicht.

Habe ich eine Frage übersehen?
Die Frage war doch nach dem Sketch? Das habe ich dann gepostet.

Tut mir leid wenn das etwas doof rüber kommt. Bin im Gebiet Lora und Arduino komplett neu.

Funkionieren tut gar nix. Das Sketch wird übertragen, aber bekomme in TTN keine Verbindung

Fehler 1:

C:\Users\Matthias\Documents\Arduino\libraries\arduino-lmic-master\src\hal\getpinmap_thisboard.cpp: In function 'const Arduino_LMIC::HalPinmap_t* Arduino_LMIC::GetPinmap_ThisBoard()':

C:\Users\Matthias\Documents\Arduino\libraries\arduino-lmic-master\src\hal\getpinmap_thisboard.cpp:61:72: note: #pragma message: Board not supported -- use an explicit pinmap

         #pragma message("Board not supported -- use an explicit pinmap")

                                                                        ^

Der Sketch verwendet 22890 Bytes (70%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 1648 Bytes (80%) des dynamischen Speichers, 400 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
Wenig Arbeitsspeicher verfügbar, es können Stabilitätsprobleme auftreten.

Fehler 2 im Seriell Monitor:

Starting
FAILURE 
C:\Users\Matthias\Documents\Arduino\libraries\arduino-lmic-master\src\lmic\radio.c:877

uwefed:
Was ist ein "Arduino One" ? Hast Du einen Link darauf?
Grüße Uwe

Meine natürlich ein Arduino Uno.

Also das Hardware-Setup besteht aus folgenden Komponenten:

Arduino Uno

RFM95

Ahh.. One = Uno, und ich dachte schon, der One ist ein neues spezial-Bord, das noch irgendwelche Wifi oder ähnliches on Board hat.

Nun ja, nicht imme ist es von Vorteil, alles ins englische zu übersetzen, besonders bei Boardnamen - da ist dan oft die italienische Originalbezeichnung etwas verständlicher.

LG Stefan

Mauritos:
Meine natürlich ein Arduino Uno.

Also das Hardware-Setup besteht aus folgenden Komponenten:

Hast du dir denn schon mal die Fehlermeldungen selbst durchgelesen ?

Da steht doch drin, dein Board wird nicht unterstützt.
Dann sieh dir doch mal die Library dazu an, ich kenne die nicht.

Und auch die Verkabelung prüfen, evtl. ist da noch ein Fehler.