Afin d’obtenir des données pour notre passerelle, nous utiliserons l’exemple de Partie 1 conversion à LoRa. Pour ce faire, nous devons utiliser la D1 Mini ESP32 avec LoRa Remplacer. Lla DHT11 nous nous connectons à la Pin GPIO22 et à la Relais avec la broche GPIO23.
dessin:
Conseil d’administration pour Arduino IDE - TTGO LoRa32-OLED V1
#include <Arduino.H (en)> #include <DHTesp DHTesp.H (en)> #include <Spi.H (en)> #include <CayenneLPP CayenneLPP.H (en)> #include <Lora.H (en)> #include "SSD1306.h" Paramètres LoRa #define Ss 18 #define Tvd 14 #define DI0 26 #define Bande 433175000 Intervalle de temps (secondes) #define TX_INTERVAL 10 Épingle pour DHT11 #define DHT_PIN 22 POin pour relais #define Relais 23 Cartographie des canaux #define CHANNEL_TEMP 1 #define CHANNEL_HUM 2 #define CHANNEL_RELAIS 3 #define CHANNEL_STATUS 4 Variables globales uint8_t Daniel[6]; DEVICE ID - Adresse MAC uint8_t relaisOn = 0; Statut du relais TempAndHumidity newValues; Température et humidité de DHT11 Struct LPP_BLOCK { uint8_t Type; Int Val; }; Recevoir un tampon pour un maximum de 8 canaux LPP_BLOCK empBuf (empBuf)[8]; Format de données Tampon CayenneLPP. CayenneLPP CayenneLPP Ppr(64); Exemple pour les capteurs de température DHTesp DHTesp Dht; Affichage OLED SSD1306 Affichage(0x3c, 4, 15); Fonction d’envoyer les données à la passerelle Vide sendLoRa() { Int Cnt; uint8_t Sze; uint8_t Ch; Supprimer le tampon Ppr.Réinitialiser(); Rédiger des paquets de données dans le tampon Ppr.addTemperature(CHANNEL_TEMP, newValues.Température); Ppr.addRelativeHumidity(CHANNEL_HUM, newValues.Humidité); Ppr.addDigitalInput(CHANNEL_STATUS,relaisOn); Ppr.addDigitalOutput(CHANNEL_RELAIS,0); Ceci est nécessaire pour que la passerelle crée un tampon pour ce canal Créer le package LoRa Si (Lora.beginPacket()){ Lora.Écrire(Daniel,6); d’abord les appareils vID Lora.Écrire(Ppr.Getbuffer Getbuffer(),Ppr.getSize()); puis les données en format LPP Si (Lora.endPacket()) { Série.println("Lora Transmission OK"); } Autre { Série.println("Lora Crossing Error"); } } Autre { Série.println("Lora Crossing Error"); } Série.Printf("%3i Octets envoyés",Ppr.getSize()+6); maintenant nous attendons le reçu Cnt = 0; Jeu { Sze = Lora.parsePacket (en)(); Cnt++; Retard(100); } Tandis que ((Sze == 0) && (Cnt < 100)); Si (Cnt >= 100) { Série.println("Pas de réponse de la porte"); } Autre { Série.Printf("Recevoir des données %i Bytes"n,Sze); Si (Sze >= 6){ Série.Printf("Receipt get %i bytes",Sze); Cnt=0; nous lisons l’éclatement 6 octets et les comparer avec les appareils Id Tandis que ((Sze > 0) && (Cnt<6)) { Sze--; Daniel[Cnt++]==Lora.Lire(); } si cnt 6 est l’ID était correct Nous lisons le reste dans le tampon de réception Tandis que (Sze > 0) { ertses byte - canal Ch = Lora.Lire(); Sze--; est le canal plus petit 8 nous stockons le type et les valeurs Si (Ch < 8) { empBuf (empBuf)[Ch].Type = Lora.Lire(); Sze--; Interrupteur (empBuf (empBuf)[Ch].Type) { Seuls les types d’action sont importants Cas LPP_DIGITAL_OUTPUT: empBuf (empBuf)[Ch].Val = Lora.Lire(); Sze--; Série.Printf("Recevoir Channel -%%02x Type'%%02x Valeur%%i,Ch,empBuf (empBuf)[Ch].Type,empBuf (empBuf)[Ch].Val); Pause; Cas LPP_ANALOG_OUTPUT: empBuf (empBuf)[Ch].Val = Lora.Lire() * 256 + Lora.Lire(); Sze-=2; Série.Printf("Recevoir Channel -%%02x Type'%%02x Valeur%%i,Ch,empBuf (empBuf)[Ch].Type,empBuf (empBuf)[Ch].Val); Pause; } } } Si (Cnt == 6) { Série.println("Receipt OK"); } Autre { Série.println("Réponse invalide"); } } } } Vide Configuration() { Série.Commencer(115200); Série.println("Démarrage"); pinMode(Relais,Sortie); Spi.Commencer(5,19,27,18); esp_efuse_read_mac(Daniel); Ininisalisation OLED pinMode(16,Sortie); digitalWrite (en)(16, Faible); Retard(50); digitalWrite (en)(16, Haute); et initialiser Affichage.Init(); Affichage.setFont(ArialMT_Plain_10); Affichage.Affichage(); Lora.setPins setPins setPins setPin(Ss,Tvd,DI0); Série.println("LoRa TRX"); Si (!Lora.Commencer(Bande)) { Série.println("Démarrer LoRa a échoué!"); } Série.println("LoRa initial OK!"); Lora.enableCrc(); Dht.Configuration(DHT_PIN, DHTesp DHTesp::DHT11); } Vide Boucle() { uint8_t* Buf Buf; uint8_t Len; Int Cnt; uint8_t Sze; newValues = Dht.getTempAndHumidity (en)(); sendLoRa(); digitalWrite (en)(Relais,empBuf (empBuf)[3].Val); relaisOn = empBuf (empBuf)[3].Val; Si (Dht.Getstatus Getstatus() == 0) { Affichage.Clair(); Affichage.Cordon(0, 0, "Température: "); Affichage.Cordon(80, 0, String(newValues.Température)); Affichage.Cordon(110, 0,"C"); Affichage.Cordon(0, 20, "Humidité: "); Affichage.Cordon(80,20, String(newValues.Humidité)); Affichage.Cordon(110,20, "%"); Affichage.Cordon(0, 40, "Relais :"); Si (relaisOn == 1) Affichage.Cordon(80, 40, "sur"); Autre Affichage.Cordon(80, 40, "off"); Affichage.Affichage(); Retard(TX_INTERVAL * 1000); } }
Inscription à la porte d’entrée :
Une fois l’esquisse téléchargée et le début du programme, le circuit envoie un paquet de données via LoRa toutes les 10 secondes. Si nous accédons maintenant au site Web de la passerelle avec le navigateur, nous devrions voir l’adresse MAC de notre circuit à côté du bouton « Enregistrer ».
Nous pouvons maintenant donner un nom à l’appareil, puis l’enregistrer. L’appareil apparaît dans la liste des périphériques de la passerelle.
Maintenant, nous devrions également voir les canaux dans le tableau de bord de Cayenne.
Maintenant, nous pouvons ajouter et configurer les widgets au tableau de bord tel que décrit dans la partie 1. Nous avons également besoin de créer un widget avec un bouton pour changer le relais.
Amusez-vous à l’artisanat.
2 commentaires
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