Arbeiten mit dem Cayenne Dashboard - LoRa Device (Teil 4) - AZ-Delivery

Damit wir auch Daten für unser Gateway erhalten, werden wir das Beispiel aus Teil 1 auf LoRa umbauen. Dazu müssen wir den D1 Mini durch einen ESP32 mit LoRa ersetzen. Den DHT11 verbinden wir mit dem Pin GPIO22 und das Relais mit dem Pin GPIO23.

Sketch:

 Board für Arduino IDE = TTGO LoRa32-OLED V1

#include <arduino.h>
#include <DHTesp.h>
#include <SPI.h>
#include <CayenneLPP.h>
#include <LoRa.h>
#include "SSD1306.h"

//LoRa Einstellungen
#define SS      18
#define RST     14
#define DI0     26
#define BAND    433175000

// Zeitintervall (Sekunden)
#define TX_INTERVAL 10

//Pin für DHT11
#define DHT_PIN 22

//POin für Relais
#define RELAIS  23

//Kanalzuordnung
#define CHANNEL_TEMP 1
#define CHANNEL_HUM 2
#define CHANNEL_RELAIS 3
#define CHANNEL_STATUS 4


//Globale Variablen
uint8_t devid[6]; //ID des Geräts = MAC Adresse
uint8_t relaisOn = 0; //Status des Relais
TempAndHumidity newValues; //Temperatur und Feuchte von DHT11


struct LPP_BLOCK {
  uint8_t typ;
  int val;
};

//Empfangsbuffer für maximal 8 Kanäle
LPP_BLOCK empBuf[8];


// Buffer CayenneLPP Datenformat.
CayenneLPP lpp(64);

//Instanz für Temperaturfühler
DHTesp dht;

//OLED Display
SSD1306  display(0x3c, 4, 15);

// Funktion zum Senden der Datenn an das Gateway
void sendLoRa() {
    int cnt;
    uint8_t sze;
    uint8_t ch;
    //Buffer löschen
    lpp.reset();
    //Datenpakete in den Buffer schreiben
    lpp.addTemperature(CHANNEL_TEMP, newValues.temperature);
    lpp.addRelativeHumidity(CHANNEL_HUM, newValues.humidity);
    lpp.addDigitalInput(CHANNEL_STATUS,relaisOn);
    lpp.addDigitalOutput(CHANNEL_RELAIS,0); //Das ist notwendig damit das Gateway einen Buffer für diesen Kanal anlegt
    //LoRa paket erstellen
    if (LoRa.beginPacket()){
      LoRa.write(devid,6); //zuerst die Geräte vID
      LoRa.write(lpp.getBuffer(),lpp.getSize()); //dann die Daten im LPP Format
      if (LoRa.endPacket()) {
        Serial.println("Lora Übertragung OK");
      } else {
        Serial.println("Lora Übertagung Fehler");
      }
    } else {
      Serial.println("Lora Übertagung Fehler");
    }
    Serial.printf("%3i Bytes gesendet\n",lpp.getSize()+6);
    //nun warten wir auf die Quittung
    cnt = 0;
    do {
      sze = LoRa.parsePacket();
      cnt++;
      delay(100);
    } while ((sze == 0) && (cnt < 100));
    if (cnt >= 100) {
      Serial.println("Keine Antwort vom Gateway");
    }
    else
    {
      Serial.printf("Daten empfangen %i Bytes\n",sze);
      if (sze >= 6){
        Serial.printf("Quittung erhalten %i Bytes\n",sze);
        cnt=0;
        //wir lesen die bersten 6 bytes und vergleichen diese mit der Geräte Id
        while ((sze > 0) && (cnt<6)) {
          sze--;
          devid[cnt++]==LoRa.read();
        }
        //wenn cnt = 6 ist war die ID richtig
        //Wir lesen den Rest in den Empfangsbuffer
        while (sze > 0) {
        //ertses Byte = Kanal 
        ch = LoRa.read();
        sze--;
        //ist der Kanal kleiner 8 speichern wir Typ und Werte
        if (ch < 8) {
          empBuf[ch].typ = LoRa.read();
          sze--;
          switch (empBuf[ch].typ) {
            //Nur Aktionstypen sind von Bedeutung              
            case LPP_DIGITAL_OUTPUT: empBuf[ch].val = LoRa.read();
              sze--;
              Serial.printf("Empfangen Kanal=%02x Typ=%02x Wert=%i \n",ch,empBuf[ch].typ,empBuf[ch].val);
              break;
            case LPP_ANALOG_OUTPUT: empBuf[ch].val = LoRa.read() * 256 + LoRa.read();
              sze-=2;
              Serial.printf("Empfangen Kanal=%02x Typ=%02x Wert=%i \n",ch,empBuf[ch].typ,empBuf[ch].val);
              break;
          }
        }
      }
      if (cnt == 6) {
        Serial.println("Quittung OK");
      } else {
        Serial.println("Ungültige Antwort");
      }
    }
  }
}

void setup() {
    Serial.begin(115200);
    Serial.println("Starting");
    pinMode(RELAIS,OUTPUT);
    SPI.begin(5,19,27,18);
    esp_efuse_read_mac(devid);
    //OLED Reset
    pinMode(16,OUTPUT);
    digitalWrite(16, LOW); 
    delay(50);
    digitalWrite(16, HIGH);
    //und initialisieren
    display.init();
    display.setFont(ArialMT_Plain_10);
    display.display();    
    LoRa.setPins(SS,RST,DI0);
    Serial.println("LoRa TRX");
    if (!LoRa.begin(BAND)) {
      Serial.println("Starting LoRa failed!");
    }
    Serial.println("LoRa Initial OK!");
    LoRa.enableCrc();
    dht.setup(DHT_PIN, DHTesp::DHT11);
}

void loop() {
    uint8_t* buf;
    uint8_t len; 
    int cnt;
    uint8_t sze;
    newValues = dht.getTempAndHumidity();
    sendLoRa();
    digitalWrite(RELAIS,empBuf[3].val);
    relaisOn = empBuf[3].val;
    if (dht.getStatus() == 0) {
      display.clear();
      display.drawString(0, 0, "Temperatur: ");
      display.drawString(80, 0, String(newValues.temperature));
      display.drawString(110, 0,"°C");
      display.drawString(0, 20, "Feuchtigkeit  : ");
      display.drawString(80,20, String(newValues.humidity));
      display.drawString(110,20, "%");
      display.drawString(0, 40, "Relais :");
      if (relaisOn == 1) display.drawString(80, 40, "ein"); else display.drawString(80, 40, "aus");
      display.display();
      delay(TX_INTERVAL * 1000);  
    }
}

Registrierung am Gateway:

Nachdem der Sketch hochgeladen wurde und das Programm gestartet wurde, sendet die Schaltung alle 10 Sekunden ein Datenpaket über LoRa. Wenn wir nun mit dem Browser die Gateway Webseite aufrufen, sollten wir die MAC-Adresse unserer Schaltung neben dem Knopf "Registrieren" sehen.

Wir können nun dem Gerät einen Namen geben und es dann registrieren. Das Gerät wird in der Geräteliste des Gateways angezeigt.

Jetzt sollten wir auch die Kanäle im Cayenne Dashboard sehen.

Nun können wir wie im Teil 1 beschrieben die Widgets zum Dashboard hinzufügen und konfigurieren. Auch ein Widget mit einem Knopf zum Schalten des Relais müssen wir noch erstellen.

Viel Spaß beim Basteln.

 

DisplaysEsp-32Projekte für fortgeschritteneSensoren

2 comments

Andreas Wolter

Andreas Wolter

@Jens: ich empfehle Ihnen zuerst den Blogbeitrag, in dem es nur um den BME280 geht:
https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/turchen-nr-11

Versuchen Sie zuerst, die Sensordaten auszulesen. Wenn das funktioniert, tauschen Sie die entsprechenden Zeilen im Sketch für dieses Projekt hier aus.

Grüße,
Andreas Wolter
AZ-Delivery Blog

Jens

Jens

Hallo. Ich würde gerne versuchen den BME280 zu verwenden. Leider habe ich noch nicht sooo viel Erfahrung. Kann mir hier jemand behilflich sein? Vielen lieben Dank

Leave a comment

All comments are moderated before being published

Recommended blog posts

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery