Zodat we ook gegevens ontvangen voor onze gateway, zullen we het voorbeeld gebruiken Deel 1 converteren naar LoRa. Om dit te doen moeten we door een D1 Mini gaan ESP32 met LoRa vervangen. Den DHT11 we verbinden met de pin GPIO22 en dat Estafette met de pin GPIO23.
Schets:
Bord voor Arduino IDE = TTGO LoRa32-OLED V1
# opnemen <Arduino.h> # opnemen <DHTesp.h> # opnemen <SPI.h> # opnemen <CayenneLPP.h> # opnemen <LoRa.h> # opnemen "SSD1306.h" // LoRa-instellingen #define SS 18 #define RST 14 #define DI0 26 #define BAND 433175000 // tijdsinterval (seconden) #define TX_INTERVAL 10 // pin voor DHT11 #define DHT_PIN 22 // POin voor relais #define RELAIS 23 // kanaaltoewijzing #define CHANNEL_TEMP 1 #define CHANNEL_HUM 2 #define CHANNEL_RELAIS 3 #define CHANNEL_STATUS 4 // Globale variabelen uint8_t devid[6]; // Device ID = MAC-adres uint8_t relayOn = 0; // Status van het relais TempAndHumidity nieuwe waarden; // DHT11 temperatuur en vochtigheid struct LPP_BLOCK { uint8_t typ; int val; }; // Ontvang buffer voor maximaal 8 kanalen LPP_BLOCK EmpBuf[8]; // Buffer CayenneLPP gegevensformaat. CayenneLPP lpp(64); // Exemplaar voor temperatuursensoren DHTesp dht; // OLED-weergave SSD1306 weer te geven(0x3c, 4, 15); // Functie om de gegevens naar de gateway te verzenden nietig sendLoRa() { int cnt; uint8_t sze; uint8_t ch; // buffer wissen lpp.reset(); // Schrijf gegevenspakketten in de buffer lpp.addTemperature(CHANNEL_TEMP, nieuwe waarden.temperatuur); lpp.addRelativeHumidity(CHANNEL_HUM, nieuwe waarden.luchtvochtigheid); lpp.addDigitalInput(CHANNEL_STATUS,relayOn); lpp.addDigitalOutput(CHANNEL_RELAIS,0); // Dit is nodig zodat de gateway een buffer voor dit kanaal maakt // Maak een LoRa-pakket als (LoRa.beginPakket()){ LoRa.schrijven(devid,6); // eerst de apparaten-vID LoRa.schrijven(lpp.getBuffer(),lpp.getSize()); // vervolgens de gegevens in LPP-indeling als (LoRa.endPacket()) { Serie.println("Lora-overdracht OK"); } anders { Serie.println("Lora verzendfouten"); } } anders { Serie.println("Lora verzendfouten"); } Serie.printf("% 3i bytes verzonden \ n",lpp.getSize()+6); // nu wachten we op het ontvangstbewijs cnt = 0; doen { sze = LoRa.parsePacket(); cnt++; vertraging(100); } terwijl ((sze == 0) && (cnt < 100)); als (cnt >= 100) { Serie.println("Geen reactie van de gateway"); } anders { Serie.printf("Gegevens ontvangen% i bytes \ n",sze); als (sze >= 6){ Serie.printf("Ontvangst ontvangen% i bytes \ n",sze); cnt=0; // we lezen de laatste 6 bytes en vergelijken deze met de apparaat-ID terwijl ((sze > 0) && (cnt<6)) { sze--; devid[cnt++]==LoRa.lezen(); } // if cnt = 6 was de ID correct // We lezen de rest in de ontvangstbuffer terwijl (sze > 0) { // eerste byte = kanaal ch = LoRa.lezen(); sze--; // als het kanaal kleiner is dan 8, slaan we het type en de waarden op als (ch < 8) { EmpBuf[ch].typ = LoRa.lezen(); sze--; schakelaar (EmpBuf[ch].typ) { // Alleen actietypen zijn belangrijk geval LPP_DIGITAL_OUTPUT: EmpBuf[ch].val = LoRa.lezen(); sze--; Serie.printf("Kanaal ontvangen =% 02x type =% 02x waarde =% i \ n",ch,EmpBuf[ch].typ,EmpBuf[ch].val); pauze; geval LPP_ANALOG_OUTPUT: EmpBuf[ch].val = LoRa.lezen() * 256 + LoRa.lezen(); sze-=2; Serie.printf("Kanaal ontvangen =% 02x type =% 02x waarde =% i \ n",ch,EmpBuf[ch].typ,EmpBuf[ch].val); pauze; } } } als (cnt == 6) { Serie.println("Bon OK"); } anders { Serie.println("Ongeldig antwoord"); } } } } nietig instellen() { Serie.beginnen(115200); Serie.println("Beginnen"); pinMode(RELAIS,UITGANG); SPI.beginnen(5,19,27,18); esp_efuse_read_mac(devid); // OLED-reset pinMode(16,UITGANG); digitalWrite(16, LAAG); vertraging(50); digitalWrite(16, HOOG); // en initialiseren weer te geven.in het(); Scherm.setFont(ArialMT_Plain_10); Scherm.Scherm(); LoRa.setPins(SS,RST,DI0); Serie.println("LoRa TRX"); als (!LoRa.beginnen(BAND)) { Serie.println("Het starten van LoRa is mislukt!"); } Serie.println("LoRa Aanvankelijk OK!"); LoRa.enableCrc(); dht.opstelling(DHT_PIN, DHTesp::DHT11); } nietig lus() { uint8_t* buf; uint8_t len; int cnt; uint8_t sze; nieuwe waarden = dht.getTempAndHumidity(); sendLoRa(); digitalWrite(RELAIS,empBuf[3].val); relaisOn = empBuf[3].val; als (dht.getStatus() == 0) { Scherm.Doorzichtig(); Scherm.drawString(0, 0, "Temperatur:"); Scherm.drawString(80, 0, Draad(nieuwe waarden.temperatuur)); Scherm.drawString(110, 0,"° C"); Scherm.drawString(0, 20, "Feuchtigkeit:"); Scherm.drawString(80,20, Draad(nieuwe waarden.vochtigheid)); Scherm.drawString(110,20, "%"); Scherm.drawString(0, 40, "Relais:"); als (relaisOn == 1) Scherm.drawString(80, 40, "ein"); anders Scherm.drawString(80, 40, "aus"); Scherm.Scherm(); vertraging(TX_INTERVAL * 1000); } }
Registrierung am Gateway:
Nachdem der Sketch hochgeladen wurde und das Programma gestart, 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" zien.
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 wuch auch die Kanäle im Cayenne Dashboard zien.
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.
2 Reacties
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
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