{"id":1860,"date":"2019-08-10T10:28:09","date_gmt":"2019-08-10T15:28:09","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/edelros\/?p=1860"},"modified":"2020-09-26T14:58:36","modified_gmt":"2020-09-26T19:58:36","slug":"actuador-tomacorriente-archivo-ino","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/actuador-tomacorriente-archivo-ino\/","title":{"rendered":"2.3 IoT WiFi Actuador Tomacorriente: Archivo.ino"},"content":{"rendered":"<h4>1. Instrucciones en Arduino IDE<\/h4>\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<ul>\n<li>monitor de operaci\u00f3n del dispositivo: LED interno, GPIO1 (TXD)<\/li>\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<p>Por el uso en operaci\u00f3n de los pines de comunicaci\u00f3n Serial (GPIO1 y GPIO3) se descartan las lineas Serial.print() convirtiendolas en comentarios \"\/\/\".<\/p>\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<p>Si la subida del archivo.ino al m\u00f3dulo ESP01\u00a0 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<h4>2. Funciones repetitivas<\/h4>\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<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<h5>2.1 funci\u00f3n para actuador<\/h5>\n<p>Para procesar las instrucciones enviadas por el Broker en MQTT se a\u00f1ade la funci\u00f3n callback().<\/p>\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<pre>\/* 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 = \"iotirni19\";\nchar* password = \"anera2018\";\n\n\/\/ MQTT: Servidor\nchar* MQTT_IP = \"192.168.10.100\";\nuint16_t MQTT_puerto = 1883;\nchar* MQTT_usuario = \"usuarioprueba\";\nchar* MQTT_contrasena = \"usuarioclave\";\n\n\/\/ MQTT: Dispositivo Interruptor\nchar* MQTT_ID = \"oficina_luz1\";\nchar* MQTT_TOPIC = \"oficina\/luz1\/estado\";\nchar* MQTT_COMMAND = \"oficina\/luz1\/cambia\";\nchar MQTT_SensorEstado[10] = \"OFF\";\nchar MQTT_ActuadorEstado[10] = \"OFF\";\nvolatile boolean mqtt_desconectado = true;\n\nchar* sensor_ON  = \"ON\";\nchar* sensor_OFF = \"OFF\";\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[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>\n","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: monitor de operaci\u00f3n del dispositivo: LED interno, GPIO1 (TXD) control Actuador en GPIO2, pin 3, que es usado para la modo de operaci\u00f3n al iniciar el dispositivo. Luego de iniciado &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.espol.edu.ec\/girni\/actuador-tomacorriente-archivo-ino\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \"2.3 IoT WiFi Actuador Tomacorriente: Archivo.ino\"<\/span><\/a><\/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-2-actuador-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":3,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/1860\/revisions"}],"predecessor-version":[{"id":2649,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/1860\/revisions\/2649"}],"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}]}}