Para obtener datos para nuestra puerta de enlace, utilizaremos el ejemplo de Parte 1 conversión a LoRa. Para ello, necesitamos usar el D1 Mini ESP32 con LoRa Reemplazar. el DHT11 nos conectamos al Pin GPIO22 y a la Relais con el pin GPIO23.
Bosquejo:
Placa para Arduino IDE - TTGO LoRa32-OLED V1
#include <Arduino.H> #include <DHTesp.H> #include <Spi.H> #include <CayenneLPP.H> #include <Lora.H> #include "SSD1306.h" Ajustes de LoRa #define Ss 18 #define Rst 14 #define DI0 26 #define Banda 433175000 Intervalo de tiempo (segundos) #define TX_INTERVAL 10 Pin para DHT11 #define DHT_PIN 22 POin para relés #define Relais 23 Mapeo de canales #define CHANNEL_TEMP 1 #define CHANNEL_HUM 2 #define CHANNEL_RELAIS 3 #define CHANNEL_STATUS 4 Variables globales uint8_t Daniel[6]; ID DEL DISPOSITIVO - Dirección MAC uint8_t relaisOn = 0; Estado del relé TempAndHumidity newValues; Temperatura y humedad de DHT11 Estructura LPP_BLOCK { uint8_t Tipo; Int Val; }; Búfer de recepción para un máximo de 8 canales LPP_BLOCK empBuf[8]; Formato de datos CayenneLPP de búfer. CayenneLPP Lpp(64); Instancia de sensores de temperatura DHTesp Dht; Pantalla OLED SSD1306 Monitor(0x3c, 4, 15); Función para enviar los datos a la puerta de enlace Vacío sendLoRa() { Int Cnt; uint8_t Sze; uint8_t Ch; Eliminar búfer Lpp.Restablecer(); Escribir paquetes de datos en el búfer Lpp.addTemperature(CHANNEL_TEMP, newValues.Temperatura); Lpp.addRelativeHumidity(CHANNEL_HUM, newValues.Humedad); Lpp.addDigitalInput(CHANNEL_STATUS,relaisOn); Lpp.addDigitalOutput(CHANNEL_RELAIS,0); Esto es necesario para que el gateway cree un buffer para este canal Crear paquete LoRa Si (Lora.beginPacket()){ Lora.Escribir(Daniel,6); primero los dispositivos vID Lora.Escribir(Lpp.Getbuffer(),Lpp.getSize()); entonces los datos en formato LPP Si (Lora.endPacket()) { Serial.println("Lora Transmisión OK"); } Más { Serial.println("Error de cruce de Lora"); } } Más { Serial.println("Error de cruce de Lora"); } Serial.Printf("%3i Bytes Enviados",Lpp.getSize()+6); ahora estamos esperando el recibo Cnt = 0; Jue { Sze = Lora.parsePacket(); Cnt++; Retraso(100); } Mientras ((Sze == 0) && (Cnt < 100)); Si (Cnt >= 100) { Serial.println("No hay respuesta desde la puerta de enlace"); } Más { Serial.Printf("Recibir datos %i Bytes"n,Sze); Si (Sze >= 6){ Serial.Printf("Recibo obtener %i bytes",Sze); Cnt=0; leemos la ráfaga 6 bytes y los comparamos con los dispositivos Id Mientras ((Sze > 0) && (Cnt<6)) { Sze--; Daniel[Cnt++]==Lora.Leer(); } si cnt 6 es el ID era correcto Leemos el resto en el búfer receptor Mientras (Sze > 0) { byte de ertses a canal Ch = Lora.Leer(); Sze--; es el canal más pequeño 8 almacenamos tipo y valores Si (Ch < 8) { empBuf[Ch].Tipo = Lora.Leer(); Sze--; Interruptor (empBuf[Ch].Tipo) { Solo los tipos de acción son importantes Caso LPP_DIGITAL_OUTPUT: empBuf[Ch].Val = Lora.Leer(); Sze--; Serial.Printf("Canal de recepción%02x Tipo-%02x Valor-%i,Ch,empBuf[Ch].Tipo,empBuf[Ch].Val); Romper; Caso LPP_ANALOG_OUTPUT: empBuf[Ch].Val = Lora.Leer() * 256 + Lora.Leer(); Sze-=2; Serial.Printf("Canal de recepción%02x Tipo-%02x Valor-%i,Ch,empBuf[Ch].Tipo,empBuf[Ch].Val); Romper; } } } Si (Cnt == 6) { Serial.println("Recibo bien"); } Más { Serial.println("Respuesta no válida"); } } } } Vacío Configuración() { Serial.Comenzar(115200); Serial.println("Empezar"); pinMode(Relais,Salida); Spi.Comenzar(5,19,27,18); esp_efuse_read_mac(Daniel); Restablecimiento de OLED pinMode(16,Salida); digitalWrite(16, Bajo); Retraso(50); digitalWrite(16, Alto); e inicializar Monitor.Init(); Monitor.Setfont(ArialMT_Plain_10); Monitor.Monitor(); Lora.setPins(Ss,Rst,DI0); Serial.println("LoRa TRX"); Si (!Lora.Comenzar(Banda)) { Serial.println("Comenzando LoRa falló!"); } Serial.println("LoRa inicial ok!"); Lora.enableCrc(); Dht.Configuración(DHT_PIN, DHTesp::DHT11); } Vacío Bucle() { uint8_t* Buf; uint8_t Len; Int Cnt; uint8_t Sze; newValues = Dht.getTempAndHumidity(); sendLoRa(); digitalWrite(Relais,empBuf[3].Val); relaisOn = empBuf[3].Val; Si (Dht.Getstatus() == 0) { Monitor.Claro(); Monitor.Lazo(0, 0, "Temperatura: "); Monitor.Lazo(80, 0, Cadena(newValues.Temperatura)); Monitor.Lazo(110, 0,"C"); Monitor.Lazo(0, 20, "Humedad: "); Monitor.Lazo(80,20, Cadena(newValues.Humedad)); Monitor.Lazo(110,20, "%"); Monitor.Lazo(0, 40, "Relé :"); Si (relaisOn == 1) Monitor.Lazo(80, 40, "en"); Más Monitor.Lazo(80, 40, "Muy buena"); Monitor.Monitor(); Retraso(TX_INTERVAL * 1000); } }
Registro en la puerta de enlace:
Después de cargar el boceto y iniciar el programa, el circuito envía un paquete de datos a través de LoRa cada 10 segundos. Si ahora accedemos al sitio web de la puerta de enlace con el navegador, deberíamos ver la dirección MAC de nuestro circuito junto al botón "Registrarse".
Ahora podemos asignar un nombre al dispositivo y luego registrarlo. El dispositivo aparece en la lista de dispositivos de la puerta de enlace.
Ahora también deberíamos ver los canales en el panel de Cayenne.
Ahora podemos agregar y configurar los widgets al panel como se describe en la Parte 1. También necesitamos crear un widget con un botón para cambiar el relé.
Diviértete haciendo manualidades.
2 comentarios
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