LoRaWAN Node mit DHT22 misst Temperatur

lorawan logoGestern noch Hello Word, heute Temperatur und Luftfeuchtigkeit. Da mittlerweile meine DHT22 eingetroffen sind, kann ich meinen Node endlich etwas Sinnvolles machen lassen. Er wird um einen DHT22 erweitert und somit Temperatur und Luftfeuchtigkeit übermitteln. Es geht also an den Bau des ersten richtigen LoRaWAN Node mit DHT22.

Als Grundlage dient also mein vorheriger Beitrag zu dem Thema. Der unterschied liegt in dem dazu gekommenen DHT22, einem anderen Sketch und einer agbespeckten LMIC Bibliothek. Als Grundlage diente mit dieser Beitrag.

lorawan node

Der Hartware-Aufbau des LoRaWAN Node mit DHT22

Wie ihr seht, hat sich ansonsten nichts verändert, es ist nur der DHT22 hinzugekommen. Der DHT22 verfügt über vier Anschlüsse. Von vorne betrachtet sind diese Links nach Rechts 1. 5V 2. Daten 3. und 4. GND. Der DHT22 wird hier mit 5 Volt angeschaltet und nicht mit dem 3,3 Volt des Dragino Bee.

lorawan node mit dht22

Bezeichnung Arduino Nano Dragino Bee DHT22
VCC 3.3V 1
GND GND 10 4
DIO0 D2 11
DIO1 D3 12
NSS D10 17
MOSI D11 11
MISO D12 4
SCK D13 18
5V 5V 1
DATA D7 2

 

Konfiguration des Arduino

Damit der Sensor angesteuert werden kann, benötigt ihr zwei weitere Bibliotheken. Geht also unter Sketch >> Bibliothek verwalten >> Bibliotheken einbinden und installiert die Adafruit Unified Sensors und die DHT sensor library.

arduino ide bibliothek

 

Leider wäre das Programm zu groß für den Arduino, es gibt aber Abhilfe. Auf GitHub liegt eine angepasste Version der LMIC-Bibliothek, die weniger Platz benötigt. Ihr ladet euch das File herunter, entpackt es und kopiert die Files über die bestehenden der IBM-LMIC-Bibliothek. Damit lässt sich das Programm dann auch kompilieren und hochladen.

Als Sketch habe ich diesen verwendet. Ihr müsst natürlich wieder die Keys anpassen und die Device ID anpassen. Eine Applikation solltet ihr vorher natürlich auch erstellt haben. Wie das geht könnt ihr in diesem Post sehen. Ebenfalls müsst ihr noch das Pin Mapping anpassen.

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

 

Test des Nodes

Erst solltet ihr schauen ob der Serielle Monitor was auswirft und anschließend die Daten in TTN prüfen. Wie man hier sieht, versucht der Node jedenfalls etwas zu senden.


Starting

Sending - temperature: 28.20, humidity: 49.70
Packet queued
389279: EV_TXCOMPLETE (includes waiting for RX windows)

 

Im TTN werden ebenfalls Daten empfangen, zwar nur jedes dritte Paket, aber das ist dem Single Channel Gateway geschuldet.

lorawan node dht22

 

Wir schauen uns mal die Payload an und finden hier weider unsere Temperatur und Luftfeuchtigkeit. Es hat also alles geklappt.

hex to ascii

Als nächstes werde ich mich wohl damit befassen müssen, wie man an die Daten kommt und sie aufbereiten kann.

12 Gedanken zu “LoRaWAN Node mit DHT22 misst Temperatur

    • Hallo Mario,

      ja ich habe mich daran gemacht, möglichst wenig Payload zu verbrauchen. Ich habe mir gedacht ich benötige nur eine ganzzahlige Luftfeuchtigkeit ohne Nachkommastellen und da der Sensor nicht im Freien steht, reicht mir ein Wertebereich von 10 bis 35,4 °C. Damit verbrauche ich nur 2 Byte an Payload also 15 gesamt. Für einen Sensor der im freien Steht, müsste man ein Byte mehr belegen, was aber auch nicht wirklich viel ist.

      Ich habe den Sketch um folgende Variable erweitert:
      uint8_t measurement[2];

      und mein do_send sieht so aus:

      void do_send(osjob_t* j){
      byte buffer[8];
      float t = dht.readTemperature();
      float h = dht.readHumidity();
      t = t – 10;
      int32_t temp = t * 10;
      int32_t humidity = round(h);
      measurement[0] = temp;
      measurement[1] = humidity;

      // 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, (uint8_t*) measurement, sizeof(measurement), 0);
      Serial.println(F(„Packet queued“));
      }
      // Next TX is scheduled after TX_COMPLETE event.
      }

      Die Payload-Funtkion sieht dafür so aus:
      function Decoder(b, port) {

      var temp = (b[0]) / 10+10;
      var humidity = (b[1]);

      return {
      measurement: {
      temp: temp,
      humidity: humidity
      },
      };
      }

  1. Hallo,

    Wie hast du es möglich gemacht, dass das Programm mit ‚dtostrf‘ funktioniert ? , wenn ich die benutze, bekomme ich eine Fehlermeldung.

    ‚dtostrf‘ was not declared in this scope

    Die Version meines IDE Arduino programm ist 1.8.5

    Liebe Grüsse

    Paula

    • Hallo Paula,

      je nachdem was du für einen Controller verwendest, ist dtostrf bereits in seiner Library enthalten. Versuch mal folgendes einzubinden:
      #include

      Grüße,
      Björn

  2. Vielen Dank für deine schnelle Antwort, ich habe #include hinzugefügt und das Problem der Erkennung von „dtostrf“ wurde behoben.

    Jetzt stehe ich vor einem neuen Problem, nachdem ich das behoben habe. Arduino IDE zeigt an: „invalid conversion from ‚byte aka unsigned char ‚ to ’serial config‘ -fpermissive“, daher verstehe ich diese Konvertierung des „Float“ nicht wirklich gut. Momentan habe ich mehrere Probleme, Nachrichten bei TTN zu empfangen, so dass ich dieses Problem nicht gut verstehen kann. Hast du irgendwelche Ideen, was nicht funktioniert, um diese Fehlermeldung zu bekommen?

    Liebe Grüsse

    • Hallo Paula,

      das Problem liegt am Ultra Pro, mit einem Arduino Nano kompiliert der Sketch. Ich habe ihn jetzt mal angepasst, damit solltest du Erfolg haben.
      Im Kopf ist der Payload-Decoder enthalten, diesen musst du unter Applications >> Payload Formats als Decoder einfügen.
      Er beginnt mit function …

      Sketch

      Grüße,
      Björn

  3. Hallo,

    Jetzt denke ich, dass ich ein großes Problem habe. Ich bin nicht in der Lage, Nachrichten mehr als einmal zu sehen, ich habe bemerkt, dass ich das Paket nur für die erste Zeit erhalten habe, wenn ich den Code hochlade, oder nach einem Reset.

    Ich füge „delay“ ein, um zu sehen, wenn meine Nachricht hängen bleibt, aber soweit ich sehe, bekomme ich die Nachricht „Packet queued“ und es werden keine weiteren Fehler mehr empfangen, Ist dir das auch passiert?

    Grüsse

    Paula

    • Probiere mal folgendes Pin-Mapping

      // Pin mapping
      const lmic_pinmap lmic_pins = {
      .nss = 5,
      .rxtx = LMIC_UNUSED_PIN,
      .rst = 3,
      .dio = {2, 6, LMIC_UNUSED_PIN},
      };

  4. Hallo Björn, ich habe versucht Deinen Sketch auf einen Feather 32u4 Lora zu mappen (Pin Mapping angepasst). Leider ohne Erfolg. Kannst Du mir bitte einen Hinweis geben, was ich weiterhin beachten muss? Vielen Dank!

Schreibe einen Kommentar