This commit is contained in:
ivan 2022-06-27 20:35:05 +03:00
parent 0c7b052093
commit e6af070ea2
5 changed files with 130 additions and 1 deletions

View File

@ -1,3 +1,8 @@
# fantube
Device that regulates fan speed and damper in the tube depending on temperature
Device that regulates fan speed and damper in the tube depending on temperature
![fantube](https://dev.ussr.win/microcontrollers/fantube/raw/branch/master/fantube_agg.jpg)
![fantube](https://dev.ussr.win/microcontrollers/fantube/raw/branch/master/fantube_bb.jpg)

BIN
fantube.fzz Normal file

Binary file not shown.

124
fantube.ino Normal file
View File

@ -0,0 +1,124 @@
#include <Thread.h>
#include <Servo.h>
#include <dht11.h> // https://github.com/adidax/dht11
#include "HCMotor.h" // https://github.com/HobbyComponents/HCMotor/
#define DHT11PIN 4 // DHT11 - PIN 4
#define FANPIN 5 // IRF520 MOS Driver - PIN 5
#define SERVOPIN 6 // Servo - PIN 6
Servo myservo;
HCMotor fan;
dht11 DHT11;
int currenttemp = 0;
int currenthum = 0;
int fanstatus = 0;
int damperpos = 0;
bool damperstatus = false; // false - damper closed; true - damper opened
Thread checkSensorThread = Thread();
Thread ledThread = Thread();
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
checkSensorThread.onRun(sensorDataCheck);
checkSensorThread.setInterval(60000);
ledThread.onRun(ledBlink);
ledThread.setInterval(2000);
fan.Init();
fan.attach(0, DCMOTOR, FANPIN);
fan.DutyCycle(0, 100); // min and max fan rotation
delay(2222);
sensorDataCheck();
damperOpen();
fanSpeed(0);
}
void loop()
{
if (checkSensorThread.shouldRun())
checkSensorThread.run();
if (ledThread.shouldRun())
ledThread.run();
}
void sensorDataCheck()
{
sensorDataRead();
serPrintHumTemp();
if (currenttemp < 5) {
if (damperstatus) damperClose(); // <5 - damper close
} else if (!damperstatus) damperOpen(); // >4 - damper open
if (currenttemp > 25) {
if (currenttemp > 30) {
if (currenttemp > 35) {
if (currenttemp > 40) { fanSpeed(100); // >40 - fan full
} else fanSpeed(75); // >35 - fan three quarters
} else fanSpeed(50); // >30 - fan half
} else fanSpeed(30); // >25 - fan third
} else fanSpeed(0); // <26 - fan off
}
void ledBlink() {
static bool ledStatus = false;
ledStatus = !ledStatus;
digitalWrite(LED_BUILTIN, ledStatus);
}
void sensorDataRead()
{
int chk = DHT11.read(DHT11PIN);
currenthum = DHT11.humidity;
if (currenthum == 0)
{
for (int i=0; i<=5; i++)
{
delay(111);
chk = DHT11.read(DHT11PIN);
currenthum = DHT11.humidity;
if (currenthum > 0) i = 5;
}
}
currenttemp = DHT11.temperature;
}
void damperClose()
{
myservo.attach(SERVOPIN);
delay(55);
for (damperpos = 0; damperpos <= 90; damperpos += 1)
{
myservo.write(damperpos);
delay(25);
}
delay(55);
myservo.detach();
damperstatus = false;
}
void damperOpen()
{
myservo.attach(SERVOPIN);
delay(55);
for (damperpos = 90; damperpos >= 0; damperpos -= 1)
{
myservo.write(damperpos);
delay(15);
}
delay(55);
myservo.detach();
damperstatus = true;
}
void fanSpeed(int fanrate)
{
fan.OnTime(0, fanrate);
fanstatus = fanrate;
}
void serPrintHumTemp()
{
Serial.print("temp: ");
Serial.print(currenttemp);
Serial.print("; hum: ");
Serial.println(currenthum);
}

BIN
fantube_agg.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
fantube_bb.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 KiB