Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <ESP8266WiFi.h>
- #include <WiFiClient.h>
- //const char* ssid = "iPhone Mukhammad";
- //const char* password = "12344321";
- //const char* ssid = "TECH_BFA3";
- //const char* password = "092115066";
- const char* ssid = "KUY";
- const char* password = "";
- WiFiClient espClient;
- //IPAddress ip(192,168,4,4);
- //IPAddress gateway(192,168,4,1);
- //IPAddress subnet(255,255,255,0);
- #define mytopic "data/waterflow"
- #define typeSensor 0
- #include <PubSubClient.h>
- char mqtt_server[] = "192.168.43.171";
- //char mqtt_server[] = "192.168.0.31";
- PubSubClient client(espClient);
- byte sensorInterrupt = 0; // 0 = digital pin 2
- byte sensorPin = D2;
- // The hall-effect flow sensor outputs approximately 4.5 pulses per second per
- // litre/minute of flow.
- float calibrationFactor = 4.5;
- volatile byte pulseCount;
- float flowRate;
- unsigned int flowMilliLitres;
- unsigned long totalMilliLitres;
- unsigned long oldTime;
- void setup() {
- Serial.begin(115200); // Starts the serial communication
- WiFi.mode(WIFI_STA);
- WiFi.begin(ssid, password);
- // WiFi.config(ip,gateway,subnet);
- while (WiFi.waitForConnectResult() != WL_CONNECTED) {
- Serial.println("Connection Failed! Rebooting...");
- delay(5000);
- Serial.print(".");
- }
- client.connect("1","hcix","hcix");
- client.setServer(mqtt_server, 1883);
- while (!client.connected()) {
- client.connect("1","hcix","hcix");
- client.setServer(mqtt_server, 1883);
- Serial.print("Attempting MQTT connection...");
- if (client.connect("waterflow")) {
- Serial.println("connected");
- } else {
- Serial.print("failed, rc=");
- Serial.print(client.state());
- Serial.println(" try again in 5 seconds");
- delay(5000);
- }
- }
- //waterflow
- pinMode(sensorPin, INPUT);
- digitalWrite(sensorPin, HIGH);
- pulseCount = 0;
- flowRate = 0.0;
- flowMilliLitres = 0;
- totalMilliLitres = 0;
- oldTime = 0;
- // The Hall-effect sensor is connected to pin 2 which uses interrupt 0.
- // Configured to trigger on a FALLING state change (transition from HIGH
- // state to LOW state)
- attachInterrupt(digitalPinToInterrupt(sensorPin), pulseCounter, FALLING);
- }
- void loop() {
- if((millis() - oldTime) > 1000) // Only process counters once per second
- {
- // Disable the interrupt while calculating flow rate and sending the value to
- // the host
- detachInterrupt(sensorInterrupt);
- // Because this loop may not complete in exactly 1 second intervals we calculate
- // the number of milliseconds that have passed since the last execution and use
- // that to scale the output. We also apply the calibrationFactor to scale the output
- // based on the number of pulses per second per units of measure (litres/minute in
- // this case) coming from the sensor.
- flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
- // Note the time this processing pass was executed. Note that because we've
- // disabled interrupts the millis() function won't actually be incrementing right
- // at this point, but it will still return the value it was set to just before
- // interrupts went away.
- oldTime = millis();
- // Divide the flow rate in litres/minute by 60 to determine how many litres have
- // passed through the sensor in this 1 second interval, then multiply by 1000 to
- // convert to millilitres.
- flowMilliLitres = (flowRate / 60) * 1000;
- // Add the millilitres passed in this second to the cumulative total
- totalMilliLitres += flowMilliLitres;
- unsigned int frac;
- // Print the flow rate for this second in litres / minute
- // Serial.print("Flow rate: ");
- // Serial.print(int(flowRate)); // Print the integer part of the variable
- // Serial.print("."); // Print the decimal point
- // // Determine the fractional part. The 10 multiplier gives us 1 decimal place.
- // frac = (flowRate - int(flowRate)) * 10;
- // Serial.print(frac, DEC) ; // Print the fractional part of the variable
- // Serial.print("L/min");
- /*
- // Print the number of litres flowed in this second
- Serial.print(" Current Liquid Flowing: "); // Output separator
- Serial.print(flowMilliLitres);
- Serial.print("mL/Sec");
- // Print the cumulative total of litres flowed since starting
- Serial.print(" Output Liquid Quantity: "); // Output separator
- Serial.print(totalMilliLitres);
- Serial.println("mL");
- */
- // Reset the pulse counter so we can start incrementing again
- pulseCount = 0;
- // Enable the interrupt again now that we've finished sending output
- attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
- // if(flowRate != 0){
- String msg = String(typeSensor);
- msg += ":";
- msg += int(flowRate);
- msg += ".";
- frac = (flowRate - int(flowRate)) * 10;
- msg += frac;
- Serial.println(msg);
- client.publish(mytopic, String(msg).c_str());
- // }
- }
- }
- /*
- Insterrupt Service Routine
- */
- void pulseCounter()
- {
- // Increment the pulse counter
- pulseCount++;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement