/**
* Program: Bathroom Exhaust Fan V3.0
* Author: Cody Leisgang
* Created: 2/14/2024
* Description: this program is designed to implement
* Class FanController to automate a fan using readings
* from a DHT22 sensor. Setup for output display LCD I2C
**/
#include "FanController.h"
#include <LiquidCrystal_I2C.h>
#include <Arduino.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
//Rotary encoder inputs
#define up 8
#define down 9
#define buttonClick 10
//Fan settings
FanController fanController;
#define fanPin 3 //Fan pin
#define manualDelay 600000 //Delay time for Manual Mode
#define DHTpin 12 //DHT Sensor pin
byte humiditySet = 50; //Humitidy % setting
float humidity, temperature;
String message[] = {"Change Humidity +/- "};
unsigned long lastButtonPress = 0;
void setup() {
// Setup Serial Monitor
Serial.begin(115200);
// Run LCD 1602 Display Setup
lcd1602Setup();
// Setup Fan
fanController = FanController(fanPin, manualDelay, DHTpin, humiditySet);
// Designate button inputs
pinMode(up, INPUT);
pinMode(down, INPUT);
pinMode(buttonClick, INPUT);
}
void loop() {
updateDisplay(false);
fanController.run();
if (millis() - lastButtonPress > 500 && digitalRead(down) == 1) {
settings();
// Remember last button press event
lastButtonPress = millis();
} else if (digitalRead(up) == 1 && millis() - lastButtonPress >= 500) {
lastButtonPress = millis();
fanController.toggleManualMode();
}
}
void lcd1602Setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Start-up Complete!");
delay(2000);
lcd.clear();
}
void printDHT(float humidity, float temperature) {
// Check if any reads failed and exit early (to try again):
if (isnan(humidity) || isnan(temperature)) {
lcd.setCursor(0, 0);
lcd.print("Failed to read ");
lcd.setCursor(0, 1);
lcd.print("from DHT sensor!");
return;
}
// Print a message to the LCD.
lcd.setCursor(0, 0);
lcd.print("Humidity: ");
lcd.print(humidity, 1);
lcd.print("%");
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// Print a message to the LCD.
lcd.print("Temp: ");
lcd.print(temperature, 1);
lcd.print((char)223);
lcd.print("F ");
}
void settings() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(message[0]);
lcd.setCursor(0, 1);
lastButtonPress = millis();
lcd.print(humiditySet);
lcd.print("%");
byte lastHumiditySet = humiditySet;
while (millis() - lastButtonPress < 3000) {
if (millis() - lastButtonPress > 250 && digitalRead(up)) {
humiditySet++;
lastButtonPress = millis();
fanController.setHumiditySet(humiditySet);
} else if ( millis() - lastButtonPress > 250 && digitalRead(down)) {
humiditySet--;
lastButtonPress = millis();
fanController.setHumiditySet(humiditySet);
}
if (humiditySet != lastHumiditySet) {
humiditySet = fanController.getHumiditySet();
lastHumiditySet = humiditySet;
lcd.setCursor(0, 1);
lcd.print(humiditySet);
lcd.print("%");
}
}
updateDisplay(true);
}
void updateDisplay(bool forceUpdate) {
bool updateValues = fanController.sensorRead();
//if values changed, update output
if (updateValues || forceUpdate) {
// Read the humidity in %:
humidity = fanController.getHumidity();
// Read Temp in F
temperature = fanController.getTemperature();
//Display results
printDHT(humidity, temperature);
}
}
void compare(int val1, int val2){
Serial.print(val1);
Serial.print("\t|\t");
Serial.println(val2);
}