Spaces:
Build error
Build error
| /** | |
| * ESP32 Firebase Sensor Monitoring System | |
| * | |
| * This script collects data from DHT sensor (temperature and humidity) | |
| * and a photoresistor (light intensity), then uploads it to Firebase | |
| * Realtime Database. | |
| * | |
| * Libraries required: | |
| * - WiFiManager by tzapu (https://github.com/tzapu/WiFiManager) | |
| * - Firebase-ESP32 by mobizt (https://github.com/mobizt/Firebase-ESP32) | |
| * - DHT sensor library by Adafruit | |
| */ | |
| // Firebase credentials - Get these from Firebase Console | |
| // User Email and Password for Firebase Authentication | |
| // Create this user in Firebase Console -> Authentication -> Users | |
| // Sensor and button pin definitions | |
| // Data upload interval (milliseconds) | |
| // Firebase objects | |
| FirebaseData fbdo; | |
| FirebaseAuth auth; | |
| FirebaseConfig config; | |
| // DHT sensor | |
| DHT dht(DHT_PIN, DHT_TYPE); | |
| // Global variables | |
| unsigned long lastUploadTime = 0; | |
| unsigned long buttonPressTime = 0; | |
| String deviceId; | |
| bool signupOK = false; | |
| bool resetButtonPressed = false; | |
| bool checkResetButton() { | |
| if (digitalRead(RESET_BTN_PIN) == LOW) { | |
| if (!resetButtonPressed) { | |
| resetButtonPressed = true; | |
| buttonPressTime = millis(); | |
| // Serial.println("Hold to reset WiFi"); | |
| } | |
| if (resetButtonPressed && (millis() - buttonPressTime >= BUTTON_HOLD_TIME)) { | |
| return true; | |
| } | |
| } else { | |
| if (resetButtonPressed) { | |
| resetButtonPressed = false; | |
| } | |
| } | |
| return false; | |
| } | |
| void setupWiFi() { | |
| WiFiManager wifiManager; | |
| if (checkResetButton()) { | |
| // Serial.println("Resetting WiFi settings"); | |
| wifiManager.resetSettings(); | |
| } | |
| String apName = "ProjectSTRATA - WiFiSetter"; | |
| wifiManager.setConfigPortalTimeout(180); | |
| if (!wifiManager.autoConnect(apName.c_str())) { | |
| Serial.println("Failed to connect"); | |
| ESP.restart(); | |
| } | |
| // Serial.print("Connected: "); | |
| Serial.println(WiFi.localIP()); | |
| deviceId = String((uint32_t)ESP.getEfuseMac(), HEX); | |
| } | |
| void setupFirebase() { | |
| config.api_key = API_KEY; | |
| config.database_url = DATABASE_URL; | |
| auth.user.email = USER_EMAIL; | |
| auth.user.password = USER_PASSWORD; | |
| config.token_status_callback = tokenStatusCallback; | |
| Firebase.begin(&config, &auth); | |
| if (Firebase.signUp(&config, &auth, USER_EMAIL, USER_PASSWORD)) { | |
| // Serial.println("Firebase sign up OK"); | |
| signupOK = true; | |
| } else { | |
| Serial.printf("Sign up failed: %s\n", config.signer.signupError.message.c_str()); | |
| } | |
| Firebase.reconnectWiFi(true); | |
| } | |
| bool readSensorData(float &temperature, float &humidity, int &light) { | |
| // Read temperature | |
| temperature = dht.readTemperature(); | |
| if (isnan(temperature)) { | |
| return false; | |
| } | |
| // Read humidity | |
| humidity = dht.readHumidity(); | |
| if (isnan(humidity)) { | |
| return false; | |
| } | |
| // Read light | |
| light = analogRead(LDR_PIN); | |
| Serial.printf("Temp: %.1f°C, Humidity: %.1f%%, Light: %d\n", | |
| temperature, humidity, light); | |
| return true; | |
| } | |
| void uploadToFirebase() { | |
| if (!signupOK || !Firebase.ready()) { | |
| // Serial.println("Firebase not ready"); | |
| return; | |
| } | |
| float temperature, humidity; | |
| int lightIntensity; | |
| if (!readSensorData(temperature, humidity, lightIntensity)) { | |
| return; | |
| } | |
| unsigned long timestamp = millis(); | |
| // Create JSON with minimal memory footprint | |
| FirebaseJson json; | |
| json.add("id", deviceId); | |
| json.add("ts", timestamp); | |
| json.add("temp", temperature); | |
| json.add("hum", humidity); | |
| json.add("light", lightIntensity); | |
| // Path to save data | |
| String path = "/sensor_data/" + deviceId + "/" + String(timestamp); | |
| if (Firebase.setJSON(fbdo, path, json)) { | |
| Serial.println("Data uploaded OK"); | |
| } else { | |
| Serial.println("Upload failed: " + fbdo.errorReason()); | |
| } | |
| // Update latest data with minimal path length | |
| if (Firebase.setJSON(fbdo, "/latest/" + deviceId, json)) { | |
| Serial.println("Latest data updated"); | |
| } | |
| } | |
| void setup() { | |
| Serial.begin(115200); | |
| dht.begin(); | |
| pinMode(LDR_PIN, INPUT); | |
| pinMode(RESET_BTN_PIN, INPUT_PULLUP); | |
| setupWiFi(); | |
| setupFirebase(); | |
| } | |
| void loop() { | |
| // Check for WiFi reset | |
| if (checkResetButton()) { | |
| // Serial.println("WiFi reset requested"); | |
| WiFiManager wifiManager; | |
| wifiManager.resetSettings(); | |
| ESP.restart(); | |
| } | |
| // Upload data at interval | |
| if (millis() - lastUploadTime >= UPLOAD_INTERVAL) { | |
| uploadToFirebase(); | |
| lastUploadTime = millis(); | |
| } | |
| delay(100); | |
| } |