DesignSpark Electrical Logolinkedin
Menu Suche
Ask a Question

Prototyping eines LoRa-Wireless-Überwachungssystems mit XinaBox Teil 3: E/A hinzufügen und testen

Schnelles Prototyping eines Langstreckenfunk-Sensorsystems mit der modularen Elektronikplattform.

In Teil 1 haben wir unser Anwendungsbeispiel umrissen, einen Blick auf die LoRa-Wireless-Modulation geworfen, begründet, warum wir sie verwenden, und uns danach mit einigen der verfügbaren XinaBox-Hardwareoptionen befasst. In Teil 2 haben wir dann ein CR02-Modul bzw. „☒CHIP“ (mit integriertem Mikrocontroller und Funk) programmiert und anschließend Daten über eine drahtlose LoRa-Verbindung gesendet und empfangen.

In diesem dritten und letzten Beitrag fügen wir auf der Übertragungsseite der drahtlosen Verbindung einen Temperatursensor für die Eingabe hinzu, dessen „Fotorelais“ auf der Empfängerseite als Ausgabe eine visuelle Anzeige oder einen Alarmton ansteuert.

Verwendete Hardware

Wir verwenden wieder dieselben CR02-Module für den Mikrocontroller plus LoRa sowie IP01-USB-UART-Module zum Programmieren und Testen.

Als Sensormodul verwenden wir die XinaBox SW02 (174-3745) . Darin ist ein Bosch BME680 integriert, also ein kombinierter Sensor für Temperatur, Feuchtigkeit, Luftdruck und flüchtige organische Verbindungen (Volatile Organic Compounds, VOCs). In diesem Beispiel werden wir ihn jedoch nur zur Temperaturmessung verwenden, da sich hierdurch bei den Tests mit Abstand am leichtesten Veränderungen auslösen lassen.

Für die Ausgabe verwenden wir eine XinaBox OC03 (174-3715) . Diese ermöglicht die optisch isolierte Steuerung eines Relais und kann bei 2 A Lasten von bis zu 40 V schalten. Sie könnte daher zur direkten Schaltung standardmäßig in der Industrie verwendeter Anzeigeleuchten, Summer usw. verwendet werden, die im Allgemeinen mit 24 V betrieben werden. Alternativ kann sie zur Steuerung eines 12- oder 24-V-Relais dienen, das wiederum die Stromversorgung schaltet.

Zusammen mit zwei Modulen des Typs CR02 (174-3699) dienen uns diese Komponenten zur Überwachung der Umgebungstemperatur und können einen Alarm auslösen, wenn die Temperatur an einem anderswo gelegenen Ort außerhalb eines bestimmten Sollbereichs liegt.

Arduino-Bibliotheken

Im vorherigen Beitrag haben wir die RadioHead-Bibliothek installiert, sodass die Arduino-IDE die LoRa-Funkfunktion des CR02-Moduls unterstützt. Um die Module SW02 und OC03 zu verwenden, müssen wir außerdem Folgendes installieren:

Die Installation nimmt am wenigsten Zeit in Anspruch, wenn Sie jeweils eine ZIP-Datei herunterladen und dann in der Arduino-IDE Sketch → Include Library → Add .ZIP Library... (Sketch → Bibliothek einbinden → ZIP-Bibliothek hinzufügen...) auswählen. Nach dem Neustart der IDE sollten über File → Examples → Examples from Custom Libraries (Datei → Beispiele → Beispiele aus benutzerdefinierten Bibliotheken) neue Beispiel-Sketches verfügbar sein.

Hardwaretest

Zunächst müssen wir sicherstellen, dass im Menü „Tools“ („Werkzeuge“) folgende Optionen ausgewählt sind:

  • Platine: Arduino Pro oder Pro Mini
  • Prozessor: ATmega328P (5 V, 16 MHz)
  • Port: /dev/ttyUSB0 (oder ein anderer Port, den das IP01 auflistet)

Wenn wir dann das Beispiel SW02_Temperature_Measurement laden, kompilieren/überprüfen, hochladen und anschließend den seriellen Monitor öffnen, sollten die Temperaturmesswerte angezeigt werden.

Zum Testen unseres Ausgangsmoduls können wir das Beispiel OC03_ToggleOutput laden, kompilieren, hochladen und dann wieder den seriellen Monitor öffnen. Dieses Mal erhalten wir einfach eine Anzeige der Meldung OC03 Test. Wenn wir den Widerstand an den Ausgangsklemmen messen, sollte zu sehen sein, dass sich das Fotorelais 2 s lang schließt, 2 s lang öffnet und immer so weiter.

Jetzt haben wir unsere Entwicklungsumgebung eingerichtet und sichergestellt, dass die Hardware funktioniert. Als Nächstes integrieren wir nun E/A mit der LoRa-Empfangs-/Sendefunktion.

Sensor plus Übertragung

#include <xCore.h>
#include <xSW02.h>
#include <RH_RF95.h>

#define LED_BUILTIN 16
#define CR02_FREQUENCY 868.0

const int DELAY_TIME = 2000;
const float MAX_TEMP = 30.00;

xSW02 SW02;
RH_RF95 CR02;

void setup(){
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
  
  // SW02 sensor setup
  Wire.begin();
  SW02.begin();

  // CR02 radio setup
  if (!CR02.init()){
    Serial.println("CRO2 init failed");
  }
  CR02.setFrequency(CR02_FREQUENCY);
  CR02.setTxPower(23, false);
  
  // Delay for sensor to normalise
  delay(5000);
}

void loop(){
  float temp;
  byte txdata[1];
  
  // Read SW02 sensor
  SW02.poll();
  temp = SW02.getTempC();
  
  // Print temperature to the Serial Monitor   
  Serial.print(temp);
  Serial.println(" C");

  // Set status (0x00 if temp OK and 0x01 if high)
  if (temp <= MAX_TEMP) {
    digitalWrite(LED_BUILTIN, LOW);
    txdata[0] = { 0x00 };
  }
  else {
    digitalWrite(LED_BUILTIN, HIGH);
    txdata[0] = { 0x01 };
  }

  // Transmit status
  CR02.send(txdata, sizeof(txdata));

  // Delay between sensor reads
  delay(DELAY_TIME);
}

Im oben gezeigten Sketch haben wir:

  1. Die benötigten Bibliotheken eingebunden und einige Parameter konfiguriert
  2. Die CR02-LED, den Sensor und das LoRa-Funkmodul eingerichtet
  3. Die Temperatur ermittelt und anschließend auf dem seriellen Port ausgegeben
  4. Die Statusvariable auf 0 gesetzt, wenn die Temperatur im Sollbereich liegt, bzw. auf 1, wenn der Sollwert überschritten wurde
  5. Den Status über unsere LoRa-Verbindung übermittelt
  6. Die konfigurierte Verzögerungszeit abgewartet und dann ab Schritt 3 wiederholt

Wir hätten auch die tatsächlich abgelesene Temperaturanzeige übermitteln können, was von Nutzen wäre, wenn wir den Sollwert empfängerseitig konfigurieren würden. Die Auswertung der Temperatur auf der Übertragungsseite bietet jedoch ebenfalls einige Vorteile. Wenn wir wollten, könnten wir beispielsweise den Sensor nur bei Überschreitung des Temperaturgrenzwerts senden lassen oder den Alarm anzeigen lassen, wenn dies der Fall ist, und ansonsten mit einer geringeren Frequenz eine regelmäßige Statusmeldung übertragen.

Beachten Sie auch, dass wir nur ein einzelnes Byte übertragen, wobei 0x00 bedeutet, dass alles in Ordnung ist, und 0x01, dass die Temperatur zu hoch ist. Darüber hinaus sind viele weitere Statustypen denkbar, z. B. 0x03 für den Fall, dass der Sensor nicht gelesen werden kann, und möglicherweise 0x04 für einen niedrigen Batterieladestand.

Im Allgemeinen empfiehlt es sich, die Übertragungszeit möglichst gering zu halten (und daher so wenig Daten wie möglich zu übertragen), um Energieverbrauch und Frequenzauslastung zu sparen. Aus diesem Grund übertragen wir über die Funkverbindung nur ein einziges Statusbyte, anstatt unnötigerweise ausführlichen und verschwenderischen ASCII-Text wie „Alarm“ oder „Temperatur ist 27 °C“ usw. zu übermitteln.

Empfang plus Ausgabe

#include <RH_RF95.h>
#include <xOC03.h>
#include <xCore.h> 

#define LED_BUILTIN 16
#define CR02_FREQUENCY 868.0

RH_RF95 CR02;
xOC03 OC03;

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);

  // CR02 radio setup
  if (!CR02.init()) {
    Serial.println("init failed");
  }
  CR02.setFrequency(CR02_FREQUENCY);
  CR02.setTxPower(23, false);

  // OC03 setup
  Wire.begin();
  OC03.begin();
}

void loop() {
  byte buf[1];
  byte len = 1;
 
  if (CR02.available())
  {
    if (CR02.recv(buf, &len))
    {
      Serial.print("Status: ");
      
      if (buf[0] == 0x00) {
        Serial.print("OK");
        OC03.write(LOW);
        digitalWrite(LED_BUILTIN, LOW);
      }
      else if (buf[0] == 0x01) {
        Serial.print("ALARM");
        OC03.write(HIGH);
        digitalWrite(LED_BUILTIN, HIGH);
      }
      else {
        Serial.print("ERROR - unknown status");
      }
      Serial.print("   //   RSSI: ");
      Serial.println(CR02.lastRssi(), DEC);      
    }
    else
    {
      Serial.println("Receive failed!");
    }
  }
}

Auf dem empfangenden Knoten:

  1. Binden wir die benötigten Bibliotheken ein und konfigurieren einige Parameter
  2. Richten wir die integrierte LED und das LoRa-Funkmodul des CR02 sowie das OC03-Modul ein
  3. Suchen wir nach eingehenden Daten
  4. Analysieren wir den Status
  5. Erstellen wir einen Ausgabe auf dem Anschluss und nehmen Einstellungen für das Fotorelais sowie die integrierte LED vor und
  6. Gehen dann zurück zu Schritt 3

Wir geben auch die Empfangssignal-Stärkenanzeige (Received Signal Strength Indication, RSSI) auf dem seriellen Monitor aus, da diese Information sehr nützlich ist und einen Hinweis auf die Qualität der Funkverbindung liefert. Wenn bei der Inbetriebnahme das Signal zu schwach ist, können wir auf der Übertragungsseite den LoRa-Verteilungsfaktor (Spreading Factor, SF) erhöhen, wodurch wir eine größere Reichweite erhalten, sich allerdings auch die Übertragungszeit erhöht. Wenn wir den RSSI-Verlauf überwachen und hierbei eine Verminderung feststellen, kann dies bedeuten, dass der Ladestand der Batterien niedrig ist, ein Hindernis in den Übertragungsweg der Funkverbindung geraten ist oder ein Hardwareproblem (z. B. eine defekte Antenne) vorliegt.

Zusammenfassung

Dieses sehr einfache Beispiel zeigt, wie sich in kurzer Zeit Prototypen einer drahtlosen Überwachungslösung mit großer Reichweite erstellen lassen, die ohne bereits vorhandene Netzwerke oder zusätzliche Basisstationen bzw. Gateways Daten übertragen. In diesem Fall wurde ein BME680-Sensor zur Temperaturmessung integriert, der darüber hinaus viele andere Messungen vornehmen kann. Außerdem stehen für Ein- und Ausgang viele weitere xCHIP-Module zur Auswahl, die alle von der schnellen und einfachen physischen Verbindung über xBUS-Steckverbinder profitieren.

Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.

27 Mar 2019, 14:11

Kommentare