#include "DHT.h"
#include <Servo.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Pinnen van de RGB led
int rood = 5;
int groen = 6;
int blauw = 7;
// Pinnen voor kamerlichten
int kamerVerlichting[] = {10, 11, 12};
// Knoppen
int knopA = 8; // Schakel alle kamerlichten aan/uit GEEL
int knopB = 9; // Pas ventilatorsnelheid handmatig aan BLAUW
int knopC = 3; // Open/sluit het raamgordijn ROOD
int knopD = 13;
// Servo
Servo raamServo;
int raamPositie = 0;
unsigned int lichtWaarde;
unsigned int lampWaarde;
bool lichten = false;
bool handmatigeModus = false; // Variabele om handmatige modus bij te houden
int ventilatorKleur = 0; // 0 = uit, 1 = groen, 2 = blauw, 3 = rood
unsigned long laatsteKnopTijdA = 0; // Tijdstip van de laatste knopdruk voor knopA
unsigned long laatsteKnopTijdB = 0; // Tijdstip van de laatste knopdruk voor knopB
const unsigned long debounceTijd = 50; // Debounce tijd in milliseconden
unsigned long laatsteKnopTijdD = 0; // Tijdstip van de laatste knopdruk voor knopA
bool nood = false;
void setup() {
Serial.begin(9600);
pinMode(rood, OUTPUT);
pinMode(groen, OUTPUT);
pinMode(blauw, OUTPUT);
for (int i = 0; i < 3; i++) {
pinMode(kamerVerlichting[i], OUTPUT);
}
pinMode(knopA, INPUT_PULLUP); // Gebruik interne pull-up weerstanden
pinMode(knopB, INPUT_PULLUP);
pinMode(knopC, INPUT_PULLUP);
pinMode(knopD, INPUT_PULLUP);
raamServo.attach(4); // Pin 4 voor servo
dht.begin();
}
void loop() {
unsigned long huidigeTijd = millis();
//geraakt moeilijk uit de loop maar lukt wel
if (digitalRead(knopD) == LOW && (huidigeTijd - laatsteKnopTijdA > debounceTijd)) {
nood = true;
while (nood == true) {
for (int i = 0; i < 3; i++) {
analogWrite(kamerVerlichting[i], 250);
delay(20);
}
for (int i = 0; i < 3; i++) {
analogWrite(kamerVerlichting[i], 0);
delay(20);
}
raamServo.write(180);
setColor(255, 0, 0); // Rood
delay(20);
setColor(0, 0, 0); // uit
// Lees de knopstatus en voeg een vertraging toe
if (digitalRead(knopD) == LOW) {
delay(50); // Voeg een kleine vertraging toe om ruis te verminderen
if (digitalRead(knopD) == LOW) { // Controleer opnieuw na de vertraging
nood = false;
delay(20);
nood = false;
}
}
}
} else{
// Knop C: Open/sluit het raamgordijn met behulp van de servo (0° voor gesloten, 180° voor open)
if (digitalRead(knopC) == LOW && (huidigeTijd - laatsteKnopTijdA > debounceTijd)) {
raamPositie = (raamPositie == 0) ? 180 : 0; // Toggle raampositie
raamServo.write(raamPositie);
laatsteKnopTijdA = huidigeTijd; // Update laatste knop tijd
delay(500); // Wacht even voor de servo om te bewegen
}
// Knop A: handmatig overschrijven van de kamerlichten
if (digitalRead(knopA) == LOW && (huidigeTijd - laatsteKnopTijdA > debounceTijd)) {
lichten = !lichten; // Toggle de lichtstatus
laatsteKnopTijdA = huidigeTijd; // Update laatste knop tijd
if (lichten == false) {
lichtWaarde = analogRead(A0);
lampWaarde = lichtWaarde / 4;
for (int i = 0; i < 3; i++) {
analogWrite(kamerVerlichting[i], lampWaarde);
}
Serial.println(lampWaarde);
} else {
for (int i = 0; i < 3; i++) {
analogWrite(kamerVerlichting[i], 250);
}
}
Serial.print("Lichten: ");
Serial.println(lichten);
delay(500); // Wacht even voordat we de volgende knopdruk registreren
}
// Knop B: handmatig de ventilatorsnelheid regelen
if (digitalRead(knopB) == LOW && (huidigeTijd - laatsteKnopTijdB > debounceTijd)) {
handmatigeModus = !handmatigeModus; // Toggle de handmatige modus
ventilatorKleur = 0; // Reset ventilator kleur bij het inschakelen van de handmatige modus
laatsteKnopTijdB = huidigeTijd; // Update laatste knop tijd
delay(500); // Wacht even voordat we de volgende knopdruk registreren
}
if (handmatigeModus) {
// Pas ventilatorkleur aan op basis van de knopdrukken
if (digitalRead(knopB) == LOW && (huidigeTijd - laatsteKnopTijdB > debounceTijd)) {
ventilatorKleur = (ventilatorKleur + 1) % 4; // Schakel tussen 0, 1, 2, 3
laatsteKnopTijdB = huidigeTijd; // Update laatste knop tijd
delay(500); // Wacht even voordat we de volgende knopdruk registreren
}
switch (ventilatorKleur) {
case 0:
setColor(0, 0, 0); // Uit
break;
case 1:
setColor(0, 255, 0); // Groen
break;
case 2:
setColor(0, 0, 255); // Blauw
break;
case 3:
setColor(255, 0, 0); // Rood
break;
}
} else {
// Automatische regeling van de ventilatorsnelheid op basis van de temperatuur
float Temperatuur = dht.readTemperature();
Serial.print(Temperatuur);
Serial.println(F("°C "));
if (Temperatuur < 17.00) {
setColor(0, 0, 0); // Uit
} else if (Temperatuur >= 17.00 && Temperatuur < 21.00) {
setColor(0, 255, 0); // Groen
} else if (Temperatuur >= 21.00 && Temperatuur < 25.00) {
setColor(0, 0, 255); // Blauw
} else if (Temperatuur >= 25.00) {
setColor(255, 0, 0); // Rood
}
}
}
}
void setColor(int roodWaarde, int groenWaarde, int blauwWaarde) {
analogWrite(rood, roodWaarde);
analogWrite(groen, groenWaarde);
analogWrite(blauw, blauwWaarde);
}