Na początek witam wszystkich majsterkowiczów. Jest to mój pierwszy artykuł jednak majsterkowo sledze już od dłuższego czasu.
Bez zbędnego owijania przejdę do przedstawienia mojego projektu którym jest stacja meteo.
Wykorzystane części:
- Arduino Pro Mini
- wyświetlacz TFT 128×160 —Trochę inny model
- 2x czujnik DHT21 — do kupienia TU
- moduł RTC DS1302
- cyfrowy barometr — do kupienia TU
- czujnik deszczu — do kupienia TU
- i moduł wyświetlacza 7-segmentowego ze sterownikiem TM1637
- przewody
- gniazda goldpin — do kupienia TU
- płytka uniwersalna
- moduł ładowarki ogniw li-pol
- ogniwa li-pol ze starej baterii od laptopa
Na początek schemat podłączenia wszystkich elementów(niektóre elementy różnią się wyglądem od zastosowanych jednak nie znalazłem ich w bibliotece fritzinga):
W pierwotnym zamyśle miał być dodatkowo zapis na karcie SD odczytanych z czujników wartości jednak miałem z tym pewne problemy bo karty gryzły mi się z modułem RTC a na nim bardziej mi zależało.
Nie będę zamieszczał zdjęć z płytki stykowej bo widać tylko plątaninę kabli dlatego oto zdjęcia gotowego układu na płytce uniwersalnej bez obudowy(nie mogę się przybrać do jej zrobienia)
Brakuje jeszcze podłączonej płytki do czujnika deszczu
sama konstrukcja nie jest jakoś specjalnie skomplikowana i nikt nie powinien mieć problemu z połączeniem wszystkich elementów.
Docelowo wyświetlacz TFT miał być podświetlony bez przerwy z automatyczna regulacją jasności dzięki zastosowaniu fotorezystora jednak jest to nie potrzebne marnowanie energii bo wyświetlane elementy są na tyle małe ze trzeba i tak podejść żeby coś odczytać (a przynajmniej z moją wadą wzroku) więc zastosowałem zwykłego tact switch-a.
Teraz chyba najważniejsza część projektu czyli kod(jest on mojego autorstwa wzorowałem się jedynie na przykładach z zawartych bibliotek jak obsługiwać poszczególne elementy) a oto on:
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 |
//dodanie bibliotek #include <DS1302.h> #include <DHT.h> #include <TFT.h> #include <SPI.h> #include <Wire.h> #include <Adafruit_BMP085.h> #include <Arduino.h> #include <TM1637Display.h> #define lcd_cs 10 //{ #define dc 9 //{ piny wyświetlacza TFT #define rst -1 //{ #define DHTdomPIN 6 //pin pierwszego DHT #define DHTzewPIN 7 //pin drugiego DHT #define DHTdomTYPE DHT21 //{ #define DHTzewTYPE DHT21 //{definicja typu czujników DHT #define CLK 5 //{ #define DIO 8 //{ definicja pinów wyświetlacza 7 segmentowego DHT dhtdom(DHTdomPIN, DHTdomTYPE); //{ DHT dhtzew(DHTzewPIN, DHTzewTYPE); //{ przypisanie nazw i pinów do czujników DHT // dodawanie potrzebnych zmiennych int czujnik = 1; DS1302 rtc(4, 3, 2); Time t; int h,m,r,p,opad; TM1637Display display(CLK, DIO); Adafruit_BMP085 bmp; TFT TFTscreen = TFT(lcd_cs, dc, rst); float tempdom,tempzew,wildom,wilzew,cis; void inicjacja(){//funkcja inicjacji wszystkich modułów Serial.begin(9600); pinMode(czujnik, INPUT); digitalWrite(czujnik, HIGH); dhtdom.begin(); dhtzew.begin(); bmp.begin(0x77); TFTscreen.begin(); } void ekran(){//funkcja uruchamiająca ekran TFT oraz wypisująca niezmienne elementy TFTscreen.setRotation(0); //ustawienie orientacji wyświetlacza TFT TFTscreen.background(0xFFE0); //ustawienie koloru tła TFTscreen.stroke(0,0,0); //ustawianie koloru tekstu TFTscreen.setTextSize(2); //ustawianie wielkości tekstu TFTscreen.text("Dom",45,2); TFTscreen.text("Temp: C",2,19); TFTscreen.text("Wilg: %",2,38); TFTscreen.text("Zewnatrz",15,60); TFTscreen.text("Temp: C",2,77); TFTscreen.text("Wilg: %",2,95); TFTscreen.text("Cis:",2,113); TFTscreen.text("Opad: ",2,131); } void czyszczenie(){//funkcja czyszcząca odpowiednie fragmenty ekranu TFTscreen.fillRect(60,19,50,15,0xFFE0); TFTscreen.fillRect(60,38,50,15,0xFFE0); TFTscreen.fillRect(60,77,50,15,0xFFE0); TFTscreen.fillRect(60,95,50,15,0xFFE0); TFTscreen.fillRect(60,113,68,15,0xFFE0); TFTscreen.fillRect(60,131,68,15,0xFFE0); } void odczyt(){//funkcja odczytująca dane z czujników tempdom = dhtdom.readTemperature(); wildom = dhtdom.readHumidity(); tempzew = dhtzew.readTemperature(); wilzew = dhtzew.readHumidity(); cis = bmp.readPressure(); cis = cis/100; opad = digitalRead(czujnik); } void wyswietlenie(){//funkcja wyświetlająca zebrane dane na wyświetlaczu TFT TFTscreen.setTextSize(2); //ustawienie wielkości tekstu TFTscreen.stroke(0,0,0); TFTscreen.setCursor(60,19); TFTscreen.print(tempdom,1); TFTscreen.setCursor(60,38); TFTscreen.print(wildom,1); TFTscreen.setCursor(60,77); TFTscreen.print(tempzew,1); TFTscreen.setCursor(60,95); TFTscreen.print(wilzew,1); TFTscreen.setCursor(60,113); TFTscreen.print(cis,0); TFTscreen.setCursor(60,131); if(opad == 0){ TFTscreen.print("Tak");} else{ TFTscreen.print("Nie"); } } void zegarek(){ //funkcja wyświetlająca aktualną godzinę na wyświetlaczy 7-segmengtowym display.setBrightness(0x8); uint8_t data[] = { 0xff, 0xff, 0xff, 0xff }; t = rtc.getTime();//odczyt godziny z modułu RTC h= t.hour; //{ m= t.min; //{przypisanie godzin i minut do oddzielnych zmiennych r=h*100+m; // przygotowanie zmiennej do wyświetlenia if (r<10){ //instrukcja warunkowa wypisująca 0(zera)na początku godziny bez niej np o godzinie 00.03 wyświetlana była jedynie liczba 3 display.showNumberDec(0, false, 1, 0); display.showNumberDec(0, false, 1, 1); display.showNumberDec(0, false, 1, 2); display.showNumberDec(r, true); } else display.showNumberDec(r, true); Serial.print(t.hour); Serial.println(t.min); } void setup() { rtc.halt(false); //{ rtc.writeProtect(false); //{uruchomienie zegara RTC //inicjalizacja funkcji inicjacja(); ekran(); } void loop (){ czyszczenie(); odczyt(); wyswietlenie(); zegarek(); delay(10000); } |
Wiem że projekt nie jest idealny ale jak na kogoś kto dopiero rozpoczyna swoją przygodę z arduino ( wiem że muszę sie jeszcze wiele nauczyć a szczegulnie programować)jestem z niego zadowolony
I to by było na tyle w razie jakich kol wiek pytań zapraszam do komentarzy
EDIT: dzięki podpowiedzi The JarOS oraz Sławka dodałem komentarze do kodu oraz ustawiłem wyświetlanie ciśnienia w hPa
Pozdrawiam i dziękuje za uwagę.
Darek
No powiem Ci że projekt świetny! Bardzo dobry na “późniejszy początek”, bo zawiera sporo różnych modułów.
Powiem Ci, że artykuł całkiem spoko. Jedyne do czego się mogę przyczepić to brak komentarzy w kodzie ani żadnych jego objaśnień ale tak poza tym jest wszystko OK! 5/5
Podziel odczyt ciśnienia przez 100, wtedy będzie w hPa a nie Pascalach :)
Dzięki za podpowiedzi już edytowane
Mogłeś zrobić na czystej atmedze np. atmega8. Ale masz i tak 5 gwiazdek
Zastosowałem tu pro mini od chinczyka za 3.50 wiec wyszło taniej niż kupować atmege
Bardzo fajnie, ale gotowe stacje meteo z czytelniejszym wyświetlaczem i nierozwalające się przy upadku z 10cm oraz które przeżyją pierwsze przymrozki czego nie można powiedzieć o Twojej konstrukcji, kosztują 1/3 ceny którą wydałeś na wykonanie tego projektu…
Ostatnio spadło mi to przypadkiem z szafki (ok 1,5m) i nic się nie stało
Co do tego czy przetrwa pierwsze przymrozki to sie okaże ( puszka na balkonie została uszczelniona silikonem więc powinno być wszystko ok)
Jeśli chodzi o czytelność wyświetlacza zawsze można zastosować inny ja akurat taki miałem pod ręką lub też inaczej sobie rozmieścić dane(pozostaje to kwestia gustu)
Ostatnia kwestia czyli cena. Oczywiście ze można kupić tańszą gotową stacje jednak jak się coś popsuje to w większości wypadków jest ona do wyrzucenia a moja konstrukcja jest modułowa dzięki czemu wystarczy uszkodzony czujnik wymienić na nowy w kilka sekund
no i najważniejsze kupując gotowca nie masz tyle frajdy z budowania oraz możliwości pochwalenia się znajomym że zrobiło się coś niepowtazalnego samemu zamiast kupować gotowca który może mieć każdy
Tak jak kolega napisał wcześniej, Twoje urządzenie jest droższe niż zwykłą stacja pogodowa. Ale gdybyś zrezygnował z wyświetlacza, i dołożył kartę sieciową, mógłbyś przekształcić to w stacje pogody dla automatyki domowej, więc sens takiego “treningu” jest uzasadniony. Do czego jest ten segmentowy wyświetlacz???
Sory chyba już widzę to godzina
Tak jest to godzina
Rozwiazanie z dodaniem karty sieciowej jest ciekawe może spróbuję coś z tym wykombinować(i tu kolejny plus zrobienia stacji samemu że zawsze mozna coś zmienić czy dodac kolejną funkcje)
Tego szukałem…. Ale czy można by jakoś rozwinąć do:
3 pokoje a w każdym:
Na zewnątrz – pomiar w cieniu:
Na zewnątrz – pomiar w słońcu:
Przekazywanie danych między czujnikami a “mózgiem” powinno odbywać się przez WLAN
W pokojach czujnik temp i światła w celu zacienienia żaluzjami, gdy słońce świeci a temp przekracza odpowiednią temp, czujnik CO2 by powiedzieć dzieciom by nie zapomniały przewietrzyć pokoi gdy idą do szkoły (dostały by sms-a przed wyjściem z domu o zaplanowanej godzinie)…
Na zewnątrz pomiar opadów, wiatru, temperatury i naświetlenia w celu automatycznego wysunięcia lub schowania markizy. Pomiar opadów i wilgotności gleby w celu włączenia podlewania. Parę przekaźników do włączenia podlewania (3 sekcje + markiza)
Przy moim biurku wyświetlacz np. z tableta, nie mniej niż 9″, możliwość odczytu wyników, alertów online, do tego na wyświetlaczu porównanie wyników ze stacjami meteo.
Wszystko oparte na np. RPi2 lub BPi M3 (bo się wala gdzieś w “drewutni”)
Zastosowań jest mnóstwo….
PS. Znam się na elektryce a nie elektronice, nie mam pojęcia (zbyt dużego) o programowaniu więc dlatego bardzo proszę o jakieś wskazówki…
Wszystko co napisałem można rozwiązać w systemach takie jak KNX (InstaBus) stosowaliśmy takie rozwiązania w firmie której pracuje ale to było dla klientów z 6-7 cyfrowym stanem konta bankowego, dla normalnego człowieka jakim jestem a chciałybm trochę automatyzacji w domu kosztowało by to lawinę… Można by jeszcze podłączyć kontakty magnetyczne od alarmu w celu pod nieisienia np. żaluzji gdy się wchodzi do domu, lub zaświecenia światła w korytarzu, lub, lub,jak już mówiłem zastosowań jest tysiące… Myślałem już nad zastosowaniem podzespołów firmy LOXONE, ale to wszystko jest gotowe i niema tej adrenaliny przed odpaleniem podzespołu… Na dzień dzisiejszy jestem w stanie podłączenia wszystkiego, wgrania odpowiedniego oprogramowania, oraz lekką edycję do potrzeb… Dla kogoś, kto by się tego podjął, mogę obiecać następne zamówienia… oczywiście nie FREE…
Projekt Fajny i chcialbym go zrobic dla siebie czy mozna schemat z opisem pinow bo to na zdieciu jest nie czytelene