With the wires back on the fan motor, I confirmed that code works in two ways: 1) when the humidity sensor detects that the average humidity is less than 50% the fan turns on, and 2) when the average humidity is less than 50% the fan turns off. Next, with condition 2 as the base conditions, I needed to test if the fan will turn on when the humidity sensor detects that the average humidity has increased to above 50%.
With my first version of the code, the fan was not responding the way I wanted to the humidity sensor readings.
This second version of the code using millis() was successful:
#include <DHT.h> #include <DHT_U.h> #define DHTPIN 2 // sensor DHT22 data connected to Arduino pin 2 #define DHTTYPE DHT22 // using sensor DHT22 DHT dht(DHTPIN, DHTTYPE); //dht library int chk; int humid; //stores humidity //data smoothing const int numReadings = 5; int humReadings [numReadings]; int humReadIndex = 0; int humTotal = 0; int humAverage = 0; int inputPin = 2; //put dht 222 sensor pin here //detecting sensor change int last; //response to sensor change //for fan and motor int speedPin = 5; int dir1 = 4; int dir2 = 3; int mSpeed = 0; unsigned long lastReadTime = 0; void setup() { // put your setup code here, to run once: //pins for fan and motot pinMode(speedPin, OUTPUT); pinMode(dir1, OUTPUT); pinMode(dir2, OUTPUT); //dht sensor dht.begin(); //data smoothing for humidity for (int thisReading = 0; thisReading < numReadings; thisReading++) { //tempReadings[thisReading] = 0; humReadings[thisReading] = 0; } Serial.begin(9600); lastReadTime = millis(); } void loop() { //delay(1000); if ((millis() - lastReadTime) >= 10000UL) { //Serial.println(lastReadTime); //used to check millis //Serial.println(millis());//used to check millis lastReadTime = millis(); humid = dht.readHumidity(); Serial.println(humid); //prints the current sensor reading humTotal = humTotal - humReadings[humReadIndex]; humReadings[humReadIndex] = humid; humTotal = humTotal + humReadings [humReadIndex]; humReadIndex = humReadIndex + 1; if (humReadIndex >= numReadings) { humReadIndex = 0; } humAverage = humTotal / numReadings; Serial.println(humAverage); } if (humAverage > 50) { digitalWrite(dir1, HIGH); digitalWrite(dir2, LOW); analogWrite(speedPin, 225); }else { digitalWrite(dir1,HIGH); digitalWrite(dir2,LOW); analogWrite(speedPin, 0); } }
I started in a room with humidity readings less than 50 (no fan motion). I turned on hot water in the bathroom, and after a few minutes, moved the sensor and fan into that room. As the sensor’s humidity reading rose, so did the average humidity reading. Once the average humidity reading rose above 50, the fan began to turn. Then I moved the sensor and fan back into the original room, and waited for the average humidity to fall. When the average humidity fell below 50 again, the fan motor turned off.
Note on power and troubleshooting:
I originally had both the fan and the humidity sensor connected to the rail. This worked the first time I tried it, but the sensor began to send back 0 readings after a few test runs. I had to connect the DHT22 sensor to the arduino and the fan to the rail (with 5V power supply connected to 9V battery) for both the sensor and the fan to work properly. My clue was that the LED light on the power supply started bright and dimmed as the code started running.