//Importeer bibliotheken
#include <LiquidCrystal_I2C.h>
#include "VertraagFunctie.h"
#include "ButtonFunction.h"
#include "Oneshot.h"
//Defineer de input,output pinnen
#define PIN_DEUR_TEMP_ALARM 9
#define PIN_BUZZER 8
#define PIN_TEMPSENSOR A0
#define PIN_DEURSENSOR 6
#define PIN_LED 7
#define PIN_RESTKNOP 5
#define PIN_MOTOR 4
//Defineer constanten
#define DEFAULTTEMPFRIGO 5
#define TEMPLIMIET 0.5
#define WACHTTIJDINSTELLEN 3000
#define TEMP_ALARM 1
#define DEUR_ALARM 2
// States
#define DEUR_DICHT 1
#define DEUR_OPEN_OK 2
#define DEUR_OPEN_ALARM 3
#define DEUR_OPEN_MUTE 4
// Functies
void checkDeurSwitch();
void checkTemperatuur();
void checkMuteButton();
void alarm();
float controleerTemperatuurInC();
void checkMuteTime();
void checkTempFrigo();
void ledBlink();
void instellenTemperatuur();
void steltTemperatuurIn();
void printInstelMenu();
void stelEenTemperatuurIn();
//Creëer objecten
LiquidCrystal_I2C lcd(0x27, 16, 2);
VertraagFunctie ledKnipper;
ButtonFunction instelKnop; //Resetknop gebruikt als instelknop temperatuur antidender
VertraagFunctie instellenTemp; //Druktijd resetknop om temperatuur in te stellen.
Oneshot lcdPrinteenmaal; //Print eenmaal regel op LCD
// Variablen
float temp;
int ingesteldeTemp = DEFAULTTEMPFRIGO;
unsigned long pauze = 7000;
unsigned long startMoment = - pauze;
byte stateFrigo = DEUR_DICHT;
volatile bool instelTempActief = false; //True als de temperatuur wordt ingesteld
int tempAlarm = ingesteldeTemp + TEMP_ALARM; //Temparatuur koelkast alarm
int tempDeurAlarm = ingesteldeTemp + DEUR_ALARM; //Temparatuur deur open alarm
volatile bool optellen = false; //Start met aftellen in beginfase
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
instelKnop.initButton(false, PIN_RESTKNOP, false);
instellenTemp.vertraagBegin(WACHTTIJDINSTELLEN);
lcdPrinteenmaal.StartOneshot(0);
pinMode(PIN_DEUR_TEMP_ALARM, OUTPUT);
pinMode(PIN_BUZZER, OUTPUT);
pinMode(PIN_TEMPSENSOR, INPUT);
pinMode(PIN_DEURSENSOR, INPUT);
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_RESTKNOP, INPUT);
pinMode(PIN_MOTOR, OUTPUT);
ledKnipper.vertraagBegin(200);
lcd.setCursor(0, 0);
lcd.print("Setup done!");
delay(2000);
lcd.clear();
}
void loop() {
checkTempFrigo();
checkDeurSwitch();
//Serial.println(stateFrigo);
switch (stateFrigo) {
case DEUR_DICHT: // 1
// doet niks
break;
case DEUR_OPEN_OK: // 2
checkTemperatuur();
break;
case DEUR_OPEN_ALARM: // 3
checkMuteButton();
alarm();
break;
case DEUR_OPEN_MUTE: // 4
checkMuteButton();
break;
default:
break;
}
if (digitalRead(PIN_RESTKNOP) == false && digitalRead(PIN_DEURSENSOR) == true && instelTempActief == false) {
instellenTemp.vertaagControleer(instellenTemperatuur);
} else if (instelTempActief == true) {
steltTemperatuurIn();
} else {
tempAlarm = ingesteldeTemp + TEMP_ALARM;
tempDeurAlarm = ingesteldeTemp + DEUR_ALARM;
instellenTemp.reset();
checkTempFrigo();
}
}
void checkDeurSwitch() {
if (digitalRead(PIN_DEURSENSOR) == HIGH) { // deur open
if (stateFrigo != DEUR_OPEN_MUTE) {
checkTemperatuur();
}
}
else {
stateFrigo = DEUR_DICHT;
}
digitalWrite(PIN_LED, digitalRead(PIN_DEURSENSOR)); // led volgt deur
}
void checkTemperatuur() {
temp = controleerTemperatuurInC();
if (temp > tempDeurAlarm) { //Deur alarm
stateFrigo = DEUR_OPEN_ALARM;
} else {
stateFrigo = DEUR_OPEN_OK;
}
}
void checkMuteButton() {
if ( digitalRead(PIN_RESTKNOP) == LOW) {
stateFrigo = DEUR_OPEN_MUTE;
startMoment = millis();
}
else {
if (millis() - startMoment >= pauze && stateFrigo == DEUR_OPEN_MUTE) {
stateFrigo = DEUR_OPEN_ALARM;
}
}
}
void alarm() {
tone(PIN_BUZZER, 1400, 100);
}
float controleerTemperatuurInC() {
const float BETA = 3950; // should match the Beta Coefficient of the thermistor
return 1 / (log(1 / (1023. / analogRead(PIN_TEMPSENSOR) - 1)) / BETA + 1.0 / 298.15) - 273.15;
}
void checkTempFrigo() {
float tempFrigo = controleerTemperatuurInC();
if (tempFrigo <= (ingesteldeTemp - TEMPLIMIET)) {
digitalWrite(PIN_MOTOR, LOW);
}
if (tempFrigo >= (ingesteldeTemp + TEMPLIMIET)) {
digitalWrite(PIN_MOTOR, HIGH);
}
if (tempFrigo >= tempAlarm && stateFrigo == DEUR_DICHT) { //Temperatuur te hoog alarm
ledKnipper.vertaagControleer(ledBlink);
}
else if (tempFrigo >= tempAlarm && stateFrigo == DEUR_OPEN_ALARM) {
digitalWrite(PIN_DEUR_TEMP_ALARM, HIGH);
}
else if (tempFrigo >= tempAlarm && stateFrigo == DEUR_OPEN_MUTE) {
ledKnipper.vertaagControleer(ledBlink);
}
else {
digitalWrite(PIN_DEUR_TEMP_ALARM, LOW);
}
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(tempFrigo);
lcd.setCursor(0, 1);
lcd.print("Set: ");
lcd.print(ingesteldeTemp);
}
void ledBlink() {
digitalWrite(PIN_DEUR_TEMP_ALARM, !digitalRead(PIN_DEUR_TEMP_ALARM));
}
//Activeerd instellen temperatuur
void instellenTemperatuur() {
instelTempActief = true;
}
// Functie die temparatuur instelt
void steltTemperatuurIn() {
while (instelTempActief == true) {
lcdPrinteenmaal.CheckOneshot(printInstelMenu);
instelKnop.checkButton(stelEenTemperatuurIn);
if (digitalRead(PIN_DEURSENSOR) == false) {
//Serial.println("Instellen verlaten.");
instelTempActief = false;
lcd.clear();
lcd.blink_off();
lcdPrinteenmaal.ResetOneshot();
}
}
}
//Print het instelmenu
void printInstelMenu() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Stel temp in:");
lcd.setCursor(0, 1);
lcd.print(ingesteldeTemp);
lcd.setCursor(1, 1);
lcd.blink_on();
}
//Functie om de temperatuur in te stellen tussen TEMP_KOELKAST_BEGINW -5 en TEMP_KOELKAST_BEGINW +5
void stelEenTemperatuurIn() {
if (ingesteldeTemp == (DEFAULTTEMPFRIGO + 4)) {
optellen = false;
}
if (ingesteldeTemp == (DEFAULTTEMPFRIGO - 4)) {
optellen = true;
}
if (ingesteldeTemp >= (DEFAULTTEMPFRIGO - 4) && ingesteldeTemp <= (DEFAULTTEMPFRIGO + 4)) {
if (optellen == true) {
ingesteldeTemp++;
} else {
ingesteldeTemp--;
}
}
lcd.setCursor(0, 1);
lcd.print(ingesteldeTemp);
lcd.setCursor(1, 1);
}