#define TEMP_SENSOR 0
//#define LIB_HCSR04 0
#define DEBUG 0
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
/*#if LIB_HCSR04
#include <HCSR04.h>
#endif*/
#if TEMP_SENSOR
#include <Adafruit_HTU21DF.h>
#else
#include <DHT.h>
#endif
LiquidCrystal_I2C lcd(0x27,20,4);
const int pinEcho = 2;
const int pinTrig = 3;
const int pinDHT = 4;
const int ledGreen = 6;
const int ledRed = 5;
const int lcdCols = 20;
const int diameter = 40;
const int maxLevel = 50;
const int distSensMaxLevel = 20;
const float area = diameter*diameter*PI/4;
const float maxVol = area*maxLevel;
//float sonicSpeed = 0;
//float duration = 0;
float distance = 0;
float level = 0;
float volume = 0;
float liter = 0;
float prozVol = 0;
float temperature = 0;
String lcdText;
String blankText;
int barSeg = 0;
#if TEMP_SENSOR
Adafruit_HTU21DF tempSensor;
#else
DHT tempSensor(pinDHT, DHT22);
#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);
tempSensor.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(4,0);
lcd.print("Fillinglevel");
lcd.setCursor(7,2);
lcd.print("Mateusz");
delay(3000);
lcd.clear();
if (DEBUG) Serial.begin(9600);
}
void loop() {
temperature = tempSensor.readTemperature();
//if (DEBUG) Serial.println(temperature,1);
delay(200);
//#if LIB_HCSR04
//distance = sonicSensor.measureDistanceCm(temperature);
//#else
distance = measureDistanceCm(temperature);
//if (DEBUG) Serial.println(distance,1);
//#endif
level = maxLevel + distSensMaxLevel - distance;
if (DEBUG) Serial.println(level);
if(level >= 50)
{
lcd.setCursor(0,0);
lcdText = ("Behaelter voll!!" + blankText);
lcdText = lcdText.substring(0,lcdCols);
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);
}
if(level < 0)
{
lcd.setCursor(0,0);
lcdText = ("Behaelter Leere!" + 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);
}
if((level < 50) && (level = 0))
{
volume = area*level;
liter = volume/1000;
prozVol = volume*100/maxVol;
setLcdResults();
barSeg = map(prozVol,0,100,0,lcdCols);
barGraph(barSeg,lcdCols,3);
}
}
float measureDistanceCm(float temp)
{
float duration = 0;
float sonicSpeed = 0;
digitalWrite(pinTrig, LOW);
delayMicroseconds(2);
digitalWrite(pinTrig, HIGH);
delayMicroseconds(10);
digitalWrite(pinTrig, LOW);
duration = pulseIn(pinEcho, HIGH);
delay(100);
sonicSpeed = 331.5 + 0.6 * temp;
return (sonicSpeed/20000*duration);
}
void barGraph(int anzSeg, int maxCol, int row)
{
int i = 0;
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);
}