Measuring Pipe's capacitance to track the quality of the pipe
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
3.4 KiB

#include "Arduino.h"
#include <WiFiMulti.h>
#include <Wire.h> //Import the required libraries
#include <PubSubClient.h>
#define DISCHARGE_PIN 23
#define CHARGE_PIN 5
#define MEASURING_PIN 36
#define RESISTOR_VALUE 1e6
#define DEVICE "ESP32"
#define WIFI_SSID "SSID_HERE" // Network Name
#define WIFI_PASSWORD "PASSWORD_HERE" // Network Password
#define MQTT_SERVER "test.mosquitto.org"
#define MQTT_PORT 1883
#define MQTT_SUBSCRIBE_PUMP "plant/1/pump"
WiFiMulti wifiMulti;
WiFiClient espClient;
PubSubClient client(espClient);
void setup()
{
// initialize LED digital pin as an output.
Serial.begin(9600);
pinMode(CHARGE_PIN, OUTPUT);
digitalWrite(CHARGE_PIN, LOW);
setup_wifi();
setup_mqtt();
}
// =============== LOOP ============
void loop()
{
float cap;
setup_wifi();
setup_mqtt();
cap = capacitance(DISCHARGE_PIN, CHARGE_PIN, MEASURING_PIN);
}
// =============== LOOP END ============
float capacitance(int discharge_pin, int charge_pin, int measuring_pin) {
unsigned int start_time, elapsed_time;
float nanoFarads;
// discharge:
digitalWrite(charge_pin, LOW);
pinMode(discharge_pin, OUTPUT);
digitalWrite(discharge_pin, LOW);
// wait until the capacitor is fully discharged
while(analogRead(measuring_pin) > 0) {
//Serial.println(analogRead(measuring_pin));
//Serial.print("discharging\n");
};
// stop discharging
pinMode(discharge_pin, INPUT);
// Start charging
digitalWrite(charge_pin, HIGH);
start_time = millis();
while(analogRead(measuring_pin) < 2588){// 2588 is 63.2% of 4096, which corresponds to full-scale voltage
}
elapsed_time = millis() - start_time;
nanoFarads = ((float)elapsed_time / RESISTOR_VALUE) * 1e6;
Serial.println((long) nanoFarads);
delay(1000);
return nanoFarads;
};
void setup_wifi() {
WiFi.mode(WIFI_STA); // Setup wifi connection
wifiMulti.addAP(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to wifi"); // Connect to WiFi
while (wifiMulti.run() != WL_CONNECTED) {
Serial.print(".");
delay(100);
}
Serial.print("Connected to ");
Serial.print(WIFI_SSID);
Serial.println(" Successfully");
Serial.print(WiFi.localIP());
Serial.println(" isn the local IP");
}
void setup_mqtt() {
client.setServer(MQTT_SERVER, MQTT_PORT);
client.setCallback(callback);
}
void callback(char *topic, byte *message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
if (String(topic) == MQTT_SUBSCRIBE_PUMP) {
Serial.print("Starting Pump for: ");
}
}
void reconnect_mqtt() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("ESP32-1")) {
Serial.println("connected");
// Subscribe
client.subscribe(MQTT_SUBSCRIBE_PUMP);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void publish_mqtt(const char *topic, const char *sensor, float value) {
char buffer[40];
sprintf(buffer, "plant1 %s=%.0f", sensor, value);
Serial.print("Publishing ");
Serial.println(buffer);
client.publish(topic, buffer);
}