-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHumidityController.cpp
132 lines (111 loc) · 4.02 KB
/
HumidityController.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include "Arduino.h"
#include "Time.h"
#include "TimeAlarms.h"
#include "DHT22.h"
#include "DateTime.h"
#include "AtomizerController.h"
#include "FanController.h"
#include "HumidityController.h"
// Create a new HumidityControllerSettings object with specified
// target humidity, kick on humidity, fan stop delay (s), and update interval (s)
HumidityControllerSettings::HumidityControllerSettings(float target, float kickOn, int fanStop, int update){
targetHumidity = target;
kickOnHumidity = kickOn;
fanStopDelay = fanStop;
updateInterval = update;
};
// static member initializers
DHT22 HumidityController::sensorOne = NULL;
DHT22 HumidityController::sensorTwo = NULL;
AtomizerController HumidityController::atomizer = NULL;
FanController HumidityController::fans = NULL;
HumidityControllerSettings* HumidityController::settings;
bool HumidityController::running = false;
// Initialize the humidity controller with provided sensor, atomizer and fan pins, and settings.
void HumidityController::init(byte sensorOnePin, byte sensorTwoPin, byte atomizerPin,
byte fansPin, HumidityControllerSettings* s) {
//init sensors
sensorOne = DHT22(sensorOnePin);
sensorTwo = DHT22(sensorTwoPin);
atomizer = AtomizerController(atomizerPin);
fans = FanController(fansPin);
//init settings and tracking vars
settings = s;
Serial.print("setting update interval: "); Serial.println(settings->updateInterval);
//set up update interval
Alarm.timerRepeat(settings->updateInterval, update);
};
// Update the humidity system status, called once per update interval
void HumidityController::update() {
// update sensor readings
sensorOne.updateValues();
sensorTwo.updateValues();
//check values against threshold
//float avgHumidity = average(sensorOne.getHumidity(), sensorTwo.getHumidity());
float avgHumidity, hum1, hum2;
humidity(avgHumidity, hum1, hum2);
if(avgHumidity < settings->kickOnHumidity) {
// start humidifier when kick-on humidity reached.
if(!running) {
runHumidifier();
running = true;
}
} else if(avgHumidity >= settings->targetHumidity) {
if(running) {
// stop atomizer when target humidity reached.
stopAtomizer();
//set up delayed fan stop timer
Alarm.timerOnce(settings->fanStopDelay, stopFans);
}
}
};
// Enable the humidifier and fans
void HumidityController::runHumidifier() {
Serial.println("Turning ON humidifier");
atomizer.enable();
fans.enable();
};
// Stop the atomizer system
void HumidityController::stopAtomizer() {
Serial.println("Turning OFF atomizer");
atomizer.disable();
};
// Stop the fan system
void HumidityController::stopFans() {
Serial.println("Turning OFF fans");
fans.disable();
running = false; // set running false so humidity check knows to start up again.
};
// Return the average humidity of the two DHT22 sensors
float HumidityController::average(float a, float b) {
// if one sensor is down, exclude it from the average
if(a == 0) {
a = b;
} else if(b == 0) {
b = a;
}
float avg = (a + b) / 2;
//print details about averages for debugging
Serial.print("avg: ");
Serial.print(avg);
Serial.print(" ( "); Serial.print(a);
Serial.print(" , "); Serial.print(b); Serial.println(" )");
return avg;
};
// Update the provided variables with the humidity system status
void HumidityController::controlStatus(bool& aEnabled, bool& fEnabled) {
aEnabled = atomizer.isEnabled();
fEnabled = fans.isEnabled();
};
void HumidityController::humidity(float &avg, float &one, float &two) {
Serial.print("Humidity - ");
one = sensorOne.getHumidity();
two = sensorTwo.getHumidity();
avg = average(one, two);
}
void HumidityController::temperature(float &avg, float &one, float &two) {
Serial.print("Temperature - ");
one = sensorOne.getTemperature();
two = sensorTwo.getTemperature();
avg = average(one, two);
}