//*** conditional compiler flags ***
#define TEMP_SENSOR 0 //0...using DHT used, 1...using HTU21DF
#define LIB_HCSR04 1 //0...using own function, 1...using HCSR04 Library
#define DEBUG 0 //flag für Serial monitor
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#if LIB_HCSR04
#include <HCSR04.h> //HCSR04 library used
#endif
#if TEMP_SENSOR //HTU21DF used
#include <Adafruit_HTU21DF.h>
#else //DHT used
#include <DHT.h>
#endif
LiquidCrystal_I2C lcd(0x27,20,4); //create LCD object
//---------------------------------- pin definitions
const int pinEcho = 2;
const int pinTrig = 3;
const int pinDht = 4;
const int ledGreen = 6;
const int ledRed = 5;
const int swOn = 8;
const int swOff = 7;
const int MESS_OFF = 0; //Werte für Motor Betriebszustand
const int MESS_ON = 1; //
const int SW_OFF = 1; //Werte für Schalterstellung - low active
const int SW_ON = 0; //
int status = MESS_OFF;
//---------------------------------- container definitions + LCD
const int lcdCols = 20; //Anzahl Spalten des LCD, normally 16 or 20
const int diameter = 40; //Durchmesser Behälter[cm]
const int maxLevel = 50; //maximaler Füllstand[cm]
const int distSensMaxLevel = 20; //Abstand Sensor - maximaler Füllstand[cm]
const float area = diameter*diameter*PI/4; //Grundfläche Behälter[qcm]
const float maxVol = area*maxLevel; //maximales Volumen Flüssigkeit[ccm]
//float sonicSpeed = 0; //Schallgeschwindigkeit in m/s
//float duration = 0; //Dauer bis Schall kommt
float distance = 0; //Entfernung Sensor - Oberfläche Flüssigkeit [cm]
float level = 0; //Füllstand [cm]
float volume = 0; //Flküssigkeitsvolumen [ccm]
float liter = 0; //Flüssigkeit[l]
float prozVol = 0; //Prozent von max Volumen
float temperature = 0; //Messtemperatur Sensor
String lcdText; //Text für Ausgabe LCD
String blankText = " "; //Text 20 Blanks
int barSeg = 0; //Stellen der Bargraphanzeige
#if TEMP_SENSOR
Adafruit_HTU21DF tempSensor; //HTU21DF wird verwendet
#else
DHT tempSensor(pinDht, DHT22); //DHT wird verwendet
#endif
#if LIB_HCSR04
UltraSonicDistanceSensor sonicSensor(pinTrig, pinEcho, 400 ,50000);
#endif
void setup() {
pinMode(pinEcho, INPUT);
pinMode(pinTrig, OUTPUT);
pinMode(ledGreen, OUTPUT);
pinMode(ledRed, OUTPUT);
pinMode(swOn, INPUT_PULLUP); ///pin modes
pinMode(swOff, INPUT_PULLUP);
tempSensor.begin();
lcd.init();
lcd.backlight(); //LCD Startup Message
lcd.setCursor(4,0);
lcd.print("Fillinglevel");
lcd.setCursor(7,2);
lcd.print("Heinze");
delay(3000);
lcd.clear();
if (DEBUG) Serial.begin(9600);
}
void loop() {
if(digitalRead(swOn) == SW_ON) status = MESS_ON;
if(digitalRead(swOff) == SW_ON) status = MESS_OFF;
if (DEBUG) Serial.println(status);
if(status == MESS_ON)
{
temperature = tempSensor.readTemperature(); //read temperature from Temp-Sensor
delay(200);
#if LIB_HCSR04
distance = sonicSensor.measureDistanceCm(temperature); //Lib function distance in cm abhängig von temp
#else
distance = measureDistanceCm(temperature);
//if (DEBUG) Serial.println(distance,1); // own local function
#endif
level = maxLevel + distSensMaxLevel - distance; //calculate Flüssigkeitsstand
if(level >= 50)
{
lcd.setCursor(0,0);
lcdText = ("Behaelter voll!" + blankText);
lcdText = lcdText.substring(0,lcdCols);
lcd.print(lcdText);
lcd.setCursor(0,1);
lcd.print(blankText);
lcd.setCursor(0,2);
lcd.print(blankText);
lcd.setCursor(0,3);
lcd.print(blankText);
digitalWrite(ledRed, HIGH);
digitalWrite(ledGreen, LOW);
}
else if(level < 0)
{
lcd.setCursor(0,0);
lcdText = ("Fehler Sensor!" + blankText);
lcdText = lcdText.substring(0,lcdCols);
lcd.print(lcdText);
lcd.setCursor(0,1);
lcd.print(blankText);
lcd.setCursor(0,2);
lcd.print(blankText);
lcd.setCursor(0,3);
lcd.print(blankText);
digitalWrite(ledGreen, LOW);
digitalWrite(ledRed, !digitalRead(ledRed));
delay(300);
}
else
{
volume = area*level; //Volumen Flüssigkeit [ccm]
liter = volume/1000; //Flüssigkeit [l]
prozVol = volume*100/maxVol; //Volumen Prozent
digitalWrite(ledRed, LOW);
digitalWrite(ledGreen, HIGH);
setLcdResults(); //Anzeigen der Resulte auf LCD
barSeg = map(prozVol,0,100,0,lcdCols); //Segmente für Bargraph
barGraph(barSeg,lcdCols,3);
}
}
if(status == MESS_OFF)
{
lcd.setCursor(0,0);
lcdText = ("Messung abgeschaltet!" + blankText);
lcdText = lcdText.substring(0,lcdCols);
lcd.print(lcdText);
lcd.setCursor(0,1);
lcd.print(blankText);
lcd.setCursor(0,2);
lcd.print(blankText);
lcd.setCursor(0,3);
lcd.print(blankText);
digitalWrite(ledGreen, LOW);
digitalWrite(ledRed, LOW);
}
}
float measureDistanceCm(float temp)
{
float duration = 0;
float sonicSpeed = 0; //Schallgeschwindigkeit in m/s
digitalWrite(pinTrig, LOW); //Triggerpin sicherheitshalber zurücksetzen
delayMicroseconds(2); //2 us warten
digitalWrite(pinTrig, HIGH); //Trigger Pin auf HIGH setzen
delayMicroseconds(10); //10 us warten
digitalWrite(pinTrig, LOW); //Trigger Pin auf LOW setzen
duration = pulseIn(pinEcho, HIGH); //Dauer bis Echo kommt in us
delay(100);
sonicSpeed = 331.5 + 0.6 * temp; //Schallgeschwindigkeit aus Temp berechnen
return (sonicSpeed/20000*duration); //Umrechnung m/s -> cm
}
void barGraph(int anzSeg, int maxCol, int row)
{
int i = 0; //Schleifenvariable
for(i = 0;i < maxCol; i++)
{
lcd.setCursor(i,row);
if(i < anzSeg)lcd.write(0xFF);
else lcd.write(0x20);
}
}
void setLcdResults()
{
lcd.setCursor(0,0);
lcdText = ("Level[cm]: " + String(level,1) + blankText);
lcdText = lcdText.substring(0,lcdCols);
lcd.print(lcdText);
lcd.setCursor(0,1);
lcdText = ("Lit[l]: " + String(liter,1) + blankText);
lcdText = lcdText.substring(0,lcdCols);
lcd.print(lcdText);
lcd.setCursor(0,2);
lcdText = ("Prozent[%]: " + String(prozVol,1) + blankText);
lcdText = lcdText.substring(0,lcdCols);
lcd.print(lcdText);
}