Witam wszystkich!
Chciałem Wam dziś zaprezentować mój pierwszy projekt tego typu oraz pierwszy artykuł na Majsterkowie. Jest to domowa stacja meteorologiczna. Wcześniej próbowałem już budować różnego typu urządzenia ale zwykle nie wychodziły ona po za płytkę stykową.
Przed rozpoczęciem prac postanowiłem wytyczyć kilka założeń, oto one:
- stacja ma być łatwa w przebudowywaniu oraz modyfikacji,
- będzie mierzyć podstawowe dane meteorologiczne,
- ma być dostosowana do, ręcznie wybieranych, dwóch źródeł zasilania jakimi będą baterie i zasilacz.
Co będzie nam potrzebne do zrealizowania tych planów?
Elektronika:
- Arduino Uno lub podobne(Ja użyłem Duemillanove bo po prostu takie miałem),
- DS18B20 termometr wewnętrzny,
- DHT21 termometr oraz higrometr, zewnętrzny,
- YL-83 czujnik deszczu,
- BMP085 barometr, we wnętrzu obudowy,
- gniazdo USB (typ w zależności od upodobań, ja użyłem typu B),
- 2 przełączniki dźwigniowe,
- tact switch, najlepiej jak najdłuższy, żeby przeszedł przez sklejkę,
- LCD 4×20 na i2c,
- koszyk na 4 baterie AA lub AAA,
- goldpiny żeńskie do wlutowania,
- płytka uniwersalna typu strip, czyli połączona po długości,
- trochę przewodów w tym jeden minimum pięciożyłowy,
- moduł RTC DS1307 (zegar czasu rzeczywistego).
Materiały:
- Płytka sklejki, wymiary o grubości 6mm.
- listewka 12x12x200,
- 2 małe zawiasy,
- kawałki rurek PCV na zrobienie sondy,
- farba do pomalowania obudowy i sondy.
Przydatne narzędzia:
- piła,
- papier ścierny do drewna,
- wiertarka i wiertła różnych rozmiarów,
- klej typu Wikol,
- gorący klej,
- wszelkie podstawowe narzędzia do prac elektronicznych (lutownica, cyna, odsysacz itp.).
Użyte w programie biblioteki:
- Wire,
- Adafruit_BMP085,
- DHT_u,
- OneWire,
- Time,
- DS1307RTC,
- LiqiudCrystal.
Każdą z nich możecie zainstalować w programie Arduino.ide. Wystarczy tylko w otwartym oknie kliknąć: Szkic>Dołącz bibliotekę>Zarządzaj bibliotekami. Trzeba tam wpisać nazwę biblioteki i zainstalować.
Jak to w ogóle działa?
Urządzenie mierzy kilka podstawowych parametrów meteorologicznych za pomcą czujników.
Zostały one zamocowane w obudowie i w specjalnej sondzie, którą wystawiamy za okno aby mierzyła czynniki zewnętrzne. Czujniki w obudowie mierzą tylko temperaturę wewnętrzną i ciśnienie, natomiast te w sondzie mierzą temperaturę zewnętrzną, wilgotność oraz sprawdzają czy pada deszcz. Ważne jest aby, zarówno w obudowie jak i sondzie, była dobra wymiana powietrza ponieważ jeśli jej zabraknie czujniki będą podawały złe wyniki.
Dobra, czas zabrać się do pracy.
Prototyp
Prace zaczynamy od prototypu na płytce stykowej, powinien on wyglądać tak:
A tak na schemacie:
Pracę proponuję zacząć od pojedynczych czujników (w celu sprawdzenia czy działają).
Potem najlepiej zmontować je wszystkie razem i wyświetlać ich wyniki na monitorze portu.
Gdy już to zrobimy czas podłączyć LCD. Programując go napotkałem na pewien problem, otóż gdy przekraczałem ilość znaków w linijce to wyświetlacz, zamiast pisać tekst na kolejnej linijce, psuł się i wyświetlał krzaki. Żeby to naprawić wystarczyło użyć komendy do ustawiania kursora.
Obudowa
Teraz przystał czas na obudowę.
Pracę nad obudową zaczynamy od wycięcia płytek ze sklejki według poniższych wymiarów.
Plik schematu (w formacie .pdf) dostępny jest w na dolę.
Pracę nad obudową podzielę tu na trzy części.
- Środkowa część obudowy. Czyli miejsce, w którym znajdują się wszystkie najważniejsze komponenty urządzenia.
Zacząłem od sklejenia bocznych ścian z podstawą przy pomocy kleju typu Wikol.
Potem zabrałem się za miejsca do mocowania komponentów. Użyłem do tego „dystansów”, wykonałem je z małych kawałków listewki. Przykleiłem je w odpowiednich miejscach wewnątrz obudowy, właśnie do nich przykręcimy później po kolei wszystkie komponenty.
Został nam jeszcze tylko do wykonania „koszyk na koszyk” z bateriami.
Będzie do niego wsuwany pojemnik. Bez problemu będzie go można wyjąć w celu zmiany baterii.
- Panel przedni. Miejsce, w którym zamocujemy wyświetlacz, przełącznik oraz przycisk.
Należy w nim wyciąć otwory na te części i to w zasadzie tyle co musimy tu zrobić.
- Panel tylni. Tam musimy wyciąć otwór na gniazdo USB, sondę oraz otwory aby czujniki wewnątrz obudowy miały poprawne odczyty.
Dobrą alternatywą dla tego kwadratu jest wycięcie otworu. Ja wyciąłem kwadrat,
zakleję go później siateczką.
Przed malowaniem polecam przymierzyć wszystkie komponenty czy będą pasować do przygotowanych miejsc.
Gdy już się upewnimy że wszystko jest ok, musimy przykleić oba panele do reszty.
Malowanie
Teraz przyszedł czas na malowanie!
Niektóre zdjęcia przedstawiają obudowę już pomalowaną, jest to spowodowane tym że kilka zmian zostało wprowadzone po malowaniu.
Do pomalowanie użyłem zwykłej, białej, farby do drewna.
W między czasie, gdy schną nam pomalowane komponenty, możemy zabrać się w końcu za robienie sondy!
Sonda
Wykonałem ją z z dwóch kawałków PCV znalezionych na strychu.
Pokrywa sondy miała być skręcona z resztą dwiema śrubkami. Aby ułatwić sobie to zadanie przykleiłem dwie drewniane listewki po bokach.
Przy dalszej pracy okazało się że otwór na górze sondy jest za duży jak na jeden
przewód i że trzeba go zmniejszyć. użyłem do tego kolejnego kawałka PCV.
Całość skleiłem gorącym klejem, pomalowałem i tak prezentuje się już gotowe (bez czujników):
Gdy już mamy prototyp, obudowę oraz sondę czas zabrać się za poskładanie tego!
Montaż
Składanie zacząłem od drewnianej obudowy, najlepiej zamocować na początku największe elementy takie jak: lcd, arduino i zegar. Na razie tylko je zamocujemy, bez podłączania.
Po wykonaniu tej czynności powinniśmy zabrać się za układ wyboru zasilania.
Jak już wspomniałem wyżej jest to przełącznik, którym wybieramy czy pobieramy prąd z usb czy z baterii. Realizacja tego nie jest skomplikowana, wystarczy tylko wmontować gniazdo usb oraz przełącznik w odpowiednie otwory z tyłu obudowy.
Potrzebne będzie nam jeszcze “gniazdko”, w które będziemy wpinać kable od baterii. Widać je na zdjęciu poniżej.
Przełącznik zamocowałem na wcisk i dokręciłem z drugiej strony, gniazdo usb wcisnąłem w otwór i zalałem gorącym klejem.
Ważne jest aby dobrze umocować gniazdo usb ponieważ działają na nie duże siły.
Fotografie przedstawiają już zlutowany układ.
Po zamocowaniu trzeba teraz odpowiednio połączyć komponenty.
Pamiętajcie aby nie lutować urządzeń pod prądem!
Tak wygląda połączenie tych części na schemacie.
Jeśli chodzi o praktykę to minus z USB i baterii należy złączyć a plusy obu tych komponentów przylutować do oddzielnych, znajdujących się skrajnie po bokach, nóżek przełącznika.
Teraz jeszcze pozostało nam tylko podpiąć do czegoś te kable.
Jako że jednym z założeń było to że urządzenie ma być łatwe w modyfikacji, wykonałem “rozgałęźnik” do zasilania oraz i2c.
Zostały one wykonane z płytki uniwersalnej typu strip oraz dwóch goldpinów żeńskich. Uwaga, płytka musi mieć o jeden otwór więcej od goldpinów aby można było wlutować kable od zasilania oraz i2c.
Zdjęcia przedstawiają wykonanie tylko jednego “rozgałęźnika”.
Plus zasilania musimy jeszcze pociągnąć przez przełącznik, który odpowiada za włączanie i wyłączanie urządzenia.
Do wolnych pól na płytce przylutowujemy plus i minus zasilania, przyklejamy całą listwę do podstawy obudowy i to tyle.
Tak prezentują się listwy, i2c i zasilania, z podłączonymi już urządzeniami.
Gdy przygotujemy listwę zasilania oraz i2c mamy już z górki.
Teraz wszystkie czujniki wystarczy podpiąć do zasilania oraz do i2c albo pinów cyfrowych na arduino.
Jeśli chodzi o podpięcie arduino to kable z listwy zasilania trzeba podpiąć do 5v i gnd.
Zegar nie powinien nikomu sprawić problemu z podłączeniem, wystarczy tylko podpiąć SCL do A5 i SDA do A4, VCC do plusa a GND do minusa na listwie zasilania.
Z LCD robimy dokładnie to samo co z zegarem.
W tyle obudowy, przy otworze wentylacyjnym, musimy zamocować teraz DS18B20 i BMP085.
Podłączenie obu czujników jest dość proste. Jednak należy pamiętać że DS18 wymaga połączenia pinu Data z 5v poprzez opornik o oporności 4.7kΩ. BMP za to należy podpiąć do 3.3v a nie do 5v.
Termometr (DS18B20) umieściłem przyklejając go do podstawy na gorący klej a BMP przykręciłem do wcześniej przygotowanego miejsca.
Na obrazku widać jeszcze siateczkę, która ma zasłaniać otwór.
Tak prezentuje się cała obudowa w środku:
Pozostała nam jeszcze do złożenia sonda.
Sonda
W sondzie mają znaleźć się DHT21 oraz YL-83. Żeby ułatwić sobie ewentualne modyfikacje w środku zamieściłem listwę zasilania wykonaną z kawałka płytki uniwersalnej typu strip. Lutowanie do niej jest dużo łatwiejsze niż pojedynczego kabla.
DHT21 przykleiłem na gorący klej w dolnej części sondy.
Sterownik do czujnika deszczu nie jest zamocowany na stałe a płytka, na którą ma padać deszcz, jest zamocowana sylikonem na zewnątrz. Najlepiej żeby płytka znajdowała się pod kątem 45 stopni.
Ważne jest aby styki od płytki były dobrze zaizolowane.
Jeśli chodzi o podłączenie to wykorzystamy do tego długi kabel (minimum pięciożyłowy).
Jeden koniec wkładamy w odpowiedni otwór w obudowie a drugi w otwór na górze sondy. Do wybranych kabli lutujemy zasilanie oraz przewody sygnału.
D0 na sterowniku YL-83 podpinamy do odpowiedniego pinu cyfrowego.
Sygnał z DHT21 musimy, przez opornik dokładnie tak jak z DS18B20, połączyć z 5v .
Dalej sygnał łączymy też pinem cyfrowym na Arduino. Cały przewód sondy trzeba wkleić oczywiście w obudowie aby nie latał tam luźno.
Po wykonaniu tych prostych czynności sonda jest już gotowa.
Ale obudowa nie jest jeszcze skończona, aczkolwiek zostało nam już tylko troszeńkę pracy:) Trzeba jeszcze zrobić zawiasy i coś co będzie trzymać klapkę. Robię to na końcu ponieważ wyszedłem z założenia że jeśli zamocuję wszystko wcześniej to później tylko będę się męczył przy montowaniu czegoś w środku.
Jak już pisałem nie jest to dużo pracy, wystarczy tylko wziąć odpowiednie zawiasy (ja użyłem zewnętrznych) wymierzyć miejsce gdzie je zamocować, wywiercić i wkręcić.
Kiedy mamy już zawiasy musimy wmontować jeszcze coś co będzie trzymać
zamkniętą pokrywkę. W tym celu użyłem dwóch magnesów.
Programowanie
Teraz tylko wystarczy wgrać na urządzenie kod, który znajduję się poniżej i sprawdzić czy działa.
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 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 |
//Dodawanie bibliotek #include <Wire.h> #include <Adafruit_BMP085.h> #include <DHT_U.h> #include <OneWire.h> #include <Time.h> #include <DS1307RTC.h> #include <LiquidCrystal_I2C.h> #define DHTPIN 3 //definicja pinu czujnika #define DHTTYPE DHT21 // wybór typu czujnika //Definicja zmiennych float pascal; float dhtTemperature; float dhtHumidity; float celsius; int wartosc_D0; // zmienna dla wartości D0 //Delay odpowiadający za poprawną komunikację z dht uint32_t delayMS; int wysokosc = 206; // wysokość miejscowości w której odbywają się pomiary //Definicja pinów czujników int pushButton = 5; int buttonState = 0;//digitalRead(pushButton); int sensor_D0 = 2; // podłączenie od D0 na czujniku do pinu 2 na Arduino //Tworzenie obiektów OneWire ds(4); LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); DHT_Unified dht(DHTPIN, DHTTYPE); Adafruit_BMP085 bmp; //Funkcje void BMP() { Serial.print("Temperature = "); Serial.print(bmp.readTemperature()); Serial.println(" *C"); pascal = bmp.readPressure(); Serial.print("Pressure = "); Serial.print(bmp.readPressure() ); Serial.println(" Pa"); //Zmienna pascal przepuszczamy przez wzór, który wylicza nam prawidłowe ciśnienie. pascal = pascal * pow((1 - (0.0065 * wysokosc) / (15 + 0.0065 * wysokosc + 273.15)), -5.257); //Wzór pochodzi ze strony: http://keisan.casio.com/exec/system/1224575267 } void DHTRead() { delay(delayMS); sensors_event_t event_t; sensors_event_t event_h; dht.temperature().getEvent(&event_t); //Sprawdzanie temperatury z DHT21 dht.humidity().getEvent(&event_h); //Sprawdzanie wilgotnosci z DHT21 dhtTemperature = event_t.temperature; //Zapiswyanie danych do zmiennych dhtHumidity = event_h.relative_humidity; //Wyświetlanie wyników na monitorze portu Serial.print("Temperatura:"); Serial.print(event_t.temperature); Serial.println(" *C"); Serial.print("Wilgotnosc:"); Serial.print(event_h.relative_humidity); Serial.println("%"); } void ds18() { byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; float fahrenheit; if ( !ds.search(addr)) { Serial.println(); ds.reset_search(); delay(250); return; } for ( i = 0; i < 8; i++) { } if (OneWire::crc8(addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return; } switch (addr[0]) { case 0x10: type_s = 1; break; case 0x28: type_s = 0; break; case 0x22: type_s = 0; break; default: return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); present = ds.reset(); ds.select(addr); ds.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = ds.read(); } int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } celsius = (float)raw / 16.0; fahrenheit = celsius * 1.8 + 32.0; //Powyższy kod do ds18b20 został przeniesiony z przykładu w niezmienionej formie // Wyświetlanie wyników na monitorze portu Serial.print("Temperatura:"); Serial.print(celsius); Serial.print(" *C"); Serial.println(""); } void setup() { Serial.begin(9600); // uruchomienie monitora szeregowego //Sprawdzenie czy bmp działa if (!bmp.begin()) { Serial.println("Could not find a valid BMP085 sensor, check wiring!"); while (1) {} } //Ustawienie pinów na: pinMode(3, INPUT); //Wejście pinMode(6, OUTPUT); //Wyjście pinMode(pushButton, INPUT); //Rozpoczęcie pracy LCD lcd.begin(20, 4); //for (int i = 0; i < 3; i++) //Wyłączenie podświetlenia LCD po 100 ms delay(100); lcd.noBacklight(); digitalWrite(6, LOW); //Start pracy DHT21 dht.begin(); sensor_t sensor; } void loop() { //Odczyt z czujników BMP(); DHTRead(); ds18(); int buttonState = digitalRead(pushButton);//Czyta odczyt z przycisku wartosc_D0 = digitalRead(sensor_D0); // pobranie wartości z D0 //Odczyt zegara i wyświetlanie na lcd tmElements_t tm; if (RTC.read(tm)) { lcd.setCursor(0, 0); lcd.print(tm.Hour); lcd.print(":"); if (tm.Minute < 10) { lcd.print("0"); } lcd.print(tm.Minute); } //Wyświetlanie na LCD //Ustawienie kursora na: 12 znak pierwszej linijki lcd.setCursor(12, 0); if (digitalRead(sensor_D0) == 0) { //Jeśli D0 = 0, na monitorze portu i LCD, wyświetl: "Pada" lcd.print(" Pada"); Serial.println("Pada"); } else { // //Jeśli D0 = 1, na monitorze portu i LCD, wyświetl: "Nie pada" lcd.print("Nie pada"); Serial.println("Nie pada,"); } //Wyświetlanie wszystkich odczytów na LCD lcd.setCursor(0, 1); lcd.print("Temp:"); lcd.print("W "); lcd.print(celsius, 1); lcd.print("C "); lcd.print("Z "); if (dhtTemperature < 10) { lcd.print(" "); } lcd.print(dhtTemperature, 1); lcd.print("C"); lcd.setCursor(0, 2); lcd.print("Wilgotnosc: "); lcd.print(dhtHumidity, 1); lcd.print("%"); lcd.setCursor(0, 3); lcd.print("Cisnienie: "); lcd.print(pascal / 100 , 0); lcd.print("hPa "); Serial.println(""); //Wygaszanie ekranu //Jeżeli wciśnięto przycisk włącz podświetlenie if (digitalRead(pushButton) == 1) { lcd.backlight(); delay(5000); //Czekaj 5 sekund, wyłącz podświetlenie lcd.noBacklight(); } delay(20); } |
Koniec
I tak oto kończy się budowa prostej, domowej stacji meteorologicznej.
Może nie jest z NASA ale ma jedną, wręcz najważniejszą zaletę, jest nasza.
Tutaj jeszcze kilka zdjęć naszego projektu:
Czekam na Wasze opinię, komentarze i sugestię oraz dziękuję Wam za zapoznanie się z moim tekstem.
Pozdrawiam!
Słowem wyjaśnienia.
Pomysł oraz wykonanie jest mojego autorstwa, kod napisałem w oparciu o przykłady z bibliotek wymienionych na początku tekstu.
Projekt zrealizowałem w ramach gimnazjalnego projektu edukacyjnego.
Funkcjonalność 6/5, estetyka 3/5 ;-) Świetny projekt.
Ciekawy projekt 5/5. Możesz dać większy schemat ??
Jest dostępny w pliku .png do zobaczenia na dole.
Fajny projekt. Od jakiegoś czasu chodzi za mną myśl o zrobieniu czegoś takiego.
Chciałbym zapytać co skłoniło cie do wykorzystania BMP085 a nie np. BMP280. Czy umieszczenie czujnika ciśnienia wewnątrz budynku ma duży wpływ na wiarygodność pomiaru tej wartości?
Zdradzę ci sekret, najpierw użyłem bmp280 ale się spalił. Szybko potrzebowałem barometru więc wziąłem bmp085 bo go miałem.
Umieszczenie czujnika wewnątrz obudowy nie zmienia wiarygodności pomiarów.
Oj często będziesz ten zegar regulował. DS1307 to chyba najgorszy możliwy wybór.
Mi nie sprawiał aż tak dużo problemów. Aczkolwiek musiałem go czasem ponownie ustawiać.
Mała podpowiedź odnośnie wiercenia w sklejce Mikołaj. Jeśli nie chcesz żeby wiertło odrywało fragment ostatniej warstwy sklejki, to warstwa ta… nie może być ostatnią. Wierć na desce, albo przez dwa arkusze sklejki (wtedy oderwane fragmenty będą na dolnym arkuszu, przy wierceniu w powietrzu). Górny arkusz będzie poprawnie przewiercony, dolny… jak u Ciebie. Górnego używasz, dolny to odpad.
Dzięki za uwagę skorzystam gdy będę robił następny projekt tego typu.
Ciekawy projekt może się przydać w domu lub przy zastanawia mnie tylko dlaczego nie zrobiłeś jednak obudowy nie ze sklejki lecz z plastiku można kupić gotowe w różnych rozmiarach i myślę że była by bardziej estetyczna na pewno lżejsza i lepsza do obróbki
Dziękuję ze miłe słowa, jeśli chodzi o pytanie, to nie użyłem gotowych plastikowych obudów ponieważ nie jestem dobry w obrabianiu plastiku. Obróbka drewna idzie mi dużo lepiej i przy tym według mnie daje więcej możliwości. Obudowa ze sklejki wcale nie jest ciężka, zaryzykowałbym stwierdzenie że waży nie wiele więcej niż koszyk z bateriami.
Projekt spoko !!! Też coś takie psuje. Podziwiam za wytrwałość. Na pewno troszkę czasu spędziłeś nad nim.
Dzięki, jeśli chodzi o czas tworzenia to sama koncepcja narodziła się jakoś wrzesień-październik 2016. Potem zaczęły się pojawiać rysunki koncepcyjne i dokładniejsze plany. Jakoś tak koło listopada kupiłem części i zabrałem się do pracy. Całość skończyłem jakoś w grudniu i w sylwestra pisałem ten artykuł. I gotowe:)
Duże WOW, spróbuje zrobić takie coś na podstawie tego projektu. Ktoś przerabiał moduł GSM do arduino? Np. żeby mi wysyłało SMSem dane które wyświetla?
Ostatnio sam miałem ochotę coś takiego zrobić, teraz nie ma już więcej wymówek i czas zabrać się za robotę.