Arduino – Presostat Programabil 0-12 bar – Proiect Complet

Personal, am avut nevoie de un astfel de presostat programabil pentru ca cele gasite in comert nu se pretau utilizarii dorite de mine, asa ca intr-un final am zis: de ce sa nu-mi fac eu ceva pe gustul si inima mea 🙂 !?

Senzorul folosit este un model foarte ieftin iar din observatii si utilizare este unul extraordinar de bun, chiar nu inteleg cum pot sa existe astfel de senzori cu aceleasi specificatii, dar de zeci de ori mai scumpi, totala hotie.
Cautati pe google dupa HK1100C sau “G1/4 0-1.2 MPa Hydraulic Pressure Sensor” si o sa-l gasiti peste tot, mai ales pe site-urile din China precum aliexpress, dx sau dhgate.

Nu intru in detalii foarte tehnice pentru ca majoritatea sunt deja explicate prin comentarii in codul prezentat mai jos. Dar ca si idee, iata de ce aveti nevoie pentru acest proiect:

    1. Placa Arduino Uno (sau alt model daca aveti alte preferinte, dar nu toate au disponibili cel putin doi pini de alimentare )
    2. Modul cu doua relee
    3. Senzor/Traductor de presiune, model: G1/4 0-1.2 MPa (HK1100C). Presiunea maxima este de 12bar.  In romania l-am gasit la robofun.
    4. Alimentator de telefon de 1A (sau mai mare) ptr cablu USB  (amperajul mai mare reduce foarte mult variatiile de tensiune) + cablu USB care ramane atasat pentru alimentare
    5. Fire conexiune tata-tata / tata-mama, in functie de modulul cu relee
  1. Statie/Ciocan de lipit, aliaj de lipit (fludor), decapant (ca sa prelungiti cablul traductorului daca este nevoie si sa lipiti firele de conexiune)
  2. Banda izolatoare sau tub termocontractabil pentru izolarea lipiturilor
  3. Un notebook/laptop pentru a verifica si reprograma controlerul acolo unde este nevoie de el, in utilizare !

Foarte important:

Nu folositi un alimentator extern direct pe alimentarea microcontrolerului pentru ca multe modele nu au un regulator de tensiune de calitate sau bine racit si proiectul nu va functiona corespunzator ! Utilizati un alimentator de telefon la care puteti atasa un cablu USB.
In timpul programarii si testarii cand placa Arduino este conectata la calculator totul poate sa functioneze perfect, insa odata folosita doar sursa de curent pe alimentare externa, functionarea poate sa o ia razna, presostatul devine instabil !

In cazul meu, am ales o presiune de functionare mica pentru ca pompa este la distanta foarte mare ~ 100m si diferenta de nivel pana la 25 de m, iar pompa nu baga decat maxim 1.9 bar. Diferenta de presiune se alege astfel incat vasul de expansiune (daca exista) sa nu se goleasca prea mult ptr ca scade presiunea la robinet.

Trebuie sa mai luati in considerare si faptul ca pompa poate sa bage o presiune mai mica pe timp de vara. Cand fantana este mai plina stratul de apa de deasupra pompei ajuta la cresterea presiunii, iar cand nivelul apei in fantana scade si presiunea poate sa scada, depinde de parametrii pompei.

Nota:

  • Daca nu exista vas de expansiune, pompa va porni mai des, aproape la fiecare deschidere de robinet!
  • In mod obligatoriu folositi pe alimentarea cu apa o supapa de sens pentru a evita golirea retelei de apa ~ la iesirea pompei daca este submersibila sau pe intrare (dupa filtru) daca este alt tip!
  • Pentru a evita pornirea pompei si cand nu folositi robinetul, verificati instalatia de scurgeri!

Iata mai jos codul complet pentru un  presostat cu comanda pe ambele faze de curent (comentariile nu sunt in romana ptr ca am scris articolul si in engleza):

/* Arduino pressure switch by Emilian Robert Vicol */ 

#include <avr/wdt.h>  /* Arduino watchdog Lib. Defense when something goes wrong and reset the board! */

/* senzor settings: G1/4 0-1.2 MPa Hydraulic Pressure Sensor */
/* the sensor is cheap and extraordinarily good. Search for models: HK1100C */
const float Voffset = 0.52;   /* Volts, depends on the stability of the supply voltage. ideal is 0.5V */
const float Vmin = 0.5;       /* Volts */
const float Vmax = 4.5;       /* Volts */
const float Pmin = 0;         /* MPa */
const float Pmax = 1.2;       /* MPa */
const float kPV = (Pmax - Pmin) / (Vmax - Vmin);

/* arduino settings */
/* To avoid voltage variations when switch ON/OFF relays, I strongly recommend that you powering arduino board through USB port, a phone charger is very suitable. */
/* The second solution is to drive the relay block from a separate power supply. I've used the first solution! */
/* Do not forget these recommendations, they are very important, the project will not work properly if the supply voltage is not stable! */
const float SupplyVoltage = 5.0;  /* depends on the power supply and the stability of the voltage conversion on the board */
const float MaxDAC = 1024.0;

/* pump sesttings */
const float max_bar_off = 1.85;    /* max pressure (permited or posible) */
const float delta = 0.4;           /* delta pressure */
const float min_bar_on = max_bar_off - delta; /* the minimum pressure at which the pump starts. The pump will operate from "min_bar_on" to  max_bar_off" */

const int Sensor = A2;             /* Analogic A2 pin for the pressure sensor */
/* To connect the sensor to a larger distance, use twisted wires, such as in the network cables, */
/* use two pairs of twisted wires, a pair of power supply (+ 5V / GND) and a pair with signal (Data / GND) */

void setup() {
    Serial.begin(9600);
  
    pinMode(3, OUTPUT); digitalWrite(3, HIGH);  /* We use two control pins for two relays */
    pinMode(4, OUTPUT); digitalWrite(4, HIGH);  /* to isolate both phases of the pump */      
  
    pinMode(Sensor, INPUT);   /* enable INPUT mode for sensor */

    wdt_enable(WDTO_4S);      /* enable Arduino watchdog, 4 seconds */

    Serial.print("START!");
}

  unsigned long time_end = 0;          /* "delay for stop" variable, we do not stop the pump immediately, but wait for a few seconds */
  unsigned long stop_delay = 5*1000;   /* 5 seconds waiting when the pressure has reached the desired value, then checking if it should be stopped  */

  void loop(){

  int sensorVal=analogRead(Sensor);

  float voltage = (sensorVal* SupplyVoltage) / MaxDAC;

  float pressure_bar = abs(kPV *( (float)voltage - Voffset ) ) * 10 ;  /* x10 = MegaPascal to Bar; use abs() to avoid negative pressure */

  Serial.print("Sensor Value: "); Serial.print(sensorVal); Serial.print(" | ");
  Serial.print("Volts: ");        Serial.print(voltage);   Serial.print(" | ");
  Serial.print("Pressure: ");     Serial.print(pressure_bar); Serial.println(" bars ");

    if (pressure_bar >= max_bar_off) {      /* Check if the pressure remains above the limit "max_bar_off" */
        if  (time_end != 0) {               /* Check if the "delay for stop" time is activated */
            if ( time_end < millis() ) {    /*  "delay for stop" end ? then turn OFF the pump */
              digitalWrite(4, HIGH); 
              digitalWrite(3, HIGH);
              Serial.println("PUMP => OFF");  
              time_end = 0;                 /* reset "delay for stop" and start new Check  */
            }
        } else {              
            time_end = millis() + stop_delay;   /* init "delay for stop" and Check if the pressure remains above the limit "max_bar_off"  */
            Serial.println("PUMP => WAIT FOR STOP...");
        }
      
    } else if (pressure_bar <= min_bar_on) {    /* the pressure is lower than the "min_bar_on" and we start the pump */
      time_end = 0;                             /* reset "delay for stop", start de pump and start/loop new Check  */
      digitalWrite(4, LOW);
      digitalWrite(3, LOW);
      Serial.println("PUMP => ON");      
    }   
    
  delay(333);     /* A check of 3 times per second in the loop is enough for my case */

  wdt_reset();    /* reset Arduino watchdog */
}

Pentru cine doreste si are timp de “bricolat” :

  • poate sa-i adapteze un ecran LCD si butoane ptr reglarea parametrilor,
  • SD card ptr loguri (in acest caz se poate programa si cu autoconfigurare la instalare, resetare, etc),
  • senzor de curent ptr detectarea defectiunii pompei sau daca pompa este submersibila cu plutitor se detecteaza de fapt lipsa apei, nu mai este apa in fantana
  • implementarea de cod pentru estimarea consumului (daca este prezent senzorul de curent)
  • interfata WIFi/LAN ptr programare/control de la distanta

Se poate adauga si cod suplimentar + senzor de curent ptr detectarea lipsei de apa si oprirea pompei “pe avarie” pana la resetare manuala sau cu verificare periodica dupa un anumit timp. Practic, se verifica daca presiunea este aproape de zero si daca exista curent pe alimentare, insa daca pompa este submerisbila si are plutitor, acest aspect devine redundant, mai mult deranjeaza decat aduce un avantaj.

O alta modificare: daca exista doua surse de alimentare se poate configura una preferentiala, iar daca apare o lipsa de apa pe sursa preferentiala, se va comuta automat pe cea “secundara” urmand ca trecerea pe cea preferata sa se faca manual sau automat cu verificare periodica, in functie de specificatiile proiectului. Insa ptr o astfel de optiune este nevoie de bloc cu mai multe relee (minim 3), alimentare separata ptr comanda releelor + electrovana si instalatie special construita ptr alimentare din doua surse.

Pentru alte nelamuriri sau intrebari, puteti sa lasati un comentariu mai jos.

Arduino-pressure-switch project-byrev

byrev Written by:

6 Comments

  1. George Ilie
    May 21, 2020
    Reply

    Salut! Frumos din partea ta sa impartasesti munca ta.
    Incerc sa fac ceva asemanator si am niste probleme cu citirea senzorului de presiune.
    Mai exact, folosind codul tau am intodeauna presiune 0.00 bari.

    Cateva detalii despre mediul meu:
    – placa NodeMCU. Are o iesire Vin
    – alimentare cu USB sau incarcator de mobil la 5V
    – lungimea cablului pana la senzor este de 5 metri

    Am incercat cu alte ciduri, dar de obicei variaza presiunea si nu pare sa fie corecta.
    Ai sugestii?

    • byrev
      September 27, 2020
      Reply

      Acum am observat ca ai zis ceva despre cablu:
      “lungimea cablului pana la senzor este de 5 metri”
      … ar trebui sa folosesti un cablu ecranat/torsadat ptrcum cele de internet, sa nu ai surprize cu paraziti/zgomot RF pe cablu respectiv !

  2. byrev
    June 29, 2020
    Reply

    Salut,
    Nu stiu cat de compatibil este NodeMCU cu un cod Arduino “clasic”, dar poti sa faci un cod ptr debug, citesti ce ai pentru valoarea de zero (ca presiune), acel Voffset poate sa fie diferit. de altfel si senzorul, poate este un alt model ? Poate are alte caracteristici ? … Nu ma pot pronunta mai mult, dar un debug sa vezi ce rezultate ai la zero bari te=ar putea ajuta. Ar fi util sa stii si pentru presuini mai mari, de ex 10bar, ce valori ai, dar ai nevoie de o presiune “etalon’ , mai greu de obtinut … pompele ptr furci si shockuri de biciclete te pot ajuta pana la 41 de bari, dar majoritatea sunt pana la 21 bar !

  3. Catalin
    September 26, 2020
    Reply

    Salut!
    Cum am putea discuta despre un proiect putin mai complex decat acesta?
    Multumesc.

    • byrev
      September 27, 2020
      Reply

      Salut,
      Ti-am trimis un email si poti sa-mi lasi acolo ceva detalii !

  4. Bogdan Iulian
    June 4, 2021
    Reply

    Salut. Foarte interesant proiectul. Doresc sa fac si eu ceva asemanator, dar as vrea sa atasez si un LCD si nu prea reusesc :)). M-ai putea ajuta? Multumesc anticipat!

Leave a Reply

Your email address will not be published. Required fields are marked *