1.3 Sensor Puerta-Ventana: Archivo.ino

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)
  • lectura de sensor en GPIO3, pin 7, mismo que es configurado como RXD en modo PROG.

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 //. La instrucción para encender el LED de monitor también activa para TXD, por lo que de tener conectado la comunicación serial podría mostrar caracteres ilegibles.

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.

/* ESP8266 Sensor de Puerta. edelros@espol.edu.ec
 *  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 = "xxxx";
char* password = "xxxx";

// MQTT: Servidor
char* MQTT_IP = "192.168.xx.xx";
uint16_t MQTT_puerto = 1883;
char* MQTT_usuario = "usuarioprueba";
char* MQTT_contrasena = "usuarioclave";

// MQTT: Dispositivo Interruptor
char* MQTT_ID = "oficina_puerta1";
char* MQTT_TOPIC = "oficina/puerta1/estado";
char MQTT_SensorEstado[10] = "OFF";
volatile boolean mqtt_desconectado = true;
char* sensor_ON  = "ON";
char* sensor_OFF = "OFF";

// Sensor Interruptor
const uint8_t sensor_pin = 1;
volatile boolean sensor_estado = false;
volatile boolean sensor_bandera = true;

// Actuador LED
volatile boolean actuador_estado = false;
const uint8_t LED_actuador = 2;

// LED monitor //interno: ESP01-pin=1, ESP07-pin=2
const uint8_t LED_pin=0;

// Clientes WiFi y MQTT
WiFiClient wifiClient;
PubSubClient mqttclient(wifiClient);

void setup() {
  // SENSOR Interruptor
  pinMode(sensor_pin, INPUT);
  attachInterrupt(digitalPinToInterrupt(sensor_pin),sensorActivado,CHANGE);
  
  // ACTUADOR LED
  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 (sensor_bandera){
      delay(10);
      sensor_estado = digitalRead(sensor_pin);
    if (sensor_estado==LOW){
      actuador_estado = true;
      }
    if (sensor_estado ==HIGH){
      actuador_estado = false;
      }
    ACTUADORactivaestado();
    publica_estado();
    sensor_bandera = false;
    }
  yield(); // procesa wifi
  
  if (WiFi.status() != WL_CONNECTED){
    inicia_wifi();
    }else{
    if (mqttclient.connected()==false){
        mqtt_desconectado = true;
        inicia_mqtt(); // reintento
      }
    if (mqttclient.connected()==true){
      if (mqtt_desconectado==true){
        publica_estado();
        mqtt_desconectado=false;
        }
      mqttclient.loop();
      }
    }
  yield(); // procesa wifi
}

// ISR interrupción activada
ICACHE_RAM_ATTR void sensorActivado(){
  sensor_bandera = true;
  }

// Actuador activar estado
void ACTUADORactivaestado(){
  if (actuador_estado){
      // LED actuador ilumina en apagado
      digitalWrite(LED_actuador, HIGH);
    }else{
      digitalWrite(LED_actuador, LOW);
    }

  }

// Publicar el estado del dispositivo
void publica_estado() {
    if (actuador_estado){
      snprintf (MQTT_SensorEstado,10, sensor_ON);
    }else{
      snprintf (MQTT_SensorEstado,10, sensor_OFF);
    }
    if (mqttclient.connected()==true){
      mqttclient.publish(MQTT_TOPIC,MQTT_SensorEstado,true);
    }else{
      mqtt_desconectado = true;
    }
}

void inicia_wifi(){
  int intentos = 10;
  int cuenta = 0;
  WiFi.mode(WIFI_STA);
  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(300);
    digitalWrite(LED_pin, HIGH);
    delay(200);
    }
  }

void inicia_mqtt(){
  int intentos = 2;
  int cuenta = 0;
  
  mqttclient.setServer(MQTT_IP, MQTT_puerto);
  mqttclient.connect(MQTT_ID, MQTT_usuario, MQTT_contrasena);
  
  while (!mqttclient.connected() && (cuenta<intentos)) {
    cuenta = cuenta + 1;
    // Parpadeo de Monitor enciende en LOW
    digitalWrite(LED_pin, LOW);
    delay(200);
    digitalWrite(LED_pin, HIGH);
    delay(200);
    }
  publica_estado();
  }

1.2 Sensor Puerta-Ventana: Esquemático ESP01

1. Esquemático con ESP01

El esquemático se divide en varias secciones mostradas en la figura y descritas a continuación.

1.1 Sensor

El sensor es un interruptor magnético, de los que se usa en los sistemas de seguridad como sensor de puertas y ventanas.

1.2 Controlador

Centrado en ESP8266-01 con conector para sensor. La activación del módulo se realiza de acuerdo a lo descrito en el manual del módulo. Revisar en la sección «Módulos» ESP8266 versión ESP-01.

El reinicio del dispositivo se controla con la botonera «Reset» al cambiar el pin a estado BAJO (GND). El estado predeterminado es ALTO por medio de R1 y C1 minimiza los rebotes del pulsador.

1.2.1 Modo Ejecución

La operación predeterminada es «Ejecutar Programa» por medio de R3 hacia estado ALTO (pullup HIGH) y un jumper entre los Pines Sensor-RX. El Jumper conecta el Pin RXD a la entrada del sensor magnético.

Para tomar la lectura de estado del sensor, se usa el pin RX configurado como entrada y estado predeterminado en ALTO con R5. El capacitor C2 se usa para minimizar las señales de rebote que se presentan en los interruptores.

1.2.2 Modo Cargar Programa

La carga de las instrucciones en archivo.ino se la realiza fuera de la placa mostrada.

La botonera Reset dispone de R1 hacia estado predeterminado ALTO y C1 se usa para minimizar los rebotes.

La configuración se completa manteniendo el estado de GPIO2 en estado ALTO (pullup HIGH) con R2 y el pin de CH_PD a estado ALTO mediante R4.

1.3 Fuente DC

Conformada por el Regulador d 110VAC  a 5VDC, y el Regulador de 5VDC a 3.3VDC usando el módulo AMS1117.

Los componentes usados o sus sus componentes alternos se describen en la sección de Fuentes de Alimentación para Módulos.

http://blog.espol.edu.ec/edelros/fuente-de-alimentacion-a-3-3vdc/


2. Ensamble en Protoboard

Para probar el circuito se ensambla en un protoboard teniendo como guía el diagrama del circuito del punto anterior.


Considere que como guía se incluye la parte de conexión AC. Se recomienda realizarla separada y tomando las precauciones de aislamiento que correspondan.


3. Circuito impreso – PCB

El diseño se ha realizado en dos placas por flexibilidad de ensamble. La placa de fuente de alimentación se puede reemplazar por un cargador USB, conectando a la primera placa del dispositivo a los conetores +5VDC-.

Para el archivo de producción de placa, escribir al email de contacto al final de la página.

Alternativas durante el proceso de desarrrollo

Durante el desarrollo del prototipo se usó una placas perforadas de circuito impreso de 4×6 cm.

Luego de algunas pruebas, se presenta la versión 2 del circuito impreso.

1.1 Sensor Puerta-Ventana

Presentación

El dispositivo inalámbrico se usa para registrar el estado abierto o cerrado de una puerta o ventana.

Se conoce como sensor binario por determinar estados ON/OFF.

El dispositivo es de tipo inalámbrico-WIFI, usa protocolo MQTT para la comunicación con el broker y se implementa con ESP8266, en modalidad DIY (Do It Yourself).
En éste caso el diseño usa la versión ESP-01.

implementación versión 1

La versión 1 mostrada en la imagen se ha instalado en una puerta en una caja sobrepuesta plástica.


El sensor es un interruptor magnético y la alimentación se realiza con una fuente 110VAC a 5VDC obtenida de un cargador de celular (económico). Se ha usado una placa perforada para ensamblar el prototipo, sin embargo al final se presenta el diseño de la placa de circuito.

Una segunda versión en placa perforada, probando los espacios para el diseño de la PCB.

Premisas para desarrrollo en la versión 1

  • Diseño de dispositivos con conexión inalámbrica WIFI
  • Conoce los datos para conexión a la red a WIFI y broker MQTT
  • Dispone de acceso a un broker MQTT local
  • Dispone de Arduino IDE para cargar las instrucciones en el ESP8266
  • Emplea diseños abiertos tipo: Open Hardware y Open Software
  • Dispone de los componentes en el mercado local
  • Considera componentes alternos a los no disponibles en el mercado local
  • Identifica las etapas de desarrollo e inconvenientes en la implementación.

Temas para desarrollo posterior

  • Otros dispositivos tipo actuadores
  • Ampliar la forma de carga de scripts en el tablero, de forma alámbrica o inalámbrica.
  • Analizar consumos de corriente para uso con baterías.
  • Revisar el uso de los canales WIFI para evitar desconexiones por saturación de canal.

1.4 Sensor Puerta-Ventana: MQTT-HA

Esta es la última sección a realizar, pues se supone que tiene listo el dispositivo, construido y operativas las partes: Dispositivo y Broker.

El objetivo es incorporar dispositivo sensor puerta-ventana en el broker MQTT y observar los resultados.

Se plantea observar los estados del dispositivo en dos formas:

  • Desde un navegador en la página local de Home-Assistant
  • Desde una consola conectando al servidor MQTT

1. Incorporar el dispositivo en Home Assistant

Se requiere modificar el archivo configuration.yaml en el raspberry.

Se puede realizar en forma local desde el raspberry que tiene monitor, teclado y mouse conectado, y editar el archivo que se encuentra en el directorio:

 /home/homeassistant/.homeassistant/configuration.yaml

La otra forma es conectarse via remota por medio de una sesión ssh. Requiere dirección, usuario y password. Los detalles se dan en la sección Raspberry.

En el archivo se añade los datos del dispositivo sensor, que en el caso del sensor de puerta ventana se clasifica como un sensor de dos estados (binary sensor).

El sensor trabaja con MQTT, se le asigna un nombre más sencillo de reconocer como «puerta oficina»y se complementa con la instrucción de identificación en el formato: lugar/cosa/acción.

binary_sensor:
  - platform: mqtt
    name: 'oficina_puerta1'
    state_topic: "oficina/puerta1/estado"

Se graba el archivo, y se pasa al procedimiento de prueba desde la página de Home-Assistant, seccion de configuración, para luego reiniciar Home-Assistant dese la misma página. (configuration, restart)

El resultado se observa desde una página en un navegador como se muestra en las figuras: para las posiciones de puerta cerrada y abierta

   

Observe el estado de la puerta y la gráfica mostrada en la pantalla del equipo.

  

Referencia: https://www.home-assistant.io/components/binary_sensor.mqtt/

1.2  Monitoreo desde MQTT

Para monitorear señal desde consola Raspberry usando MQTT, usar la instrucción:

mosquitto_sub -h 192.168.10.100 -t oficina/puerta1/contact

Se observarán los valores de cambio de estado cada vez que se realice un cambio en el sensor.