Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projekte:grossprojekte:lorawan:12_temp-feuchte

Dies ist eine alte Version des Dokuments!


12 Temperatur - Luftfeuchte



Eine Node nie ohne Antenne in Betrieb nehmen! Durch die reflektierte Sendenenergie nimmt der LoRa-Chip Schaden.



Allgemein

Aufbau einer LoRa-Node zur Überwachung von Temperatur und Feuchte in einem abgelegenen Gebäude.

Verwendung findet dabei der „Digitale Temperatur- und Feuchte-Sensor“ DHT22.

Da im Gebäude Strom verfügbar ist und die Überwachung nur temporär sein soll, wurden einige Vereinfachungen vorgenommen. Der Node wird über ein USB-Steckernetzteil versorgt. Der Aufbau ist in einem Halbschalengehäuse untergebracht. Der interne Aufbau ist „fliegend“. Weiterhin werden die Messwerte auf ganze Zahlen gerundet. D.h. sowohl die Temperatur als auch die Angaben zur relativen Luftfeuchte werden nur in 1 °C - bzw. 1% RelH- Schritten übertragen. Dafür benötigt die Übertragung nur insgesamt zwei Byte Daten. Dieses kommt der Datansparsamkeit zugute. Weiterhin werden nur alle 30 Minuten Daten übertragen.

Material

Benötigtes Material:

  • Halbschalenghäuse (oder ähnlich)
  • Arduino Uno (oder ähnlich)
  • Graduino Shield mit LoRa Chip (oder ähnliche Konstruktionen)
  • Antenne für den Bereich 868 MHz
  • DHT22 Sensor
  • Kabelsatz zum Anschluß DHT22
  • USB Kabel Typ B-Stecker (Arduino) - auf Typ A-Stecker (Steckernetzteil)
  • USB-Steckerladegrät



Kabelsatz

Der DHT22 besitzt vier Anschlüsse - VCC - Daten - NULL - GND (Datenblatt
Die Anschlüsse NULL und GND sind zusammenzulegen und auf GND zu führen. Zur Verkabelung kommen die aus den Arduino Workshops bekannten Steckerkabel zur Anwendung.
Am DHT22 besitzen die Kabel eine Buchse, am anderen Ende einen kleinen Steckstift. Dieser wird einfach in die entsprechende Buchsenleiste am LoRa Shield (VCC, GND und Digital Pin 4 ) gesteckt. Der DHT22 passt in die Buchsen der Steckerkabel.
Man verbindet zwei dieser Steckerkabel zu einem „Y“, d.h. zwei Buchsen auf der Seite des DHT22 und ein Stecker auf Seite des LoRa-Shields. (Durchschneiden, Abisolieren, Zusammenlöten, Schrumpfschlauch drüber)
Die vier Buchsen klebt man, nachdem sie am DHT22 gesteckt und damit ausgerichtet sind, mit einem kleinen Streifen Gewebeband zu einer vierpoligen „Buchsenleiste“ zusammen.
Kabelsatz


Antennendurchführung

Die Stirnwand des Schalenghäuses ist in einer Führung einsetzbar und soll mit einem kleinen Durchführungsloch für die Schraubantenne gleichzeitg als „Halterung“ für den Arduino gelten.
An geigneter Stelle ein Loch bohren, Schraubanschluß hinhdurchstecken, Antenne aufschrauben - fertig.
 Antennendurchführung


Stromkabel und Sensorkabel

An der gegenüberliegenden Stirnwand des Halbschalengehäuses an passender Stelle einen Schlitz zur Durchführung des USB-Kabel einarbeiten und am oberen Rand einen schmalen Bereich ausschneiden, um das Kabel für den Sensor durchführen zu können. Ist der Bereich schmal genug, klemmt der Deckel das Kabel etwas ein und sichert es dadurch auch etwas.
Stromkabel - Sensorkabel


Übersicht

 Zusammengebaut, Deckel offen














Fertig


Zuletzt noch den Halbschalendeckel aufsetzen. Fertig ist die Node.

 Gesamtgerät




Sketch

Was wäre eine Node ohne Programm (Sketch)? (siehe auch)
Zur Verwendung kommt der LoRa-Universalsketch (diesmal mit Serial.print-Anweisungen, um den Ablauf im seriellen Monitor verfolgen zu können) mit Erweiterungen zum Auslesen des Sensors DHT22.
Nartürlich muss der Sensor vorher wieder im TTN-Netzwerk in seiner zugehörigen Applikation angemeldet werden. Dadurch erhält man alle nötigen Adress- und Passwortangaben, die im Sketch eingetragen werden müssen.
(Ich habe diese Daten im nachfolgenden Listing natürlich wieder unkenntlich gemacht)

  1. /*******************************************************************************
  2.   Copyright (c) 2015 Thomas Telkamp and Matthijs Kooijman
  3.   Copyright (c) 2018 Terry Moore, MCCI
  4.  
  5.   Permission is hereby granted, free of charge, to anyone
  6.   obtaining a copy of this document and accompanying files,
  7.   to do whatever they want with them without any restriction,
  8.   including, but not limited to, copying, modification and redistribution.
  9.   NO WARRANTY OF ANY KIND IS PROVIDED.
  10.  
  11.   This example sends a valid LoRaWAN packet with payload "Hello,
  12.   world!", using frequency and encryption settings matching those of
  13.   the The Things Network.
  14.  
  15.   This uses OTAA (Over-the-air activation), where where a DevEUI and
  16.   application key is configured, which are used in an over-the-air
  17.   activation procedure where a DevAddr and session keys are
  18.   assigned/generated for use with all further communication.
  19.  
  20.   Note: LoRaWAN per sub-band duty-cycle limitation is enforced (1% in
  21.   g1, 0.1% in g2), but not the TTN fair usage policy (which is probably
  22.   violated by this sketch when left running for longer)!
  23.  
  24.   To use this sketch, first register your application and device with
  25.   the things network, to set or generate an AppEUI, DevEUI and AppKey.
  26.   Multiple devices can use the same AppEUI, but each device has its own
  27.   DevEUI and AppKey.
  28.  
  29.   Do not forget to define the radio type correctly in
  30.   arduino-lmic/project_config/lmic_project_config.h or from your BOARDS.txt.
  31.  
  32.  *******************************************************************************/
  33.  
  34. #include <lmic.h>
  35. #include <hal/hal.h>
  36. #include <SPI.h>
  37. //eigene Bibliotheken
  38. #include <SimpleDHT.h>
  39. //
  40. // eigene Defintitionen
  41.  
  42. //
  43. //DHT22
  44. int pinDHT22 = 4;
  45. SimpleDHT22 dht22(pinDHT22);
  46. byte temperature = 0;
  47. byte humidity = 0;
  48.  
  49. // Ende eigene Definitionen
  50. //
  51. // Application EUI Reihenfolge LSB MSB
  52. static const u1_t PROGMEM APPEUI[8] = { 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x?? };
  53. void os_getArtEui (u1_t* buf) {
  54. memcpy_P(buf, APPEUI, 8);
  55. }
  56.  
  57. //Device EUI Reihenfolge LSB MSB
  58. static const u1_t PROGMEM DEVEUI[8] = { 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x?? };
  59. void os_getDevEui (u1_t* buf) {
  60. memcpy_P(buf, DEVEUI, 8);
  61. }
  62.  
  63. // Application Key Achtung: Reihenfolge MSB LSB
  64. static const u1_t PROGMEM APPKEY[16] = { 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x?? };
  65. void os_getDevKey (u1_t* buf) {
  66. memcpy_P(buf, APPKEY, 16);
  67. }
  68.  
  69. static uint8_t payload[] = "Hi";
  70. // 2 Bytes werden gesendet
  71. //
  72. static osjob_t sendjob;
  73.  
  74. // Schedule TX every this many seconds (might become longer due to duty
  75. // cycle limitations).
  76. const unsigned TX_INTERVAL = 1800; // 30 Minunten
  77.  
  78. //
  79. // Pin Mapping für Graduino LoRa Shield for Arduino
  80. const lmic_pinmap lmic_pins = {
  81. .nss = 10,
  82. .rxtx = LMIC_UNUSED_PIN,
  83. .rst = 9,
  84. .dio = {2, 6, 7},
  85. };
  86.  
  87. void onEvent (ev_t ev) {
  88. switch (ev) {
  89. case EV_JOINED:
  90. {
  91. u4_t netid = 0;
  92. devaddr_t devaddr = 0;
  93. u1_t nwkKey[16];
  94. u1_t artKey[16];
  95. LMIC_getSessionKeys(&netid, &devaddr, nwkKey, artKey);
  96. }
  97. // Disable link check validation (automatically enabled
  98. // during join, but because slow data rates change max TX
  99. // size, we don't use it in this example.
  100. LMIC_setLinkCheckMode(0);
  101. break;
  102. case EV_TXCOMPLETE:
  103. // Schedule next transmission
  104. os_setTimedCallback(&sendjob, os_getTime() + sec2osticks(TX_INTERVAL), do_send);
  105. break;
  106. default:
  107. break;
  108. }
  109. }
  110.  
  111. void do_send(osjob_t* j) {
  112. // Check if there is not a current TX/RX job running
  113. if (LMIC.opmode & OP_TXRXPEND)
  114. {
  115. }
  116. else
  117. {
  118. // Eigene Sensoren
  119.  
  120. byte temperature = 0;
  121. byte humidity = 0;
  122. int err = SimpleDHTErrSuccess;
  123. if ((err = dht22.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess)
  124. {
  125. Serial.print("Read DHT22 failed, err="); Serial.println(err); delay(2000);
  126. return;
  127. }
  128. Serial.print("Sample OK: ");
  129. Serial.print((byte)temperature); Serial.print(" *C, ");
  130. Serial.print((byte)humidity); Serial.println(" RH%");
  131. //DHT22 sampling rate is 0.5HZ.
  132. delay(2500);
  133. // die integerwerte werden jeweils als 1 Byte übertragen, sie kommen im Hex-Format bei TTN an
  134. // d.h. Anzeige TTN 1. Byte 14 (Hex) ist 20 Grad Celsius
  135. // 2. Byte 38 (Hex) ist 56 % Rel H
  136. payload[0] = temperature;
  137. payload[1] = humidity;
  138. // Ende eigene Sensoren
  139. // Prepare upstream data transmission at the next possible time.
  140. LMIC_setTxData2(1, payload, sizeof(payload) - 1, 0);
  141. }
  142. // Next TX is scheduled after TX_COMPLETE event.
  143. }
  144.  
  145. void setup() {
  146. // Eigenes Setup
  147. Serial.begin(115200);
  148. Serial.println("DHT22 - Test!");
  149.  
  150. //
  151. #ifdef VCC_ENABLE
  152. // For Pinoccio Scout boards
  153. pinMode(VCC_ENABLE, OUTPUT);
  154. digitalWrite(VCC_ENABLE, HIGH);
  155. delay(1000);
  156. #endif
  157.  
  158. // LMIC init
  159. os_init();
  160. // Reset the MAC state. Session and pending data transfers will be discarded.
  161. LMIC_reset();
  162. LMIC_setClockError(MAX_CLOCK_ERROR * 2 / 100);
  163. LMIC_setupChannel(0, 868100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
  164. LMIC_setupChannel(1, 868300000, DR_RANGE_MAP(DR_SF12, DR_SF7B), BAND_CENTI); // g-band
  165. LMIC_setupChannel(2, 868500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
  166. LMIC_setupChannel(3, 867100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
  167. LMIC_setupChannel(4, 867300000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
  168. LMIC_setupChannel(5, 867500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
  169. LMIC_setupChannel(6, 867700000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
  170. LMIC_setupChannel(7, 867900000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
  171. LMIC_setupChannel(8, 868800000, DR_RANGE_MAP(DR_FSK, DR_FSK), BAND_MILLI); // g2-band
  172.  
  173. LMIC_setLinkCheckMode(0);
  174. LMIC.dn2Dr = SF9;
  175. LMIC_setDrTxpow(DR_SF7, 14);
  176. // Start job (sending automatically starts OTAA too)
  177. do_send(&sendjob);
  178. }
  179.  
  180. void loop() {
  181.  
  182.  
  183. os_runloop_once();
  184. }


Was kommt hinzu: (Zeilenangaben in Klammern)

  • (38) Bibliothek für den DHT22 (ist eine Einfachbibliothek, kann nur ganze Werte auslesen)
  • (44-47) Datenpin, Initialisierung, Variablendefinition
  • (69) Vorbelegung payload Variablen auf zwei Byte (wird später mit den Daten überschrieben)
  • (76) Sendeintervall in Sekunden
  • (120-137) Auslesen des Sensors mit Fehlerbehandlung, Übergabe der Daten in die Payload und Ausgabe für den seriellen Monitor
  • (147-148) Ausgabe auf den seriellen Monitor - damit man weiß, dass es los geht



Stand: 11.03.2020

projekte/grossprojekte/lorawan/12_temp-feuchte.1583967986.txt.gz · Zuletzt geändert: 2020/03/11 23:06 von fablab_wiki