{"id":1873,"date":"2019-08-10T10:50:52","date_gmt":"2019-08-10T15:50:52","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/edelros\/?p=1873"},"modified":"2026-08-04T22:11:26","modified_gmt":"2026-08-05T03:11:26","slug":"wifi-control-remoto-ir-archivo-ino","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/wifi-control-remoto-ir-archivo-ino\/","title":{"rendered":"WiFi - Control Remoto IR: Archivo.ino"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Instrucciones<\/h2>\n\n\n\n<p>Las instrucciones enfocadas en cada sensor o actividad se resumen en funciones, tratando de mantener la simplicidad del lazo principal.<\/p>\n\n\n\n<p>Las instrucciones incorporan las siguientes caracter\u00edsticas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>el bot\u00f3n config_IR, una vez presionado espera hasta recibir una se\u00f1al infraroja que se lee, y graba.<\/li>\n\n\n\n<li>el Env\u00edo de la se\u00f1al se realiza con la instrucci\u00f3n MQTT o\u00a0 desde Home Assistant<\/li>\n\n\n\n<li>Usa el LED_LeeIR\u00a0 como indicador de estado de lectura o activaci\u00f3n de control remoto.<\/li>\n\n\n\n<li>Se emite la se\u00f1al de control mediante la variable senal_ONOFF<\/li>\n\n\n\n<li>Se controla el estado de lectura del sensor\/decodificador infrarojo mediante MQTT, y la respuesta se emite a la conexi\u00f3n serial.<\/li>\n\n\n\n<li>La temperatura y humedad se actualizan con el parametro \"intervalo\" cuyo primer n\u00famero es minutos<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n\/* ESP8266 IRremoteESP8266: Receptor Infrarojo\n * edelros@espol.edu.ec\n * Debe usar un sensor detector\/demodulador conectado al Receptor_Pin.\n * \u00a0\u00a0Based on Mark Szabo's Version 0.2 June, 2017 and\n * \u00a0\u00a0Ken Shirriff's IrsendDemo Version 0.1 July, 2009\n * \u00a0\u00a0https:\/\/github.com\/markszabo\/IRremoteESP8266 \n* \u00a0Para usar, actualice las secciones de:\n * \u00a0- WIFI:Router, MQTT:Servidor, MQTT:Dispositivo\n * \u00a0ESP-01 al usar GPIO1 y GPIO3,(Tx,Rx), NO USE Serial.print()\n*\/\n#include &lt;ESP8266WiFi.h&gt;\n#include &lt;PubSubClient.h&gt;\n\n#include &lt;IRremoteESP8266.h&gt;\n#include &lt;IRrecv.h&gt;\n#include &lt;IRutils.h&gt;\n#include &lt;IRsend.h&gt;\n\n#include &lt;EEPROM.h&gt;\n\n#include &lt;DHT.h&gt;\n\n\/\/ WIFI: conexi\u00f3n a Router\nchar* ssid = &quot;giotirni20&quot;;\nchar* password = &quot;Anera2020@&quot;;\n\n\/\/ MQTT: Servidor\nchar* MQTT_IP = &quot;192.168.10.50&quot;;\nuint16_t MQTT_puerto = 1883;\nchar* MQTT_usuario = &quot;usuarioprueba&quot;;\nchar* MQTT_contrasena = &quot;usuarioclave&quot;;\n\n\/\/ MQTT: Dispositivo Interruptor\nchar* MQTT_ID = &quot;oficina_CtrlIR01&quot;;\nchar* MQTT_TOPIC = &quot;oficina\/CtrlIR01\/estado&quot;;\nchar* MQTT_COMMAND = &quot;oficina\/CtrlIR01\/cambia&quot;;\n\nchar* MQTT_TOPIC_T = &quot;oficina\/CtrlIR01\/temperatura&quot;;\nchar* MQTT_TOPIC_H = &quot;oficina\/CtrlIR01\/humedad&quot;;\nchar* MQTT_COMMAND_DHT = &quot;oficina\/CtrlIR01\/actualiza&quot;;\n\nchar* MQTT_TOPIC_LeeIR = &quot;oficina\/CtrlIR01\/leer&quot;;\nchar* MQTT_COMMAND_LeeIR = &quot;oficina\/CtrlIR01\/grabar&quot;;\n\nchar MQTT_SensorEstado&#x5B;10] = &quot;OFF&quot;;\nchar MQTT_ActuadorEstado&#x5B;10] = &quot;OFF&quot;;\nchar MQTT_DHT_T&#x5B;6] = &quot;25&quot;; \/\/ inicializa\nchar MQTT_DHT_H&#x5B;6] = &quot;50&quot;; \/\/ inicializa\nchar MQTT_LeeIR&#x5B;6] = &quot;0&quot;; \/\/ inicializa\nvolatile boolean mqtt_desconectado = true;\n\nchar* sensor_ON \u00a0= &quot;ON&quot;;\nchar* sensor_OFF = &quot;OFF&quot;;\n\n\/\/ Actuador Control Remoto Emisor LED-IR en GPIO14\nconst uint8_t emisorIR_pin = 14;\nuint32_t senal_ONOFF = 0xFF5AA5; \/\/ c\u00f3digo de control\nvolatile boolean actuador_estado = false;\nvolatile boolean actuador_bandera = false;\n\n\/\/ Sensor IR en GPIO05\nconst uint8_t receptorIR_pin = 5;\nvolatile boolean LeerIR_estado = false;\nvolatile boolean LeerIR_bandera = false;\n\n\/\/ Boton de lectura y emitir IR\nconst uint8_t config_pin = 12;\nconst uint8_t emitir_pin = 0;\n\n\/\/ LED monitor \/\/interno: ESP01-pin=1, ESP07-pin=2\nconst uint8_t LED_pin=13;\nconst uint8_t LED_LeerIR = 2;\n\n\/\/ Mensajes por Puerto Serial\nvolatile boolean serial_msg = true;\n\n\/\/ Control de tiempo transcurrido entre lecturas temperatura\nunsigned long ahora = millis();\nconst long intervalo = 5*60*1000;\/\/minutos*60s*1000ms\nunsigned long antes = ahora-intervalo-1; \/\/leer al inicio\n\n\/\/ Clientes WiFi y MQTT\nWiFiClient wifiClient;\nPubSubClient mqttclient(wifiClient);\n\n\/\/ Receptor y Emisor Infrarojos\nIRrecv irrecv(receptorIR_pin);\ndecode_results lecturaIR;\nIRsend irsend(emisorIR_pin);\n\n\/\/ Sensor de Temperatura&amp;Humedad\n#define DHTPIN 4\n#define DHTTYPE \u00a0\u00a0DHT11\nDHT dht(DHTPIN, DHTTYPE);\n\nvoid setup() {\n \u00a0Serial.begin(74880);\/\/74880, 115200\n \u00a0while (!Serial){delay(50);}\n \u00a0\n \u00a0\/\/ SENSOR IR \/\/ inicia receptor IR\n \u00a0irrecv.enableIRIn(); \n \u00a0pinMode(LED_LeerIR, OUTPUT);\n \u00a0Leer_Activaestado();\n \u00a0\u00a0\u00a0\n \u00a0\/\/ ACTUADOR IR \/\/ inicia emisor IR\n \u00a0pinMode(emisorIR_pin, OUTPUT); \n \u00a0irsend.begin();\n\n \u00a0\/\/ SENSOR Temperatura&amp;Humedad\n \u00a0dht.begin();\n \u00a0\n \u00a0\/\/ LED monitor, Enciende en LOW\n \u00a0pinMode(LED_pin, OUTPUT);\n\n \u00a0\/\/ Memoria lectura y escritura\n \u00a0EEPROM.begin(64); \/\/eeprom maximo 512 posiciones\n \u00a0codigo_leermem();\n\n \u00a0\/\/ Boton de lectura de c\u00f3digo IR\n \u00a0pinMode(config_pin, INPUT);\n \u00a0attachInterrupt(digitalPinToInterrupt(config_pin),LeerActivado,CHANGE);\n\n \u00a0\/\/ Boton de Emisor de c\u00f3digo IR\n \u00a0pinMode(emitir_pin, INPUT);\n \u00a0attachInterrupt(digitalPinToInterrupt(emitir_pin),IR_Activado,CHANGE);\n \u00a0\n \u00a0\/\/ conexi\u00f3n WIFI y MQTT\n \u00a0inicia_wifi();\n \u00a0if (WiFi.status() == WL_CONNECTED){\n \u00a0\u00a0\u00a0inicia_mqtt();\n \u00a0\u00a0\u00a0}\n \u00a0}\n\nvoid loop() {\n \u00a0\/\/ enviar se\u00f1al IR\n \u00a0if (actuador_bandera){\n \u00a0\u00a0\u00a0irsend.sendNEC(senal_ONOFF ,32);\n \u00a0\u00a0\u00a0\/\/ parpadeo\n \u00a0\u00a0\u00a0digitalWrite(LED_LeerIR, LOW);\n \u00a0\u00a0\u00a0delay(300);\n \u00a0\u00a0\u00a0digitalWrite(LED_LeerIR, HIGH);\n \u00a0\u00a0\u00a0delay(200);\n \u00a0\u00a0\u00a0digitalWrite(LED_LeerIR, LOW);\n \u00a0\u00a0\u00a0delay(300);\n \u00a0\u00a0\u00a0digitalWrite(LED_LeerIR, HIGH);\n \u00a0\u00a0\u00a0delay(200);\n \u00a0\u00a0\u00a0\/\/ deja en estado anterior el LED Leer_IR\n \u00a0\u00a0\u00a0Leer_Activaestado();\n \u00a0\u00a0\u00a0publica_estado();\n \u00a0\u00a0\u00a0actuador_bandera = false;\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0if (serial_msg==true){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot;\\n Se\u00f1al IR enviada: &quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0serialPrintUint64(senal_ONOFF, HEX);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(&quot;&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n\n \u00a0\u00a0\u00a0}\n \u00a0yield(); \/\/ procesa wifi\n\n \u00a0\/\/ Sensor IR, leer c\u00f3digo\n \u00a0if(LeerIR_bandera){\n \u00a0\u00a0\u00a0if (irrecv.decode(&amp;lecturaIR)) {\n \u00a0\u00a0\u00a0\u00a0\u00a0\/\/ conversi\u00f3n a texto\n \u00a0\u00a0\u00a0\u00a0\u00a0uint64_t numero = lecturaIR.value;\n \u00a0\u00a0\u00a0\u00a0\u00a0unsigned long parte1 = (unsigned long)((numero &amp; 0xFFFF0000) &gt;&gt; 16 );\n \u00a0\u00a0\u00a0\u00a0\u00a0unsigned long parte2 = (unsigned long)((numero &amp; 0x0000FFFF));\n \u00a0\u00a0\u00a0\u00a0\u00a0String texto = String(parte1, HEX) + String(parte2, HEX);\n \u00a0\u00a0\u00a0\u00a0\u00a0texto.toUpperCase();\n \u00a0\u00a0\u00a0\u00a0\u00a0senal_ONOFF = lecturaIR.value;\n \u00a0\u00a0\u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Escribe a memoria EEPROM \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0\u00a0\u00a0\/\/ escribe a eeprom\n \u00a0\u00a0\u00a0\u00a0\u00a0texto = texto+&quot;;&quot;; \/\/marca fin de texto\n \u00a0\u00a0\u00a0\u00a0\u00a0int n = texto.length();\n \u00a0\u00a0\u00a0\u00a0\u00a0int posicion = 0;\n \u00a0\u00a0\u00a0\u00a0\u00a0int i = posicion;\n \u00a0\u00a0\u00a0\u00a0\u00a0while(i&lt;n){\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0EEPROM.write(i,texto&#x5B;i]);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0i=i+1;\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0\u00a0\u00a0EEPROM.commit();\n \u00a0\u00a0\u00a0\u00a0\u00a0irrecv.resume();\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0\u00a0\u00a0LeerIR_bandera = false;\n \u00a0\u00a0\u00a0\u00a0\u00a0LeerIR_estado = false;\n\n \u00a0\u00a0\u00a0\u00a0\u00a0publica_estado();\n \u00a0\u00a0\u00a0\u00a0\u00a0Leer_Activaestado();\n \u00a0\u00a0\u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0\u00a0\u00a0if (serial_msg==true){\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot;\\n lecturaIR: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ print() &amp; println() no maneja enteros largos(uint64_t)\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0serialPrintUint64(lecturaIR.value, HEX);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(&quot;&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot; grabado en memoria: \u00a0\u00a0&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(texto);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0}\n \u00a0}\n\n \u00a0yield(); \/\/ procesa wifi\n \u00a0\n \u00a0\/\/ lectura Temperatura,Humedad\n \u00a0unsigned long ahora = millis();\n \u00a0unsigned long transcurre = ahora-antes;\n \u00a0if (transcurre&gt;=intervalo){\n \u00a0\u00a0\u00a0antes = ahora;\n \u00a0\u00a0\u00a0delay(50);\n \u00a0\u00a0\u00a0\/\/ calibrar con una referencia m\u00e1s precisa\n \u00a0\u00a0\u00a0\/\/ modo simple: resta factor de correcci\u00f3n=5\n \u00a0\u00a0\u00a0float temperatura = dht.readTemperature();\n \u00a0\u00a0\u00a0float humedad = dht.readHumidity();\n \u00a0\u00a0\u00a0\/\/ convierte a texto mqtt; a 4 d\u00edgitos, 2 decimales\n \u00a0\u00a0\u00a0dtostrf(temperatura, 4, 2, MQTT_DHT_T); \u00a0\n \u00a0\u00a0\u00a0dtostrf(humedad, 4, 2, MQTT_DHT_H);\n \u00a0\u00a0\u00a0publica_estado();\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0if (serial_msg==true){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot;\\n tiempo: &quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(transcurre);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot; Temperatura,Humedad: &quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(MQTT_DHT_T);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot; , &quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(MQTT_DHT_H);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println();\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0\n \u00a0yield(); \/\/ procesa wifi\n \u00a0\n \u00a0if (WiFi.status() != WL_CONNECTED){\n \u00a0\u00a0\u00a0inicia_wifi();\n \u00a0\u00a0\u00a0}else{\n \u00a0\u00a0\u00a0if (mqttclient.connected()==false){\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mqtt_desconectado = true;\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0inicia_mqtt(); \/\/ reintento\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0if (mqttclient.connected()==true){\n \u00a0\u00a0\u00a0\u00a0\u00a0if (mqtt_desconectado==true){\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0publica_estado();\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mqtt_desconectado=false;\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0\u00a0\u00a0mqttclient.loop();\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0}\n \u00a0yield(); \/\/ procesa wifi\n}\n\nvoid codigo_leermem(){\n \u00a0\/\/ lectura desde eeprom, codigo on\/off\n \u00a0int posicion = 0;\n \u00a0int n = posicion+10;\n \u00a0String codigotxt = &quot;&quot;;\n \u00a0char simbolo;\n \u00a0int i = posicion;\n \u00a0while(i&lt;n){\n \u00a0\u00a0\u00a0simbolo = char(EEPROM.read(i));\n \u00a0\u00a0\u00a0if (simbolo!=';'){\n \u00a0\u00a0\u00a0\u00a0\u00a0codigotxt = codigotxt+String(simbolo);\n \u00a0\u00a0\u00a0\u00a0\u00a0}else{\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0i=n; \/\/ terminar lectura antes\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0i=i+1;\n \u00a0\u00a0\u00a0}\n \u00a0\/\/ conversi\u00f3n de codigotxt a HEX\n \u00a0char codigochar&#x5B;64];\n \u00a0codigotxt.toCharArray(codigochar, n);\n \u00a0uint32_t codigoIRhex = strtoul(codigochar, 0, 16);\n \u00a0\/\/ actualiza variable\n \u00a0senal_ONOFF = codigoIRhex;\n \u00a0if (serial_msg==true){\n \u00a0\u00a0\u00a0Serial.print(&quot;texto leido: \u00a0\u00a0\u00a0\u00a0&quot;);\n \u00a0\u00a0\u00a0Serial.println(codigotxt);\n \u00a0\u00a0\u00a0Serial.print(&quot;codigo IR eprom: &quot;);\n \u00a0\u00a0\u00a0\/\/ print() &amp; println() no maneja enteros largos(uint64_t)\n \u00a0\u00a0\u00a0serialPrintUint64(senal_ONOFF, HEX);\n \u00a0\u00a0\u00a0Serial.println(&quot;\\n&quot;);\n \u00a0\u00a0\u00a0}\n \u00a0}\n\n\/\/ ISR interrupci\u00f3n activada\nICACHE_RAM_ATTR void LeerActivado(){\n \u00a0\/\/ evita repeticiones por rebotes del botonera\n \u00a0if (LeerIR_bandera==false){\n \u00a0\u00a0\u00a0LeerIR_bandera = true;\n \u00a0\u00a0\u00a0LeerIR_estado = true;\n \u00a0\u00a0\u00a0Leer_Activaestado();\n \u00a0\u00a0\u00a0publica_estado();\n \u00a0\u00a0\u00a0if (serial_msg){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(&quot; Leer IR activado...&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0}\n \u00a0}\nICACHE_RAM_ATTR void IR_Activado(){\n \u00a0\/\/ evita repeticionese por rebotes del botonera\n \u00a0if (actuador_bandera ==false){\n \u00a0\u00a0\u00a0actuador_bandera = true;\n \u00a0\u00a0\u00a0if (actuador_estado == true) {\n \u00a0\u00a0\u00a0\u00a0\u00a0actuador_estado = false;\n \u00a0\u00a0\u00a0\u00a0\u00a0}else{\n \u00a0\u00a0\u00a0\u00a0\u00a0actuador_estado = true;\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0publica_estado();\n \u00a0\u00a0\u00a0if (serial_msg){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(&quot; IR_env\u00edo activado...&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0}\n \u00a0}\n\n\/\/ Actuador activar estado\nvoid Leer_Activaestado(){\n \u00a0\u00a0\u00a0if (LeerIR_estado){\n \u00a0\u00a0\u00a0\u00a0\u00a0\/\/ ACTUADOR ACTIVA EN LOW\n \u00a0\u00a0\u00a0\u00a0\u00a0\/\/ LED actuador ilumina en apagado\n \u00a0\u00a0\u00a0\u00a0\u00a0digitalWrite(LED_LeerIR, LOW);\n \u00a0\u00a0\u00a0}else{\n \u00a0\u00a0\u00a0\u00a0\u00a0digitalWrite(LED_LeerIR, HIGH);\n \u00a0\u00a0\u00a0}\n \u00a0}\n\n\/\/ Publicar el estado del dispositivo\nvoid publica_estado() {\n \u00a0\u00a0\u00a0if (actuador_estado){\n \u00a0\u00a0\u00a0\u00a0\u00a0snprintf (MQTT_ActuadorEstado,10, sensor_ON);\n \u00a0\u00a0\u00a0}else{\n \u00a0\u00a0\u00a0\u00a0\u00a0snprintf (MQTT_ActuadorEstado,10, sensor_OFF);\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0if (LeerIR_estado){\n \u00a0\u00a0\u00a0\u00a0\u00a0snprintf (MQTT_LeeIR,10, sensor_ON);\n \u00a0\u00a0\u00a0}else{\n \u00a0\u00a0\u00a0\u00a0\u00a0snprintf (MQTT_LeeIR,10, sensor_OFF);\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0if (mqttclient.connected()==true){\n \u00a0\u00a0\u00a0\u00a0\u00a0mqttclient.publish(MQTT_TOPIC,MQTT_ActuadorEstado,true);\n \u00a0\u00a0\u00a0\u00a0\u00a0mqttclient.publish(MQTT_TOPIC_LeeIR,MQTT_LeeIR,true);\n \u00a0\u00a0\u00a0\u00a0\u00a0mqttclient.publish(MQTT_TOPIC_T,MQTT_DHT_T,true);\n \u00a0\u00a0\u00a0\u00a0\u00a0mqttclient.publish(MQTT_TOPIC_H,MQTT_DHT_H,true);\n \u00a0\u00a0\u00a0}else{\n \u00a0\u00a0\u00a0\u00a0\u00a0mqtt_desconectado = true;\n \u00a0\u00a0\u00a0}\n}\n\nvoid inicia_wifi(){\n \u00a0int intentos = 10;\n \u00a0int cuenta = 0;\n\n \u00a0if (serial_msg){\n \u00a0\u00a0\u00a0Serial.print(&quot; WIFI Conectando a &quot;);\n \u00a0\u00a0\u00a0Serial.println(ssid);\n \u00a0\u00a0\u00a0}\n \u00a0WiFi.mode(WIFI_STA);\n \u00a0WiFi.begin(ssid, password);\n \u00a0\n \u00a0while ((WiFi.status() != WL_CONNECTED) &amp;&amp; (cuenta&lt;intentos)){\n \u00a0\u00a0\u00a0if (serial_msg){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot;.&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0cuenta = cuenta+1;\n \u00a0\u00a0\u00a0\/\/ Parpadeo de Monitor enciende en LOW\n \u00a0\u00a0\u00a0digitalWrite(LED_pin, LOW);\n \u00a0\u00a0\u00a0delay(300);\n \u00a0\u00a0\u00a0digitalWrite(LED_pin, HIGH);\n \u00a0\u00a0\u00a0delay(200);\n \u00a0\u00a0\u00a0}\n \u00a0if (serial_msg){\n \u00a0\u00a0\u00a0\/\/Fin de &quot;...&quot;\n \u00a0\u00a0\u00a0Serial.println();\n \u00a0\u00a0\u00a0if (WiFi.status() == WL_CONNECTED){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot; Estado: &quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(WiFi.status());\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot; MAC: &quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(WiFi.macAddress());\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot; IP: &quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(WiFi.localIP());\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot; RSSI: &quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(WiFi.RSSI());\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println();\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0if (WiFi.status() != WL_CONNECTED){\n \u00a0\u00a0\u00a0\u00a0\u00a0WiFi.printDiag(Serial);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println();\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0}\n \u00a0}\n\nvoid inicia_mqtt(){\n \u00a0int intentos = 2;\n \u00a0int cuenta = 0;\n \u00a0\n \u00a0if (serial_msg){\n \u00a0\u00a0\u00a0Serial.print(&quot; MQTT Conectando a &quot;);\n \u00a0\u00a0\u00a0Serial.println(MQTT_IP);\n \u00a0\u00a0\u00a0}\n \u00a0\n \u00a0mqttclient.setServer(MQTT_IP, MQTT_puerto);\n \u00a0mqttclient.connect(MQTT_ID, MQTT_usuario, MQTT_contrasena);\n \u00a0mqttclient.setCallback(callback);\n \u00a0\n \u00a0while (!mqttclient.connected() &amp;&amp; (cuenta&lt;intentos)) {\n\n \u00a0\u00a0\u00a0if (serial_msg){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot;.&quot;);\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0cuenta = cuenta + 1;\n \u00a0\u00a0\u00a0\/\/ Parpadeo de Monitor enciende en LOW\n \u00a0\u00a0\u00a0digitalWrite(LED_pin, LOW);\n \u00a0\u00a0\u00a0delay(200);\n \u00a0\u00a0\u00a0digitalWrite(LED_pin, HIGH);\n \u00a0\u00a0\u00a0delay(200);\n \u00a0\u00a0\u00a0}\n \u00a0publica_estado();\n \u00a0mqttclient.subscribe(MQTT_COMMAND);\n \u00a0mqttclient.subscribe(MQTT_COMMAND_LeeIR);\n \u00a0mqttclient.subscribe(MQTT_COMMAND_DHT);\n \u00a0\n \u00a0if (serial_msg){\n \u00a0\u00a0\u00a0\/\/Fin de &quot;...&quot;\n \u00a0\u00a0\u00a0Serial.println();\n \u00a0\u00a0\u00a0Serial.print(&quot; MQTT Conectado: &quot;);\n \u00a0\u00a0\u00a0Serial.println(mqttclient.connected());\n \u00a0\u00a0\u00a0Serial.print(&quot; MQTT Estado: &quot;);\n \u00a0\u00a0\u00a0Serial.println(mqttclient.state());\n \u00a0\u00a0\u00a0}\n \u00a0}\n\n\/\/ llega mensaje MQTT\nvoid callback(char* p_topic, byte* p_payload, unsigned int p_length) {\n \u00a0\/\/ convierte a texto\n \u00a0String payload;\n \u00a0for (uint8_t i = 0; i &lt; p_length; i++) {\n \u00a0\u00a0\u00a0payload.concat((char)p_payload&#x5B;i]);\n \u00a0\u00a0\u00a0}\n \u00a0\/\/ revisa mensaje por topico\n \u00a0if (String(MQTT_COMMAND).equals(p_topic)) {\n \u00a0\u00a0\u00a0if (payload.equals(String(sensor_ON))) {\n \u00a0\u00a0\u00a0\u00a0\u00a0if (actuador_estado != true) {\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0actuador_estado = true;\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0if (payload.equals(String(sensor_OFF))) {\n \u00a0\u00a0\u00a0\u00a0\u00a0if (actuador_estado != false) {\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0actuador_estado = false;\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0Leer_Activaestado();\n \u00a0\u00a0\u00a0publica_estado();\n \u00a0\u00a0\u00a0actuador_bandera = true;\n \u00a0\u00a0\u00a0}\n\n \u00a0if (String(MQTT_COMMAND_LeeIR).equals(p_topic)) {\n \u00a0\u00a0\u00a0if (payload.equals(String(sensor_ON))) {\n \u00a0\u00a0\u00a0\u00a0\u00a0if (LeerIR_estado != true) {\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LeerIR_estado = true;\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0if (payload.equals(String(sensor_OFF))) {\n \u00a0\u00a0\u00a0\u00a0\u00a0if (LeerIR_estado != false) {\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LeerIR_estado = false;\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0LeerIR_bandera = true;\n \u00a0\u00a0\u00a0Leer_Activaestado();\n \u00a0\u00a0\u00a0publica_estado();\n \u00a0\u00a0\u00a0}\n \u00a0if (String(MQTT_COMMAND_DHT).equals(p_topic)) {\n \u00a0\u00a0\u00a0antes = antes-(intervalo+2);\n \u00a0\u00a0\u00a0}\n \u00a0}\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>Instrucciones Las instrucciones enfocadas en cada sensor o actividad se resumen en funciones, tratando de mantener la simplicidad del lazo principal. Las instrucciones incorporan las siguientes caracter\u00edsticas:<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1430994],"tags":[],"class_list":["post-1873","post","type-post","status-publish","format-standard","hentry","category-wifi-control-remoto-ir"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/1873","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=1873"}],"version-history":[{"count":5,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/1873\/revisions"}],"predecessor-version":[{"id":4881,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/1873\/revisions\/4881"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=1873"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=1873"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=1873"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}