Teneriffa genießen

Home
Wetter
Wandern
GPS-Navigation
Fotografieren
Rezepte
Monarch
Interessantes
Familie privat
Arduino
Vulkanausbruch

Nach oben
Roboter
Pozo

Nach oben

 

 

Wassermenge im Regenwassertank messen und
per Digitalanzeige und Power-LEDs anzeigen

 

Mein erstes nutzbringendes Kleinprojekt mit dem Arduino, welches nicht käuflich zu erwerben ist.

Wie viel Regenwasser im Regenwassertank wirklich vorhanden war, konnte ich nur mit dem Maßband messen. Ich ließ ein Maßband von oben so weit in den dunklen Tank hinunter gleiten, bis ich von oben die Wellen gesehen habe, die das Maßband auf der Regenwasser-Oberfläche hervorrief.

Nun habe ich einen

Ultraschall-Abstandssensor mit dem Arduino verbunden und zusätzlich ein
Feuchtigkeits-Temperatursensor, ein
2-zeiliges LCD-Display und
4 Farben, mit je 3 Power LEDs zur Fernanzeige
● und in C++ programmiert

Es ist ja ganz gut, den Wasservorrat auf dem LCD Display zu sehen (und die Temperatur, die Feuchtigkeit und die Wasserstandshöhe) aber das sieht man nur, wenn man direkt vor dem Display steht oder "hockt".

Um nun die Regen-Wasserstandshöhe auch von meinem Arbeitsplatz im Arbeitszimmer aus zu sehen, ohne hinausgehen zu müssen, habe ich 4 x 3 farbige  Power-LEDs eingebaut mit denen ich den umgerechneten Meßwert von meinem Computerarbeitsplatz ablesen kann.

Die Power-LED-Anzeige besteht aus

3 LEDs rot >> m
3 LEDs grün >> dm
3 LEDs weiß >> cm und
3 LEDs blau >> es folgt eine neue Messung

Die Ablesung aus der Entfernung erfolgt folgendermaßen:

Anzahl rotes Blinken - entspricht der Anzahl Meter
Anzahl grünes Blinken - entspricht der Anzahl dm
Anzahl weißes Blinken - entspricht der Anzahl cm

danach blinken 3 x schnell die 3 blauen LEDs, um anzuzeigen, daß eine neue Messung erfolgt.

Also, 3 x rot blinken, 2 x grün blinken, 5 x weiß blinken und danach das schnelle Blinken der blauen LEDs heißt:

325 cm Wasserstand noch vorhanden, also 3,25 Meter Regenwasser noch vorhanden.


Regenwassertank-Zugang  mit Arduino-Kästchen


Zusammenbau


Anzeige des LCD-Displays

Da die Power LEDs 12 V Betriebsspannung benötigen, mußte ich die LEDs über je einen Transistor ansteuern und mit einem 12 V Netzteil versorgen:
(A_Projekt_11_Pozo.cdr)
 

 

Die Überlegungen der Umrechnungen:

 

Verdrahtung der Sensoren:

 

Und hier der C++ - Sketch dazu:

String file="DHT22_Ultrasonic_LCD_Pozo_21";

#include <DHT22.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

#define DHT22_PIN 6
DHT22 myDHT22(DHT22_PIN);

#include <Ultrasonic.h>
#define TRIGGER_PIN 8
#define ECHO_PIN 7
// und VCC+5V und GND
#define NUMBER_BUFFERS 3
#define BUFFER_SIZE 3
#define BUFFER_01 0
#define BUFFER_02 1
#define BUFFER_03 2

Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);
bool disableSD = false;

int b=400;
int a,i,hunderter, zehner,einer;

float celsius,feucht,wassermenge;

void setup()
{
Serial.begin(9600);
Serial.println(file);
pinMode(2, OUTPUT); //rot hunderter
pinMode(3, OUTPUT); //grün zehner
pinMode(4, OUTPUT); //weiß einer
pinMode(5, OUTPUT); //blau Ende Messung

//pinMode(13,OUTPUT);//intern zur Kontrolle

if(!ultrasonic.sampleCreate(NUMBER_BUFFERS,
BUFFER_SIZE, BUFFER_SIZE,BUFFER_SIZE))
{
disableSD = true;
Serial.println("Could not allocate memory.");
}

// initialize the LCD
lcd.begin();
lcd.backlight();
lcd.print(file);
lcd.print(file);delay(2000);
lcd.clear();
lcd.setCursor(7, 1);lcd.print(" ");

delay(2500); //DHT22 braucht über 2 Sekunden nach Start zum Aufwärmen
}

void loop()
{
float cm;
float msStdDev, cmStdDev, inStdDev;
long microsec = ultrasonic.timing();

cm = ultrasonic.convert(microsec, Ultrasonic::CM);

DHT22_ERROR_t errorCode;
errorCode = myDHT22.readData();

msStdDev = ultrasonic.unbiasedStdDev((float) microsec, BUFFER_01);
cmStdDev = ultrasonic.unbiasedStdDev(cm, BUFFER_02);

cm=470-cm; //Wassertiefe, nicht Abstand zur Wasseroberfläche

wassermenge=(cm*0.25);
if (cm>1000) {
Serial.println("Neumessung");
lcd.setCursor(14, 0);lcd.print("nM");
}

 // rot=100-er (Pin3), grün=10-er (Pin4), weiß=1-er (Pin5),
blau=Data fertig(Pin6)
//zerlegung der cm-Daten
hunderter=cm/100;

if (hunderter >= 20) {cm=0;hunderter=0; }

zehner=(cm-hunderter*100)/10;
einer=cm-hunderter*100-zehner*10;

lcd.setCursor(0, 0);
lcd.print(cm,1);lcd.print("cm ");


Serial.print ("cm:");Serial.print(cm);

if (hunderter>0)
{
Serial.print(" hunderter: ");Serial.print(hunderter);
for (i=1;i<=hunderter;i++)
{digitalWrite(2,HIGH);
lcd.setCursor(10, 0);lcd.print(wassermenge,3);
delay(800);
digitalWrite(2,LOW);
// lcd.setCursor(12, 0);lcd.print(" ");
delay(800);
}
}

if (zehner>0)
{
Serial.print(" zehner: ");Serial.print(zehner);
for (i=1;i<=zehner;i++)
{digitalWrite(3,HIGH);
delay(800);
digitalWrite(3,LOW);
delay(800);
}

}

if (einer>0)
{
Serial.print(" einer: ");Serial.println(einer);
for (i=1;i<=einer;i++)
{digitalWrite(4,HIGH);
delay(800);
digitalWrite(4,LOW);
delay(800);}
}

Serial.println("Messung beendet ");
digitalWrite(5,HIGH);delay(100);digitalWrite(5,LOW);delay(100);
digitalWrite(5,HIGH);delay(100);digitalWrite(5,LOW);delay(100);
digitalWrite(5,HIGH);delay(100);digitalWrite(5,LOW);delay(100);

delay(2000);

celsius= myDHT22.getTemperatureC()-1.2;
feucht=feucht=myDHT22.getHumidity()+4.6;

Serial.print(" C ");Serial.println(celsius,1);
Serial.print(" F ");Serial.println(feucht,1);Serial.println();

lcd.clear();
lcd.setCursor(0, 0);
lcd.print(cm,1);lcd.print(" cm ");
lcd.setCursor(0, 1);
lcd.print(celsius,1);
lcd.print("\xDF" "C");

lcd.setCursor(9, 1);
lcd.print(feucht,1);
lcd.print("%rF ");

}