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