#include <Servo.h>
// Nieuwe pin- en variabele definities
int pinLicht = 9;
int pinFotoresistor = A0;
int pinServo = 11;
int pinKnop1 = 2;
int pinKnop2 = 4;
int pinKnop3 = 7;
int pinRGB[] = {3, 5, 6};
int pinTemperatuur = A1;
int pinKnopNood = 8;
bool lichtStatus = LOW;
bool knopStatus1 = LOW;
bool knopStatus2 = LOW;
bool knopStatus3 = LOW;
bool knopStatusNood = LOW;
bool vorigeKnopStatus1;
bool vorigeKnopStatus2;
bool vorigeKnopStatus3;
bool vorigeKnopStatusNood;
bool noodModusActief = LOW;
bool handmatigeVentilatorModus = LOW;
String ventilatorSnelheid = "Uit";
bool gordijnStatus = LOW;
int servoPositie = 0;
Servo servoMotor;
float huidigeTemperatuur = 0;
float vorigeTemperatuur;
const float BETA = 3950;
void setup() {
// Setup configuratie
Serial.begin(9600);
pinMode(pinLicht, OUTPUT);
pinMode(pinKnop1, INPUT);
pinMode(pinKnop2, INPUT);
pinMode(pinKnop3, INPUT);
pinMode(pinKnopNood, INPUT);
for (int i = 0; i < 3; i++) {
pinMode(pinRGB[i], OUTPUT);
}
servoMotor.attach(pinServo);
servoMotor.write(servoPositie);
}
void loop() {
beheerLicht();
leesTemperatuur();
controleerKnoppen();
controleerNoodknop();
if (lichtStatus == HIGH) {
beheerLicht();
}
if (handmatigeVentilatorModus == LOW || vorigeTemperatuur != huidigeTemperatuur) {
beheerVentilator();
handmatigeVentilatorModus = LOW;
}
}
void beheerLicht() {
int lichtwaarde = analogRead(pinFotoresistor);
int helderheid = lichtwaarde / 4;
analogWrite(pinLicht, helderheid);
}
void leesTemperatuur() {
int analogeWaarde = analogRead(pinTemperatuur);
vorigeTemperatuur = huidigeTemperatuur;
huidigeTemperatuur = 1 / (log(1 / (1023. / analogeWaarde - 1)) / BETA + 1.0 / 298.15) - 273.15;
}
void beheerVentilator() {
if (huidigeTemperatuur > 26) {
ventilatorSnelheid = "R";
stelRGBIn(0, 255, 255);
} else if (huidigeTemperatuur > 22) {
ventilatorSnelheid = "B";
stelRGBIn(255, 255, 0);
} else if (huidigeTemperatuur > 18) {
ventilatorSnelheid = "G";
stelRGBIn(255, 0, 255);
} else {
ventilatorSnelheid = "Uit";
stelRGBIn(255, 255, 255);
}
}
void stelRGBIn(int R, int G, int B) {
analogWrite(pinRGB[0], R);
analogWrite(pinRGB[1], G);
analogWrite(pinRGB[2], B);
}
void controleerKnoppen() {
// Knop 1
vorigeKnopStatus1 = knopStatus1;
knopStatus1 = digitalRead(pinKnop1);
if (knopStatus1 == HIGH && vorigeKnopStatus1 == LOW) {
if (lichtStatus == LOW) {
Serial.println("Lichten aan");
lichtStatus = HIGH;
beheerLicht();
} else {
Serial.println("Lichten uit");
analogWrite(pinLicht, 0);
lichtStatus = LOW;
}
delay(300);
}
// Knop 2
vorigeKnopStatus2 = knopStatus2;
knopStatus2 = digitalRead(pinKnop2);
if (knopStatus2 == HIGH && vorigeKnopStatus2 == LOW) {
if (ventilatorSnelheid == "R") {
stelRGBIn(255, 255, 255);
ventilatorSnelheid = "Uit";
} else if (ventilatorSnelheid == "B") {
stelRGBIn(0, 255, 255);
ventilatorSnelheid = "R";
} else if (ventilatorSnelheid == "G") {
stelRGBIn(255, 255, 0);
ventilatorSnelheid = "B";
} else if (ventilatorSnelheid == "Uit") {
stelRGBIn(255, 0, 255);
ventilatorSnelheid = "G";
}
handmatigeVentilatorModus = HIGH;
delay(300);
}
// Knop 3
vorigeKnopStatus3 = knopStatus3;
knopStatus3 = digitalRead(pinKnop3);
if (knopStatus3 == HIGH && vorigeKnopStatus3 == LOW) {
if (gordijnStatus == LOW) {
Serial.println("Gordijnen sluiten");
for (servoPositie = 0; servoPositie <= 180; servoPositie += 1) {
servoMotor.write(servoPositie);
delay(15);
}
Serial.println("Gesloten");
gordijnStatus = HIGH;
} else {
Serial.println("Gordijnen gaan open");
for (servoPositie = 180; servoPositie >= 0; servoPositie -= 1) {
servoMotor.write(servoPositie);
delay(15);
}
Serial.println("Open");
gordijnStatus = LOW;
}
}
}
void controleerNoodknop() {
vorigeKnopStatusNood = knopStatusNood;
knopStatusNood = digitalRead(pinKnopNood);
if (knopStatusNood == LOW && vorigeKnopStatusNood == HIGH) {
noodModusActief = !noodModusActief;
if (noodModusActief) {
Serial.println("Noodmodus aan");
if (gordijnStatus != LOW) {
Serial.println("Gordijn gaan open");
servoMotor.write(0);
gordijnStatus = LOW;
}
} else {
stelRGBIn(255, 255, 255);
ventilatorSnelheid = "Uit";
analogWrite(pinLicht, 0);
lichtStatus = LOW;
Serial.println("Noodmodus uit");
}
delay(250);
}
if (noodModusActief) {
activeerNoodModus();
}
}
void activeerNoodModus() {
static unsigned long vorigeMillisLicht = 0;
static unsigned long vorigeMillisRGB = 0;
const long intervalLicht = 300;
const long intervalRGB = 300;
static bool lichtAan = LOW;
static bool rgbAan = LOW;
unsigned long huidigeMillis = millis();
if (huidigeMillis - vorigeMillisLicht >= intervalLicht) {
vorigeMillisLicht = huidigeMillis;
lichtAan = !lichtAan;
digitalWrite(pinLicht, lichtAan);
}
if (huidigeMillis - vorigeMillisRGB >= intervalRGB) {
vorigeMillisRGB = huidigeMillis;
rgbAan = !rgbAan;
if (rgbAan) {
stelRGBIn(0, 255, 255); // Rood
} else {
stelRGBIn(0, 0, 0); // Uit
}
}
}