#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <HCSR04.h>
#include "Tank.h"
#define DHTTYPE DHT22 //Typ des sensonr const int dhttype = DHT22;
#define DHTPIN 6 //const int Dhtpin = 6;
#define ECHO 2 //const int echo = 2;
#define TRIG 3 //const int trig = 3;
#define LED_R 7
#define LED_Y 8
#define LED_G 9
LiquidCrystal_I2C lcd(0x27,20,4);
DHT tempSens(DHTPIN, DHTTYPE);
UltraSonicDistanceSensor sonicSensor(TRIG,ECHO);
//*** Definitionen aus Angabe
const float d = 40.0; //Durchmesser Behälter [cm]
const float r = d / 2; //Radius Behälter [cm]
const float h_max = 50.0; //maximale Füllstand
const float d_max = 20.0; //Abstand Sensor - max Füllstand
const float H = h_max + d_max; //gesamte Höhe Sensor - Boden
const float A = r*r*PI; //Grundfläche Behälter
const float V_max = A*h_max/1000; //Maximales Volumen in Liter
float t = 0; //Temperatur
float d_fill = 0; //Abstand Sensor - Flüssigkeit gemessen mit Sensor
float fill = 0; // Füllstand
float volume = 0; //Volumen Flüssigkeit
float prozent = 0;
Tank myTank(d,h_max,d_fill);
void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(LED_R, OUTPUT);
pinMode(LED_Y, OUTPUT);
pinMode(LED_G, OUTPUT);
tempSens.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(4,0);
lcd.print("FILL LEVEL");
lcd.setCursor(2,2);
lcd.print("Chaudhary");
delay(2000);
lcd.clear();
Serial.begin(115200);
myTank.setDistance(30);
Serial.print("Distance: ");
Serial.println(myTank.getDistance());
Serial.print("Area: ");
Serial.println(myTank.getArea());
Serial.print("Max Vol: ");
Serial.println(myTank.getMaxVolume());
Serial.print("Level: ");
Serial.println(myTank.getLevel());
Serial.print("Vol ccm: ");
Serial.println(myTank.getVolCCM());
Serial.print("Vol lit: ");
Serial.println(myTank.getVolLIT());
Serial.print("Prozent: ");
Serial.println(myTank.getVolProzent());
}
void loop() {
t = tempSens.readTemperature(); //Temperatur feststellen
d_fill = sonicSensor.measureDistanceCm(t); //Abstand Sensor - Flüssigkeit messen
fill = H - d_fill; // Füllstand ist gesamte Höhe - Distanz Sensor-Flüssikeit
volume = A * fill / 1000; //Volumen Flüssigkeit in Liter
prozent = 100 * volume / V_max;
if(fill < 0)
{
lcd.setCursor(0,0);
lcd.print("Fehler ");
ClearLines();
digitalWrite(LED_R,!digitalRead(LED_R));
digitalWrite(LED_Y,LOW);
digitalWrite(LED_G,LOW);
delay(500);
}
else if((fill > 0) && (fill < 10))
{
lcd.setCursor(0,0);
lcd.print("Fast leer <5 cm");
ClearLines();
digitalWrite(LED_R,LOW);
digitalWrite(LED_Y,HIGH);
digitalWrite(LED_G,LOW);
}
else if((fill < 50) && (fill > 45))
{
lcd.setCursor(0,0);
lcd.print("Fast voll >45 cm");
ClearLines();
digitalWrite(LED_R,LOW);
digitalWrite(LED_Y,HIGH);
digitalWrite(LED_G,LOW);
}
else if(fill >= 50)
{
lcd.setCursor(0,0);
lcd.print("Tank voll ");
ClearLines();
digitalWrite(LED_R,HIGH);
digitalWrite(LED_Y,LOW);
digitalWrite(LED_G,LOW);
}
else
{
lcd.setCursor(0,0);
lcd.print("Level [cm]: ");
lcd.print(fill,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Volume [l]: ");
lcd.print(volume,1);
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print("Prozent [%]: ");
lcd.print(prozent,0);
lcd.print(" ");
digitalWrite(LED_R,LOW);
digitalWrite(LED_Y,LOW);
digitalWrite(LED_G,HIGH);
}
}
void ClearLines()
{
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print(" ");
lcd.setCursor(0,3);
lcd.print(" ");
}