CREATE TABLE water_readings ( id INT AUTO_INCREMENT PRIMARY KEY, sensor_id INT NOT NULL, volume FLOAT NOT NULL, recorded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); //////////////////////////////////////////////////////////////////////////// connect_error) { die("Connection failed: " . $conn->connect_error); } // Get JSON from POST body $json = file_get_contents('php://input'); $data = json_decode($json, true); if (!empty($data['sensors'])) { foreach ($data['sensors'] as $sensor) { $sensor_id = $sensor['id']; $volume = $sensor['volume']; $sql = "INSERT INTO water_readings (sensor_id, volume) VALUES ('$sensor_id', '$volume')"; $conn->query($sql); } echo "Success"; } else { echo "No data received"; } $conn->close(); ?> ///////////////////////////////////////////////////////////////////////////// #include #include #include // WiFi and Server Config const char* ssid = "YOUR_SSID"; const char* password = "YOUR_PASSWORD"; const char* serverUrl = "http://your-server-ip/api/insert_flow.php"; // Sensor Configuration const int sensorPins[] = {25, 26, 27, 14, 12}; // Use ESP32 interrupt-capable pins volatile long pulseCounts[5] = {0, 0, 0, 0, 0}; float totalVolumes[5] = {0.0, 0.0, 0.0, 0.0, 0.0}; // Calibration: YF-S201 produces ~450 pulses per liter const float calibrationFactor = 450.0; // Interrupt Service Routines (ISRs) void IRAM_ATTR pulseCounter0() { pulseCounts[0]++; } void IRAM_ATTR pulseCounter1() { pulseCounts[1]++; } void IRAM_ATTR pulseCounter2() { pulseCounts[2]++; } void IRAM_ATTR pulseCounter3() { pulseCounts[3]++; } void IRAM_ATTR pulseCounter4() { pulseCounts[4]++; } void (*isrFunctions[])() = {pulseCounter0, pulseCounter1, pulseCounter2, pulseCounter3, pulseCounter4}; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); for (int i = 0; i < 5; i++) { pinMode(sensorPins[i], INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(sensorPins[i]), isrFunctions[i], RISING); } while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi Connected"); } void loop() { // Update volumes every 10 seconds static unsigned long lastUpdate = 0; if (millis() - lastUpdate > 10000) { lastUpdate = millis(); StaticJsonDocument<300> doc; JsonArray data = doc.createNestedArray("sensors"); for (int i = 0; i < 5; i++) { totalVolumes[i] = pulseCounts[i] / calibrationFactor; // Calculate liters JsonObject s = data.createNestedObject(); s["id"] = i + 1; s["volume"] = totalVolumes[i]; } String jsonPayload; serializeJson(doc, jsonPayload); if (WiFi.status() == WL_CONNECTED) { HTTPClient http; http.begin(serverUrl); http.addHeader("Content-Type", "application/json"); int httpResponseCode = http.POST(jsonPayload); Serial.print("HTTP Response: "); Serial.println(httpResponseCode); http.end(); } } }