Σάββατο 18 Φεβρουαρίου 2023

Αισθητήρας ροής νερού (Gravity: Water Flow Sensor (1/2") For Arduino)

 

    O αισθητήρας ροής διαθέτει μία φτερωτή που παρεμβάλλεται στην ροή του νερού μέσα στον σωλήνα ύδρευσης. Όταν γυρίζει η φτερωτή παράγει ηλεκτρικούς παλμούς, χάρη στο φαινόμενο Χολ(Hall). 

    Από την συχνότητα αυτών των παλμών μπορούμε να έχουμε εικόνα σχετικά με την ποσότητα του νερού που περνάει μέσα από τον σωλήνα στη μονάδα του χρόνου. 

    Από την άλλη, αν δεν υπάρχει ροή, δεν δημιουργούνται παλμοί.

    Στο παρακάτω πρόγραμμα, αν υπάρχουν παλμοί (δηλαδή ροή νερού) αυξάνουμε ένα μετρητή κάθε δευτερόλεπτο. Αν δεν υπάρχουν, ο μετρητής μηδενίζεται. Στόχος είναι να καταγραφεί η διάρκεια ροής, ώστε αν αυτή ξεπερνάει κάποιο χρονικό διάστημα, να δίνεται η πληροφορία διαρροής από κάποιο σημείο του δικτύου.

Το κύκλωμα φαίνεται παρακάτω:


  • Το κόκκινο καλώδιο συνδέεται με τάση 5V
  • Το μαύρο με την γείωση
  • Το πράσινο σε ένα pin (στο συγκεκριμένο το 2) του Arduino που έχει οριστεί ως είσοδος.

Το πρόγραμμα φαίνεται παρακάτω:

volatile int flow_frequency; // Measures flow sensor pulses

// Calculated litres/hour

unsigned char flowsensor = 2; // Sensor Input

unsigned long currentTime;

unsigned long cloopTime;

int flow_counter=0;

int valve=5;


void flow () // Interrupt function

{

   flow_frequency++;

}




void setup() {

  // put your setup code here, to run once:

pinMode(flowsensor, INPUT);

pinMode(valve, OUTPUT);

   digitalWrite(flowsensor, HIGH); 

   digitalWrite(valve, LOW);

   Serial.begin(9600);


   attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Setup Interrupt

  currentTime = millis();

   cloopTime = currentTime;

  }

void loop() {
  // put your main code here, to run repeatedly:
currentTime = millis();
   // Every second,
   if(currentTime >= (cloopTime + 1000))
   {
    cloopTime = currentTime; // Updates cloopTime
    if(flow_frequency != 0){
      
       flow_counter++; //increase counter every second
       flow_frequency = 0;
      Serial.print(flow_counter);
      if (flow_counter>20)
      {
       digitalWrite(valve, HIGH); }
      }
    }
    else {
        flow_counter = 0; // Reset Counter
        Serial.print(flow_counter);
     }
     
     }

Σημεία για συζήτηση:
1) attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); 

Σημαίνει, πρακτικά, ότι όταν έχεις αίτημα διακοπής (ηλεκτρικό παλμό) και μάλιστα "RISING", δηλαδή από 0V προς 5V, τότε κάλεσε την συνάρτηση flow, η οποία αυξάνει τον μετρητή  flow_frequency κατά ένα, σημάδι ότι υπάρχει ροή νερού.

2) currentTime = millis();
   // Every second, 
   if(currentTime >= (cloopTime + 1000))
Βρίσκει την τρέχουσα ώρα και κάνει την επόμενη κίνηση αν ο χρόνος ισούται με τρέχουσα ώρα + 1000ms, δηλαδή ελέγχει κάθε sec.

3) Ο μετρητής flowcounter αυξάνει κατά 1 κάθε sec, όσο υπάρχει ροή( flowfrequency !=0). Διαφορετικά (flowfrequency==0) μηδενίζεται.

4) Έχουμε θέσει το pin 5 ως έξοδο, ώστε να στείλουμε σήμα σε μία ηλεκτροβάνα και να κλείσει την ροή νερού, αν ο μετρητής flowcounter ξεπεράσει μια τιμή, γεγονός που σημαίνει ότι υπάρχει συνεχής ροή για υπερβολικό χρονικό διάστημα, συνεπώς εικάζεται διαρροή νερού.




Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

Σημείωση: Μόνο ένα μέλος αυτού του ιστολογίου μπορεί να αναρτήσει σχόλιο.