Fetching real time data from the firebase database to ESP8266

Hi!
I need to read data from the Firebase real time database which connected with ESP8266.ESP8266 nodemcu fetching time data form the Firebase database by using DS3231RTC module. but after the execution of code;there's a message showing path is not exist in serial time monitor when it fetching data from the database.Here is my full code.Hope I will find a better solution to fix this issue.

#include <ESP8266WiFi.h>
#include <RTClib.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <Firebase_ESP_Client.h>
#include <UrlEncode.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_PWMServoDriver.h>

const int buzzerPin = 15;  // D8
const int irSensorPin = 2; // D4

#include "addons/TokenHelper.h"
#include "addons/RTDBHelper.h"

const char *ssid = "  56651";
const char *password = "------  ";
#define FIREBASE_HOST "----------------.firebasedatabase.app"
#define FIREBASE_API_KEY "-----------------------------"
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;

unsigned long sendDataPrevMillis = 0;
int alarmHours[3] = {0};
int alarmMinutes[3] = {0};
bool isDispensed[3] = {false};
bool signupOK = false;

// RTC_DS3231<TwoWire> Rtc(Wire);
RTC_DS3231 rtc;
const int servoOpenPosition = 30;
LiquidCrystal_I2C lcd(0x27, 16, 2);
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
String phoneNumber = "+------------";
String apiKey = "-----------";

void displayDateTime(const DateTime &dt);
void checkAndDispensePills(const DateTime &now);
void dispensePills(int slot);
void sendMessage(String message);

void setup()
{
  Serial.begin(115200);
  Wire.begin();
  pinMode(buzzerPin, OUTPUT);
  pinMode(irSensorPin, INPUT);
  if (!rtc.begin())
  {
    Serial.println("Couldn't find RTC");
  }

  lcd.init();
  lcd.backlight();
  pwm.begin();
  pwm.setPWMFreq(60);

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());

  Serial.println("Database URL: " + String(FIREBASE_HOST));
  Serial.println("API Key: " + String(FIREBASE_API_KEY));

  config.api_key = FIREBASE_API_KEY;
  config.database_url = FIREBASE_HOST;

  if (Firebase.signUp(&config, &auth, "", ""))
  {
    Serial.println("ok");
    signupOK = true;
  }
  else
  {
    Serial.printf("%s\n", config.signer.signupError.message.c_str());
  }

  config.token_status_callback = tokenStatusCallback;
  Firebase.begin(&config, &auth);

  if (Firebase.ready())
  {
    Serial.println("Firebase is ready!");
  }
  else
  {
    Serial.println("Failed to initialize Firebase");
  }

  Firebase.reconnectWiFi(true);

  if (!Firebase.RTDB.beginStream(&fbdo, "/times"))
  {
    Serial.println("Failed to begin stream: " + fbdo.errorReason());
  }
}

void loop()
{
  DateTime now = rtc.now();
  displayDateTime(now);

  // Check for updates at a less frequent interval or upon specific triggers
  static unsigned long lastFirebaseUpdate = 0;
  unsigned long currentMillis = millis();
  if (currentMillis - lastFirebaseUpdate > 60000)
  { // Update every 60 seconds
    for (int i = 0; i < 3; i++)
    {

      if (Firebase.RTDB.readStream(&fbdo))
      {
        if (fbdo.streamAvailable())
        {
          int time1_hour = fbdo.intData()["time1"]["hour"];
          int time1_minute = fbdo.intData()["time1"]["minute"];
          int time2_hour = fbdo.intData()["time2"]["hour"];
          int time2_minute = fbdo.intData()["time2"]["minute"];
          int time3_hour = fbdo.intData()["time3"]["hour"];
          int time3_minute = fbdo.intData()["time3"]["minute"];

          alarmHours[0] = time1_hour;
          alarmMinutes[0] = time1_minute;
          alarmHours[1] = time2_hour;
          alarmMinutes[1] = time2_minute;
          alarmHours[2] = time3_hour;
          alarmMinutes[2] = time3_minute;

          lcd.print("Time1: " + String(time1_hour) + ":" + String(time1_minute));
          lcd.print("Time2: " + String(time2_hour) + ":" + String(time2_minute));
          lcd.print("Time3: " + String(time3_hour) + ":" + String(time3_minute));
        }
      }
      if (!Firebase.RTDB.getString(&fbdo, "/alarmMinutes/" + String(i)))
      {
        Serial.println("Failed to fetch alarm hours: " + fbdo.errorReason());
      }
      if (!Firebase.RTDB.getString(&fbdo, "/alarmMinutes/" + String(i)))
      {
        Serial.println("Failed to fetch alarm minutes: " + fbdo.errorReason());
      }
    }
    lastFirebaseUpdate = currentMillis;
  }

  checkAndDispensePills(now);

  // Read the state of the IR sensor and check for transition from HIGH to LOW
  int sensorState = digitalRead(irSensorPin);
  static int lastSensorState = HIGH; // Assuming pull-up resistor in the circuit
  if (sensorState == LOW && lastSensorState == HIGH)
  {

    sendMessage("Pills dispensed");
    delay(1000); // Simple debounce delay
  }
  lastSensorState = sensorState;
}
void displayDateTime(const DateTime &dt)
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Date:");
  lcd.print(dt.year());
  lcd.print("-");
  lcd.print(dt.month());
  lcd.print("-");
  lcd.print(dt.day());
  lcd.setCursor(0, 1);
  lcd.print("Time:");
  lcd.print(dt.hour());
  lcd.print(":");
  lcd.print(dt.minute());
  lcd.print(":");
  lcd.print(dt.second());
}

void checkAndDispensePills(const DateTime &now)
{
  for (int i = 0; i < 3; i++)
  {
    if (now.hour() == alarmHours[i] && now.minute() == alarmMinutes[i] && !isDispensed[i])
    {
      digitalWrite(buzzerPin, HIGH);
      lcd.setCursor(0, 0);
      lcd.print("Hello!");
      lcd.setCursor(0, 1);
      lcd.print("Dispensing pills");
      delay(3000);
      digitalWrite(buzzerPin, LOW);
      dispensePills(i);
      isDispensed[i] = true;
      break;
    }
  }
}
void dispensePills(int slot)
{
  pwm.setPWM(slot, 0, servoOpenPosition);
  delay(5000);
  pwm.setPWM(slot, 0, 0);
}

void sendMessage(String message)
{
  String url = "http://api.callmebot.com/whatsapp.php?phone=" + phoneNumber + "&apikey=" + apiKey + "&text=" + urlEncode(message);
  WiFiClient client;
  HTTPClient http;
  http.begin(client, url);
  int httpResponseCode = http.GET();
  if (httpResponseCode == 200)
  {
    Serial.println("Message sent successfully");
  }
  else
  {
    Serial.print("Error sending the message, HTTP response code: ");
    Serial.println(httpResponseCode);
  }
  http.end();
}

Your topic does not seem to indicate a problem with avrdude nor with stk500 nor with the bootloader and therefore has been moved to a more suitable location on the forum.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.