Introduction: Debiet Meter in Stroomgoot

Deze instructable is van een zelf gebouwde debiet meter. Deze meet de waterdiepte en de watersnelheid aan het oppervlak en berekend daarmee het debiet van de stroomgoot. Deze debiet meter is gemaakt voor een projectvak tijdens onze minor

Supplies

  1. Arduino
  • hall sensor + magneet
  • LCD scherm
  • battarij pakket (AA batarijen)
  • ultrasoon sensor
  • bedrading
  1. piepschuim
  2. lijm
  3. 3D geprint schoepenrad
  4. waterdichte bak voor arduino
  5. zuignap
  6. latten hout
  7. ductape
  8. ijzerdraad
  9. m8 schroefdraad + 4 moeren
  10. stuk touw

Step 1: In Elkaar Zetten

  1. snij 2 piepschuimen drijvers van 45 cm lang, 4 cm x 4 cm breed.
  2. Print het schoepenrad met een 3D printer
  3. Lijm dit schoepenrad aan elkaar
  4. kijk hoever de drijvers uitelkaar moeten liggen dat er genoeg ruimte is zodat het rad vrij kan draaien. In ons geval 6 cm uit elkaar.
  5. bevestig de houders waar het schoepenrad in draait op de twee drijvers
  6. lijm de sensor in de houder van het schoepenrad
  7. lijm ook de magneet in het bedoelde gaatje van het schoepen gat zodat deze als het rad ronddraait langs de hall sensor gaat. Let op dat de goede kant van de magneet boven wordt gelegd.
  8. bevestig de twee drijvers aan elkaar met lijm en 2 houten latten. Doe dit ook zo dat het schoepenrad nog kan blijven draaien.
  9. lijm de battarijen en het waterdichte bakje voor de arduino op een goede plek achterop de drijvers en zorg dat deze een stuk boven het water zitten


Step 2: 3D Printer Bestanden

Hier de bestanden die zijn getekend om daarna uit te laten printen op de 3D printer. Het zijn een aantal losse onderdelen die na het printen aan elkaar zijn gelijmd.

Step 3: Arduino Setup

In het overzicht is te zien hoe de bedrading van de arduino moet worden gedaan. Het project maakt gebruik van twee sensoren en een lcd scherm. De arduino die wij hebben gebruikt had niet genoeg ground en 5 volt inputs. Dit moet worden opgelost door de bedradingen samen te solderen tot één output.

Ook maakt het ontwerp gebruik van een batterijenpakket. Deze moet worden aangesloten op de arduino via de Vin poort en de Ground poort.

Belangrijk om rekening mee te houden zijn de lengtes van de beradingen naar de verschillende sensoren. Er moet met name voor de ultrasonic sensor een relatief lange bedrading gebruikt worden zodat de afstand tussen de sensor en de arduino overbrugt kan worden.

Step 4: Arduino Code

De arduinocode voor dit project is als volgt. Hieronder zal stap voor stap worden uitgelegd wat er gebeurt.


//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
int sensorPin = A0;

#define echoPin 2 // attach pin D2 Arduino to pin Echo of HC-SR04
#define trigPin 3 //attach pin D3 Arduino to pin Trig of HC-SR04

float pathlength = 0.85; //dm
float sensorheight = 4.05; //dm
float tankwidth = 2.02; //dm
float hwater;
float Awater;
float slipfactor;
float flowspeed;
float debit;
long duration; // variable for the duration of sound wave travel
float distance; // variable for the distance measurement


void setup()
{
 pinMode(trigPin, OUTPUT); // Sets the trigPin as an OUTPUT
 pinMode(echoPin, INPUT); // Sets the echoPin as an INPUT
 lcd.init();           // initialize the lcd 
 lcd.init();
 lcd.backlight();
 lcd.setCursor(1,0);
 lcd.print("Debietmeter");
 delay(1000);
 lcd.clear();
}

void loop() {
 float hall_count = 1.0;
 bool on_state = false;
 int counter = 0;
 float detect = 0;
 float olddetect = 0;
 float data[] = {0,0,0};
 float sum = 1.000;
 digitalWrite(trigPin, LOW);
 delayMicroseconds(2);
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10);
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);
 distance = duration * 0.0034 / 2;
 hwater = sensorheight - distance;
 Awater = hwater*tankwidth; //dm2
 while(true){
  int sensorValue = analogRead(sensorPin);
  if (sensorValue>=600 and on_state == false){
   counter++;
   detect = micros();
   //Serial.println(counter);
   lcd.setCursor(0,0);
   lcd.print("depth: ");
   lcd.print(hwater);
   lcd.print("dm");
   float t = (detect-olddetect)/1000000;
   int index = counter%3;
   data[index] = t;
   sum = data[0] + data[1] + data[2];
   sum = 3/sum;
   slipfactor = (1.45+1.5)/(sum+1.5);
   flowspeed = sum*pathlength*6.28*slipfactor;
   debit = flowspeed*Awater;
   lcd.setCursor(0,1);
   lcd.print("Debiet: ");
   lcd.print(debit); 
   lcd.print("l/s");
  
   on_state = true;
   delay(10);
   }
  if (sensorValue<=599 and on_state == true){
   on_state = false;
   olddetect = detect;
   delay(10);
  }
 }
}

Variabelen definiëren:


In dit deel van de code worden alle variabelen gedefinieerd en wat in- en output pins vastgesteld.

variabelen vooraf in te stellen:

pathlength is de straal van het schoepenrad, van het midden van de schoepen uit gezien. 

sensorheight is de hoogte van de sensor boven de bodem van de stroomgoot.

tankwidth is de breedte van de stroomgoot.

Variabelen die door de code worden gebruikt en ingesteld:

hwater is de diepte van het water.

Awater is het oppervlak van de doorsnede van het water.

slipfactor is een versterkingsfactor om rekening te houden met de slip van het schoepenrad.

flowspeed is de stroomsnelheid van het water.

debit is het debiet.

duration is de duur van de geluidspuls van de ultrasoonsensor

distance is de afstand van de ultrasoonsensor tot het wateroppervlak.


//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display

int sensorPin = A0;

#define echoPin 2 // attach pin D2 Arduino to pin Echo of HC-SR04
#define trigPin 3 //attach pin D3 Arduino to pin Trig of HC-SR04

float pathlength = 0.85; //dm
float sensorheight = 4.05; //dm
float tankwidth = 2.02; //dm
float hwater;
float Awater;
float slipfactor;
float flowspeed;
float debit;
long duration; // variable for the duration of sound wave travel
float distance; // variable for the distance measurement


setup()

void setup()
{
 pinMode(trigPin, OUTPUT); // Sets the trigPin as an OUTPUT
 pinMode(echoPin, INPUT); // Sets the echoPin as an INPUT
 lcd.init();           // initialize the lcd 
 lcd.init();
 lcd.backlight();
 lcd.setCursor(1,0);
 lcd.print("Debietmeter");
 delay(1000);
 lcd.clear();
}


Het LCD-scherm en enkele in- en uitgangspinnen worden geïnitialiseerd.

loop()

void loop() {
 float hall_count = 1.0;
 bool on_state = false;
 int counter = 0;
 float detect = 0;
 float olddetect = 0;
 float data[] = {0,0,0};
 float sum = 1.000;


Hier worden nog een aantal variabelen ingesteld die verderop in de code gebruikt worden.


 digitalWrite(trigPin, LOW);
 delayMicroseconds(2);
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10);
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);
 distance = duration * 0.0034 / 2;
 hwater = sensorheight - distance;
 Awater = hwater*tankwidth; //dm2

Hier wordt het oppervlak van de doorsnede van het water bepaald. Eerst wordt de afstand van de sensor tot het water bepaald. Voor meer informatie wordt verwezen naar deze site: https://create.arduino.cc/projecthub/abdularbi17/ultrasonic-sensor-hc-sr04-with-arduino-tutorial-327ff6


Door de gemeten afstand van de sensorhoogte af te halen, kan de waterdiepte worden bepaald. Hiermee wordt vervolgens het oppervlak berekend.


 while(true){
  int sensorValue = analogRead(sensorPin);
  if (sensorValue>=600 and on_state == false){
   counter++;
   detect = micros();
   //Serial.println(counter);
   lcd.setCursor(0,0);
   lcd.print("depth: ");
   lcd.print(hwater);
   lcd.print("dm");

Als de magneet voor de sensor langskomt, groeit de meetwaarde fors. Als de meetwaarde boven de 600 uitkomt en de variabele on_state nog 0 is, "triggert" dit if statement en worden de volgende stappen uitgevoerd.


De waterdiepte wordt geprint op het LCD-scherm. Verder wordt 1 bij de variabele counter opgeteld. Dit is meer voor debuggingdoeleinden, en zou bijvoorbeeld op de serial kunnen worden geprint.


   float t = (detect-olddetect)/1000000;
   int index = counter%3;
   data[index] = t;
   sum = data[0] + data[1] + data[2];
   sum = 3/sum;

Hier wordt het toerental van het schoepenrad berekend. Telkens als dit stuk code getriggerd wordt, wordt de tijd sinds de laatste trigger bepaald en opgeslagen in de data[] variabele. Hiermee wordt dan het gemiddelde van de afgelopen drie metingen bepaald voor meer nauwkeurigheid, en opgeslagen in de variabele sum.


   slipfactor = (1.45+1.5)/(sum+1.5);
   flowspeed = sum*pathlength*6.28*slipfactor;
   debit = flowspeed*Awater;



De slipfactor wordt bepaald als functie van het eerder bepaalde toerental. Bij lage stromingssnelheden, slipt het schoepenrad meer t.o.v. het water doordat invloed van de interne wrijvingskrachten dan significanter wordt. Als het toerental laag is, is dus een versterkingsfactor nodig om te corrigeren voor deze slip. Deze is als volgt bepaald:


1.45 is het maximale toerental dat wij konden bereiken met onze testopstelling. "sum" is het huidige toerental. Om te reguleren hoeveel invloed de versterkingsfactor heeft, wordt bij beide kanten van de deling 1.5 opgeteld. Zonder deze 1.5 zou de slipfactor heel snel heel groot kunnen worden: bij een toerental van 0.3 rps, zou de factor 1.45/0.3=4.83 worden, wat zeer hoog is. Met de extra optelling wordt de factor voor deze situatie 2.95/1.8=1.64. De 1.5 is bepaald door de stroomgoot op een bepaald debiet in te stellen, en de diepte van het water te variëren. Hierdoor blijft debiet hetzelfde, maar de stroming verandert. De factor is gekalibreerd tot het punt dat het gemeten debiet een kleine afwijking geeft bij verschillende waterdieptes.


   lcd.setCursor(0,1);
   lcd.print("Debiet: ");
   lcd.print(debit); 
   lcd.print("l/s");
  
   on_state = true;
   delay(10);

Print het gemeten debiet op het LCD-scherm, en zet de eerder benoemde on_state variabele op true. De on_state variabele zorgt ervoor dat elke keer dat de magneet langs de sensor komt maar één keer geregistreerd wordt. Hierna blijft de sensorwaarde nog wel boven de 600, maar wordt dit deel van de code toch overgeslagen. Als de sensorwaarde onder de 599 komt is de magneet "voorbij" en wordt on_state weer op false gezet, en de oude detectietijd opgeslagen.


   }
  if (sensorValue<=599 and on_state == true){
   on_state = false;
   olddetect = detect;
   delay(10);
  }
 }
}

Step 5: Calibreren

Nadat het meet instrument in elkaar is gezet en de Arduino werkt, moet het schoepenrad nog gecalibreerd worden.

We meten nu namelijk een aantal rotaties van het rad maar nog geen snelheid.

Het schoepenrad draait door het water en is natuurlijk niet perfect efficient waardoor er water langs het rad slipt, zonder dat het gaat draaien.

Dat betekend dat hier een correctie factor voor opgezet moet worden. Na verschillede tests te hebben gedaan kwamen we er op uit dat de weerstand van het rad ook veranderd met de snelheid waarmee het water stroomt.

Hiervoor hebben we de slipfactor linear laten toenemen met de watersnelheid. Dus hoe harder het stroomt hoe soepeler het schoepenrad draait en dus minder weerstand heeft dan wanneer het langzaam stroomt.