Gestern 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.
Der Hartware-Aufbau des LoRaWAN Node mit DHT22
!! ACHTUNG. Der von mir verwendete Arduino Nano verwendet an seinen Ausgängen 5V, was aber für den Dragino Bee zu viel ist. Für einen Testaufbau mag es ok sein, aber auf Dauer ist das nicht empfehlenswert. Ein Arduino Pro Mini in der 3,3 Volt Variante ist besser geeignet. Ansonsten muss ein Pegelwandler eingebaut werden !!
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.
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.
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.
[code] // Pin mapping const lmic_pinmap lmic_pins = { .nss = 10, .rxtx = LMIC_UNUSED_PIN, .rst = LMIC_UNUSED_PIN, .dio = {2, 3}, }; [/code]
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.
[code] Starting Sending - temperature: 28.20, humidity: 49.70 Packet queued 389279: EV_TXCOMPLETE (includes waiting for RX windows) [/code]
Im TTN werden ebenfalls Daten empfangen, zwar nur jedes dritte Paket, aber das ist dem Single Channel Gateway geschuldet.
Wir schauen uns mal die Payload an und finden hier weider unsere Temperatur und Luftfeuchtigkeit. Es hat also alles geklappt.
Als nächstes werde ich mich wohl damit befassen müssen, wie man an die Daten kommt und sie aufbereiten kann.
Schöne Arbeit!
Hast du die Payload-Funktionen inzwischen geschrieben?
Grüße Mario
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
},
};
}
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
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
Hi,
immerhin etwas. Ich versuche deinen Fehler nachzustellen, sag mir doch bitte welchen Controller du verwendest?
Hallo,
ich verwende eine Mini Ultra Pro Card V1 mit einem RFM95W darin.
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
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},
};
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!
Hallo Elisa,
wo genau liegt dein Problem?
Grüße,
Björn
Hallo Björn,
ich habe nun auch mal deinen TTN Node mit der Dragino Bee und einem Nano aufgebaut.
Leider hat der Node nicht auf Anhieb funktioniert – Fehlermeldung bezüglich Lmic Pin etc.
Ich habe alle Verdrahtungen überprüft, aber keinen Fehler gefunden.
Erst als ich den Dragino Bee nicht an den 3.3 Volt Pin angeschlossen sondern an VIN angeschlossen habe funktionierte er einwandfrei. Ähnliches Verhalten habe ich auch bereits bei Arduino Mini Pro’s mit RF95W gesehen. Was ist hier das Problem ? Inakzeptable Spannungsdifferenzen oder zu wenig Strom ? Systeme laufen über USB um serial ports benutzen und debugs sehen zu können ? Ich werde in den nächsten Tagen einmal versuchen Messungen bezüglich Spannung und Strom zu machen.
Hallo Achim,
was das Problem ist , kann ich dir leider auch nicht sagen. Ich habe bisher dieses Problem jedenfalls nicht gehabt.
Was ich dir aber sagen kann ist folgendes (leider fehlte der Hinweis in dem Artikel aktuell).
Der Dragino Bee, bzw. der SX1276, ist nur für 3,3V ausgelegt. Der Nano liefert an seinen IOs einen 5 Volt Pegel. Eventuell hat es damit zu tun.
Dauerhaft solltest du den Bee jedenfalls nicht so betreiben.
Grüße,
Björn
Hallo Björn,
der Link zu dem Beispiesktech ist kaputt.