I have a small project using Firebase, ESP32
Android app has 5 switch button, when I click it, Firebase will receive that value, then esp32 will read the value and output signal
if(Firebase.RTDB.getInt(&fbdo, "/control/relay0"))
newStatus_relay0 = fbdo.intData();
Esp32 always get value on firebase and it slow execution time and make delay. So I want when the value changes, esp32 will get it
I had read example of DataChangesListener, but I dont understand it
And this is my code
Firebase lib: GitHub - mobizt/Firebase-ESP32: 🔥 Firebase RTDB Arduino Library for ESP32. The complete, fast, secured and reliable Firebase Arduino client library that supports CRUD (create, read, update, delete) and Stream operations.
#define RELAY0 19
#define RELAY1 18
#define RELAY2 5
#define RELAY3 17
#define RELAY4 16
//FIREBASE
#include <WiFi.h>
#include <FirebaseESP32.h>
#include <addons/TokenHelper.h>
#include <addons/RTDBHelper.h>
#define WIFI_SSID "****"
#define WIFI_PASSWORD "****"
#define API_KEY "****"
#define DATABASE_URL "****"
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
int oldStatus_door = 0;
int newStatus_door = 0;
int oldStatus_relay0 = 0;
int newStatus_relay0 = 0;
int oldStatus_relay1 = 0;
int newStatus_relay1 = 0;
int oldStatus_relay2 = 0;
int newStatus_relay2 = 0;
int oldStatus_relay3 = 0;
int newStatus_relay3 = 0;
int oldStatus_relay4 = 0;
int newStatus_relay4 = 0;
unsigned long time1 = millis();
void setup()
{
Serial.begin(115200);
pinMode(RELAY0,OUTPUT);
pinMode(RELAY1,OUTPUT);
pinMode(RELAY2,OUTPUT);
pinMode(RELAY3,OUTPUT);
pinMode(RELAY4,OUTPUT);
pinMode(CTHT,INPUT);
Serial.println();
Serial.println();
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(300);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
Serial.printf("Firebase Client v%s\n\n", FIREBASE_CLIENT_VERSION);
config.api_key = API_KEY;
config.database_url = DATABASE_URL;
config.signer.tokens.legacy_token = "***";
config.token_status_callback = tokenStatusCallback;
Firebase.begin(&config, &auth);
Firebase.reconnectWiFi(true);
}
void loop(){
controlRelay();
}
void controlRelay(){
if(Firebase.RTDB.getInt(&fbdo, "/control/relay0"))
newStatus_relay0 = fbdo.intData();
if(Firebase.RTDB.getInt(&fbdo, "/control/relay1"))
newStatus_relay1 = fbdo.intData();
if(Firebase.RTDB.getInt(&fbdo, "/control/relay2"))
newStatus_relay2 = fbdo.intData();
if(Firebase.RTDB.getInt(&fbdo, "/control/relay3"))
newStatus_relay3 = fbdo.intData();
if(Firebase.RTDB.getInt(&fbdo, "/control/relay4"))
newStatus_relay4 = fbdo.intData();
oldStatus_relay0 = digitalRead(RELAY0);
oldStatus_relay1 = digitalRead(RELAY1);
oldStatus_relay2 = digitalRead(RELAY2);
oldStatus_relay3 = digitalRead(RELAY3);
oldStatus_relay4 = digitalRead(RELAY4);
if (oldStatus_relay0 != newStatus_relay0){
oldStatus_relay0 = newStatus_relay0;
digitalWrite(RELAY0, oldStatus_relay0);
}
if (oldStatus_relay1 != newStatus_relay1){
oldStatus_relay1 = newStatus_relay1;
digitalWrite(RELAY1, oldStatus_relay1);
}
if (oldStatus_relay2 != newStatus_relay2){
oldStatus_relay2 = newStatus_relay2;
digitalWrite(RELAY2, oldStatus_relay2);
}
if (oldStatus_relay3 != newStatus_relay3){
oldStatus_relay3 = newStatus_relay3;
digitalWrite(RELAY3, oldStatus_relay3);
}
if (oldStatus_relay4 != newStatus_relay4){
oldStatus_relay4 = newStatus_relay4;
digitalWrite(RELAY4, oldStatus_relay4);
}
}