{"id":1860,"date":"2019-08-12T10:28:09","date_gmt":"2019-08-12T15:28:09","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/edelros\/?p=1860"},"modified":"2026-08-04T22:04:28","modified_gmt":"2026-08-05T03:04:28","slug":"wifi-tomacorriente-archivo-ino","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/wifi-tomacorriente-archivo-ino\/","title":{"rendered":"WiFi - Tomacorriente: 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>monitor de operaci\u00f3n del dispositivo: LED interno, GPIO1 (TXD)<\/li>\n\n\n\n<li>control Actuador en GPIO2, pin 3, que es usado para la modo de operaci\u00f3n al iniciar el dispositivo. Luego de iniciado se lo puede reconfigurar.<\/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() convirti\u00e9ndolas en comentarios \"\/\/\".<\/p>\n\n\n\n<p>El dise\u00f1o realizado permite conectar un m\u00f3dulo USB-TTL a la placa PCB. Revise la configuraci\u00f3n de las botoneras Reset, PROG y los Jumpers para realizar la carga del <strong><em>archivo.ino<\/em><\/strong>.<\/p>\n\n\n\n<p>Si la subida del archivo.ino al m\u00f3dulo ESP01&nbsp; se realiza fuera de la placa PCB revise nuevamente la configuraci\u00f3n de PCB para que trabaje en modo \u00abEjecutar\u00bb luego de insertar el m\u00f3dulo ESP01.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Funciones repetitivas<\/h2>\n\n\n\n<p>Para las acciones repetitivas como la conexi\u00f3n a WIFI y comunicaci\u00f3n por MQTT se realizan en funciones para simplificar las instrucciones en la configuraci\u00f3n inicial (setup) y la ejecuci\u00f3n 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 al 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 en MQTT se a\u00f1ade la funci\u00f3n callback().<\/p>\n\n\n\n<p>Para el control del Rel\u00e9 se usa la funci\u00f3n ACTUADORactivaestado() que realiza acciones semejantes a la de activar el monitor LED, y permite en futuro mantener separadas las acciones sobre el ACTUADOR o Rel\u00e9.)<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n\/* ESP8266 Interruptor AC. edelros@espol.edu.ec\n *  Sensor-Actuador Binario, control de un Relay con Tomacorriente o foco.\n *  Para usar, actualice las secciones de:\n *  - WIFI:Router, MQTT:Servidor, MQTT:Dispositivo\n *  ESP-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;iotirni19&quot;;\nchar* password = &quot;anera2018&quot;;\n\n\/\/ MQTT: Servidor\nchar* MQTT_IP = &quot;192.168.10.100&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  = &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;\nvolatile boolean actuador_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  \/\/ ACTUADOR Tomacorriente\n  pinMode(actuador_pin, OUTPUT);\n  pinMode(LED_actuador, OUTPUT);\n  \n  \/\/ LED monitor, Enciende en LOW\n  pinMode(LED_pin, OUTPUT);\n\n  \/\/ conexi\u00f3n WIFI y MQTT\n  inicia_wifi();\n  if (WiFi.status() == WL_CONNECTED){\n    inicia_mqtt();\n    }\n  }\n\nvoid loop() {\n  \/\/ Revisa cambios en interruptor\n  if (actuador_bandera){\n    ACTUADORactivaestado();\n    if (mqttclient.connected()){\n      publica_estado();\n      }\n    actuador_bandera = false;\n    }\n  yield(); \/\/ procesa wifi\n  if (WiFi.status() != WL_CONNECTED){\n    inicia_wifi();\n    }else{\n      if (!mqttclient.connected()){\n        mqtt_desconectado = true;\n        inicia_mqtt();\n      }else{\n        mqttclient.loop();\n        if (mqtt_desconectado==true){\n          publica_estado();\n          mqtt_desconectado==false;\n          }\n        }\n    }\n    yield(); \/\/ procesa wifi\n}\n\n\/\/ Actuador activar estado\nvoid ACTUADORactivaestado(){\n  if (actuador_estado){\n      \/\/ ACTUADOR ACTIVA EN LOW\n      \/\/ LED actuador ilumina en apagado\n      digitalWrite(actuador_pin, LOW);\n      digitalWrite(LED_actuador, HIGH);\n    }else{\n      digitalWrite(actuador_pin, HIGH);\n      digitalWrite(LED_actuador, LOW);\n    }\n}\n\n\/\/ Publicar el estado del dispositivo\nvoid publica_estado() {\n  if (actuador_estado){\n    snprintf (MQTT_ActuadorEstado,10, sensor_ON);\n  }else{\n    snprintf (MQTT_ActuadorEstado,10, sensor_OFF);\n  }\n  mqttclient.publish(MQTT_TOPIC,MQTT_ActuadorEstado,true); \n  mqttclient.subscribe(MQTT_COMMAND);\n}\n\nvoid inicia_wifi(){\n  int intentos = 20;\n  int cuenta = 0;\n  WiFi.begin(ssid, password);\n  \n  while ((WiFi.status() != WL_CONNECTED) &amp;&amp; (cuenta&lt;=intentos)){\n    cuenta = cuenta+1;\n    \/\/ Parpadeo de Monitor enciende en LOW\n    digitalWrite(LED_pin, LOW);\n    delay(250);\n    digitalWrite(LED_pin, HIGH);\n    delay(250);\n    }\n  }\n\nvoid inicia_mqtt(){\n  int intentos = 4;\n  int cuenta = 0;\n  mqttclient.setServer(MQTT_IP, MQTT_puerto);\n  mqttclient.connect(MQTT_ID, MQTT_usuario, MQTT_contrasena);\n  mqttclient.setCallback(callback);\n  \n  while (!mqttclient.connected() &amp;&amp; (cuenta&lt;=intentos)) {\n    cuenta = cuenta + 1;\n    \/\/ Parpadeo de Monitor enciende en LOW\n    digitalWrite(LED_pin, LOW);\n    delay(600);\n    digitalWrite(LED_pin, HIGH);\n    delay(400);\n    }\n  if (mqttclient.connected()){\n      publica_estado();\n  }\n  }\n\n\/\/ llega mensaje MQTT\nvoid callback(char* p_topic, byte* p_payload, unsigned int p_length) {\n  \/\/ convierte a texto\n  String payload;\n  for (uint8_t i = 0; i &lt; p_length; i++) {\n    payload.concat((char)p_payload&#x5B;i]);\n    }\n  \/\/ revisa mensaje por topico\n  if (String(MQTT_COMMAND).equals(p_topic)) {\n    if (payload.equals(String(sensor_ON))) {\n      if (actuador_estado != true) {\n        actuador_estado = true;\n        }\n      }\n    if (payload.equals(String(sensor_OFF))) {\n      if (actuador_estado != false) {\n          actuador_estado = false;\n        }\n      }\n    actuador_bandera = true;\n    }\n  }\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() convirti\u00e9ndolas en comentarios \"\/\/\". El dise\u00f1o realizado permite conectar un m\u00f3dulo [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1430992],"tags":[1457944],"class_list":["post-1860","post","type-post","status-publish","format-standard","hentry","category-wifi-tomacorriente","tag-iot-wifi"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/1860","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=1860"}],"version-history":[{"count":10,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/1860\/revisions"}],"predecessor-version":[{"id":4874,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/1860\/revisions\/4874"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=1860"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=1860"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=1860"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}