5. Sensor de Batería/Temp-Hum ESP-07

Se implementa un dispositivo alimentado por baterías a partir del sensor de Temperatura/Humedad con el sensor DHT11.

El dispositivo es de tipo inalámbrico, WIFI, usa protocolo MQTT para comunicación con el broker y es implementado con ESP8266 versión ESP-07. El ESP-07 tiene una entrada de tipo analógica en el rango [0,1] de 10 bits, 1024 muestras [0,1023].

Premisas para el desarrollo del prototipo, versión 1:

  • Supone que ya se ha implementado un Broker MQTT
  • Dispone de Arduino IDE para cargar las instrucciones en el ESP9266-07 (Revisar)
  • Dispone de una base para el desarrollo de dispositivos, verificando funcionamiento de WIFI y MQTT, en formato DIY (Do It Yourself)
  • Identifica otros elementos de desarrollo e inconvenientes para la implementación.
  • Usa diseños abiertos tipo: Open hardware y Open software
  • Usa componentes disponibles en el mercado local
  • Considera alternativas para los componentes que solo se puedan conseguir por internet
  • Conecta dispositivos por medios inalámbricos.

Para activar el Sensor en la plataforma con Raspberry, consulte la sección de Broker, donde se detallan las instrucciones.

Observaciones

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

Se descartó el uso de bancos de baterias para celulares a pesar de tener disponibilidad, para realizar mediciones de consumo y considerar realizar el experimento con baterias no recargables AA

  • La temperatura puede ser medida a intervalos largos, por ejemplo 1 hora.
  • Entre intervalos de lecturas se pone en modo sleep el sensor, para ahorrar energía.
  • Se prueban los modos de ahorro de energía para el ESP-07 en modo Deep-Sleep.  Se analiza luego el uso de otros modos para otro tipo de sensores.

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


Esquema Propuesto

Para sensar el estado de la batería se usa el convertidor analógico-digital ADC marcado como pin A0.

El pin analógico tiene rango de operación entre 0 y 1 Voltio, 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 cerrar su operación.

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 GPIO5 usando un optoacoplador. El optoacoplador también fue usado en el actuador binario, tratando de reutilizar técnicas anteriores.

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.


Protoboard

Se usó un ESP-07 adaptado a una placa con pines que permita su inserción. La adaptación con pines funciona, sin embargo, para implementación 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.


Circuito impreso – PCB

En el modelo presentado, la placa principal es la del sensor. Por generalidad se mantiene en placa separada la fuente AC, y el programa también muestra la relación con el porta-batería.


Instrucciones Arduino

Se reutilizan las funciones de conexión a WIFI y al servidor MQTT.

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).

Se han separado el sensor de batería y el sensor de temperatura y humedad en dos funciones.

En el circuito se implementaron las partes de comunicación serial para monitorear el estado del circuito y reprogramación una vez que se encuentra en la placa.

/* 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);
            }
        }
    }
}

Implementación con una caja eléctrica Dexon

Lecturas registradas con baterías, con periodos de lectura cada 5 segundos, se lograron obtener hasta 4600 muestras antes de que se presentara el apagado del dispositivo.

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.