{"id":1840,"date":"2018-12-21T09:16:55","date_gmt":"2018-12-21T14:16:55","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/edelros\/?p=1840"},"modified":"2026-08-04T22:07:33","modified_gmt":"2026-08-05T03:07:33","slug":"wifi-tomacorriente-interruptor-archivo-ino","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/wifi-tomacorriente-interruptor-archivo-ino\/","title":{"rendered":"WiFi - Tomacorriente\/Interruptor: Archivo.ino"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">1. Instrucciones en Arduino IDE<\/h2>\n\n\n\n<p>Como la versi\u00f3n del ESP8266-01 no dispone de muchos pines de trabajo, se define el uso de los pines como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lectura del <strong>sensor <\/strong>interruptor en GPIO1, que tambi\u00e9n es TXD configurado (setup) como entrada (INPUT).<\/li>\n\n\n\n<li>Control <strong>actuador<\/strong> con relay en GPIO3,\u00a0 que tambi\u00e9n es RXD configurado en modo de salida (OUTPUT).<\/li>\n\n\n\n<li>Monitor de operaci\u00f3n del dispositivo: LED actuador GPIO2<\/li>\n\n\n\n<li>Monitor de conexi\u00f3n a la red: LED conexi\u00f3n GPIO0<\/li>\n<\/ul>\n\n\n\n<p>Por el uso en operaci\u00f3n de los pines de comunicaci\u00f3n Serial (GPIO1 y GPIO3) se descartan las lineas Serial.print().<\/p>\n\n\n\n<p>Si la subida del archivo.ino al m\u00f3dulo ESP01&nbsp; se realiza fuera de la placa PCB.<br>Si el dise\u00f1o realizado permite conectar un m\u00f3dulo USB-TTL a la placa PCB. Revise la configuraci\u00f3n de las botoneras Reset, PROG o DIP-switch para realizar la carga del <strong><em>archivo.ino<\/em><\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Funciones repetitivas<\/h2>\n\n\n\n<p>La conexi\u00f3n a WIFI y comunicaci\u00f3n por MQTT&nbsp; al ser repetitivas entre algoritmos se separan en funciones,&nbsp; simplificando la configuraci\u00f3n inicial (setup) y el bloque principal (loop).<\/p>\n\n\n\n<p>Al inicio se definen las librer\u00edas y los valores para la conexi\u00f3n WIFI y los datos para comunicarse con el servidor MQTT-Mosquitto implementado en el Raspberry. Revisar de ser necesario la secci\u00f3n \"Broker\".<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 funci\u00f3n para actuador<\/h3>\n\n\n\n<p>Para procesar las instrucciones enviadas por el broker MQTT se dispne de la funci\u00f3n callback().<\/p>\n\n\n\n<p>Para el control del Rel\u00e9 se usa la funci\u00f3n <code>ACTUADORactivaestado()<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.2 Funci\u00f3n para sensor<\/h3>\n\n\n\n<p>Para monitorear sensor se usa una interrupci\u00f3n para sensar cambios de estado. Por el control de rebotes, se considera los intervalos entre cambios implementado en la funci\u00f3n SensorActivado(). De confirmarse el cambio se pasa a publicar el estado en el broker MQTT con SENSORpublicaestado()<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n\/* ESP8266 Interruptor AC.\n * \u00a0edelros@espol.edu.ec\n * \u00a0Sensor-Actuador Binario, \n * \u00a0control de un Relay con Tomacorriente o foco.\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\/\/ WIFI: conexi\u00f3n a Router\nchar* ssid = &quot;xxxx&quot;;\nchar* password = &quot;xxxx&quot;;\n\n\/\/ MQTT: Servidor\nchar* MQTT_IP = &quot;192.168.xx.xx&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_luz1&quot;;\nchar* MQTT_TOPIC = &quot;oficina\/luz1\/estado&quot;;\nchar* MQTT_COMMAND = &quot;oficina\/luz1\/cambia&quot;;\nchar MQTT_SensorEstado&#x5B;10] = &quot;OFF&quot;;\nchar MQTT_ActuadorEstado&#x5B;10] = &quot;OFF&quot;;\nvolatile boolean mqtt_desconectado = true;\n\nchar* sensor_ON \u00a0= &quot;ON&quot;;\nchar* sensor_OFF = &quot;OFF&quot;;\n\n\/\/ Actuador Tomacorriente-Luz\nconst uint8_t actuador_pin = 3;\nvolatile boolean actuador_estado = false;\n\n\/\/ Sensor Interruptor\nconst uint8_t sensor_pin = 1;\nvolatile boolean sensor_estado = false;\nvolatile boolean sensor_bandera = true;\n\n\/\/ LED monitor \/\/interno: ESP01-pin=1, ESP07-pin=2\nconst uint8_t LED_pin=0;\nconst uint8_t LED_actuador = 2;\n\n\/\/ Clientes WiFi y MQTT\nWiFiClient wifiClient;\nPubSubClient mqttclient(wifiClient);\n\nvoid setup() {\n \u00a0\/\/ SENSOR Interruptor\n \u00a0pinMode(sensor_pin, INPUT);\n \u00a0attachInterrupt(digitalPinToInterrupt(sensor_pin),sensorActivado,CHANGE);\n \u00a0\n \u00a0\/\/ ACTUADOR Tomacorriente\n \u00a0pinMode(actuador_pin, OUTPUT);\n \u00a0pinMode(LED_actuador, OUTPUT);\n \u00a0\u00a0\n \u00a0\/\/ LED monitor, Enciende en LOW\n \u00a0pinMode(LED_pin, OUTPUT);\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\/\/ Revisa cambios en interruptor\n \u00a0if (sensor_bandera){\n \u00a0\u00a0\u00a0\u00a0\u00a0delay(10);\n \u00a0\u00a0\u00a0\u00a0\u00a0sensor_estado = digitalRead(sensor_pin);\n \u00a0\u00a0\u00a0if (sensor_estado==LOW){\n \u00a0\u00a0\u00a0\u00a0\u00a0actuador_estado = true;\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0if (sensor_estado ==HIGH){\n \u00a0\u00a0\u00a0\u00a0\u00a0actuador_estado = false;\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0ACTUADORactivaestado();\n \u00a0\u00a0\u00a0publica_estado();\n \u00a0\u00a0\u00a0sensor_bandera = false;\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\n\/\/ ISR interrupci\u00f3n activada\nICACHE_RAM_ATTR void sensorActivado(){\n \u00a0sensor_bandera = true;\n \u00a0}\n\n\/\/ Actuador activar estado\nvoid ACTUADORactivaestado(){\n \u00a0if (actuador_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(actuador_pin, LOW);\n \u00a0\u00a0\u00a0\u00a0\u00a0digitalWrite(LED_actuador, HIGH);\n \u00a0\u00a0\u00a0}else{\n \u00a0\u00a0\u00a0\u00a0\u00a0digitalWrite(actuador_pin, HIGH);\n \u00a0\u00a0\u00a0\u00a0\u00a0digitalWrite(LED_actuador, LOW);\n \u00a0\u00a0\u00a0}\n\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 (mqttclient.connected()==true){\n \u00a0\u00a0\u00a0\u00a0\u00a0mqttclient.publish(MQTT_TOPIC,MQTT_ActuadorEstado,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 \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\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 \u00a0}\n\nvoid inicia_mqtt(){\n \u00a0int intentos = 2;\n \u00a0int cuenta = 0;\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 \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 \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 \u00a0&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\u00a0ACTUADORactivaestado();\n \u00a0\u00a0\u00a0publica_estado();\n \u00a0\u00a0\u00a0}\n \u00a0}\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>1. Instrucciones en Arduino IDE Como la versi\u00f3n del ESP8266-01 no dispone de muchos pines de trabajo, se define el uso de los pines como: Por el uso en operaci\u00f3n de los pines de comunicaci\u00f3n Serial (GPIO1 y GPIO3) se descartan las lineas Serial.print(). Si la subida del archivo.ino al m\u00f3dulo ESP01&nbsp; se realiza fuera [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1431667],"tags":[],"class_list":["post-1840","post","type-post","status-publish","format-standard","hentry","category-wifi-tomacorriente-interruptor"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/1840","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=1840"}],"version-history":[{"count":8,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/1840\/revisions"}],"predecessor-version":[{"id":4877,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/1840\/revisions\/4877"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=1840"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=1840"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=1840"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}