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.
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".
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.
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.
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).
/* 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!"); } }