#define TEMP_SENSOR 0 //0..DHT 1...HTU21
//#define LIB_HCSR04 0
#define DEBUG 0 //flag für Serial monitor
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#if TEMP_SENSOR // HTU21 wird verwendet
#include <Adafruit_HTU21DF.h>
#else // DHT wird verwendet
#include <DHT.h>
#endif
LiquidCrystal_I2C lcd(0x27,20,4);
const int echo = 2;
const int trig = 3;
const int dhtpin = 4;
const int ledgreen = 6;
const int ledred = 5;
const int lcdCols=20; // 20 Anzahl Display Spalten
const int diameter= 40; // Durchmesser Behälter(cm)
const int maxLevel=50; // maximaler Füllstand(cm)
const int distSensMax= 20; // Abstand Sensor - maximaler Füllstand
const float area= diameter*diameter*PI/4; //Grundfläche Behälter (cm²)
const float maxVol=area*maxLevel; // maximale Volumen Flüssigkeit(cm³)
float distance =0 ; //Entfernung Sensor-Oberfläche Flüssigkeit
float level = 0; // Füllstand
float volume = 0; // Flüssigkeitsvolumen (cm³)
float liter = 0; // Flüssigkeit (l)
float prozVol = 0; // Prozent von max Volumen
float temperature=0;
String lcdText; // TEXT FÜR LCD ANZEIGE
String blankText =" "; // Text mit 20 Leerzeilen
int barSeg = 0; //Stellen der Bargraphanzeige
#if TEMP_SENSOR
Adafruit_HTU21DF tempsensor;
#else
DHT tempsensor(dhtpin, DHT22); //Der Sensor wird ab jetzt mit „dht“ angesprochen
#endif
void setup() {
pinMode(echo, INPUT);
pinMode(trig, OUTPUT);
pinMode(ledgreen, OUTPUT);
pinMode(ledred, OUTPUT);
tempsensor.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(6,0);
lcd.print("Filling");
lcd.setCursor(7,2);
lcd.print("Berat");
delay(3000);
lcd.clear();
if (DEBUG) Serial.begin(9600);
}
void loop() {
temperature = tempsensor.readTemperature(); //read temperature
if (DEBUG) Serial.println(temperature,1);
delay(200);
distance = measureDistanceCm(temperature);
if (DEBUG) Serial.println(distance,1);
level=maxLevel + distSensMax - distance;
if (level>=50)
{
lcd.setCursor(0,0);
//lcd.print("Behaelter:voll");
lcdText=("Behaelter:voll" + blankText);
digitalWrite(ledred,HIGH);
digitalWrite(ledgreen,LOW);
lcd.setCursor(0,1);
lcd.print(blankText);
lcd.setCursor(0,2);
lcd.print(blankText);
lcd.setCursor(0,3);
lcd.print(blankText);
}
else if(level<0)
{
lcd.setCursor(0,0);
//lcd.print("Fehler Sensor");
lcdText=("Fehler Sensor" + blankText);
digitalWrite(ledgreen,LOW);
digitalWrite(ledred,! digitalRead(ledred));
lcd.setCursor(0,1);
lcd.print(blankText);
lcd.setCursor(0,2);
lcd.print(blankText);
lcd.setCursor(0,3);
lcd.print(blankText);
delay(300);
}
volume= area* level;
liter= volume/1000;
prozVol= volume*100/maxVol;
lcd.setCursor(0,0);
lcdText= "LEVEL(ccm): "+String(level,1) + blankText;
lcdText= lcdText.substring(0,20);
lcd.print(lcdText);
lcd.setCursor(0,1);
lcdText = "Lit(l): "+String(liter,1) + blankText;
lcdText= lcdText.substring(0,20);
lcd.print(lcdText);
lcd.setCursor(0,2);
lcdText= "Prozent(%): "+String(prozVol,1) + blankText;
lcdText= lcdText.substring(0,20);
lcd.print(lcdText);
int adc = analogRead(prozVol);
int seg = map(adc, 0, 100, 0, lcdCols);
barGraph(seg, 20, 3,255);
}
float measureDistanceCm(float temp)
{
float duration = 0;
float sonicSpeed =0;
digitalWrite(trig, LOW); //Triggerpin sicherheitshalber zurücksetzen
delayMicroseconds(2);
digitalWrite(trig, HIGH); //Trigger Pin auf HIGH setzen
delayMicroseconds(10); //10 Microsekunden warten
digitalWrite(trig, LOW); //Trigger Pin auf LOW setzen
duration = pulseIn(echo, HIGH); //Dauer bis Echo kommt in us
delay(100);
sonicSpeed= 331.5 +0.6*temp;
return (sonicSpeed/20000*duration);
}
void barGraph(int anzSeg, int bar, int row,int zeichen) {
int i=0;
for (int i = 0; i < bar; ++i) {
lcd.setCursor(i, row);
//if (i < row) ;
if (i < anzSeg)
lcd.write(zeichen);
else
lcd.write(0x20);
}
}