Spisu treści:

Wczesne ostrzeżenie Światło pasa startowego Raspberry PI przy użyciu danych mapowania lotu: 14 kroków (ze zdjęciami)
Wczesne ostrzeżenie Światło pasa startowego Raspberry PI przy użyciu danych mapowania lotu: 14 kroków (ze zdjęciami)

Wideo: Wczesne ostrzeżenie Światło pasa startowego Raspberry PI przy użyciu danych mapowania lotu: 14 kroków (ze zdjęciami)

Wideo: Wczesne ostrzeżenie Światło pasa startowego Raspberry PI przy użyciu danych mapowania lotu: 14 kroków (ze zdjęciami)
Wideo: Nie było widać pasa startowego! Praca pilota samolotu | Tak trzeba żyć #50 Eska Rock 2024, Czerwiec
Anonim
Wczesne ostrzeżenie Światło pasa startowego Raspberry PI wykorzystujące dane mapowania lotu
Wczesne ostrzeżenie Światło pasa startowego Raspberry PI wykorzystujące dane mapowania lotu
Wczesne ostrzeżenie Światło pasa startowego Raspberry PI wykorzystujące dane mapowania lotu
Wczesne ostrzeżenie Światło pasa startowego Raspberry PI wykorzystujące dane mapowania lotu
Wczesne ostrzeżenie Światło pasa startowego Raspberry PI wykorzystujące dane mapowania lotu
Wczesne ostrzeżenie Światło pasa startowego Raspberry PI wykorzystujące dane mapowania lotu
Wczesne ostrzeżenie Światło pasa startowego Raspberry PI wykorzystujące dane mapowania lotu
Wczesne ostrzeżenie Światło pasa startowego Raspberry PI wykorzystujące dane mapowania lotu

Ta lampa powstała z kilku powodów, ponieważ zawsze interesują mnie samoloty, które latają nad głową, a latem w weekendy często latają całkiem ekscytujące. Chociaż masz tendencję do słuchania ich tylko wtedy, gdy przechodzą obok. Drugim powodem jest to, że wydaje się, że tor lotu samolotów wylatujących z lotniska London City będzie czasami podsłuchiwany i mają dość głośne loty. Ponieważ gram w nagrywanie niektórych filmów na YouTube, to naprawdę denerwujące jest to, że trzeba złomować nagranie z powodu hałaśliwego samolotu. Zastanawiałem się więc, czy dane, które widzisz na stronach takich jak flightradar24, są publicznie dostępne, kiedy odkryłem, że coś podobnego jest dostępne w sieci opensky, narodziła się lampka wczesnego ostrzegania. Nie minęło dużo czasu, zanim wpadłem na pomysł wykorzystania repliki światła na wybiegu, aby pomieścić projekt.

Możesz dowiedzieć się więcej o sieci OpenSky na https://www.opensky-network.org Chciałem tym razem zrobić ładny obiektyw z żywicy zamiast używać półprzezroczystego PLA i chociaż mam odbiornik ADS-B, chciałem zachować to proste i tanie. ADS-B również potrzebuje anteny, a to nie wystarczy, aby lampa stała na półce w biurze. Miejmy więc nadzieję, że ta konstrukcja okaże się interesująca, ponieważ obejmuje drukowanie 3D, formowanie żywicy i matematykę, aby ekstrapolować pozycje samolotów, które potencjalnie mogą przelatywać nad głową.

Krok 1: Projektowanie obudowy

Wyszukiwarka Google wyszukuje wiele różnych projektów lamp na wybiegu, a projekt tego został wykonany przy użyciu wpływów projektowych wielu różnych marek prawdziwych lamp. Jest również skalowany, aby siedzieć w pokoju lub na półce, a nie w pełnym rozmiarze, ponieważ w rzeczywistości są one znacznie większe.

Projekty zostały opracowane w Fusion 360 i zaimportowałem niektóre wcześniejsze elementy, takie jak uchwyt raspberry pi zero z poprzednich projektów. Możliwość ponownego wykorzystania elementów sprawia, że zapoznanie się z podstawami nie sprawia wiele bólu. Możesz również pobrać pliki tutaj

Krok 2: Zarzucanie soczewek - #fail

Rzucanie soczewek - #fail
Rzucanie soczewek - #fail
Rzucanie soczewek - #fail
Rzucanie soczewek - #fail
Rzucanie soczewek - #fail
Rzucanie soczewek - #fail

Najważniejszym elementem konstrukcyjnym tej lampy miała być soczewka. Więc zajęłam się tym jako pierwsza, ponieważ bez ładnego, autentycznego lustra projekt zadziałał. Dokumentuję tutaj niepowodzenia, które poniosłem, próbując to osiągnąć, mimo że początkowo zdecydowałem się na zrobienie obiektywu z bursztynu. Światła na pasie startowym są zarówno bursztynowe, jak i niebieskie i dopiero po tym, jak zacząłem robić bursztynowe, zmieniłem zdanie i zdecydowałem, że chcę niebieski.

Z tego, co wiem, bursztynowe są używane na linii oczekiwania, a niebieskie są używane do wyłożenia pasa startowego, i to te, które wydają się być bardziej archetypowe, znalezione, jeśli szukasz świateł pasa startowego. Oto jednak moja pierwsza próba wykonania bursztynowego obiektywu. Do wykonania soczewki miałem użyć żywicy bezbarwnej z dodatkiem koloru i chociaż wykonałem już kilka form, zastanawiałem się, czy będzie możliwe wydrukowanie formy 3D i jej użycie. Zacząłem więc od wykonania dzielonej formy w 3D i wydrukowania jej w PetG. Byłem przekonany, że rozsądne ilości uwolnienia z pleśni wystarczyłyby do rozdrobnienia pleśni. Jak się okazało po kilku próbach sprawiłem, że żywica przykleiła się do formy jak klej i po prostu wydawało się, że nie da się ich oddzielić. Chociaż miałem pełnowymiarowy model, którego zamierzałem użyć, zrezygnowałem z tego i wydrukowałem obiektyw do tradycyjnego silikonu.

Krok 3: Różne rodzaje żywic

Różne rodzaje żywic
Różne rodzaje żywic
Różne rodzaje żywic
Różne rodzaje żywic
Różne rodzaje żywic
Różne rodzaje żywic
Różne rodzaje żywic
Różne rodzaje żywic

Na marginesie, do tego projektu użyłem 3 rodzajów przezroczystych/kolorowych żywic.

Pierwszym z nich był rynek hobbystyczny o nazwie Pebeo - Gedeo i jest zwykle sprzedawany do zamykania małych przedmiotów i używany do biżuterii, przycisków do papieru itp. Działało to całkiem nieźle i ładnie utwardziło się w około 24-36 godzin. Jest to jednak dość drogie w stosunku do kwoty, którą dostajesz, ale jest poręczny i łatwo dostępny w sklepach hobbystycznych i rzemieślniczych. Jest mieszany w proporcji 2:1. Drugi to wstępnie zabarwiona żywica, którą miesza się w stosunku 10:1 z utwardzaczem, a jej utwardzenie trwało najdłużej, szczerze mówiąc, około tygodnia, zanim całkowicie się utwardziła. Ostatnia była przezroczystą żywicą, która również została zmieszana w proporcji 2:1 i utwardzona w około 2 dni, można to pokolorować kroplami pigmentu, ale musisz upewnić się, że zawsze używasz tej samej proporcji kolorów, jeśli robią oddzielne partie. Jest to również najbardziej opłacalne. Wreszcie, RTV do formy to GP-3481 RTV, który zajmuje około 24 godzin i ma dość długi czas miksowania, więc masz dużo czasu, aby go wymieszać, a następnie nalać.

W chwili obecnej nie posiadam garnka próżniowego (obecnie na zamówienie), więc możesz być nękany bąbelkami zarówno w formie, jak i wlewaniu żywicy. Nie jest to zbyt duży problem, ale z przezroczystym obiektywem lub podobnym, chciałbyś jakoś pomyśleć o usunięciu bąbelków z miksów.

Krok 4: Odlewanie soczewki w silikonowej formie nr 2

Image
Image
Odlewanie soczewki w silikonowej formie #2
Odlewanie soczewki w silikonowej formie #2
Odlewanie soczewki w silikonowej formie #2
Odlewanie soczewki w silikonowej formie #2

Jest to więc druga próba wykonania soczewki Resin, a pierwszym etapem było wykonanie zarówno soczewki w Fusion 360, a następnie wydrukowanie jej w ABS, a także wiadro do jej przechowywania. Byłoby to pierwsze dla formy i pomagało zmniejszyć ilość używanego silikonu. Możesz łatwo zrobić to z karty, ale to tylko inne podejście. Aby dać mu większą szansę na uwolnienie się z formy, najpierw go polakierowałem, a następnie dobrze pokryłem środkiem antyadhezyjnym do wosku.

Następnie nalałem trochę GP-3481, który jest około 27 RTV na brzegu, a następnie pozostawiłem go na następne 24 godziny przed wyjęciem z formy. Kiedy to zrobiłem, użyłem przezroczystej żywicy zmieszanej w proporcji 2:1 z około 4/5 kroplami kolorowego pigmentu i dobrze mieszałem przez dobre cztery minuty. Wlałem to do formy, a następnie włożyłem kieliszek do żywicy, aby później zapewnić pustkę na lampę lub diody LED. Po około 24 godzinach żywica była gotowa do usunięcia i obiektyw wyszedł całkiem nieźle. Pojawiają się bąbelki powietrza, ale na razie nie mam naczynia próżniowego do odgazowania żywicy przed wylaniem.

Krok 5: Drukowanie i przygotowanie 3D

Drukowanie i przygotowanie 3D
Drukowanie i przygotowanie 3D
Drukowanie i przygotowanie 3D
Drukowanie i przygotowanie 3D
Drukowanie i przygotowanie 3D
Drukowanie i przygotowanie 3D

Model został zaprojektowany w taki sposób, że część środkowa łączy się z podstawą. Miało to na celu uniknięcie maskowania podczas procesu malowania. Całość została wydrukowana w Hatchbox ABS, a następnie wypiaskowana. Począwszy od ziarna 60 do około 800, dało to wystarczająco dobre wykończenie powierzchni dla tego modelu.

Krok 6: Montaż i malowanie

Montaż i malowanie
Montaż i malowanie
Montaż i malowanie
Montaż i malowanie
Montaż i malowanie
Montaż i malowanie

Po przeszlifowaniu wydruków pomalowano je grubopowłokowym podkładem. Lekko przeszlifować, a następnie spryskać szarym podkładem. Główne części zostały pomalowane na kolor żółty ford, a następnie na podstawę wykorzystano zieleń Brooklands. następnie na śruby nałożono akcenty ze srebra tamiya, a na oprawkę obiektywu zastosowano trochę srebrnego chromu Molotow.

Krok 7: Najpierw znajdź samoloty w obszarze granicznym

Po uporządkowaniu sprzętu trzeba było popracować nad oprogramowaniem. Obecnie istnieje kilka witryn, które zapewniają śledzenie lotów, ale niewiele z nich udostępnia interfejs API umożliwiający dostęp do tych danych. Niektóre, które to robią, robią to tylko na zasadach komercyjnych, ale na szczęście istnieje jedna strona o nazwie https://opensky-network.org, z której można korzystać za darmo.

Aby uzyskać dostęp do tych danych, musisz się zarejestrować, a następnie możesz korzystać z ich API, zapewnia kilka funkcji i sposobów pobierania danych. Interesują nas wszystkie loty w danym obszarze i mają do tego wywołanie Live API. https://opensky-network.org/apidoc/ o nazwie obwiednia. Wywołanie API wymaga narożników pudełka, którymi jesteś zainteresowany, oczywiście jako punktu centralnego. Możesz sprawdzić działanie matematyki na tej stronie, która rysuje pole w zależności od tego, co wpisujesz. https://tools.geofabrik.de, ale na razie poniższy skrypt podaje punkty, które musimy podłączyć do API.

function get_bounding_box($szerokość_w_stopniach, $długość_w_stopniach, $pół_boku_w_milach){ $pół_boku_w_km = $pół_boku_w_milach * 1,609344; $lat = deg2rad($szerokość_w_stopniach); $lon = deg2rad($długość_w_stopniach); $promień = 6371; $promień_równoległy = $promień*cos($lat); $lat_min = $lat - $pół_boku_w_km/$promień; $lat_max = $lat + $pół_boku_w_km/$promień; $lon_min = $lon - $pół_boku_w_km/$promień_równoległy; $lon_max = $lon + $pół_boku_w_km/$promień_równoległy; $box_lat_min = rad2deg($lat_min); $box_lon_min = rad2deg($lon_min); $box_lat_max = rad2deg($lat_max); $box_lon_max = rad2deg($lon_max); return array($box_lat_min, $box_lon_min, $box_lat_max, $box_lon_max);

Jeśli chcesz przetestować swój kod, jest strona, na której możesz wpisać szerokość/długość i zobaczyć wyniki na mapie:Zobacz przykład obwiedni na mapie

Krok 8: Obliczanie kierunku samolotów w stosunku do nas

Obliczanie kierunku samolotów w stosunku do nas
Obliczanie kierunku samolotów w stosunku do nas

Wyniki wywołania API pola ograniczającego dają nam listę samolotów, ich Lon/lat, prędkość, wysokość i kurs. Następną rzeczą, którą musimy zrobić, jest uzyskanie kursu każdego samolotu w stosunku do nas, abyśmy mogli dalej przetwarzać te, które zmierzają przynajmniej w naszym ogólnym kierunku. Możemy to zrobić, ponieważ znamy naszą pozycję i możemy obliczyć kąt między nami a każdą płaszczyzną.

Aby to zrobić, używam fragmentu kodu, który pierwotnie był w JavaScript, więc przekonwertowałem go tutaj na PHP, * oblicz (początkowy) namiar między dwoma punktami * * z: Ed Williams' Aviation Formulary, https://williams.best.vwh.net/avform.htm#Crs * source = instantglobe.com/CRANES/GeoCoordTool.html */ funkcja get_bearing($dom_lat, $dom_lon, $plan_lat, $plan_lat) { $lat1 = deg2rad($dom_lat); $lat2 = deg2rad($samolot_lat);

$dLon = deg2rad($plane_lon-$home_lon);

$y = sin($dLon) * cos($lat2);

$x = cos($lat1)*sin($lat2) - sin($lat1)*cos($lat2)*cos($dLon); $z = atan2($y, $x); $zz = (rad2deg($z) +360)% 360; zwróć $zz;

Jeśli chcesz spojrzeć na stronę, na której znajdują się oryginalne wersje javascript, to jest to link:

w tym kodzie można również zobaczyć różne podprogramy dla każdego typu obliczeń.

Krok 9: Obliczanie punktu przecięcia przez spojrzenie na okrąg

Obliczanie punktu przecięcia przez spojrzenie na okrąg
Obliczanie punktu przecięcia przez spojrzenie na okrąg

Mamy więc teraz samolot, w którym namiar między nim a naszą lokalizacją jest mniejszy niż 90 (dodatni lub ujemny), co oznacza, że istnieje szansa, że może przelecieć w pobliżu. Korzystając z formuły haversine, możemy również obliczyć przy użyciu Lon/Lat samolotu i Lon/Lat naszego domu odległość, o jaką jest od nas.

Patrząc na diagram, jeśli narysujemy okrąg wokół naszego domu o promieniu powiedzmy 3 mil, to da nam to szansę zobaczenia czegokolwiek przelatującego nad nim. Znamy różnicę w kursie między samolotem a nami, znamy również odległość samolotu od nas, więc możemy następnie obliczyć trójkąt za pomocą starego dobrego SOHCAHTOA, a w tym przypadku za pomocą Tan kąta możemy uzyskać długość przeciwnego boku. Więc jeśli porównamy tę wartość z wartością promienia okręgu wokół domu, możemy wtedy dowiedzieć się, czy samolot przeleci wystarczająco blisko, abyśmy mogli go zobaczyć. Następną rzeczą, którą możemy zrobić, to obliczyć czas, w którym samolot przeleci, używając prędkości i odległości, a jeśli jest to mniej niż powiedzmy około 45 sekund, włączamy światło. To jest fragment kodu, którego używam do obliczenia szansy na przelot. Robię to, ponieważ w pobliżu znajduje się lotnisko i kiedy samoloty kołują wokół, nieuchronnie wskazują na dom. Jednak ponieważ ich wysokość wynosi zero, a prędkość to tempo marszu, nie powinno to wyzwalać alarmu.

function get_intercept($home_head, $plane_head, $plane_distance) {

$ kąt_lotu = abs(abs($dom_głowa - $plan_głowa) - 180); $kąt_lotu_r = deg2rad($kąt_lotu); $kąt_lotu_t = tan($kąt_lotu_r); $flight_intercept = $flight_angle_t * $plane_distance;

if (($flight_angle<90) && ($flight_intercept<3){ // możliwe przelot obok

}

zwróć $przechwycenie_lotu;

}

Krok 10: Odległość między dwoma punktami na mapie - formuła Haversine

Odległość między dwoma punktami na mapie - formuła Haversine
Odległość między dwoma punktami na mapie - formuła Haversine

Musimy więc obliczyć odległość między samolotem a naszą lokalizacją. Na krótkich dystansach na mapie można w przybliżeniu obliczyć odległość, ale ponieważ Ziemia jest kulista, istnieje formuła zwana formułą haversine, która pozwala wziąć pod uwagę zakrzywioną powierzchnię. Możesz przeczytać dalej w formule:

Teraz mając obliczoną odległość i znamy prędkość samolotu, możemy obliczyć, ile sekund minie, zanim samolot znajdzie się nad nami. Tak więc światło zapali się, jeśli w ciągu 30 sekund od przelotu coś się pojawi, i wreszcie mamy lampkę ostrzegawczą.

* oparty na JS na instantglobe.com/CRANES/GeoCoordTool.html i przekształcony w PHP */

function get_distHaversine ($home_lat, $home_lon, $plane_lat, $plane_lon) { $R = 6371; // średni promień Ziemi w km $dLat = deg2rad($plane_lat-$home_lat); $dLon = deg2rad($plane_lon-$home_lon); $lat1 = deg2rad($dom_lat); $lat2 = deg2rad($samolot_lat);

$a = sin($dLat/2) * sin($dLat/2) + cos($dLat1) * cos($dLat2) * sin($dLat/2) * sin($dLat/2);

$c = 2 * atan2(sqrt($a), sqrt(1-$a)); $d = $R * $c; zwróć $d; }

Krok 11: Importowanie i definiowanie bazy danych samolotu

Jednym z innych elementów jest to, że strona opensky oferuje do pobrania bazę samolotów wraz z ich znakami wywoławczymi i identyfikatorami. Jego kilkaset tysięcy wpisów. Możemy więc to pobrać i załadować lokalnie do bazy danych MariaDB w celu wyszukania (MySQL). Z każdym samolotem, który pojawia się nad głową, pobieramy jego szczegóły i aktualizujemy licznik, aby pokazać, ile razy był widziany.

Obecnie edytuję również bazę danych, aby wyróżnić interesujące mnie samoloty. Głównie stare warbirdy i inne podobne ciekawe samoloty. Kilka razy tego lata przyleciał Mig-15. więc celem jest użycie pola ostrzegawczego, które dodałem, a następnie szybkie miganie światła, gdy zbliża się coś interesującego

Krok 12: Poprawa wyników i nowe funkcje

Poprawa wyników i nowe funkcje
Poprawa wyników i nowe funkcje
Poprawa wyników i nowe funkcje
Poprawa wyników i nowe funkcje
Poprawa wyników i nowe funkcje
Poprawa wyników i nowe funkcje

Więc teoretycznie wszystko działa całkiem dobrze, ale z danymi zobaczysz, że są samoloty, które przelatują nad nimi, a które nie pojawiają się w API.

Dzieje się tak, ponieważ nie wszystkie samoloty używają transpondera ADS-B i używają starszych transponderów opartych na MLAT. Aby uzyskać dane o pozycji samolotu za pomocą MLAT, potrzeba szeregu odbiorników na ziemi, aby dokonać triangulacji ich pozycji, a niektóre witryny, takie jak Flightradar24, mają większą sieć współpracowników, którzy to robią w porównaniu do Opensky. Mam nadzieję, że z czasem ich zasięg również się poprawi i konfiguruję własny odbiornik MLAT, aby dodać do tych danych.

Krok 13: Baza kodów

Nie zapomnij, że jeśli zamierzasz tego użyć, możesz chcieć usunąć instrukcje SQL, jeśli nie masz bazy danych samolotów, a także dodać własną wartość Lon/Lat i klucz API w celu uzyskania dostępu do danych lotu.

github.com/ajax-jones/runway-light-awacs

define("ROZDZIAŁ", (20 * 1)); function fexp() { $lat = "Twoja szerokość geograficzna"; $lon = "Twoja długość geograficzna"; $strona = 15,75; $box = get_bounding_box($lat, $dług, $strona); $latmin = $pudełko[0]; $lonmin = $pudełko[1]; $latmax = $pudełko [2]; $lonmax = $pudełko [3]; $flyurl = "https://opensky-network.org/api/states/all?lamin=$latmin&lomin=$lonmin&lamax=$latmax&lomax=$lonmax"; echo "Skanowanie nieba"; $start_time = mikroczas (prawda); $json = file_get_contents($flyurl); $dane = json_decode($json, PRAWDA); $przychodzące = FAŁSZ; $liczba_planów = liczba($dane['stany']); if ($num_planes >0) { echo " i widzimy $num_planes planes\n "; for ($x =0; $x 0) { $samolot_eta = $distplane/$air_speed_kmh; } w przeciwnym razie { $eta = 1; } if ((($intercept)0)) && ($distplane0){ $inbound = TRUE; Echo "------------------------------------------------ --------------------\n"; echo "$icao24 - [$kraj $znak wywoławczy] w [$geo_altitude_m M -- $geo_altitude_f ft] "; echo "[prędkość $air_speed_kmh kmh i ", round($distplane, 1), "km dalej]\n"; echo "[na nagłówku ", round($plane_heading, 1), "] [homeangle $heading_d]"; echo "[$szerokość, $długość]\n"; echo "[flypas in ", decimal_to_time($plane_eta), " now ", round($intercept, 1), "km away\n"; Echo "------------------------------------------------ --------------------\n"; $DBi = new mysqli("127.0.0.1", "root", "twoje hasło", "awacs"); $sql = "wybierz * z bazy danych samolotów, gdzie `icao24`='$icao24'"; mysqli_set_charset($DBi, "utf8"); $getplanedata = mysqli_query($DBi, $sql) lub die(mysqli_error($DBi)); $row_getplanedata = mysqli_fetch_assoc($getplanedata); $rows_getplanedata = mysqli_num_rows($getplanedata); if($rows_getplanedata>0) { wykonaj { echo "callsign="; echo $row_getplanedata['rejestracja']; echo „jest”; echo $row_getplanedata['nazwa producenta']; Echo " "; echo $row_getplanedata['model']; echo „by”; echo $row_getplanedata['manufacturericao']; echo „własność”; echo $row_getplanedata['właściciel']; echo „widziano”; echo $row_getplanedata['wizyty']; echo "razy"; echo " ocena specjalna = "; echo $row_getplanedata['specjalne']; echo "\n"; $wizyty = $row_getplanedata['wizyty']+1; } while ($row_getplanedata = mysqli_fetch_assoc($getplanedata)); mysqli_free_result($getplanedata); $sqli = "AKTUALIZUJ bazę danych samolotów USTAW wizyty = $wizyty GDZIE icao24 = '$icao24'"; mysqli_set_charset($DBi, "utf8"); $updateplanedata = mysqli_query($DBi, $sqli) lub die(mysqli_error($DBi)); } else { echo "Nie można znaleźć tej płaszczyzny w bazie danych, więc ją dodaję"; $sqli = "WSTAW DO bazy danych samolotów (icao24, wizyty, specjalne) WARTOŚCI ('$icao24', 1, 1)"; $updateplanedata = mysqli_query($DBi, $sqli) lub die(mysqli_error($DBi)); } Echo "----------------------------------------------- ---------------------\n"; } else { // echo "$znak"; } } } else { echo " i niebo jest czyste\n "; } if ($inbound) { echo "Płaszczyzna przychodząca\n"; $polecenie = "świnie w 17 1"; execInBackground($polecenie); } else { echo "brak lotów przychodzących\n"; $polecenie = "świnie w 17 0"; execInBackground($polecenie); } } function decimal_to_time($decimal) { $offset = 0,002778; if ($dziesiętny>$przesunięcie) { $dziesiętny = $dziesiętny - 0,002778; } $godziny = gmdate('H', floor($decimal * 3600)); $minuty = gmdate('i', floor($dziesiętne * 3600)); $sekundy = gmdate('s', floor($decimal * 3600)); return str_pad($godziny, 2, "0", STR_PAD_LEFT).::. str_pad($minuty, 2, "0", STR_PAD_LEFT).::. str_pad($sekundy, 2, "0", STR_PAD_LEFT); } /* * oblicz (początkowy) namiar między dwoma punktami * * z: Ed Williams' Aviation Formulary, https://williams.best.vwh.net/avform.htm#Crs * source = instantglobe.com/CRANES/GeoCoordTool. html */ function get_bearing($dom_lat, $dom_dług, $plan_lat, $plan_lat) { $lat1 = deg2rad($dom_lat); $lat2 = deg2rad($samolot_lat); $dLon = deg2rad($plane_lon-$home_lon); $y = sin($dLon) * cos($lat2); $x = cos($lat1)*sin($lat2) - sin($lat1)*cos($lat2)*cos($dLon); $z = atan2($y, $x); $zz = (rad2deg($z) +360)% 360; zwróć $zz; } function get_intercept($home_head, $plane_head, $plane_distance) { $flight_angle = abs(abs($home_head - $plane_head) - 180); $kąt_lotu_r = deg2rad($kąt_lotu); $kąt_lotu_t = tan($kąt_lotu_r); $flight_intercept = $flight_angle_t * $plane_distance; zwróć $przechwycenie_lotu; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* * Użyj wzoru Haversine'a, aby obliczyć odległość (w km) między dwoma punktami określonymi przez * szerokość/długość geograficzną (w stopniach liczbowych) * * from: Wzór Haversine - RWSinnott, "Virtues of the Haversine", * Sky and Telescope, tom 68, nr 2, 1984 * https://williams.best.vwh.net/avform.htm#Crs * * przykładowe użycie z formularza: * wynik.wartość = LatLon.distHaversine(lat1.value.parseDeg(), long1.value.parseDeg(), * lat2.value.parseDeg(), long2.value.parseDeg()); * gdzie lat1, long1, lat2, long2 i wynik to pola formularza * source = instantglobe.com/CRANES/GeoCoordTool.html */ function get_distHaversine ($home_lat, $home_lon, $plane_lat, $plane_lon) { $R = 6371; // średni promień Ziemi w km $dLat = deg2rad($plane_lat-$home_lat); $dLon = deg2rad($plane_lon-$home_lon); $lat1 = deg2rad($dom_lat); $lat2 = deg2rad($samolot_lat); $a = sin($dLat/2) * sin($dLat/2) + cos($dLat1) * cos($dLat2) * sin($dLat/2) * sin($dLat/2); $c = 2 * atan2(sqrt($a), sqrt(1-$a)); $d = $R * $c; zwróć $d; } function get_bounding_box($szerokość_w_stopniach, $długość_w_stopniach, $pół_boku_w_milach){ $pół_boku_w_km = $połowa_boku_w_milach * 1,609344; $lat = deg2rad($szerokość_w_stopniach); $lon = deg2rad($długość_w_stopniach); $promień = 6371; # Promień równoleżnika na danej szerokości geograficznej; $promień_równoległy = $promień*cos($lat); $lat_min = $lat - $pół_boku_w_km/$promień; $lat_max = $lat + $pół_boku_w_km/$promień; $lon_min = $lon - $pół_boku_w_km/$promień_równoległy; $lon_max = $lon + $pół_boku_w_km/$promień_równoległy; $box_lat_min = rad2deg($lat_min); $box_lon_min = rad2deg($lon_min); $box_lat_max = rad2deg($lat_max); $box_lon_max = rad2deg($lon_max); return array($box_lat_min, $box_lon_min, $box_lat_max, $box_lon_max); } function execInBackground($cmd) { if (substr(php_uname(), 0, 7) == "Windows"){ pclose(popen("start /B". $cmd, "r")); } else { exec($cmd. " > /dev/null &"); } } function checkForStopFlag() { // całkowicie opcjonalny return(TRUE); } function start() { echo "start\n"; $polecenie = "świnie w 17 1"; execInBackground($polecenie); $aktywny = PRAWDA; while($aktywny) { usleep(1000); // opcjonalnie, jeśli chcesz być ostrożny if (microtime(true) >= $nextTime) { fexp(); $nextTime = mikroczas (prawda) + INTERWAŁ; } $aktywny = checkForStopFlag(); } } fexp(); początek(); ?>

Krok 14: Okablowanie diody LED i wyłącznika wyłączającego

Okablowanie diody LED i wyłącznika wyłączającego
Okablowanie diody LED i wyłącznika wyłączającego

Okablowanie tego projektu nie mogło być prostsze. Jest tylko jedna dioda LED podłączona do pinu 17 i uziemienia za pomocą wbudowanego rezystora 270R.

Zawieram również przycisk wyłączania i włączania wraz z diodą LED zasilania, która uruchamia się z pinu danych TXd. Możesz przeczytać więcej o funkcji wyłączania i wymaganym kodzie na https://github.com/Howchoo/pi-power-button.git ze strony https://howchoo.com/g/mwnlytk3zmm/how-to- add-a-pow… Możesz przeczytać o dodaniu lampki zasilania tutaj

Zalecana: