/********* Pleasedontcode.com **********

	Pleasedontcode thanks you for automatic code generation! Enjoy your code!

	- Terms and Conditions:
	You have a non-exclusive, revocable, worldwide, royalty-free license
	for personal and commercial use. Attribution is optional; modifications
	are allowed, but you're responsible for code maintenance. We're not
	liable for any loss or damage. For full terms,
	please visit pleasedontcode.com/termsandconditions.

	- Project: "Wi-Fi LED"
	- Source Code compiled for: ESP32 DevKit V1
	- Source Code created on: 2024-06-11 14:24:29

********* Pleasedontcode.com **********/

/****** SYSTEM REQUIREMENTS *****/
/****** SYSTEM REQUIREMENT 1 *****/
	/* ESP32 code LED blinking in specific patterns to */
	/* two ESP32 devices. Red, Blue, Green and Yellow LED */
	/* blinking in a pre-programmed delays. Add Firebase */
	/* integration for web hosting, authentication and */
	/* using realtime database. */
/****** END SYSTEM REQUIREMENTS *****/


/****** DEFINITION OF LIBRARIES *****/
#include <WiFi.h>
#include <FirebaseESP32.h>  //https://github.com/mobizt/Firebase-ESP32
#include <addons/TokenHelper.h>  // Provide the token generation process info.
#include <addons/RTDBHelper.h>  // Provide an RTDB helper functions.

/****** FUNCTION PROTOTYPES *****/
void setup(void);
void loop(void);
void updateOutputs(void);
void blinkPattern(void);

/***** DEFINITION OF DIGITAL OUTPUT PINS *****/
const uint8_t GPIO23_LED_PIN_D4 = 4;
const uint8_t GPIO22_LED_PIN_D13 = 13;
const uint8_t GPIO21_LED_PIN_D14 = 14;
const uint8_t GPIO19_LED_PIN_D16 = 16;

/***** DEFINITION OF OUTPUT RAW VARIABLES *****/
/***** used to store raw data *****/
bool GPIO23_LED_PIN_D4_rawData = 0;
bool GPIO22_LED_PIN_D13_rawData = 0;
bool GPIO21_LED_PIN_D14_rawData = 0;
bool GPIO19_LED_PIN_D16_rawData = 0;

/***** DEFINITION OF OUTPUT PHYSICAL VARIABLES *****/
/***** used to store data after characteristic curve transformation *****/
float GPIO23_LED_PIN_D4_phyData = 0.0;
float GPIO22_LED_PIN_D13_phyData = 0.0;
float GPIO21_LED_PIN_D14_phyData = 0.0;
float GPIO19_LED_PIN_D16_phyData = 0.0;

/****** DEFINITION OF LIBRARIES CLASS INSTANCES*****/

// Define Firebase Data object
FirebaseData fbdo;

// Define the FirebaseAuth data for authentication data
FirebaseAuth auth;

// Define the FirebaseConfig data for config data
FirebaseConfig config;

// WiFi credentials
#define WIFI_SSID "your_wifi_ssid"
#define WIFI_PASSWORD "your_wifi_password"

// Firebase project API Key
#define API_KEY "your_firebase_api_key"

// Firebase project URL
#define DATABASE_URL "your_firebase_database_url"

// User credentials
#define USER_EMAIL "your_email"
#define USER_PASSWORD "your_password"

void setup(void)
{
    // put your setup code here, to run once:
    Serial.begin(115200);

    // Connect to Wi-Fi
    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();

    // Assign the api key (required)
    config.api_key = API_KEY;

    // Assign the user sign in credentials
    auth.user.email = USER_EMAIL;
    auth.user.password = USER_PASSWORD;

    // Assign the RTDB URL (required)
    config.database_url = DATABASE_URL;

    // Assign the callback function for the long running token generation task
    config.token_status_callback = tokenStatusCallback; // see addons/TokenHelper.h

    // Initialize the library with the Firebase authen and config.
    Firebase.begin(&config, &auth);

    // Optional, set AP reconnection in setup()
    Firebase.reconnectWiFi(true);

    pinMode(GPIO23_LED_PIN_D4, OUTPUT);
    pinMode(GPIO22_LED_PIN_D13, OUTPUT);
    pinMode(GPIO21_LED_PIN_D14, OUTPUT);
    pinMode(GPIO19_LED_PIN_D16, OUTPUT);
}

void loop(void)
{
    // put your main code here, to run repeatedly:
    updateOutputs(); // Refresh output data
    blinkPattern();  // Execute LED blinking pattern
}

void updateOutputs()
{
    digitalWrite(GPIO23_LED_PIN_D4, GPIO23_LED_PIN_D4_rawData);
    digitalWrite(GPIO22_LED_PIN_D13, GPIO22_LED_PIN_D13_rawData);
    digitalWrite(GPIO21_LED_PIN_D14, GPIO21_LED_PIN_D14_rawData);
    digitalWrite(GPIO19_LED_PIN_D16, GPIO19_LED_PIN_D16_rawData);
}

void blinkPattern()
{
    // Example blinking pattern
    GPIO23_LED_PIN_D4_rawData = HIGH;
    updateOutputs();
    delay(500);
    GPIO23_LED_PIN_D4_rawData = LOW;
    updateOutputs();
    delay(500);

    GPIO22_LED_PIN_D13_rawData = HIGH;
    updateOutputs();
    delay(500);
    GPIO22_LED_PIN_D13_rawData = LOW;
    updateOutputs();
    delay(500);

    GPIO21_LED_PIN_D14_rawData = HIGH;
    updateOutputs();
    delay(500);
    GPIO21_LED_PIN_D14_rawData = LOW;
    updateOutputs();
    delay(500);

    GPIO19_LED_PIN_D16_rawData = HIGH;
    updateOutputs();
    delay(500);
    GPIO19_LED_PIN_D16_rawData = LOW;
    updateOutputs();
    delay(500);
}

/* END CODE */