Al fine di ottenere i dati per il nostro gateway, useremo l'esempio da Parte 1 conversione in LoRa. Per fare questo, abbiamo bisogno di utilizzare il D1 Mini ESP32 con LoRa Sostituire. Le DHT11 ci colleghiamo al Pin GPIO22 e alla Relais con il perno GPIO23.
Schizzo:
Tavola per Arduino IDE - TTGO LoRa32-OLED V1
#include <Arduino.H> #include <DHTesp.H> #include <Spi.H> #include <CaienneLPP.H> #include <Lora.H> #include "SSD1306.h" Impostazioni LoRa # define Ss 18 # define Rst 14 # define DI0 26 # define Band 433175000 Intervallo di tempo (secondi) # define TX_INTERVAL 10 Pin per DHT11 # define DHT_PIN 22 POin per relè # define Relais 23 Mappatura dei canali # define CHANNEL_TEMP 1 # define CHANNEL_HUM 2 # define CHANNEL_RELAIS 3 # define CHANNEL_STATUS 4 Variabili globali uint8_t Daniel[6]; DEVICE ID - Indirizzo MAC uint8_t relaisOn = 0; Stato del relè TempAndUmidy Newvalues; Temperatura e umidità del DHT11 Struct LPP_BLOCK { uint8_t digitare; Int Val; }; Buffer di ricezione per un massimo di 8 canali LPP_BLOCK empBuf[8]; Buffer CayenneLPP formato dati. CaienneLPP Lpp(64); Istanza per i sensori di temperatura DHTesp Dht; OLED Display SSD1306 Visualizzazione(0x3c (in modo 0x3c), 4, 15); Funzione per inviare i dati al gateway Vuoto sendLoRa() { Int Cnt; uint8_t Sze; uint8_t Ch; Elimina buffer Lpp.Reimpostare(); Scrivere pacchetti di dati nel buffer Lpp.addTemperature(CHANNEL_TEMP, Newvalues.Temperatura); Lpp.addRelativeUmidy(CHANNEL_HUM, Newvalues.Umidità); Lpp.addDigitalInput (addDigitalInput)(CHANNEL_STATUS,relaisOn); Lpp.addDigitalOutput (informazioni in stato di idea(CHANNEL_RELAIS,0); Ciò è necessario per il gateway per creare un buffer per questo canale Crea pacchetto LoRa Se (Lora.beginPacket()){ Lora.Scrivere(Daniel,6); prima i dispositivi vID Lora.Scrivere(Lpp.Getbuffer(),Lpp.getSize()); quindi i dati in formato LPP Se (Lora.endPacket()) { Seriale.println("Lora Trasmissione OK"); } Altro { Seriale.println("Errore di attraversamento lora"); } } Altro { Seriale.println("Errore di attraversamento lora"); } Seriale.Printf("%3i byte inviati",Lpp.getSize()+6); ora stiamo aspettando la ricevuta Cnt = 0; Thu { Sze = Lora.parsePacket(); Cnt++; Ritardo(100); } Mentre ((Sze == 0) && (Cnt < 100)); Se (Cnt >= 100) { Seriale.println("Nessuna risposta dal gateway"); } Altro { Seriale.Printf("Ricevi dati %i Byte"n,Sze); Se (Sze >= 6){ Seriale.Printf("Ricevuta ottiene %i byte",Sze); Cnt=0; abbiamo letto il burst 6 byte e confrontarli con i dispositivi Id Mentre ((Sze > 0) && (Cnt<6)) { Sze--; Daniel[Cnt++]==Lora.Leggere(); } se cnt 6 è l'ID era corretto Leggiamo il resto nel buffer di ricezione Mentre (Sze > 0) { ertses byte - canale Ch = Lora.Leggere(); Sze--; è il canale più piccolo 8 memorizziamo tipo e valori Se (Ch < 8) { empBuf[Ch].digitare = Lora.Leggere(); Sze--; Interruttore (empBuf[Ch].digitare) { Solo i tipi di azione sono importanti Caso LPP_DIGITAL_OUTPUT: empBuf[Ch].Val = Lora.Leggere(); Sze--; Seriale.Printf("Ricezione di canale: %02x Tipo: %02x Valore% %i,Ch,empBuf[Ch].digitare,empBuf[Ch].Val); Pausa; Caso LPP_ANALOG_OUTPUT: empBuf[Ch].Val = Lora.Leggere() * 256 + Lora.Leggere(); Sze-=2; Seriale.Printf("Ricezione di canale: %02x Tipo: %02x Valore% %i,Ch,empBuf[Ch].digitare,empBuf[Ch].Val); Pausa; } } } Se (Cnt == 6) { Seriale.println("Ricevuta OK"); } Altro { Seriale.println("Risposta non valida"); } } } } Vuoto Installazione() { Seriale.Iniziare(115200); Seriale.println("Inizio"); PinMode (Modalità pin)(Relais,Output); Spi.Iniziare(5,19,27,18); esp_efuse_read_mac(Daniel); Ripristino OLED PinMode (Modalità pin)(16,Output); digitalWrite (Scrittura digitale)(16, Basso); Ritardo(50); digitalWrite (Scrittura digitale)(16, alto); e inizializzare Visualizzazione.Init(); Visualizzazione.setFont (carattere di comando)(ArialMT_Plain_10); Visualizzazione.Visualizzazione(); Lora.setPins(Ss,Rst,DI0); Seriale.println("LoRa TRX"); Se (!Lora.Iniziare(Band)) { Seriale.println("Avvio LoRa non riuscita!"); } Seriale.println("LoRA Initial OK!"); Lora.enableCrc (attivato crisc)(); Dht.Installazione(DHT_PIN, DHTesp::DHT11); } Vuoto Ciclo() { uint8_t* Buf; uint8_t Len; Int Cnt; uint8_t Sze; Newvalues = Dht.getTempAndHumidity(); sendLoRa(); digitalWrite (Scrittura digitale)(Relais,empBuf[3].Val); relaisOn = empBuf[3].Val; Se (Dht.Getstatus() == 0) { Visualizzazione.Chiaro(); Visualizzazione.Coulisse(0, 0, "Temperatura": "); Visualizzazione.Coulisse(80, 0, Stringa(Newvalues.Temperatura)); Visualizzazione.Coulisse(110, 0,"C"); Visualizzazione.Coulisse(0, 20, "Umidità: "); Visualizzazione.Coulisse(80,20, Stringa(Newvalues.Umidità)); Visualizzazione.Coulisse(110,20, "%"); Visualizzazione.Coulisse(0, 40, "Relè :"); Se (relaisOn == 1) Visualizzazione.Coulisse(80, 40, "On"); Altro Visualizzazione.Coulisse(80, 40, "off"); Visualizzazione.Visualizzazione(); Ritardo(TX_INTERVAL * 1000); } }
Registrazione presso il gateway:
Dopo che lo schizzo viene caricato e il programma viene avviato, il circuito invia un pacchetto di dati tramite LoRa ogni 10 secondi. Se ora accediamo al sito web del gateway con il browser, dovremmo vedere l'indirizzo MAC del nostro circuito accanto al pulsante "Registra".
Ora possiamo dare un nome al dispositivo e quindi registrarlo. Il dispositivo viene visualizzato nell'elenco dei dispositivi del gateway.
Ora dovremmo anche vedere i canali nel Cru di Cayenne.
Ora possiamo aggiungere e configurare i widget alla dashboard come descritto nella Parte 1. Abbiamo anche bisogno di creare un widget con un pulsante per cambiare il relè.
Divertiti a creare.
2 commenti
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