Skocz do zawartości

Miglandz

Użytkownicy
  • Zawartość

    10
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    1

Miglandz wygrał w ostatnim dniu 3 lipca

Miglandz ma najbardziej lubianą zawartość!

Reputacja

22 Dobra

O Miglandz

  • Ranga
    2/10

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Palowice
  • Języki programowania
    Arduino, C++, PHP
  • www

Ostatnio na profilu byli

138 wyświetleń profilu
  1. W innym wątku opisałem jak wykonałem zdalny moduł otwierania bramy współpracujący z sterownikiem HB5, tutaj przedstawię jak przy pomocy modułów radiowych 433Mhz można odczytać kod nadawany przez pilot oraz nadać go powtórnie w celu sterowania bramą. Do całej zabawy potrzebna będzie nam biblioteka RCSwitch.h oraz jakaś płytka kompatybilna z Arduino. Wgrywamy przykład ReceiveDemo_Simple uruchamiamy monitor portu szeregowego i wciskamy przycisk na naszym pilocie powinien pojawić nam się kod który wysyła nasz pilot. W ten oto prosty sposób odczytaliśmy kod do naszego sterownika, który następnie możemy nadać. Na samym początku miałem plan zrobić tylko pilot do bramy ale projekt rozrósł się i tak oto na swoim pokładzie posiada: czujnik temperatury wilgotności oraz ciśnienia BME280 wyświetlacz oled SSD 1306 zegar czasu rzeczywistego DS1307 Wszystkie powyższe moduły komunikują się z mikrokontrolerem poprzez magistralę szeregową i2c co znacznie uprościło konstrukcję i pozwoliło uniknąć zbędnego okablowania. Do przewijania ekranów i wyświetlania tylu informacji wykorzystałem bibliotekę OLEDDisplayUi.h której działanie widać na poniższym filmie. Zostało przygotowanych 5 ekranów (Zegar analgoowy, zegar cyfrowy, temperatura, wilgotność i ciśnienie) a po wciśnięciu przycisku jest wyświetlany napis “BRAMA” oraz zostaje nadany kod otwarcia/zamknięcia bramy. Aby uniknąć konieczności ustawiania zegara, czas synchronizuje się automatycznie z moim domowym serwerem NTP, za każdym razem gdy mikrokontroler znajdzie się w zasięgu sieci WIFI. Najwięcej czasu zajęła mi rzecz która wydawała się najprostsza czyli ustawienie strefy czasowej tak przynajmniej mi się wydaje. Zobaczymy za kilka tygodni. Zasięg pilota jest bardzo zadowalający, urządzenie jest zamontowane wewnątrz pojazdu w centralnej części konsoli w Fordzie Focusie a otwarcie bramy z 150m nie stanowi dla niego problemu Obudowa została zaprojektowana w sketchupie oraz wydrukowana z PLA, lato w samochodzie przeżyła lecz temperatury zrobiły swoje i w niektórych miejscach można było zauważyć odkształcenia. W planach jest wydruk z PET-G lub ABS. Poniżej kilka zdjęć jak wszystko zostało upchnięte: Przygotowana została również mniejsza wersja do Forda Fiesty z Arduino Pro Mini, montuje się ją w centralnej części kokpitu, w miejsce gdzie można włożyć karty do bankomatu. Oczywiście kod programu udostępniam: OLEDAuto.zip
  2. Jako że w tym roku moja posiadłość dorobiła się bramy otwieranej z pilota z sterownikiem HB5 postanowiłem dorobić do niej sterowanie poprzez web’a czyli mój smart home oparty na Domoticzu. Założenia projektu: sterowanie z strony www odczyt stanów bramy (otwieranie, zamykanie, otwarta, zamknięta, stan nieznany) sygnalizacja otwarcia furtki komunikacja poprzez RS485 Użyte elementy: arduino nano Nano Expansion Adapter ESP8266 2x moduł RS485 stepdown do zasilanie arduino nano moduł przekaźników kilka rezystorów Konieczne było zastosowanie drugiego mikrokontrolera ze względu na oddalenie bramy od domu o 100m. Więc zastosowałem Arduino Nano oraz ESP8266. Tak prezentował się biurkowy testowy zestaw: W arduino nano w celu odczytania napięć podawanych na siłowniki oraz stanów krańcówek, zastosowałem dzielniki napięć na rezystorach, które podłączyłem do wejść analogowych. Taki zabieg umożliwia programowe ustawienie poziomów przy których ma nastąpić wykrycie zmiany stanu oraz przekazanie danych do drugiego mikrokontrolera. Do komunikacji poprzez RS485 została wykorzystana biblioteka RS485_protocol.h oraz SoftwareSerial.h. Dane wysyłane są jako tablica pierwsza wartość to adres urządzenia a druga i trzecia to wartość którą chcemy przesłać na drugą stronę. ESP8266 po odebraniu danych wysyła je do domoticza, ustawiając odpowiednie wartości przełączników i alarmów. Tutaj troszkę odbiegnę od tematu, domoticz ma możliwość wysyłania zdjęć z kamery, wykorzystałem to w ten sposób, że jeśli wykryte zostanie otwarcie furtki to otrzymuję maila z zdjęciem intruza Komunikacja w drugą stronę odbywa się w najprostszy możliwy sposób, czyli na ESP został uruchomiony prosty web serwer, po otwarciu strony np: http://ip/brama zostaje nawiązana komunikacja z arduino nano i wysłane polecenie otwarcia bramy. Teraz powrócimy jeszcze do Arduino Nano, wyzwolenie otwarcia i zamknięcia bramy następuje poprzez przekaźnik, który podłączony jest w sterowniku HB5 pod wejście przeważnie służące do podłączenia przycisku znajdującego się gdzieś przy bramie. Sterownik HB5 posiada jeszcze kilka fajnych funkcjonalności które warto wykorzystać. 1. Wejście pod fotokomórkę która uniemożliwia zamknięcie bramy jeśli wiązka podczerwienie jest przerwana przez obiekt znajdujący się w bramie. 2. Możliwość podłączenia akumulatorów, niestety żelowe akumulatory nie przeżyły u mnie zimy, więc w tym roku postanowiłem sklecić pakiet z ogniw 18650 6s4p wraz z bms’em który zabezpiecza ogniwa przed nadmiernym rozładowaniem oraz przeładowaniem. Po odłączeniu zasilania brama otwiera się troszkę wolniej niż zazwyczaj ale w sytuacjach awaryjnych to nie przeszkadza. W teorii powinienem zrobić pakiet 7s bo wtedy zakresy napięć pokrywają się z zakresem pracy standardowych akumulatorów żelowych (2x12v), ale cena BMS’a 6s (2$) a 7s (10$) zaważyła o wyborze tańszego rozwiązania, które działa już kilka miesięcy. Standardowo kody źródłowe: Sterownik Brama.zip W razie jakikolwiek pytań, bo temat jest ciekawy i dość obszerny służę pomocą
  3. Jako że wpadł do mnie na warsztat NVR z wyjściem RS485 oraz kilka kamer analogowych postanowiłem na testy zbudować sobie kamerkę z PTZ, no może bez Z. Na początek wyjaśnię co to jest PTZ skrót rozwijamy jako Pan Tilt Zoom, system wykorzystywany w kamerach do obracania kamerą oraz jeśli kamera posiada taką funkcjonalność regulacji ogniskowej. Głodnych wiedzy odsyłam do https://en.wikipedia.org/wiki/Pan–tilt–zoom_camera Zaczęło się od tego że znalazłem na stronie thingverse parę projektów: https://www.thingiverse.com/thing:107957 https://www.thingiverse.com/thing:2467743 Wydrukowałem jeden z nich i po szybkim złożeniu konstrukcji podłączeniu pod arduino nano, oraz napisaniu testowego programu wyszło coś takiego: Serwa które użyłem to Serwo TowerPro SG-90. Aby ruszyć dalej trzeba było zapoznać się z protokołem który wykorzystywany jest w komunikacji rejestrator -> kamera, padło na protokół Pelco-D. Znalazłem manual z 1999 roku dotyczący tego protokołu i całość prac programistycznych poszła dosyć sprawnie. pelco-d.pdf Szybkie podłączenie modułu rs485 do Arduino Nano i mojego nvr’a, krótki program i zaczynamy debug komunikacji. Przykład danych które odbieram poniżej: 255 4 0 4 39 0 47 SUM: 47 255 4 0 4 39 0 47 SUM: 47 255 4 0 4 39 0 47 SUM: 47 255 4 0 2 39 0 45 SUM: 45 255 4 0 2 39 0 45 SUM: 45 255 4 0 2 39 0 45 SUM: 45 Pierwszy bajt to synchronizacja, drugi to adres kamery, trzeci i czwarty to bajty w których przekazywane są polecenia, nas najbardziej interesuje bajt czwarty, gdzie 4 to obrót w lewo a 2 to obrót w prawo, dodatkowo w bajcie piątym i szóstym przekazywane są informacje o prędkości, a bajt siódmy to suma kontrolna. Teraz wystarczyło połączyć 2 programy w jeden i można kamerkę powiesić w warsztacie no i nie do końca. Od tego momentu natrafiłem na pewną trudność. Okazało się że biblioteka Servo.h oraz SoftwareSerial.h korzystają z tego samego timera, co objawiało szarpaniem serwami przy jakiejkolwiek komunikacji po rs485. ehh…. Znalazłem inną bibliotekę ServoTimer2.h która według wielu źródeł powinna usunąć opisywaną trudność, więc po przerobieniu programu tak aby korzystał z nowej biblioteki, nic nie uległo zmianie Więc postanowiłem obejść problem programowo. //Look for incoming data from Pelco-D controller if (RS485Serial.available() > 0) { servo1.detach(); servo2.detach(); Wyłączając serwa na czas odczytu danych po rs485. Od tej pory wszystko zaczęło działać płynnie. Tak jak na poniższym filmie. Dodatkowo dorobiłem kontaktron na drzwi do warsztatu, tak aby kamera przy otwarciu drzwi ustawiała się na wchodzącego, a po zadanym czasie z powrotem kierowała się na okno. Program przewiduje obroty kamerą w wszystkie strony z uwzględnieniem prędkości wysyłanej z NVR’a, scan kamerą po pomieszczeniu, oraz presety. switch (data) { case 0x00 : break; case 0x02 : pulseWidth1 = pulseWidth1 + turnRate1; break; // right case 0x04 : pulseWidth1 = pulseWidth1 - turnRate1; break; // left case 0x10 : pulseWidth2 = pulseWidth2 - turnRate2; break; // down case 0x08 : pulseWidth2 = pulseWidth2 + turnRate2; break; // up case 0x0C : pulseWidth1 = pulseWidth1 - turnRate1; pulseWidth2 = pulseWidth2 + turnRate1; break; // left-up case 0x0A : pulseWidth1 = pulseWidth1 + turnRate1; pulseWidth2 = pulseWidth2 + turnRate1; break; // right-up case 0x14 : pulseWidth1 = pulseWidth1 - turnRate1; pulseWidth2 = pulseWidth2 - turnRate2; break; // left-down case 0x12 : pulseWidth1 = pulseWidth1 + turnRate1; pulseWidth2 = pulseWidth2 - turnRate2; break; // right-down case 0x1B : scan = 1; break;// scan on case 0x1D : scan = 0; break;// scan off case 0x07 : // presets if (byteReceived[5] == 1) // drukarka { pulseWidth1 = 90; pulseWidth2 = 140; } else if (byteReceived[5] == 2) // tv { pulseWidth1 = 35; pulseWidth2 = 140; } else if (byteReceived[5] == 3) // drzwi { pulseWidth1 = drzwiS1; pulseWidth2 = drzwiS2; } else if (byteReceived[5] == 4) // okno { pulseWidth1 = oknoS1; pulseWidth2 = oknoS2; } break; } W planach mam funkcjonalność ustawiania presetów z rejestartora, lecz nie było mi to potrzebne w tej chwili, a dostęp do ardiuno mam na wyciągnięcie ręki, więc zawsze mogę go przeprogramować. Zastanawiała mnie również żywotność serwomechanizmów, jak narazie cała konstrukcja wisi już ponad pół roku, do warsztatu wchodzę przynajmniej 5 razy dziennie, w soboty i niedziele licznik wejść myślę że dobija do jakiś 20 i jak dotychczas nic złego im się nie dzieje. Poniżej udostępniam również kod do arduino gdyby ktoś chciał się również pobawić. Lista użytych elementów: Arduino nano Nano Expansion Adapter Serwomechanizmy moduł RS485 Kod źródłowy: PTZ_rs485.zip
  4. @SOYER dzięki, ja bym powiedział że za dwóch lasów
  5. Od dawna interesowały mnie pomiary warunków meteorologicznych w mojej miejscowości, pierwsza stacja meteorologiczna, którą zbudowałem około roku 2010, wykonana była na mikrokontrolerze Atmega32. Do komunikacji z światem wykorzystywała moduł LAN Wiznet 7010a. Stacja ta była oprogramowana w języku BASCOM. Projekt który chcę zaprezentować dzisiaj działa już od roku 2018 i został oprogramowany w środowisku Arduino. Stacja została podzielona na 2 moduły, pierwszy pomiarowy oparty jest na klonie Arduino Nano oraz drugi odbiorczy którego sercem jest ESP8266 NodeMCU v3, służy on również do wyświetlania aktualnych pomiarów na wyświetlaczu LED dot matrix o wymiarach 8x56 punktów. Na pracach stolarskich się nie będziemy skupiać napiszę tylko że klatka meteorologiczna została wykonana z drewna sosnowego i umieszczona na wysokości 2 m. Moduł Pomiarowy Czujniki jakie zastosowałem to dwie sztuki DS18B20 pierwszy zajmuje się pomiarem temperatury przy gruncie na wysokości 5cm, drugi pełni rolę zapasowego czujnika temperatury na wypadek uszkodzenia się głównego czujnika BME280. Do pomiaru prędkości wiatru wykorzystuję wiatromierz firmy Maplin na jeden obrót wiatromierza przypadają 2 impulsy z kontaktronu który jest w nim zamontowany, producent dostarcza również odpowiedni wzór według którego można obliczyć rpm oraz prędkość wiatru w km/h. Dane mierzone przez wiatromierz możemy podzielić na dwie wartości, pierwsza to chwilowa prędkość, druga prędkość w porywach, aby uśrednić wartości mierzone program zlicza impulsy z 5s a następnie dokonuje odpowiednich obliczeń. Zebrane dane przesyłane są do drugiego urządzenia poprzez moduły radiowe które działają na częstotliwości 433,92 MHz. W tym celu zastosowana została biblioteka RCSwitch. Każda mierzona wartość jest wysyłana jako osobna transmisja. aby rozróżnić pomiary z konkretnych czujników mierzona wartość mnożona jest przez 100 a następnie dodawana jest liczba 100 000 dla pierwszego czujnika, 200 000 dla drugiego itd. Przykład kodu który realizuje tę funkcję poniżej: // temperatura sensor BME codetosend = temp * 100 + (1 * 100000); mySwitch.send(codetosend, 24); // wilgotnosc sensor BME codetosend = hum * 100 + (2 * 100000); mySwitch.send(codetosend, 24); Moduł Wewnętrzny Obudowa, która idealnie nadawała się do implementacji wewnętrznego modułu pochodzi z tunera IPTV Motorola VIP1910-9. Przedni panel został wykonany z ciemnego półprzepuszczalnego plastiku który idealnie nadaje się do umieszczenia w nim wyświetlacza. Sercem urządzenia jest układ ESP8266. "Moduł wewnętrzny" został również wyposażony w czujnik temperatury oraz wilgotności DHT22, dodatkowo w celu prezentacji zmierzonych wartości dołączone zostało 7 szt. modułów wyświetlacza LED dot matrix z układem MAX7219. Do obsługi tej matrycy zastosowałem bibliotekę Max72xxPanel.h która współpracuje z biblioteką Adafruit_GFX.h w ten sposób nie byłem zmuszony implementować do rozwiązania własnych czcionek. Matryca ta oprócz modułowej konstrukcji umożliwia również sterowaniem jasnością podświetlania, w tym celu aby uprzyjemnić użytkowanie w porach nocnych odbiornik został wyposażony w fotorezystor dzięki któremu potrafi określić natężenie oświetlenia otoczenia i odpowiednie ustawienie podświetlenia. Na wyświetlaczu w pierwszej kolejności wyświetlam aktualną godzinę oraz temperaturę wewnątrz pomieszczenia oraz wilgotność, po około jednej minucie wyświetlane są informacje odczytane z stacji meteo czyli temperatura wilgotność i ciśnienie, postanowiłem nie wyświetlać tutaj informacji dotyczących prędkości wiatru oraz temperatury przy gruncie. Decyzję tą podjąłem na podstawie użytkowania innego podobnego rozwiązania, akurat jak chcemy odczytać godzinę to wyświetlane są inne informacje. Dodatkowo w godzinach nocnych, które zostały ustawione w sztywnych ramach czasowych między 21:00 a 7:00 informacje odczytane z stacji meteo zostały okrojone tylko do temperatury. W projekcie zostały zastosowane 2 rodzaje animacji pierwsza z nich, przesuwa tekst z prawej strony wyświetlacza na lewą, z możliwością zatrzymania w interesujących momentach. Drugi rodzaj to pionowa animacja. Mikrokontroler również poprzez protokół NTP i bibliotekę time.h pobiera aktualną godzinę i datę. Za odbiór danych z pierwszego układu odpowiedzialny jest moduł radiowy którego obsługą tak jak w poprzednim module zajmuje się biblioteka RCswitch. Poniżej fragment programu który demonstruje w jaki sposób odbierane i dekodowane są dane: rc = mySwitch.getReceivedValue(); // czujnik temperatury powietrza BME280 if (abs(rc)>=50000&& abs(rc)<150000) { rc=(rc-100000)/100; if (rc > -50 and rc < 60) { temp1 = rc; Serial.print("Czujnik BME280 - temperatura: \t"); Serial.println(rc); matrix.drawPixel(55,0,1); matrix.write(); } } // czujnik wilgotności BME280 if (abs(rc)>=150000 && abs(rc)<250000) { rc=(rc-200000)/100; if (rc > 5 and rc <= 100) { hum = rc; Serial.print("Czujnik BME280 - wilgotnowsc: \t"); Serial.println(rc); matrix.drawPixel(55,1,1); matrix.write(); } } Dzięki zastosowaniu zewnętrznej anteny oraz odbiornika opartego na superheterodynie, zasięg w otwartym terenie to około 250 m. Po odebraniu danych z pierwszego układu poprzez moduł radiowy następuje przekazanie ich do serwera z systemem Domoticz. Domoticz to bardzo lekki system automatyki domowej, który pozwala monitorować i konfigurować różne urządzenia, przełączniki, czujniki takie jak temperatura, opady deszczu, wiatr, promieniowanie ultrafioletowe (UV), zużycie energii elektrycznej, zużycie gazu, zużycie wody i wiele więcej. Wykresy dostępne są również na stronie www http://meteo.palowice.net Poniżej film z działania odbiornika, smużenie animacji które występuje na filmiku ludzie oko nie rejestruje. Gdyby kogoś interesował kod to również zamieszczam: meteo.zip
×
×
  • Utwórz nowe...