Montaje
Pues exactamente igual a la central de antes
El programa
/*
* Created by Aurelio Gallardo Rodríguez
* Based on: K. Suwatchai (Mobizt)
*
* Email: aurelio@seritium.es
*
* CENTRAL. Lectura
*
* Julio - 2019
*
*/
//FirebaseESP8266.h must be included before ESP8266WiFi.h
#include "FirebaseESP8266.h"
#include <ESP8266WiFi.h>
#define FIREBASE_HOST "[elquesea].firebaseio.com"
#define FIREBASE_AUTH "sdfsgdlkm3485j3dfu992349322njfewrtet" //inventado
#define WIFI_SSID "miSSID"
#define WIFI_PASSWORD "miCONTRASEÑA"
//Define FirebaseESP8266 data object
FirebaseData bd;
String path = "/Estaciones"; // path a FireBase
char *estaciones[]= {"A","B","C","D","E"}; // Estaciones que voy a controlar
int i=1; // contador general
int activo=0; // Alarma
#define LED 5 // D1(gpio5)
void setup()
{
Serial.begin(115200);
pinMode(LED, OUTPUT);
// conectando a la WIFI
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Conectando a la WiFi");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(300);
}
Serial.println();
Serial.print("Conectado con IP: ");
Serial.println(WiFi.localIP());
Serial.println();
// Conectando a la bd real Time Firebase
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
Firebase.reconnectWiFi(true);
//Set database read timeout to 1 minute (max 15 minutes)
Firebase.setReadTimeout(bd, 1000 * 60);
//tiny, small, medium, large and unlimited.
//Size and its write timeout e.g. tiny (1s), small (10s), medium (30s) and large (60s).
Firebase.setwriteSizeLimit(bd, "unlimited");
}
// Bucle principal
void loop() {
activo=0; // reinicializo la variable
for(i=0;i<=4;i++) {
delay(1);
activo=activo+rFB("/"+(String) estaciones[i]);
}
digitalWrite(LED,(activo>=1)); // activo el LED si es mayor o igual a 1.
}
// Función de lectura
int rFB(String estacion){// lee el dato de la entrada correspondiente
int valor=0;
if (Firebase.getInt(bd, pathestacion)) {
if (bd.dataType() == "int") {
Serial.println("Dato leído: "+ path+estacion+ " --> " +(String) bd.intData());
valor = bd.intData(); // retorna el valor
}
} else {
// Si no existe el dato de la estación, salta el error
// Pero el error se muestra en pantalla (bd.errorReason()) Y REINICIALIZA LA UNIDAD, lo cual no quiero.
Serial.println("Estoy dando un error... ojo");
// Serial.println(bd.errorReason());
}
return valor;
}
= = = = = = = = =
Explico simplemente qué cambia respecto al programa de la entrada anterior.
- Defino un array tipo string con las cinco estaciones que puede leer la central: char *estaciones[]= {"A","B","C","D","E"}. Evidentemente esto es ampliable y modificable.
- Defino la variable activo. Será cero si no se activa ninguna estación, y uno o más de uno si se activa una o más estaciones.
- Solamente defino la salida del led de activación #define LED 5 y pinMode(LED, OUTPUT).
- SETUP --> Las instrucciones de conexión son las mismas, tanto para la conexión WiFi como para la de Firebase.
- rFB(String estacion) --> La función de lectura es idéntica a la de la entrada anterior. Solo cambia que devuelve cero si no es capaz de encontrar un dato, evitando ejecutar .errorReason(), y puedo pasar como variable la estacion que quiero leer.
- LOOP --> El programa es sencillo. Empieza siempre con activo=0 y lee desde un bucle todas las estaciones (que deben tener valores 0 o 1). Suma sus valores, de forma que si una está activa, activo valdrá uno y 3 si hay tres activas. Actuará sobre el led encendiéndolo si activo es un número mayor o igual que uno.
No hay comentarios:
Publicar un comentario