4.4 IoT WiFi Sensor a Batería/Temp-Hum: Archivo.ino

1. Instrucciones en Arduino IDE

El modelo ESP-07 dispone de suficientes pines que permiten incorporar las funciones de programación usando pines de una sola función. Por lo que se facilita el diseño.

Modo Ahorro de Energía

Las instrucciones se desarrollan en la parte de configuración Setup() en lugar del lazo, Loop(), debido a que se utiliza el modo de ahorro de energía (deep-sleep).

2 Funciones para sensores y actuadores

Se han separado en funciones las instrucciones para el sensor de batería y temperatura-humedad.

/* Sensor de Temperatura y Humedad DHT11
Sensor de Estado de Batería
Funcionamiento con Batería
Para usar, se debe actualizar las secciones de:
 - WIFI datos para conexión a Router
 - MQTT: Servidor MQTT 
 - MQTT: identificador de dispositivo y topics
Se está usando ESP8266-07, pero para programar,
usar Placa:ESP8285
*/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <dht.h>

// WIFI datos para conexión a Router
const PROGMEM char* ssid = "iotirni19";
const PROGMEM char* password = "anera2018";

// MQTT: Servidor MQTT 
const PROGMEM char* MQTT_SERVER_IP = "192.168.10.100";
const PROGMEM uint16_t MQTT_SERVER_PORT = 1883;
const PROGMEM char* MQTT_USER = "username";
const PROGMEM char* MQTT_PASSWORD = "password";

// MQTT: identificador de dispositivo y topics
const PROGMEM char* MQTT_CLIENT_ID = "Temp_humedad01";
const PROGMEM char* MQTT_SENSOR_TOPIC_T = "oficina/DHT_Temperatura";
const PROGMEM char* MQTT_SENSOR_TOPIC_H = "oficina/DHT_Humedad";
const PROGMEM char* MQTT_SENSOR_TOPIC_B = "oficina/DHT_Bateria";
const PROGMEM char* MQTT_SENSOR_TOPIC_BS = "oficina/DHT_BatSistema";
char MQTT_SENSOR_STATE_T[10] = "0"; // inicializa
char MQTT_SENSOR_STATE_H[10] = "0"; // inicializa
char MQTT_SENSOR_STATE_B[10] = "0"; // inicializa
char MQTT_SENSOR_STATE_BS[10] = "0"; // inicializa

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

// Sensor de Temperatura&Humedad
dht DHT;
#define DHT11_PIN 12

// Bateria
#define bat_estado A0
const PROGMEM uint8_t bat_activa = 4;

// tiempo de dormir
int durmiendo = 5; //segundos

WiFiClient wifiClient;
PubSubClient client(wifiClient);

void setup() {
    // Conexion serial
    Serial.begin(9600);//74880);
    Serial.setTimeout(2000);

    // SENSOR Temperatura&Humedad
    //pinMode(DHT11_PIN, INPUT);

    // SENSOR Bateria
    pinMode(bat_activa, OUTPUT);
    digitalWrite(bat_activa, LOW);

    // LED monitor
    pinMode(LED_pin, OUTPUT);
    // LEDactivaestado();

    // Inicia redes
    if(WiFi.status() != WL_CONNECTED){
        inicia_wifi();
        }
    if (!client.connected()){
        inicia_mqtt();
        }
    client.loop();
    
    // espera inicializar serial
    while(!Serial) { }
    // actividad al despertar
    Serial.println();
    Serial.println("despertando");
    
    // lectura de sensores
    SensorTempHum();
    SensorBateria();

    // a dormir
    Serial.println("A dormir por " + String(durmiendo) + " segundos");
    ESP.deepSleep(durmiendo*1e6); //en microsegundos
}

void loop() {
    // modo sleep usa función setup
}

void SensorTempHum(){
    int chk = DHT.read11(DHT11_PIN);
    float temperatura = DHT.temperature;
    float humedad = DHT.humidity;
    Serial.println("Temperatura,Humedad: ");
    Serial.print(temperatura);
    Serial.print(",");
    Serial.println(humedad);
    client.publish(MQTT_SENSOR_TOPIC_T, 
                    String(temperatura).c_str(), 
                    true);
    client.publish(MQTT_SENSOR_TOPIC_H, 
                    String(humedad).c_str(), 
                    true);
    delay(1000);
}
void SensorBateria(){

    // Activar, Leer, Desactivar, publicar
    digitalWrite(bat_activa, HIGH);
    
    float bateria = analogRead(A0)*(57/10)/1024;
    int bat_sistema = ESP.getVcc()*100/65535;
    //delay(5000); // observar cambio
    digitalWrite(bat_activa, LOW);
    
    Serial.println("Bateria (V), sistema (%):");
    Serial.print(bateria);
    Serial.print(",");
    Serial.println(bat_sistema);
    
    client.publish(MQTT_SENSOR_TOPIC_B,
                    String(bateria).c_str(),
                    true);
    client.publish(MQTT_SENSOR_TOPIC_BS,
                    String(bat_sistema).c_str(),
                    true);
    delay(10);
}

void inicia_wifi() {
    // conexion WiFi
    Serial.print("\n Conectando a ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);
    int cuenta = 0;
    while (WiFi.status() != WL_CONNECTED){
        Serial.print(".");
        cuenta = cuenta+1;
        if (cuenta>=40){
            Serial.println();
            cuenta = 0;}
        // LED interno enciende en LOW
        digitalWrite(LED_pin, LOW);
        delay(250);
        digitalWrite(LED_pin, HIGH);
        delay(250);
        }
    Serial.print("\n WiFi conectado \n Dirección IP: ");
    Serial.println(WiFi.localIP());
    delay(10);
}

void inicia_mqtt(){
    client.setServer(MQTT_SERVER_IP, MQTT_SERVER_PORT);
    //client.setCallback(callback);
    while (!client.connected()) {
        //Serial.println("\n Conectando a MQTT ");
        if (client.connect(MQTT_CLIENT_ID, MQTT_USER, MQTT_PASSWORD)) {
            Serial.println(" MQTT conectado");  
        } else {
            Serial.print("Falló, estado: ");
            Serial.print(client.state()); 
            Serial.print(" , reintento en 5 segundos");
            // LED interno enciende en LOW
            for (int i=0;i<=5;i=i+1){
                digitalWrite(LED_pin, LOW);
                delay(600);
                digitalWrite(LED_pin, HIGH);
                delay(400);
            }
        }
    }
}

4.5 IoT WiFi Sensor a Batería/Temp-Hum: MQTT-HA

Recuerde que los detalles del dispositivo se encuentran en la sección de ‘dispositivos’. Se supone que ya lo tiene construido y operativo.

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.

# Sensores temperatura_Humedad
sensor:
  - platform: mqtt
    name: 'oficina Temperatura'
    unit_of_measurement: '°C'
    state_topic: 'oficina/DHT_Temperatura'

  - platform: mqtt
    name: 'oficina Humedad'
    unit_of_measurement: '%'
    state_topic: 'oficina/DHT_Humedad'

  - platform: mqtt
    name: 'oficina DHT_Bateria'
    unit_of_measurement: 'V'
    state_topic: 'oficina/DHT_Bateria'

  - platform: mqtt
    name: 'oficina DHT_BateriaSistema'
    unit_of_measurement: '%'
    state_topic: 'oficina/DHT_BatSistema'

Los resultados se pueden observar en la página de Home Assistant:

4.3 IoT WiFi Sensor a Batería/Temp-Hum: Esquemático ESP-07

1. Esquematico con ESP-07

El prototipo desarrollado con el módulo ESP-07 aprovecha el pin de lectura de valores anlógicos y el modo de ahorro de energía.

1.1 Sensor

El sensor usado para temperaturas ocupa el GPIO4, pin 14, de forma semejante al usado en el prototipo con el módudo ESP-01.

El sensor de voltaje de batería usa el convertidor analógico-digital ADC marcado como A0 o pin 2. El pin analógico tiene rango de operación entre 0 y 1 VDC, por lo que se usa un divisor de voltaje de la batería. El divisor consume constantemente energía de la batería, motivo por el que se añade un interruptor para solo activarlo cuando se realice lectura de estado de la batería.

1.2 Actuador

El interruptor se puede implementar de varias formas, sin embargo, por disponibilidad local de componentes se usó un transistor PNP, que se activa con la señal enviada en GPI05 por medio de un optoacoplador.

El optoacoplador se usa también en actuador binario con tomacorriente.

1.3 Baterías

Las baterías usadas son de tipo Ni-MH,  por disponibilidad local y capacidad de recarga.

Se descartó el uso de bancos de baterias para celulares a pesar de tener disponibilidad, por su tamaño y el interés de realizar mediciones de consumo en el experimento luego con baterias no recargables AA.

Por generalidad con los dispositivos previos, se mantiene en el esquema el módulo de alimentación AC. Observe que no se encuentran conectados al diagrama principal.


2. Ensamble en Protoboard

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

Para la conexión del módulo ESP-07 se adaptó a una placa perforada con pines que permitían insertarlos en el proto. La adaptación con pines funciona, sin embargo, para implementación considero que es preferible soldar directamente el módulo a la placa definitiva.

Al soldar el módulo a la placa definitiva se limita la posibilidad de actualización de instrucciones, lo que genera la necesidad de disponer de control sobre GPIO0 y los TX-RX. Se añadieron los conectores presentados en el esquemático como sección de Modo programación.


3. Circuito impreso – PCB

El diseño se ha realizado en dos placas por flexibilidad de ensamble al usar una fuente de alimentacion AC o un porta baterías. 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-

 

4.1 IoT WiFi Sensor Temperatura-Humedad ESP-07

Presentación

El dispositivo de Temperatura-Humedad es la introducción al manejo de estados de sensores con valores numéricos diferentes a los estados binarios de encendido y apagado.

El dispositivo incorpora el sensor DHT11 que entrega valores de temperatura y humedad en un mismo pin. Por lo que inicialmente el módulo ESP8266 versión ESP-01 es suficiente para cumplir con el objetivo.

Sin embargo, si posteriormente se incorpora necesidad de usar dispositivos alimentados con baterías.

Para la operación a baterías es necesario considerar:

  • Intervalos de lectura ajustables, por ejemplo 15 minutos o 1 hora
  • Operación en modo de ahorro de energía o «sleep» disponible en los módulos
  • Varios modos de ahorro de energía para el ESP8266: Modem-Sleep, Light-Sleep y Deep-Sleep

La operación del ESP8266 en modo de ahorro de energía requiere el uso de un pin para reiniciar luego de finalizado el periodo «sleep» no disponible en la versión ESP-01. En consecuencia el dispositivo se desarrolla usando el módulo ESP07 que tienes más pines de conexión.

Adicionalmente se requiere un pin para lectura analógica y el módulo ESP-07 dispone de un pin analógico con lecturas de valores de voltaje en rango [0,1] VDC  de 10 bits, 1024 muestras [0,1023].

Referenciahttps://www.espressif.com/sites/default/files/9b-esp8266-low_power_solutions_en_0.pdf


Implementación versión 1

La versión 1 del prototipo mostrada en la imagen se ha realizado en una placa perforada, alimentada por 5VDC, que se incoporan en una caja electrica.

Luego se monta sobre una caja eléctrica tipo Dexon para uso regular.

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.

Resultados de implementación a baterías

Con el prototipo operando a baterias se registraron la lecturas de temperatua y humedad cada 5 segundos, obteniendo hasta 4600 muestras consecutivas antes del apagado del dispositivo.

Temas para desarrollo posterior

  • Como siguiente actividad, se analizará ampliar el tiempo «sleep» con intervalos de lecturas mayores, revisar las fases de ejecución del código y reducción de tareas para optimización de uso de energía.
  • Otros dispositivos tipo actuadores combinado con sensores