1. Instrucciones en Arduino IDE
Como la versión del ESP8266-01 no dispone de muchos pines de trabajo, se define el uso de los pines como:
- monitor de operación del dispositivo: LED interno, GPIO1 (TXD)
- control Actuador en GPIO2, pin 3, que es usado para la modo de operación al iniciar el dispositivo. Luego de iniciado se lo puede reconfigurar.
Por el uso en operación de los pines de comunicación Serial (GPIO1 y GPIO3) se descartan las lineas Serial.print() convirtiendolas en comentarios «//».
El diseño realizado permite conectar un módulo USB-TTL a la placa PCB. Revise la configuración de las botoneras Reset, PROG y los Jumpers para realizar la carga del archivo.ino.
Si la subida del archivo.ino al módulo ESP01 se realiza fuera de la placa PCB revise nuevamente la configuración de PCB para que trabaje en modo «Ejecutar» luego de insertar el módulo ESP01.
2. Funciones repetitivas
Para las acciones repetitivas como la conexión a WIFI y comunicación por MQTT se realizan en funciones para simplificar las instrucciones en la configuración inicial (setup) y la ejecución principal (loop).
Al inicio se definen las librerías y los valores para la conexión WIFI y los datos para comunicarse con el servidor MQTT-Mosquitto implementado en el Raspberry. Revisar de ser necesario al sección Broker.
2.1 función para actuador
Para procesar las instrucciones enviadas por el Broker en MQTT se añade la función callback().
Para el control del Relé se usa la función 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é.)
/* ESP8266 Interruptor AC. edelros@espol.edu.ec * Sensor-Actuador Binario, control de un Relay con Tomacorriente o foco. * Para usar, actualice las secciones de: * - WIFI:Router, MQTT:Servidor, MQTT:Dispositivo * ESP-01 al usar GPIO1 y GPIO3,(Tx,Rx), NO USE Serial.print() */ #include <ESP8266WiFi.h> #include <PubSubClient.h> // WIFI: conexión a Router char* ssid = "iotirni19"; char* password = "anera2018"; // MQTT: Servidor char* MQTT_IP = "192.168.10.100"; uint16_t MQTT_puerto = 1883; char* MQTT_usuario = "usuarioprueba"; char* MQTT_contrasena = "usuarioclave"; // MQTT: Dispositivo Interruptor char* MQTT_ID = "oficina_luz1"; char* MQTT_TOPIC = "oficina/luz1/estado"; char* MQTT_COMMAND = "oficina/luz1/cambia"; char MQTT_SensorEstado[10] = "OFF"; char MQTT_ActuadorEstado[10] = "OFF"; volatile boolean mqtt_desconectado = true; char* sensor_ON = "ON"; char* sensor_OFF = "OFF"; // Actuador Tomacorriente-Luz const uint8_t actuador_pin = 3; volatile boolean actuador_estado = false; volatile boolean actuador_bandera = true; // LED monitor //interno: ESP01-pin=1, ESP07-pin=2 const uint8_t LED_pin=0; const uint8_t LED_actuador = 2; // Clientes WiFi y MQTT WiFiClient wifiClient; PubSubClient mqttclient(wifiClient); void setup() { // ACTUADOR Tomacorriente pinMode(actuador_pin, OUTPUT); pinMode(LED_actuador, OUTPUT); // LED monitor, Enciende en LOW pinMode(LED_pin, OUTPUT); // conexión WIFI y MQTT inicia_wifi(); if (WiFi.status() == WL_CONNECTED){ inicia_mqtt(); } } void loop() { // Revisa cambios en interruptor if (actuador_bandera){ ACTUADORactivaestado(); if (mqttclient.connected()){ publica_estado(); } actuador_bandera = false; } yield(); // procesa wifi if (WiFi.status() != WL_CONNECTED){ inicia_wifi(); }else{ if (!mqttclient.connected()){ mqtt_desconectado = true; inicia_mqtt(); }else{ mqttclient.loop(); if (mqtt_desconectado==true){ publica_estado(); mqtt_desconectado==false; } } } yield(); // procesa wifi } // Actuador activar estado void ACTUADORactivaestado(){ if (actuador_estado){ // ACTUADOR ACTIVA EN LOW // LED actuador ilumina en apagado digitalWrite(actuador_pin, LOW); digitalWrite(LED_actuador, HIGH); }else{ digitalWrite(actuador_pin, HIGH); digitalWrite(LED_actuador, LOW); } } // Publicar el estado del dispositivo void publica_estado() { if (actuador_estado){ snprintf (MQTT_ActuadorEstado,10, sensor_ON); }else{ snprintf (MQTT_ActuadorEstado,10, sensor_OFF); } mqttclient.publish(MQTT_TOPIC,MQTT_ActuadorEstado,true); mqttclient.subscribe(MQTT_COMMAND); } void inicia_wifi(){ int intentos = 20; int cuenta = 0; WiFi.begin(ssid, password); while ((WiFi.status() != WL_CONNECTED) && (cuenta<=intentos)){ cuenta = cuenta+1; // Parpadeo de Monitor enciende en LOW digitalWrite(LED_pin, LOW); delay(250); digitalWrite(LED_pin, HIGH); delay(250); } } void inicia_mqtt(){ int intentos = 4; int cuenta = 0; mqttclient.setServer(MQTT_IP, MQTT_puerto); mqttclient.connect(MQTT_ID, MQTT_usuario, MQTT_contrasena); mqttclient.setCallback(callback); while (!mqttclient.connected() && (cuenta<=intentos)) { cuenta = cuenta + 1; // Parpadeo de Monitor enciende en LOW digitalWrite(LED_pin, LOW); delay(600); digitalWrite(LED_pin, HIGH); delay(400); } if (mqttclient.connected()){ publica_estado(); } } // llega mensaje MQTT void callback(char* p_topic, byte* p_payload, unsigned int p_length) { // convierte a texto String payload; for (uint8_t i = 0; i < p_length; i++) { payload.concat((char)p_payload[i]); } // revisa mensaje por topico if (String(MQTT_COMMAND).equals(p_topic)) { if (payload.equals(String(sensor_ON))) { if (actuador_estado != true) { actuador_estado = true; } } if (payload.equals(String(sensor_OFF))) { if (actuador_estado != false) { actuador_estado = false; } } actuador_bandera = true; } }