{"id":2224,"date":"2020-02-11T07:56:40","date_gmt":"2020-02-11T12:56:40","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/edelros\/?p=2224"},"modified":"2026-08-04T22:23:17","modified_gmt":"2026-08-05T03:23:17","slug":"lora-temperatura-humedad-dispositivo-ino","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lora-temperatura-humedad-dispositivo-ino\/","title":{"rendered":"2. LoRa - Temperatura, Humedad: Dispositivo Archivo.ino"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">1. Instrucciones en Arduino IDE<\/h2>\n\n\n\n<p>Para facilitar la programaci\u00f3n, se separan en funciones las acciones para enviar y recibir mensajes Lora y las de manejo de sensor\/actuador.<\/p>\n\n\n\n<p>El sensor DTH-11 se conecta al pin 13<\/p>\n\n\n\n<p>El sensor de bateria se conecta al pin 36 como entrada anal\u00f3gica.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n\/*\n \u00a0Dispositivo Sensor Temperatura y Humedad con DHT11\n \u00a0Broker: MQTT\/Home-Assistant\n \u00a0Red ruta: LoRa\/WiFi\/Ethernet\n \u00a0edelros@espol.edu.ec\n \u00a0http:&amp;#047;&amp;#047;blog.espol.edu.ec\/edelros\/\n \u00a0Referencia: Ejemplos de Aaron.Lee www.heltec.cn\n*\/\n#include &quot;heltec.h&quot;\n#include &quot;DHT.h&quot;\n\n\/\/ Sensor de Temperatura&amp;Humedad\n#define DHTPIN 13\n#define DHTTYPE DHT11 \nDHT dht(DHTPIN, DHTTYPE);\nString temperatura = &quot;&quot;;\nString humedad = &quot;&quot;; \n\n\/\/ Sensor de Bateria\n# define BattPIN 36\nString battNivel;\n\n\/\/Banda LoRa 915Mhz - ISM en Regi\u00f3n \n#define BAND \u00a0915E6 \/\/ 433E6,868E6,915E6\n\/\/ ranges from 6-12,default 7 see API docs\nbyte spread_factor = 8;\n\n\/\/ Mensaje a enviar por direcciones\nbyte dir_local \u00a0\u00a0= 0xD1; \/\/ Dispositivo \u00a01\nbyte dir_destino = 0xC1; \/\/ Concentrador 1\n\/\/ identificador de mensaje\nbyte msjContador = 0;\n\/\/ tiempo entre lecturas\nlong t_anterior = 0;\nint \u00a0t_intervalo = 5000;\n\n\/\/ Mensaje Recibido\nbyte dir_envio = 0xC1; \/\/ Concentrador 1\nint dir_remite = 0xD0; \/\/ Inicia Remitente\nString paqueteRcb = &quot;&quot;;\nbyte \u00a0\u00a0paqrcbvID = 0;\nbyte \u00a0\u00a0paqrcbEstado = 0;\n \u00a0\/\/ 0:vacio, 1: nuevo, 2:incompleto\n \u00a0\/\/ 3:otro destinatario, 4:Broadcast\n\n \/\/ Mensajes por Puerto Serial\nvolatile boolean serial_msj = true;\n\nvoid setup(){\n \u00a0Heltec.begin(false \/*DisplayEnable Enable*\/,\n \u00a0\u00a0\u00a0true \/*Heltec.Heltec.Heltec.LoRa Disable*\/,\n \u00a0\u00a0\u00a0serial_msj \/*Serial Enable*\/,\n \u00a0\u00a0\u00a0true \/*PABOOST Enable*\/,\n \u00a0\u00a0\u00a0BAND \/*long BAND*\/);\n \u00a0\u00a0\u00a0\n \u00a0\/\/ ranges from 6-12,default 7 see API docs\n \u00a0LoRa.setSpreadingFactor(spread_factor);\n \u00a0\/\/LoRa.onReceive(cbk);\n \u00a0LoRa.receive();\n\n \u00a0\/\/inicializa sensores\n \u00a0pinMode(DHTPIN, INPUT);\n \u00a0dht.begin();\n \u00a0pinMode(BattPIN, INPUT);\n \u00a0}\n\nvoid loop(){\n \u00a0\/\/ Enviar mensajes entre intervalos\n \u00a0long t_ahora = millis();\n \u00a0long t_transcurrido = t_ahora - t_anterior;\n\n \u00a0\/\/ parametros de recepci\u00f3n\n \u00a0int rssi_lora = 0;\n \u00a0int snr_lora = 0;\n \u00a0\n \u00a0if (t_transcurrido &gt;= t_intervalo){\n \u00a0\u00a0\u00a0sensorLeeDHT(); \/\/actualiza estado del sensor\n \u00a0\u00a0\u00a0sensorBateria(); \/\/ actualiza estado de bateria\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0\/\/ Construye paquete a enviar\n \u00a0\u00a0\u00a0String paqueteEnv = &quot;&quot;;\n \u00a0\u00a0\u00a0paqueteEnv = paqueteEnv + &quot;t&quot; + temperatura;\n \u00a0\u00a0\u00a0paqueteEnv = paqueteEnv + &quot;|&quot;;\n \u00a0\u00a0\u00a0paqueteEnv = paqueteEnv + &quot;h&quot; + humedad;\n \u00a0\u00a0\u00a0paqueteEnv = paqueteEnv + &quot;|&quot;;\n \u00a0\u00a0\u00a0paqueteEnv = paqueteEnv + &quot;v&quot; + battNivel;\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0enviarlora(dir_destino, dir_local,\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0msjContador, paqueteEnv);\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0msjContador = msjContador + 1;\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0\/\/ parametros de recepci\u00f3n\n \u00a0\u00a0\u00a0rssi_lora = LoRa.packetRssi();\n \u00a0\u00a0\u00a0snr_lora = LoRa.packetSnr();\n \u00a0\u00a0\u00a0yield();\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0\/\/ mensaje a serial\n \u00a0\u00a0\u00a0if (serial_msj==true){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(String(dir_destino,HEX));\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(String(dir_local,HEX));\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(msjContador);Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(paqueteEnv.length());Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(paqueteEnv);Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(rssi_lora);Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(snr_lora);\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0t_anterior = millis();\n \u00a0\u00a0\u00a0t_intervalo = 3000 + random(2000);\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0\/\/ LED parpadea envio lora\n \u00a0\u00a0\u00a0digitalWrite(LED, HIGH); delay(100);\n \u00a0\u00a0\u00a0digitalWrite(LED, LOW); \u00a0delay(100);\n \u00a0\u00a0\u00a0yield(); \/\/ procesa wifi\n \u00a0}\n\n \u00a0\/\/ Revisar mensajes LoRa entrantes\n \u00a0int msjRcbLoRa = LoRa.parsePacket();\n \u00a0if (msjRcbLoRa !=0){\n \u00a0\u00a0\u00a0recibirlora(msjRcbLoRa);\n \u00a0\u00a0\u00a0rssi_lora = LoRa.packetRssi();\n \u00a0\u00a0\u00a0snr_lora = LoRa.packetSnr();\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0if (serial_msj==true){\n \u00a0\u00a0\u00a0\u00a0\u00a0if (paqrcbEstado == 1){\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(&quot;Mensaje: &quot; + paqueteRcb);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(&quot;RSSI: &quot; + String(rssi_lora));\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(&quot;Snr: &quot; + String(snr_lora));\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.println();\n \u00a0\u00a0\u00a0\u00a0\u00a0}else{\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot;Paquete recibido Estado: &quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(paqrcbEstado);\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0yield(); \/\/ procesa wifi\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0\/\/ LED parpadea Recibido Lora\n \u00a0\u00a0\u00a0digitalWrite(LED, HIGH); delay(50);\n \u00a0\u00a0\u00a0digitalWrite(LED, LOW); delay(50);\n \u00a0\u00a0\u00a0digitalWrite(LED, HIGH); delay(50);\n \u00a0\u00a0\u00a0digitalWrite(LED, LOW);\n \u00a0}\n \u00a0delay(100);\n \u00a0yield(); \/\/ procesa wifi\n}\n\nvoid enviarlora(byte destino, byte remite,\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0byte paqueteID, String paquete){\n \u00a0\/\/ espera que el radio est\u00e9 listo\n \u00a0\/\/ para enviar un paquete\n \u00a0while(LoRa.beginPacket() == 0){\n \u00a0\u00a0\u00a0if (serial_msj==true){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(&quot;Esperando radio disponible...&quot;);\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0yield(); \/\/ procesa wifi\n \u00a0\u00a0\u00a0delay(100);\n \u00a0}\n \u00a0\/\/ envio del mensaje LoRa\n \u00a0LoRa.beginPacket();\n \u00a0LoRa.write(destino);\n \u00a0LoRa.write(remite);\n \u00a0LoRa.write(paqueteID);\n \u00a0LoRa.write(paquete.length());\n \u00a0LoRa.print(paquete);\n \u00a0LoRa.endPacket();\n}\n\nvoid recibirlora(int tamano){\n \u00a0if (tamano == 0){ \n \u00a0\u00a0\u00a0paqrcbEstado = 0; \/\/vacio\n \u00a0\u00a0\u00a0return;\n \u00a0\u00a0\u00a0}\n \u00a0\/\/ lectura de paquete\n \u00a0paqueteRcb = &quot;&quot;;\n \u00a0dir_envio = LoRa.read();\n \u00a0dir_remite \u00a0= LoRa.read();\n \u00a0paqrcbvID = LoRa.read();\n \u00a0byte paqrcbTamano = LoRa.read();\n \u00a0while(LoRa.available()){\n \u00a0\u00a0\u00a0paqueteRcb += (char)LoRa.read();\n \u00a0}\n \u00a0if (paqrcbTamano != paqueteRcb.length()){\n \u00a0\u00a0\u00a0paqrcbEstado = 2; \/\/ Tama\u00f1o incompleto\n \u00a0\u00a0\u00a0return;\n \u00a0}\n \u00a0if (dir_envio != dir_local){\n \u00a0\u00a0\u00a0paqrcbEstado = 3; \/\/ otro destino\n \u00a0\u00a0\u00a0return;\n \u00a0}\n \u00a0if (dir_envio == 0xFF) {\n \u00a0\u00a0\u00a0paqrcbEstado = 4; \/\/ Broadcast\n \u00a0\u00a0\u00a0return;\n \u00a0}\n \u00a0paqrcbEstado = 1; \u00a0\/\/ mensaje Nuevo\n}\n\n\/\/ Sensor lecturas\nvoid sensorLeeDHT(){\n \u00a0humedad = String(int(dht.readHumidity())).c_str();\n \u00a0temperatura = String(dht.readTemperature()).c_str();\n}\n\nvoid sensorBateria(){\n \u00a0int lectura = analogRead(BattPIN);\n \u00a0\/\/ convierte a equivalente en voltios\n \u00a0float voltaje = (float(lectura)\/4096.0)*4.2*3.0\/2.0;\n \u00a0battNivel = String(voltaje).c_str();\n}\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>1. Instrucciones en Arduino IDE Para facilitar la programaci\u00f3n, 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\u00f3gica.<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1457942],"tags":[602214,1457738],"class_list":["post-2224","post","type-post","status-publish","format-standard","hentry","category-lora-temperatura-humedad","tag-iot","tag-lora"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2224","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/comments?post=2224"}],"version-history":[{"count":8,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2224\/revisions"}],"predecessor-version":[{"id":4893,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2224\/revisions\/4893"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=2224"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=2224"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=2224"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}