// PINS
#define PIN_BUZZER 8
#define PIN_DEURSENSOR 6
#define PIN_RESETKNOP 5
#define PIN_TEMPSENSOR A0
#define PIN_LED 7
// Constanten
#define MAXTEMP 9
// 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 contoleerTempratuurInC();
void timerMute();
//Variabelen
float temp;
unsigned long pauze = 7000;
unsigned long startmoment = - pauze;
unsigned long verstrekenTijd;
byte stateFrigo = 1;
String frigoStates[] = {"", "DEUR_DICHT", "DEUR_OPEN_OK", "DEUR_OPEN_ALARM", "DEUR_OPEN_MUTE"};
void setup() {
Serial.begin(115200);
pinMode(PIN_BUZZER, OUTPUT);
pinMode(PIN_TEMPSENSOR, INPUT );
pinMode(PIN_DEURSENSOR, INPUT);
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_RESETKNOP, INPUT);
}
void loop() {
checkDeurSwitch();
// Print het 'state'-ste element uit de lijst frigoStates
// Als de state 'DEUR_DICHT' wil dat zeggen dat de state '1' is.
// het 'state'-ste element is dus het 1-ste element.
Serial.println(frigoStates[stateFrigo]);
switch (stateFrigo) {
case DEUR_DICHT: // +- 1 DEUR_DICHT -----------------------------
break; // | Doet voorlopig niets in dit project. De state
// | kan veranderen door de 'checkDeurSwitch()' functie
case DEUR_OPEN_OK: // +- 2 DEUR_OPEN_OK ---------------------------
checkTemperatuur(); // | Afhankelijk van de gemeten temperatuur
break; // | verandert de state naar 'DEUR_OPEN_ALARM'
case DEUR_OPEN_ALARM: // +- 3 DEUR_OPEN_ALARM ------------------------
checkMuteButton(); // | Afhankelijk of de 'muteButton' werd ingedrukt
alarm(); // | varandert de state naar 'DEUR_OPEN_MUTE' of
break; // | blijft de state hier en hoor je een alarm
case DEUR_OPEN_MUTE: // +- 4 DEUR_OPEN_MUTE -------------------------
timerMute();
break; // | Afhankelijk van de verlopen tijd sinds op de
// | muteButton werd gedrukt blijft de state hier of
// | gaat hij naar 'DEUR_OPEN_ALARM' en is er een alarm
default:
break;
}
}
void checkMuteButton() {
if (digitalRead(PIN_RESETKNOP) == LOW) {
stateFrigo = DEUR_OPEN_MUTE;
startmoment = millis();
}
}
void alarm() {
tone(PIN_BUZZER, 1400, 100);
}
void checkDeurSwitch() {
if (digitalRead(PIN_DEURSENSOR) == HIGH) {
// Hier is de deur open
// In eerste instatie kan de frigo niet in 'Mute' gezet zijn want
// de deur is nog maar juist op.
if (stateFrigo != DEUR_OPEN_MUTE) {
// Het programma landt hier dus in eerste instantie want de state
// kan onmogelijk 'DEUR_OPEN_MUTE' zijn. Daarom gaat de frigo zijn
// huidige temperatuur controleren. Hij moet weten of hij in
// de 'DEUR_OPEN_OK' komt of in de 'DEUR_OPEN_ALARM'
checkTemperatuur();
}
} else {
// Hier is de deur gesloten
stateFrigo = DEUR_DICHT;
delay(5);
}
// Onafhankelijk van de stand van de deurSwitch moet de led zich zetten
// naar de switch, voor optimalisatie zouden we dus het electronische schema
// kunnen aanpassen en de Led gewoon op pin 6 kunnen zetten. Maar er
// komt misschien ooit een upgrade van de software die een extra functie
// voor de led voorziet (een Alarm-indicatie of zo).
digitalWrite(PIN_LED, digitalRead(PIN_DEURSENSOR)); // led volgt deur
}
void checkTemperatuur() {
// De functie 'contoleerTempratuurInC()' berekent de huidige temperatuur
// in graden Celcius op basis van de weerstand van de thermistor.
temp = contoleerTempratuurInC();
// Is de temperatuur te hoog dan moet de state
// veranderen naar 'DEUR_OPEN_ALARM', anders 'DEUR_OPEN_OK'
if (temp > MAXTEMP) {
stateFrigo = DEUR_OPEN_ALARM;
} else {
stateFrigo = DEUR_OPEN_OK;
}
}
float contoleerTempratuurInC() {
// deze code is terug te vinden op de informatie-pagina van dit component.
// De complexe formule zet een gemeten spanning om naar graden C°
// De meeste temperatuursensoren werken op een gelijkaardige manier,
// maar hebben misschien een andere BETA waarde. Vandaar dat deze als constante
// uit de formule is gehaald.Deze waarde vind je dus in de technische fiche
// van het component. Gebruik je een andere sensor dan zal je deze BETA aanpassen.
const float BETA = 3950; // Moet overeenkomen met Beta Coefficient van de thermistor
return 1 / (log(1 / (1023. / analogRead(A0) - 1)) / BETA + 1.0 / 298.15) - 273.15;
}
void timerMute() {
verstrekenTijd = millis() - startmoment;
if(verstrekenTijd > pauze){
stateFrigo = DEUR_OPEN_OK;
}
}