1. Instrucciones en Arduino IDE
Para facilitar la programación, se separan en funciones las acciones para enviar y recibir mensajes Lora y las de manejo de sensor/actuador.
El sensor DTH-11 se conecta al pin 13
El sensor de bateria se conecta al pin 36 como entrada analógica.
/* Dispositivo Sensor Temperatura y Humedad con DHT11 Broker: MQTT/Home-Assistant Red ruta: LoRa/WiFi/Ethernet edelros@espol.edu.ec http://blog.espol.edu.ec/edelros/ Referencia: Ejemplos de Aaron.Lee www.heltec.cn */ #include "heltec.h" #include "DHT.h" // Sensor de Temperatura&Humedad #define DHTPIN 13 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); String temperatura = ""; String humedad = ""; // Sensor de Bateria # define BattPIN 36 String battNivel; //Banda LoRa 915Mhz - ISM en Región #define BAND 915E6 // 433E6,868E6,915E6 // ranges from 6-12,default 7 see API docs byte spread_factor = 8; // Mensaje a enviar por direcciones byte dir_local = 0xD1; // Dispositivo 1 byte dir_destino = 0xC1; // Concentrador 1 // identificador de mensaje byte msjContador = 0; // tiempo entre lecturas long t_anterior = 0; int t_intervalo = 5000; // Mensaje Recibido byte dir_envio = 0xC1; // Concentrador 1 int dir_remite = 0xD0; // Inicia Remitente String paqueteRcb = ""; byte paqrcbvID = 0; byte paqrcbEstado = 0; // 0:vacio, 1: nuevo, 2:incompleto // 3:otro destinatario, 4:Broadcast // Mensajes por Puerto Serial volatile boolean serial_msj = true; void setup(){ Heltec.begin(false /*DisplayEnable Enable*/, true /*Heltec.Heltec.Heltec.LoRa Disable*/, serial_msj /*Serial Enable*/, true /*PABOOST Enable*/, BAND /*long BAND*/); // ranges from 6-12,default 7 see API docs LoRa.setSpreadingFactor(spread_factor); //LoRa.onReceive(cbk); LoRa.receive(); //inicializa sensores pinMode(DHTPIN, INPUT); dht.begin(); pinMode(BattPIN, INPUT); } void loop(){ // Enviar mensajes entre intervalos long t_ahora = millis(); long t_transcurrido = t_ahora - t_anterior; // parametros de recepción int rssi_lora = 0; int snr_lora = 0; if (t_transcurrido >= t_intervalo){ sensorLeeDHT(); //actualiza estado del sensor sensorBateria(); // actualiza estado de bateria // Construye paquete a enviar String paqueteEnv = ""; paqueteEnv = paqueteEnv + "t" + temperatura; paqueteEnv = paqueteEnv + "|"; paqueteEnv = paqueteEnv + "h" + humedad; paqueteEnv = paqueteEnv + "|"; paqueteEnv = paqueteEnv + "v" + battNivel; enviarlora(dir_destino, dir_local, msjContador, paqueteEnv); msjContador = msjContador + 1; // parametros de recepción rssi_lora = LoRa.packetRssi(); snr_lora = LoRa.packetSnr(); yield(); // mensaje a serial if (serial_msj==true){ Serial.print(String(dir_destino,HEX)); Serial.print(","); Serial.print(String(dir_local,HEX)); Serial.print(","); Serial.print(msjContador);Serial.print(","); Serial.print(paqueteEnv.length());Serial.print(","); Serial.print(paqueteEnv);Serial.print(","); Serial.print(rssi_lora);Serial.print(","); Serial.println(snr_lora); } t_anterior = millis(); t_intervalo = 3000 + random(2000); // LED parpadea envio lora digitalWrite(LED, HIGH); delay(100); digitalWrite(LED, LOW); delay(100); yield(); // procesa wifi } // Revisar mensajes LoRa entrantes int msjRcbLoRa = LoRa.parsePacket(); if (msjRcbLoRa !=0){ recibirlora(msjRcbLoRa); rssi_lora = LoRa.packetRssi(); snr_lora = LoRa.packetSnr(); if (serial_msj==true){ if (paqrcbEstado == 1){ Serial.println("Mensaje: " + paqueteRcb); Serial.println("RSSI: " + String(rssi_lora)); Serial.println("Snr: " + String(snr_lora)); Serial.println(); }else{ Serial.print("Paquete recibido Estado: "); Serial.println(paqrcbEstado); } } yield(); // procesa wifi // LED parpadea Recibido Lora digitalWrite(LED, HIGH); delay(50); digitalWrite(LED, LOW); delay(50); digitalWrite(LED, HIGH); delay(50); digitalWrite(LED, LOW); } delay(100); yield(); // procesa wifi } void enviarlora(byte destino, byte remite, byte paqueteID, String paquete){ // espera que el radio esté listo // para enviar un paquete while(LoRa.beginPacket() == 0){ if (serial_msj==true){ Serial.println("Esperando radio disponible..."); } yield(); // procesa wifi delay(100); } // envio del mensaje LoRa LoRa.beginPacket(); LoRa.write(destino); LoRa.write(remite); LoRa.write(paqueteID); LoRa.write(paquete.length()); LoRa.print(paquete); LoRa.endPacket(); } void recibirlora(int tamano){ if (tamano == 0){ paqrcbEstado = 0; //vacio return; } // lectura de paquete paqueteRcb = ""; dir_envio = LoRa.read(); dir_remite = LoRa.read(); paqrcbvID = LoRa.read(); byte paqrcbTamano = LoRa.read(); while(LoRa.available()){ paqueteRcb += (char)LoRa.read(); } if (paqrcbTamano != paqueteRcb.length()){ paqrcbEstado = 2; // Tamaño incompleto return; } if (dir_envio != dir_local){ paqrcbEstado = 3; // otro destino return; } if (dir_envio == 0xFF) { paqrcbEstado = 4; // Broadcast return; } paqrcbEstado = 1; // mensaje Nuevo } // Sensor lecturas void sensorLeeDHT(){ humedad = String(int(dht.readHumidity())).c_str(); temperatura = String(dht.readTemperature()).c_str(); } void sensorBateria(){ int lectura = analogRead(BattPIN); // convierte a equivalente en voltios float voltaje = (float(lectura)/4096.0)*4.2*3.0/2.0; battNivel = String(voltaje).c_str(); }