#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
const char *ssid = "Wokwi-GUEST";
const char *password = "";
#define THINGSBOARD_SERVER "mqtt.thingsboard.cloud"
#define TOKEN "dv95NyAwRpPCnQ9jnc1P"
WiFiClient espClient;
PubSubClient client(espClient);
const int flowSensorPin = 34; // Pin where the flow sensor is connected
volatile int flowPulseCount = 0;
float flowRate = 0.0;
unsigned long previousMillis = 0;
const unsigned long interval = 1000; // Interval to calculate flow rate (1 second)
void IRAM_ATTR pulseCounter() {
flowPulseCount++;
}
void setup() {
Serial.begin(115200);
pinMode(flowSensorPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(flowSensorPin), pulseCounter, FALLING);
WiFi.begin(ssid, password,6);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
client.setServer(THINGSBOARD_SERVER, 1883);
reconnect();
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// Convert pulse count to flow rate
flowRate = (flowPulseCount / 7.5); // Example conversion factor
flowPulseCount = 0;
Serial.print("Flow rate: ");
Serial.print(flowRate);
Serial.println(" L/min");
// Publish flow rate to ThingsBoard
String payload = "{\"flowRate\":" + String(flowRate) + "}";
client.publish("v1/devices/me/telemetry", payload.c_str());
}
delay(1);
}
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to ThingsBoard...");
if (client.connect("ESP32Client", TOKEN, NULL)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}