// Libraries
#include <DHT.h>
#include <Stepper.h>
//#include <Adafruit_SoftServo.h>
#include <Servo.h>
// Lights and control pins
int roomLights[] = {13, 12, 11};
int lightSwitch = 7;
int currentLightSwitchState;
int lastLightSwitchState = LOW;
int powerState = LOW;
int lightSensor = A0;
// DHT sensor, RGB as ventilation fan speed
DHT dhtSensor(A1, DHT22);
int ventilationRGB[] = {10, 9, 8};
int ventilationSwitch = 6;
int currentVentSwitchState;
int lastVentSwitchState = LOW;
// going to make 5 modes = off, green, blue, red, tempSensitive
enum ventModes {MODE_OFF = 1, MODE_GREEN, MODE_BLUE, MODE_RED, MODE_TEMP_SENSITIVE};
int mode = MODE_OFF;
int stepsPerRevolution = 360;
Stepper ventilationMotor(stepsPerRevolution, 22, 23, 24, 25);// stepper motor as ventilation fan
// Servo as window shutters
Servo servoShutter;
int shutterSwitch = 4;
int currentShutterState;
int lastShutterState = LOW;
int servoAngle = 0;
// Alarm stuff --> Actually the most important feature (if no alarm everything as is, if alarm do alarm stuff)
// Meaning --> alarm boolean needs to be global + can be a parameter of all main functions
int alarmSwitch = 3;
int currentAlarmSwitchState;
int lastAlarmSwitchState = LOW;
bool alarmTriggered = false;
void setup() {
Serial.begin(115200);
// Initialize lights and control
pinMode(lightSwitch, INPUT);
pinMode(lightSensor, INPUT);
for (int i = 0; i < 3; i++) {
pinMode(roomLights[i], OUTPUT);
}
// Initialize vents and control
pinMode(ventilationSwitch, INPUT);
dhtSensor.begin();
for (int i = 0; i < 3; i++) {
pinMode(ventilationRGB[i], OUTPUT);
}
//Initialize servo and control
pinMode(shutterSwitch, INPUT);
servoShutter.attach(5);
}
void loop() {
lastAlarmSwitchState = currentAlarmSwitchState;
currentAlarmSwitchState = digitalRead(alarmSwitch);
// Toggle alarm on/off when pressed
if (lastAlarmSwitchState == LOW && currentAlarmSwitchState == HIGH) {
alarmTriggered = !alarmTriggered;
Serial.println(alarmTriggered ? "Alarm is on" : "Alarm is off");
}
// if alarm is off everything should run normal ELSE do alarm shizzle
if (!alarmTriggered) {
lightControle();
ventilationControle();
shutterControle();
}
else {
alarmState();
}
}
// NEXT TO DO: Create UI for display & post active values
void alarmState() {
// Move the servo to 180 degrees and keep it there
servoShutter.write(180);
// Gradually increase brightness from 0 to 255 over 1 second
for (int i = 0; i <= 255; i++) {
analogWrite(roomLights[0], i);
analogWrite(roomLights[1], i);
analogWrite(roomLights[2], i);
// Set RGB LED to red with increasing brightness
analogWrite(ventilationRGB[0], i);
analogWrite(ventilationRGB[1], 0);
analogWrite(ventilationRGB[2], 0);
delay(4); // Roughly 1000 ms / 255 steps = ~4 ms per step
}
// Turn off LEDs for 0.5 seconds
analogWrite(roomLights[0], 0);
analogWrite(roomLights[1], 0);
analogWrite(roomLights[2], 0);
// Turn off RGB LED
analogWrite(ventilationRGB[0], 0);
analogWrite(ventilationRGB[1], 0);
analogWrite(ventilationRGB[2], 0);
delay(500);
}
void shutterControle() {
lastShutterState = currentShutterState;
currentShutterState = digitalRead(shutterSwitch);
if (lastShutterState == LOW && currentShutterState == HIGH) {
if (servoAngle == 0) {
servoShutter.write(180);
servoAngle = 180;
Serial.println("Window shutters are open");
} else {
servoShutter.write(0);
servoAngle = 0;
Serial.println("Window shutters are closed");
}
}
}
// Function to set RGB color or go to temperature sensitive mode
void ventilationControle() {
int temperature = dhtSensor.readTemperature();
lastVentSwitchState = currentVentSwitchState;
currentVentSwitchState = digitalRead(ventilationSwitch);
if (lastVentSwitchState == LOW && currentVentSwitchState == HIGH) {
mode++; // Increment mode
if (mode > MODE_TEMP_SENSITIVE) {
mode = MODE_OFF; // Reset mode if it exceeds the last mode
}
}
lastVentSwitchState = currentVentSwitchState; // Update the last button state
switch (mode) {
case MODE_OFF:
Serial.println("Ventilation is off - fan off");
analogWrite(ventilationRGB[0], 0);
analogWrite(ventilationRGB[1], 0);
analogWrite(ventilationRGB[2], 0);
break;
case MODE_GREEN:
Serial.println("Green mode - fan low");
analogWrite(ventilationRGB[0], 0);
analogWrite(ventilationRGB[1], 255);
analogWrite(ventilationRGB[2], 0);
ventilationMotor.setSpeed(60);
ventilationMotor.step(stepsPerRevolution);
break;
case MODE_BLUE:
Serial.println("Blue mode - fan medium");
analogWrite(ventilationRGB[0], 0);
analogWrite(ventilationRGB[1], 0);
analogWrite(ventilationRGB[2], 255);
ventilationMotor.setSpeed(120);
ventilationMotor.step(stepsPerRevolution);
break;
case MODE_RED:
Serial.println("Red mode - fan high");
analogWrite(ventilationRGB[0], 255);
analogWrite(ventilationRGB[1], 0);
analogWrite(ventilationRGB[2], 0);
ventilationMotor.setSpeed(180);
ventilationMotor.step(stepsPerRevolution);
break;
case MODE_TEMP_SENSITIVE:
Serial.println("temp_sensitive");
temperatureSensitiveLighting();
break;
}
}
// Handle ventilation RBG color based on temperature
void temperatureSensitiveLighting() {
int temperature = dhtSensor.readTemperature();
if (temperature >= 35) {
Serial.println("Ventilation level maximum - RED");
analogWrite(ventilationRGB[0], 255);
analogWrite(ventilationRGB[1], 0);
analogWrite(ventilationRGB[2], 0);
ventilationMotor.setSpeed(180);
ventilationMotor.step(stepsPerRevolution);
} else if (temperature >= 28) {
Serial.println("Ventilation level medium - BLUE");
analogWrite(ventilationRGB[0], 0);
analogWrite(ventilationRGB[1], 0);
analogWrite(ventilationRGB[2], 255);
ventilationMotor.setSpeed(120);
ventilationMotor.step(stepsPerRevolution);
} else if (temperature >= 18) {
Serial.println("Ventilation level minimum - GREEN");
analogWrite(ventilationRGB[0], 0);
analogWrite(ventilationRGB[1], 255);
analogWrite(ventilationRGB[2], 0);
ventilationMotor.setSpeed(60);
ventilationMotor.step(stepsPerRevolution);
}
else if (temperature < 18) {
Serial.println("Ventilation automatically turned off");
analogWrite(ventilationRGB[0], 0);
analogWrite(ventilationRGB[1], 0);
analogWrite(ventilationRGB[2], 0);
ventilationMotor.setSpeed(0);
ventilationMotor.step(stepsPerRevolution);
}
}
// Function to controle room lights
void lightControle() {
lastLightSwitchState = currentLightSwitchState;
currentLightSwitchState = digitalRead(lightSwitch);
// Toggle power on/off when pressed
if (lastLightSwitchState == LOW && currentLightSwitchState == HIGH) {
powerState = !powerState;
Serial.println(powerState ? "Turning LEDs on" : "Turning LEDs off");
}
// If power is on do >>>
if (powerState) {
int lightValue = analogRead(lightSensor);
int lightBrightness = map(lightValue, 8, 1016, 0, 255);
for (int i = 0; i < 3; i++) {
analogWrite(roomLights[i], lightBrightness);
}
} else {
for (int i = 0; i < 3; i++) {
digitalWrite(roomLights[i], LOW);
}
}
}
ROOM LIGHTS
VENTILATOR
LIGHT-SENSOR
TEMPERATURE
& HUMIDITY
SHUTTERS
ALARM