Inteligentny wentylator łazienkowy


Tomasz Bartuś



2016-01-08
Inteligentny wentylator łazienkowy

Wstęp

Projekt przedstawia urządzenie, które można wykorzystać do automatycznej wentylacji pomieszczeń o chwilowym wysokim poziomie zawilgocenia (Fig. 1). Układ mierzy temperaturę i wilgotność. Wyniki pomiarów są prezentowane na wyświetlaczu LCD. W momencie przekroczenia założonej wartości progowej wilgotności, układ uruchamia niewielki silniczek prądu stalego, który można wykorzystać do wymuszenia ruchu powietrza w przewodzie wentylacyjnym.

Wentylator łazienkowy
Fig. 1. Układ wentytlatora

Hardware

Sercem układu jest platforma Arduino Nano (Fig. 2). Do mikrokontrolera podłączono czujnik temperatury/wilgotności DHT11. Dane z czujnika przekazywane są do pinu D2 obsługującego przerwanie "0".

Schemat ideowy

Prototyp wentylatora
Fig. 2. Prototyp wentylatora

Do obsługi silnika wentylatora wykorzystany został mostek H L293D (Fig. 3). Pozwala on sterować dwoma silnikami prądu stałego o maksymalnym poborze prądu 1,2A. Sterowanie silnikiem 1 wymaga użycia trzech wejść sterujących: INPUT1, INPUT2 oraz ENABLE1. Wejścia INPUT1 i INPUT2 służą do wyboru kierunku obrotów silnika (Tab. 1). Wejście ENABLE wykorzystywane jest do regulacji prędkości obrotów.

Mostek H L293D
Fig. 3. Uproszczony układ aplikacyjny mostka H L293D
ENABLE INPUT1 INPUT2 obroty
PWM 1 0 LEWO
PWM 0 1 PRAWO
PWM 0 0 stop
PWM 1 1 stop

Do obsługi wejść mostka H wykorzystano (kolejno) piny: D7, D8 oraz umożliwiający sterowanie PWM D6 (Fig. 2). Aby silnik obracał się w prawo, na wejścia INPUT1 oraz INPUT2, zgodnie z tabelą prawdy Tab.1. należy odpowiednio podać logiczne "0" i logiczną "1". Aby silnik kręcił się w lewo, należy odpowiednio podać logiczną "1" i logiczne "0". W celu uniknięcia zakłóceń działania mikrokontrolera, zastosowano dwa osobne źródła zasilania: osobne dla: mikrokontrolera, czujnika i wyświetlacza LCD oraz osobne do obsługi silnika. Układ wymaga wspólnej masy dla obu źródeł zasilania. Napięcie zasilające silnik jest filtrowane za pomocą kondensatorów sprzęgających 100nF oraz 100uF. Napięcie zasilające układ sterowania +5V podpięto do pinu 16 mostka L293D (Fig. 2, 3). Napięcie zasilające silnik (także wynoszące 5V) podpięto do pinu 8. Maksymalne napięcie obsługi silników, które można podpiąć do zastosowanego mostka H wynosi 36V. Układ jest wyposażony w wyświetlacz LCD (16×2). Aby obniżyć liczbę połączeń pomiędzy Arduino i wyświetlaczem LCD, zastosowano konwerter I2C.

Działanie

Układ w kolejnych krokach działania mikrokontrolera dokonuje pomiaru temperatury oraz wilgotności powietrza. Jeżeli wilgotność jest większa od 34%, uruchamiany jest silnik wentylatora. Prędkość obrotów jest stała i maksymalna (wartrość PWM podawana na PIN 6 jest ustawiona na 255).

Lista części

  1. platforma prototypowa Arduino (tu Nano),
  2. płytka prototypowa,
  3. czujnik temperatury/wilgotności DHT11,
  4. mostek H L293D,
  5. kondensator 100nF,
  6. kondensator 100uF,
  7. wyświetlacz LCD 16×2,
  8. konwerter I2C do LCD,
  9. silnik DC (tutaj 5,9V, Imax<1,2A, ze starego napędu DVD),
  10. przewody/mostki,
  11. zasilacz/bateria do zasilania silnika (max 36V).

Film

Kod

/*
 Board	              int.0	  int.1	  int.2	  int.3	  int.4	  int.5
 Uno, Nano, Ethernet	  2	  3
 Mega2560	          2	  3	  21	  20	  19	  18
 Leonardo	          3	  2	  0	  1         
 Due	                (any pin, more info http://arduino.cc/en/Reference/AttachInterrupt)
 */

#include <idDHT11.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 

int idDHT11pin = 2; //Digital pin for comunications
int idDHT11intNumber = 0; //interrupt number (must be the one that use the previus defined pin (see table above)

//declaration
void dht11_wrapper(); // must be declared before the lib initialization

// Lib instantiate
idDHT11 DHT11(idDHT11pin,idDHT11intNumber,dht11_wrapper);

void setup()
{
  pinMode(6, OUTPUT); // Sygnał PWM silnika nr 1
  pinMode(7, OUTPUT); // Sygnały sterujące kierunkiem obrotów silnika nr 1
  pinMode(8, OUTPUT);
  
  
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.print("Temp.: ");
  lcd.setCursor(0, 1);
  lcd.print("Wilg.: ");
  lcd.setCursor(10, 0);
  lcd.print("st. C");
  lcd.setCursor(10, 1);
  lcd.print("%"); 
}
// This wrapper is in charge of calling 
// mus be defined like this for the lib work
void dht11_wrapper() {
  DHT11.isrCallback();
}
void loop()
{
  Serial.print("\nRetrieving information from sensor: ");
  Serial.print("Read sensor: ");
  delay(100);
  DHT11.acquire();
  while (DHT11.acquiring())
    ;
  int result = DHT11.getStatus();
  switch (result)
  {
  case IDDHTLIB_OK: 
    Serial.println("OK"); 
    break;
  case IDDHTLIB_ERROR_CHECKSUM: 
    Serial.println("Error\n\r\tChecksum error"); 
    break;
  case IDDHTLIB_ERROR_ISR_TIMEOUT: 
    Serial.println("Error\n\r\tISR Time out error"); 
    break;
  case IDDHTLIB_ERROR_RESPONSE_TIMEOUT: 
    Serial.println("Error\n\r\tResponse time out error"); 
    break;
  case IDDHTLIB_ERROR_DATA_TIMEOUT: 
    Serial.println("Error\n\r\tData time out error"); 
    break;
  case IDDHTLIB_ERROR_ACQUIRING: 
    Serial.println("Error\n\r\tAcquiring"); 
    break;
  case IDDHTLIB_ERROR_DELTA: 
    Serial.println("Error\n\r\tDelta time to small"); 
    break;
  case IDDHTLIB_ERROR_NOTSTARTED: 
    Serial.println("Error\n\r\tNot started"); 
    break;
  default: 
    Serial.println("Unknown error"); 
    break;
  }
  
  lcd.setCursor(7, 1);
  lcd.print(DHT11.getHumidity(), 0);
  lcd.setCursor(7, 0);
  lcd.print(DHT11.getCelsius(), 0);
  delay(2000);
  
  if(DHT11.getHumidity() >= 34){
  analogWrite(6, 255); //Maksymalna prędkość obrotów 
  digitalWrite(7, HIGH); //Silnik nr 1 - obroty w lewo
  digitalWrite(8, LOW);
  Serial.println("Silnik: jazda");
  } else   if(DHT11.getHumidity() < 34){
  digitalWrite(7, LOW); //Silnik nr 1 - stop
  digitalWrite(8, LOW); 
  Serial.println("Silnik: STOP!");
  }
}
 
 

Doktorat

Spis treści
Rozdzialy
Abstrakt [pl]
Abstract [eng]