#include "Servo.h"
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
int servo = 3;
int ledKamers = 10;
int rgbPins[] = {9, 6, 5};
int buttons[] = {1, 12, 8};
int but_A = 13;
int but_B = 12;
int but_C = 8;
int butStop = 7;
int photoRes = A1;
int tempPin = A0;
bool currButState_A = LOW;
bool currButState_B = LOW;
bool currButState_C = LOW;
bool currButState_Stop = LOW;
bool lastButState_A;
bool lastButState_B;
bool lastButState_C;
bool lastButState_Stop;
bool kamerState = LOW;
String fanSpeed = "uit";
bool manualFanMode = LOW;
int pos = 0;
bool servoState = LOW;
bool noodsituatie = LOW;
Servo myservo;
const float BETA = 3950;
float celsius = 0;
float old_celsius;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(ledKamers, OUTPUT);
pinMode(but_A, INPUT);
pinMode(but_B, INPUT);
pinMode(but_C, INPUT);
pinMode(butStop, INPUT);
for (int i; i<3; i++)
{
pinMode(rgbPins[i], OUTPUT);
}
myservo.attach(3);
myservo.write(pos);
}
void loop() {
checkTemperatuur();
if (manualFanMode == LOW || old_celsius != celsius)
{
ventilator();
manualFanMode = LOW;
}
//delay(1000);
knoppen();
if (kamerState == HIGH)
{
omgevingslicht();
}
//checkNoodKnop();
}
void omgevingslicht()
{
int analogVal = analogRead(photoRes);
int helderheid = analogVal/4;
//Serial.println(helderheid);
analogWrite(ledKamers, helderheid);
}
void checkTemperatuur()
{
int analogValue = analogRead(tempPin);
old_celsius = celsius;
//Serial.println(old_celsius);
celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
//Serial.println(celsius);
}
void ventilator()
{
//Serial.println(celsius);
if (celsius > 26)
{
fanSpeed = "rood";
//Serial.println("ventilatorsnelheid automatisch veranderd naar: rood");
setRGB(0,255,255);
}
else if (celsius > 22)
{
fanSpeed = "blauw";
//Serial.println("ventilatorsnelheid automatisch veranderd naar: blauw");
setRGB(255,255,0);
}
else if (celsius > 18)
{
fanSpeed = "groen";
//Serial.println("ventilatorsnelheid automatisch veranderd naar: groen");
setRGB(255,0,255);
}
else
{
fanSpeed = "uit";
//Serial.println("ventilator automatisch uitgezet");
setRGB(255,255,255);
}
}
void setRGB(int rood, int groen, int blauw)
{
analogWrite(rgbPins[0], rood);
analogWrite(rgbPins[1], groen);
analogWrite(rgbPins[2], blauw);
}
void knoppen()
{
//--- KNOP A ------------------------------------//
lastButState_A = currButState_A;
currButState_A = digitalRead(but_A);
if (currButState_A == HIGH && lastButState_A == LOW)
{
//Serial.println("knop A ingedrukt");
if (kamerState == LOW)
{
Serial.println("lichten AAN");
//analogWrite(ledKamers, 255);
kamerState = HIGH;
omgevingslicht();
}
else if (kamerState == HIGH)
{
Serial.println("lichten UIT");
analogWrite(ledKamers, 0);
kamerState = LOW;
}
//Deze delay is zeer handig bij een toggle button
delay(300);
}
//--- KNOP B -----------------------------------//
lastButState_B = currButState_B;
currButState_B = digitalRead(but_B);
/*
Serial.print("lastbut: ");
Serial.println(lastButState_B);
Serial.print("currbut: ");
Serial.println(currButState_B);
*/
if (currButState_B == HIGH && lastButState_B == LOW)
{
if (fanSpeed == "rood")
{
setRGB(255,255,255);
//Serial.println("ventilator manueel uitgezet");
fanSpeed = "uit";
}
else if (fanSpeed == "blauw")
{
setRGB(0,255,255);
//Serial.println("ventilatorsnelheid manueel veranderd naar: rood");
fanSpeed = "rood";
}
else if (fanSpeed == "groen")
{
setRGB(255,255,0);
//Serial.println("ventilatorsnelheid manueel veranderd naar: blauw");
fanSpeed = "blauw";
}
else if (fanSpeed == "uit")
{
setRGB(255,0,255);
//Serial.println("ventilatorsnelheid manueel veranderd naar: groen");
fanSpeed = "groen";
}
//Deze delay is zeer handig bij een toggle button
manualFanMode = HIGH;
delay(300);
}
//Serial.println(fanSpeed);
//--- KNOP C -----------------------------------//
lastButState_C = currButState_C;
currButState_C = digitalRead(but_C);
if (currButState_C == HIGH)
{
//Serial.println("knop C is ingedrukt");
}
/*
Serial.print("lastbut: ");
Serial.println(lastButState_C);
Serial.print("currbut: ");
Serial.println(currButState_C);
*/
if (currButState_C == HIGH && lastButState_C == LOW)
{
//Serial.println("if-functie binnen");
if (servoState == LOW)
{
Serial.println("raamgordijn SLUITEN...");
for (pos = 0; pos <= 180; pos += 1)
{
//Serial.println(pos);
myservo.write(pos);
delay(15);
}
Serial.println("gesloten");
servoState = HIGH;
}
else
{
Serial.println("raamgordijn OPENEN...");
for (pos = 180; pos >= 0; pos -= 1)
{
//Serial.println(pos);
myservo.write(pos);
delay(15);
}
Serial.println("open");
servoState = LOW;
}
}
checkNoodknop();
//--- NOODKNOP -----------------------------------//
/*
lastButState_Stop = currButState_Stop;
currButState_Stop = digitalRead(butStop);
if (currButState_Stop == LOW && lastButState_Stop == HIGH) {
noodsituatie = !noodsituatie;
if (noodsituatie) {
Serial.println("NOODMODUS ingeschakeld");
noodmodus_servo();
}
else
{
setRGB(255,255,255);
fanSpeed = "uit";
analogWrite(ledKamers, 0);
kamerState = LOW;
Serial.println("NOODMODUS beëindigd");
}
delay(300);
}
if (noodsituatie) {
noodmodus();
}
*/
}
void checkNoodknop()
{
lastButState_Stop = currButState_Stop;
currButState_Stop = digitalRead(butStop);
if (currButState_Stop == LOW && lastButState_Stop == HIGH) {
noodsituatie = !noodsituatie;
if (noodsituatie) {
Serial.println("NOODMODUS ingeschakeld");
//noodmodus_servo();
if (servoState != LOW)
{
Serial.println("Raamgordijn OPENEN...");
myservo.write(0);
servoState = LOW;
}
}
else
{
setRGB(255,255,255);
fanSpeed = "uit";
analogWrite(ledKamers, 0);
kamerState = LOW;
Serial.println("NOODMODUS beëindigd");
}
delay(200);
}
if (noodsituatie) {
noodmodus();
}
}
/*
void noodmodus_servo() {
if (servoState != LOW) {
Serial.println("Raamgordijn OPENEN...");
myservo.write(0);
servoState = LOW;
}
}
*/
void noodmodus() {
//Serial.println("noodmodus bezig...");
static unsigned long previousMillisLeds = 0;
static unsigned long previousMillisRgb = 0;
const long intervalLeds = 200;
const long intervalRgb = 200;
static bool ledState = LOW;
static bool rgbState = LOW;
unsigned long currentMillis = millis();
// Lichten knipperen in een volgorde naar keuze
if (currentMillis - previousMillisLeds >= intervalLeds) {
previousMillisLeds = currentMillis;
ledState = !ledState;
digitalWrite(ledKamers, ledState);
}
// RGB LED knippert rood
if (currentMillis - previousMillisRgb >= intervalRgb) {
previousMillisRgb = currentMillis;
rgbState = !rgbState;
if (rgbState) {
setRGB(0, 255, 255); // Rood
} else {
setRGB(0, 0, 0); // Uit
}
}
checkNoodknop();
}