MISURA DELLA PORTATA della Fonte del Capriolo
Dati GPS:41.848558°N, 14.269407°E
Sensore Water Flow POW11D3B
Collegamento con Arduino (come riferimento)
Il sensore invierā un impulso al pin 2 di Arduino ogni volta che la turbina effettua una rotazione completa.
Ad ogni rotazione sono passati attraverso il sensore 2.25 ml di acqua.
La Portata ( Litri al minuto) si calcola moltiplicando N.ro giri al minuto x 2.25
Per verificare il perfetto funzionamento del sensore provvedo ad effettuare vari test della portata del mio rubinetto di casa.
Il test di base consiste nel verificare il tempo di riempimento di una bottiglia di un 1 litro.
Dal test effettuato occorrono circa 16 secondi.
La portata d'acqua č di circa 4 litri al minuto.
Test pratico con Arduino:
Test del programma:
Ecco il risultato:
Test pratico con l'ESP8266 E-12
Test del programma:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define SENSOR 2
long currentMillis = 0;
long previousMillis = 0;
int interval = 1000;
float calibrationFactor = 8.8;//Parametro desunto da TEST pratico
volatile byte pulseCount;
byte pulse1Sec = 0;
float flowRate;
unsigned long flowMilliLitres;
unsigned int totalMilliLitres;
float flowLitres;
float totalLitres;
void IRAM_ATTR pulseCounter()
{
pulseCount++;
}
void setup()
{
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64)
display.clearDisplay();
delay(10);
pinMode(SENSOR, INPUT_PULLUP);
pulseCount = 0;
flowRate = 0.0;
flowMilliLitres = 0;
totalMilliLitres = 0;
previousMillis = 0;
attachInterrupt(digitalPinToInterrupt(SENSOR), pulseCounter, FALLING);
}
void loop()
{
currentMillis = millis();
if (currentMillis - previousMillis > interval)
{
pulse1Sec = pulseCount;
pulseCount = 0;
flowRate = ((1000.0 / (millis() - previousMillis)) * pulse1Sec) / calibrationFactor;
previousMillis = millis();
flowMilliLitres = (flowRate / 60) * 1000;
flowLitres = (flowRate / 60);
totalMilliLitres += flowMilliLitres;
totalLitres += flowLitres;
display.clearDisplay();
display.setCursor(10,0); //oled display
display.setTextSize(1);
display.setTextColor(WHITE);
display.print("FONTE del CAPRIOLO");
display.setCursor(0,20); //oled display
display.setTextSize(2);
display.setTextColor(WHITE);
display.print("Q:");
display.print(float(flowRate));
display.setCursor(100,28); //oled display
display.setTextSize(1);
display.print("l/m");
display.setCursor(0,45); //oled display
display.setTextSize(2);
display.setTextColor(WHITE);
display.print("T:");
display.print(totalLitres);
display.setCursor(110,53); //oled display
display.setTextSize(1);
display.print("l");
display.display();
}
}
INFORMAZIONI TECNICHE:
IMPORTANTE: I GPIO con asterisco sono solo di INPUT es.: GPIO38* - GPIO36* - ecc..
Sensori alimentati dal modulo devono essere del tipo a 3.3 Vcc.
Box realizzato con la stampante 3D l'ANYCUBIC MEGA S (Circa 6 ore)
Test pratico con l'ESP32 LoRa:
Test del programma:
#include "heltec.h"
#define SENSOR 17
long currentMillis = 0;
long previousMillis = 0;
int interval = 1000;
float calibrazione = 8.8;//Parametro desunto dal TEST pratico
volatile byte pulseCount;
byte pulse1Sec = 0;
float flowRate;
String FlowRate;
String Tot_litri;
unsigned long flowMilliLitres;
unsigned int totalMilliLitres;
float flowLitres;
float totalLitres;
#define BAND 433E6
void IRAM_ATTR pulseCounter()
{
pulseCount++;
}
void setup()
{
Heltec.begin(true, true, true, true, BAND);
Serial.begin(115200);
LoRa.setTxPower(20,RF_PACONFIG_PASELECT_PABOOST);// MAX POTENZA
Heltec.display->clear();
delay(10);
pinMode(SENSOR, INPUT_PULLUP);
pulseCount = 0;
flowRate = 0.0;
flowMilliLitres = 0;
totalMilliLitres = 0;
previousMillis = 0;
attachInterrupt(digitalPinToInterrupt(SENSOR), pulseCounter, FALLING);
}
void loop()
{
currentMillis = millis();
if (currentMillis - previousMillis > interval)
{
pulse1Sec = pulseCount;
pulseCount = 0;
flowRate = ((1000.0 / (millis() - previousMillis)) * pulse1Sec) / calibrazione;
previousMillis = millis();
flowMilliLitres = (flowRate / 60) * 1000;
flowLitres = (flowRate / 60);
totalMilliLitres += flowMilliLitres;
totalLitres += flowLitres;
Heltec.display->setContrast(255);
Heltec.display->clear();
Heltec.display->setFont(ArialMT_Plain_10);
Heltec.display->drawString(10,0," FONTE del CAPRIOLO");
Heltec.display->setFont(ArialMT_Plain_10);
String Flowrate = "Q: " + String (flowRate) + " l/m";
Heltec.display->drawString(0,20,Flowrate);
Heltec.display->setFont(ArialMT_Plain_10);
String Tot_litri = "Tot: " + String (totalLitres) + " litri";
Heltec.display->drawString(0,45,Tot_litri);
Heltec.display->display();
}
}
Continua....