{"id":3405,"date":"2021-04-05T13:02:44","date_gmt":"2021-04-05T18:02:44","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=3405"},"modified":"2026-08-04T22:31:38","modified_gmt":"2026-08-05T03:31:38","slug":"lorawan-temperatura-humedad-archivo-ino","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lorawan-temperatura-humedad-archivo-ino\/","title":{"rendered":"LoRaWan - Temperatura y Humedad: Archivo.ino"},"content":{"rendered":"\n<p>El desarrollo del ejercicio se simplifica al tratarse como una extensi\u00f3n del ejemplo base de comunicaci\u00f3n Lora al que se a\u00f1ade el Sensor DHT11.<\/p>\n\n\n\n<p><a href=\"https:\/\/blog.espol.edu.ec\/girni\/chirpstack-anadir-dispositivo\/\" data-type=\"post\" data-id=\"2842\">ChirpStack - A\u00f1adir un dispositivo<\/a><\/p>\n\n\n\n<p>El archivo de instrucciones se presenta en tres secciones o pesta\u00f1as. La primera contiene la declaraci\u00f3n de variables, la parte de configuraci\u00f3n y el lazo principal. Las siguientes dos secciones son procedimientos para preparaci\u00f3n de trama y lectura de sensor.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preparaci\u00f3n de trama<\/h2>\n\n\n\n<p>El valor de temperatura se almacena en tipo real (float) que usa 4 bytes. En la trama se separan los bytes en orden LSB (Byte menos significativo primero, detalle que hay que recordar para decodificar en ChirpStack.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n    unsigned char *puc;\n    puc = (unsigned char *)(&amp;temperaturaC);\n    appDataSize = 8;\/\/AppDataSize max value is 64\n    appData&#x5B;0] = puc&#x5B;0];\n    appData&#x5B;1] = puc&#x5B;1];\n    appData&#x5B;2] = puc&#x5B;2];\n    appData&#x5B;3] = puc&#x5B;3];\n<\/pre><\/div>\n\n\n<p>De utilizar el mismo formato para el valor de Humedad, el formato es muy semejante.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Intrucciones Principales<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n \/*\n * HelTec Automation(TM) LoRaWAN 1.0.2 OTAA example use OTAA, CLASS A\n * Solo ESP32+LoRa series boards con licencia http: \/ \/www.heltec.cn \/search \/);\n *https: \/ \/github.com \/HelTecAutomation \/ESP32_LoRaWAN\n* \/\n#include &lt;ESP32_LoRaWAN.h&gt;\n#include &quot;Arduino.h&quot;\n#include &lt;DHT.h&gt;\n\n \/*licencia Heltec ESP32 LoRaWan http: \/ \/resource.heltec.cn \/search * \/\nuint32_t  license&#x5B;4] = {0xBE21335B, 0xAEC3C5CE, 0xCC0A1CF4, 0xB836F981};\n\n \/* OTAA parametros* \/\nuint8_t DevEui&#x5B;] = { 0x01, 0x20, 0x08, 0x93, 0xdf, 0x80, 0x37, 0x74 };\nuint8_t AppEui&#x5B;] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };\nuint8_t AppKey&#x5B;] = { 0x05, 0x8e, 0xeb, 0xff, 0x24, 0xf1, 0x01, 0x84, 0xd0, 0x07, 0xbe, 0xd4, 0x65, 0xe7, 0x6b, 0xb5 };\n\n \/* ABP parametros* \/\nuint32_t DevAddr =  ( uint32_t )0x0174b1fd;\nuint8_t NwkSKey&#x5B;] = { 0xc1, 0x45, 0x31, 0x28, 0x5f, 0xb2, 0x56, 0x3b, 0x9d, 0x5f, 0x27, 0x15, 0xed, 0x3a, 0x0e, 0xbc}; \nuint8_t AppSKey&#x5B;] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\n\n \/ \/LoraWan channelsmask, default channels 0-7 \/\nuint16_t userChannelsMask&#x5B;6]={ 0x00FF,0x0000,0x0000,0x0000,0x0000,0x0000 };\n\nDeviceClass_t  loraWanClass = CLASS_A;   \/*Soporte de A and C* \/\nuint32_t appTxDutyCycle = 300000;         \/*15000; en &#x5B;ms]* \/\nbool overTheAirActivation = true;        \/*OTAA or ABP* \/\nbool loraWanAdr = true;                  \/*ADR enable* \/\nbool isTxConfirmed = true;               \/*confirmed or unconfirmed messages * \/\nuint8_t appPort = 2;                     \/* Application port * \/\n\n \/* reintentos de transmisi\u00f3n, en caso de no recibir ack * \/\nuint8_t confirmedNbTrials = 8;\n\n \/* Seleccionado de Arduino IDE tools * \/\nuint8_t debugLevel = LoRaWAN_DEBUG_LEVEL; \nLoRaMacRegion_t loraWanRegion = ACTIVE_REGION;\n\n \/ \/ variables de sensor \/actuador\nuint8_t contador = 0;  \nfloat humedad = 0;\nfloat temperaturaC = 0;\nfloat temperaturaF = 0;\n\n \/ \/ Mensajes por Puerto Serial\nvolatile boolean serial_msg = true;\n\n \/ \/ Sensor humedad y temperatura\n#define DHTPIN 4\n#define DHTTYPE DHT11\nDHT dht(DHTPIN, DHTTYPE);\n\nvoid setup(){\n  if (serial_msg){\n    Serial.begin(115200);\n    while (!Serial);\n  }\n  SPI.begin(SCK,MISO,MOSI,SS);\n  Mcu.init(SS,RST_LoRa,DIO0,DIO1,license);\n  deviceState = DEVICE_STATE_INIT;\n\n   \/ \/ SENSOR Temperatura&amp;Humedad\n  dht.begin();\n}\nvoid loop(){\n  \n  switch( deviceState )  {\n    case DEVICE_STATE_INIT:    {\n      LoRaWAN.init(loraWanClass,loraWanRegion);\n      break;\n    }\n    case DEVICE_STATE_JOIN:    {\n      LoRaWAN.join();\n      break;\n    }\n    case DEVICE_STATE_SEND:    { \n      prepareTxFrame( appPort );\n      LoRaWAN.send(loraWanClass);\n      deviceState = DEVICE_STATE_CYCLE;\n      break;\n      \n    }\n    case DEVICE_STATE_CYCLE:    {\n       \/ \/ Schedule next packet transmission\n      txDutyCycleTime = appTxDutyCycle + randr( -APP_TX_DUTYCYCLE_RND,\n                                                APP_TX_DUTYCYCLE_RND );\n      LoRaWAN.cycle(txDutyCycleTime);\n      deviceState = DEVICE_STATE_SLEEP;\n      break;\n    }\n    case DEVICE_STATE_SLEEP:    {\n      LoRaWAN.sleep(loraWanClass,debugLevel);\n      break;\n    }\n    default:    {\n      deviceState = DEVICE_STATE_INIT;\n      break;\n    }\n  }\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Preparaci\u00f3n de trama<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n\/\/ Trama - integra datos\nstatic void prepareTxFrame( uint8_t port ){\n    contador = contador + 1;\n    \/\/ Sensor de Temperatura y Humedad\n    SensorTempHum();\n\n    if (isnan(humedad) || isnan(temperaturaC) || isnan(temperaturaF)) {\n      humedad = 0;\n      temperaturaC = 0;\n      temperaturaF = 0;\n    }\n    unsigned char *puc;\n    puc = (unsigned char *)(&amp;temperaturaC);\n    appDataSize = 8;\/\/AppDataSize max value is 64\n    appData&#x5B;0] = puc&#x5B;0];\n    appData&#x5B;1] = puc&#x5B;1];\n    appData&#x5B;2] = puc&#x5B;2];\n    appData&#x5B;3] = puc&#x5B;3];\n\n    puc = (unsigned char *)(&amp;humedad);\n    appData&#x5B;4] = puc&#x5B;0];\n    appData&#x5B;5] = puc&#x5B;1];\n    appData&#x5B;6] = puc&#x5B;2];\n    appData&#x5B;7] = puc&#x5B;3];\n    if (serial_msg){\n      Serial.print(&quot;tx: &quot;+String(temperaturaC)+&quot;  &quot;);\n      Serial.print(appData&#x5B;0]);\n      Serial.print(appData&#x5B;1]);\n      Serial.print(appData&#x5B;2]);\n      Serial.println(appData&#x5B;3]);\n      Serial.print(&quot;tx: &quot;+String(humedad)+&quot;  &quot;);\n      Serial.print(appData&#x5B;4]);\n      Serial.print(appData&#x5B;5]);\n      Serial.print(appData&#x5B;6]);\n      Serial.println(appData&#x5B;7]);\n    }\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Lectura de sensor<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\nvoid SensorTempHum(){\n  \/\/ SENSOR Temperatura&amp;Humedad\n  dht.begin(); \/\/ regresa de sleep\n  delay(2000); \/\/ espera minina entre lecturas de sensor\n  humedad = dht.readHumidity();\n  temperaturaC = dht.readTemperature();\n  temperaturaF = dht.readTemperature(true);\n\n  if (isnan(humedad) || isnan(temperaturaC) || isnan(temperaturaF)) {\n    if (serial_msg){\n      Serial.println(F(&quot;Failed to read from DHT sensor!&quot;));\n    }\n    \/\/ espera minina entre lecturas de sensor\n    delay(100); \n    return;\n  }\n\n  float hif = dht.computeHeatIndex(temperaturaF, humedad);\n  float hic = dht.computeHeatIndex(temperaturaC, humedad, false);\n\n  if (serial_msg){\n    Serial.print(F(&quot; Humidity: &quot;));\n    Serial.print(humedad);\n    Serial.print(F(&quot;%  \\n Temperature: &quot;));\n    Serial.print(temperaturaC);\n    Serial.print(F(&quot;\u00b0C &quot;));\n    Serial.print(temperaturaF);\n    Serial.print(F(&quot;\u00b0F \\n Heat index: &quot;));\n    Serial.print(hic);\n    Serial.print(F(&quot;\u00b0C &quot;));\n    Serial.print(hif);\n    Serial.println(F(&quot;\u00b0F&quot;));\n  }\n}\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>El desarrollo del ejercicio se simplifica al tratarse como una extensi\u00f3n del ejemplo base de comunicaci\u00f3n Lora al que se a\u00f1ade el Sensor DHT11. ChirpStack - A\u00f1adir un dispositivo El archivo de instrucciones se presenta en tres secciones o pesta\u00f1as. La primera contiene la declaraci\u00f3n de variables, la parte de configuraci\u00f3n y el lazo principal. [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1465790],"tags":[],"class_list":["post-3405","post","type-post","status-publish","format-standard","hentry","category-lorawan-temperatura-humedad"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3405","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=3405"}],"version-history":[{"count":12,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3405\/revisions"}],"predecessor-version":[{"id":4900,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3405\/revisions\/4900"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=3405"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=3405"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=3405"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}