Cuprins:
- Pasul 1: Proiectarea carcasei
- Pasul 2: Aruncarea obiectivelor - #fail
- Pasul 3: diferite tipuri de rășină
- Pasul 4: Turnarea obiectivului în matrița din silicon # 2
- Pasul 5: Imprimare și pregătire 3D
- Pasul 6: Asamblare și pictură
- Pasul 7: Găsește mai întâi avioane într-o zonă delimitată
- Pasul 8: Calculul titlului avioanelor în legătură cu noi
- Pasul 9: Calcularea unei interceptări privind un cerc
- Pasul 10: Distanța dintre două puncte pe o hartă - Formula Haversine
- Pasul 11: Importul și definirea bazei de date a planului
- Pasul 12: îmbunătățirea rezultatelor și a noilor caracteristici
- Pasul 13: Codebase
- Pasul 14: Cablarea LED-ului și a comutatorului de oprire
Video: Avertizare timpurie Raspberry PI Runway Light Utilizarea datelor de cartografiere a zborului: 14 pași (cu imagini)
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:43
Această lampă a apărut din mai multe motive, pentru că sunt mereu interesat de avioanele care zboară deasupra capului și în timpul verii, la sfârșit de săptămână, există adesea unele destul de interesante care zboară în jur. Deși ai tendința să le auzi doar pe măsură ce trec. Apoi, celălalt motiv este că se pare că traseul de zbor pentru avioanele de la aeroportul din London City va fi uneori auzit și au zboruri destul de zgomotoase. Fiind în timp ce mă ocup de înregistrarea unor videoclipuri pentru YouTube, este foarte enervant să trebuiască să renunți la o înregistrare din cauza unui avion zgomotos. Așa că m-am întrebat dacă datele pe care le vedeți pe site-uri precum flightradar24 sunt disponibile publicului, odată ce am descoperit că ceva similar era disponibil din rețeaua opensky, s-a născut lampa de avertizare timpurie. Nu a durat prea mult pentru a veni apoi cu ideea de a folosi o replică a unei lumini de pistă pentru a adăposti proiectul.
Puteți afla mai multe despre rețeaua OpenSky la https://www.opensky-network.org De asemenea, am vrut de această dată să fac o lentilă de rășină frumoasă în loc să folosesc PLA translucid și, deși am un receptor ADS-B, am vrut să păstrez atât de simplu și ieftin. ADS-B are nevoie și de o antenă și acest lucru nu ar face ca o lampă să meargă pe raftul din birou. Așadar, sperăm că veți găsi construcția interesantă, deoarece acoperă imprimarea 3D, matrițarea rășinii și matematica, precum și pentru a extrapola pozițiile avioanelor care ar putea trece deasupra capului.
Pasul 1: Proiectarea carcasei
Căutarea Google vine cu multe modele diferite de lămpi de pistă, iar designul acesteia a fost realizat folosind influențe de design din multe mărci diferite de lămpi reale. Este, de asemenea, scalat pentru a sta într-o cameră sau pe un raft, mai degrabă decât pentru dimensiuni complete, deoarece acestea tind să fie mult mai mari în viața reală.
Design-urile au fost elaborate în Fusion 360 și am importat câteva elemente anterioare, cum ar fi suportul pentru zmeură pi zero din proiecte anterioare. Abilitatea de a reutiliza elemente necesită o mare parte din durerea de cap pentru a reduce elementele de bază. De asemenea, puteți descărca fișierele aici
Pasul 2: Aruncarea obiectivelor - #fail
Cel mai important element de design al acestei lămpi avea să fie obiectivul. Așa că am abordat acest lucru mai întâi, deoarece fără o sticlă frumoasă autentică, proiectul avea să funcționeze. Documentez aici eșecurile pe care le-am avut în încercarea de a obține acest lucru, fără a renunța la faptul că inițial am decis să fac obiectivul chihlimbar. Luminile de pistă vin atât în chihlimbar, cât și în albastru și abia după ce începusem să fac cel chihlimbar, m-am răzgândit și am decis că vreau unul albastru.
Din ceea ce pot să văd, cele de chihlimbar sunt utilizate la linia de reținere, iar cele albastre sunt folosite pentru a alinia pista, iar acestea sunt cele care par a fi cele mai arhetipale găsite dacă căutați luminile de pistă. Cu toate acestea, iată prima mea încercare de a realiza un obiectiv chihlimbar. Pentru a realiza obiectivul, aveam să folosesc rășină transparentă cu aditiv de culoare și, deși am făcut câteva matrițe înainte să mă întreb dacă va fi posibil să tipăresc o matriță 3D și să o folosesc. Așa că am început să fac o matriță divizată în 3D și să o imprim în PetG. Cantități judicioase de eliberare a mucegaiului am fost convins că vor fi suficiente pentru a spera mucegaiul. După cum se dovedește cu câteva încercări, am făcut rășina lipită de matriță ca un lipici și nu părea posibil să le separăm. Deși aveam una pe scară largă pe care urma să o folosesc, m-am hotărât împotriva ei și am imprimat obiectivul pentru a fi folosit cu turnarea tradițională din silicon.
Pasul 3: diferite tipuri de rășină
Deoparte, am folosit 3 tipuri de rășini clare / colorate pentru acest proiect.
Primul a fost un tip de piață Hobby numit Pebeo - Gedeo și este vândut în mod normal pentru încapsularea obiectelor mici și folosit pentru bijuterii și greutăți pentru birou etc. Acest lucru a funcționat destul de bine și s-a vindecat frumos în aproximativ 24-36 de ore. Cu toate acestea, este destul de scump pentru suma pe care o obțineți, dar este la îndemână și ușor disponibilă în magazinele de hobby și meșteșuguri. Este amestecat la un raport de 2: 1. Al doilea a fost o rășină precolorată care este amestecată la un raport de 10: 1 cu întăritorul și acest lucru a durat cel mai mult timp pentru a fi vindecat, aproximativ o săptămână, pentru a fi sincer, înainte de a se vindeca complet. Ultima a fost o rășină limpede, care a fost, de asemenea, amestecată în raportul 2: 1 și care a fost vindecată în aproximativ 2 zile, puteți să o colorați cu picături de pigment, dar trebuie să vă asigurați că utilizați întotdeauna același raport de culoare dacă fac loturi separate. De asemenea, funcționează cel mai rentabil. În cele din urmă, RTV-ul pentru matriță a fost un GP-3481 RTV și acest lucru durează aproximativ 24 de ore pentru a fi setat și are un timp destul de lung, așa că aveți suficient timp să-l amestecați și apoi să-l turnați.
În prezent, nu am o oală de vacumn (în prezent la comandă), astfel încât să puteți fi bătut de bule atât în matriță, cât și în turnarea rășinii. Nu este o problemă prea mare pentru acest lucru, dar cu un obiectiv clar sau similar, atunci ați dori să vă gândiți la un fel pentru a scoate bulele din amestecuri.
Pasul 4: Turnarea obiectivului în matrița din silicon # 2
Deci, aceasta este a doua încercare de a realiza o lentilă din rășină, iar prima etapă a fost aceea de a realiza atât un obiectiv în Fusion 360, cât și de a-l imprima în ABS, precum și o găleată pentru a-l ține. Acesta ar fi primul pentru matriță și ajută la menținerea cantității de silicon care trebuie utilizată. Puteți face acest lucru cu ușurință din card, dar este doar o abordare diferită. Pentru a-i oferi o șansă mai mare de a fi eliberat din matriță, l-am lăcuit mai întâi și apoi i-am dat o acoperire bună de agent de eliberare a ceară.
Am turnat apoi niște GP-3481, care este aproximativ țărmul 27 RTV și apoi l-am lăsat să se stabilească în următoarele 24 de ore înainte de demolare. Odată ce s-a făcut acest lucru, am folosit rășina limpede amestecată la raportul 2: 1 cu aproximativ 4/5 picături de pigment de culoare și am amestecat bine timp de patru minute bune. A turnat acest lucru în matriță și apoi a așezat o sticlă în rășină și pentru a oferi un gol mai târziu, fie pentru o lampă, fie pentru LED-uri. După aproximativ 24 de ore, această rășină a fost gata de îndepărtat și obiectivul a ieșit destul de bine. Există bule de aer prezente, dar încă nu am un vas de vid pentru a degaja rășina înainte de turnare.
Pasul 5: Imprimare și pregătire 3D
Modelul a fost conceput astfel încât secțiunea centrală să se conecteze la bază. Aceasta a fost pentru a evita mascarea în timpul procesului de vopsire. Întregul model a fost tipărit în Hatchbox ABS și apoi șlefuit. Începând cu 60 grit până la aproximativ 800 grit a dat un finisaj suficient de bun pentru acest model.
Pasul 6: Asamblare și pictură
Odată ce amprentele sunt șlefuite, a fost apoi vopsită cu niște grunduri de înaltă construcție. Șlefuit ușor și apoi pulverizat în grund gri. Părțile principale au fost vopsite în galben semnal Ford, iar apoi pârâul verde folosit pentru bază. aparițiile de argint tamiya au fost apoi aplicate la șuruburi și unele crom argintiu molotow utilizate pe suportul obiectivului.
Pasul 7: Găsește mai întâi avioane într-o zonă delimitată
Cu hardware-ul sortat, software-ul a trebuit să fie lucrat. Acum există câteva site-uri care oferă urmărirea zborurilor, dar nu multe care oferă un API pentru a accesa aceste date. Unii care o fac, o fac doar pe o bază comercială, dar din fericire există un site numit https://opensky-network.org pe care îl puteți folosi gratuit.
Pentru a accesa aceste date trebuie să vă înregistrați și apoi puteți utiliza API-ul lor, acesta oferă mai multe funcții și modalități de extragere a datelor. Suntem interesați de toate zborurile dintr-o zonă și au un apel API Live pentru asta. https://opensky-network.org/apidoc/ numită casetă de delimitare. Apelul API necesită colțurile casetei care vă interesează, desigur, Lat / Lon, ca punct central. Puteți verifica funcționarea matematică a acestui site, care desenează o casetă în funcție de ceea ce introduceți. Http://tools.geofabrik.de, dar deocamdată următorul script oferă punctele pe care trebuie să le conectăm la API.
funcție get_bounding_box ($ latitude_in_degrees, $ longitude_in_degrees, $ half_side_in_miles) {$ half_side_in_km = $ half_side_in_miles * 1.609344; $ lat = deg2rad ($ latitude_in_degrees); $ lon = deg2rad ($ longitude_in_degrees); $ raza = 6371; $ parallel_radius = $ radius * cos ($ lat); $ lat_min = $ lat - $ half_side_in_km / $ radius; $ lat_max = $ lat + $ half_side_in_km / $ radius; $ lon_min = $ lon - $ half_side_in_km / $ parallel_radius; $ lon_max = $ lon + $ half_side_in_km / $ parallel_radius; $ box_lat_min = rad2deg ($ lat_min); $ box_lon_min = rad2deg ($ lon_min); $ box_lat_max = rad2deg ($ lat_max); $ box_lon_max = rad2deg ($ lon_max); returnare matrice ($ box_lat_min, $ box_lon_min, $ box_lat_max, $ box_lon_max);
Dacă doriți să vă testați codul, există un site unde puteți introduce lat / lon și puteți vedea rezultatele pe o hartă: vedeți un exemplu de casetă de delimitare pe o hartă
Pasul 8: Calculul titlului avioanelor în legătură cu noi
Rezultatele apelului API al casetei de delimitare ne oferă o listă de planuri, Lon / lat, viteza, altitudinea și direcția acestora. Deci, următorul lucru pe care trebuie să-l facem este să obținem direcția fiecărui plan în raport cu noi, astfel încât să putem prelucra în continuare cele care se îndreaptă cel puțin în direcția noastră generală. Putem face acest lucru pe măsură ce ne cunoaștem poziția și putem calcula unghiul de la noi la fiecare plan.
Pentru a face acest lucru, am folosit o bucată de cod din care inițial era în Javascript, așa că am convertit-o aici în PHP, * calculați raportul (inițial) între două puncte * * din: Ed Williams 'Aviation Formulary, https://williams.best.vwh.net/avform.htm#Crs * source = instantglobe.com/CRANES/GeoCoordTool.html * / funcția get_bearing ($ home_lat, $ home_lon, $ plane_lat, $ plane_lon) {$ lat1 = deg2rad ($ home_lat); $ lat2 = deg2rad ($ plane_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; returnează $ zz;
Dacă doriți să vă uitați la pagina în care sunt versiunile originale de javascript, acesta este linkul:
în cadrul acelui cod, puteți vedea, de asemenea, diferitele sub rutine pentru fiecare tip de calcul.
Pasul 9: Calcularea unei interceptări privind un cerc
Așadar, avem acum un plan în care direcția dintre acesta și locația noastră este mai mică de 90 (fie pozitivă, fie negativă) și astfel înseamnă că există șansa ca acesta să zboare în apropiere. Folosind formula haversină putem rezolva, de asemenea, folosind Lon / Lat al avionului și Lon / Lat al casei noastre la distanța la care este departe de noi.
Uitându-ne la diagramă, dacă desenăm un cerc în jurul casei noastre, spunem aproximativ o rază de 3 mile, aceasta ne oferă șansa de a vedea ceva care zboară. Știm diferența de direcție între avion și noi, știm și distanța avionului față de noi, astfel încât să putem calcula triunghiul folosind vechiul SOHCAHTOA, și în acest caz folosind Tanul unghiului putem obține lungimea laturii opuse. Deci, dacă comparăm această valoare cu valoarea razei cercului din jurul casei, putem afla dacă avionul va zbura suficient de aproape pentru ca noi să-l vedem. Următorul bit pe care îl putem face este să stabilim timpul pe care avionul îl va zbura folosind viteza aerului și distanța și dacă aceasta este mai mică decât să spunem aproximativ 45 de secunde sau aprindem lumina. Acesta este un pic din codul pe care îl folosesc pentru a stabili șansa unei survolări. Fac asta deoarece există un aeroport în apropiere și când avioanele circulă în jurul valorii de ele, inevitabil indică spre casă. Cu toate acestea, deoarece altitudinea lor este zero și viteza este în ritm de mers, acest lucru nu ar trebui să declanșeze alarma.
funcție get_intercept ($ home_head, $ plane_head, $ plane_distance) {
$ flight_angle = abs (abs ($ home_head - $ plane_head) - 180); $ flight_angle_r = deg2rad ($ flight_angle); $ flight_angle_t = tan ($ flight_angle_r); $ flight_intercept = $ flight_angle_t * $ plane_distance;
if (($ flight_angle <90) && ($ flight_intercept <3)) {// posibil trece pe lângă
}
returnează $ flight_intercept;
}
Pasul 10: Distanța dintre două puncte pe o hartă - Formula Haversine
Deci, trebuie să calculăm distanța dintre avion și locația noastră. Pe distanțe scurte pe o hartă, puteți calcula aproximativ distanța, dar, deoarece pământul este sferic, există o formulă numită formula haversină care vă permite să luați în considerare suprafața curbată. Puteți citi mai departe în formula:
Acum, cu distanța calculată și știm viteza aeriană a avionului, putem stabili câte secunde va fi înainte ca avionul să fie deasupra capului. Deci, lumina se va aprinde dacă există ceva în termen de 30 de secunde de la flypast și în sfârșit avem lumina noastră de avertizare.
* bazat pe 0n JS la instantglobe.com/CRANES/GeoCoordTool.html și transformat în PHP * /
funcția get_distHaversine ($ home_lat, $ home_lon, $ plane_lat, $ plane_lon) {$ R = 6371; // raza medie a pământului în km $ dLat = deg2rad ($ plane_lat- $ home_lat); $ dLon = deg2rad ($ plane_lon- $ home_lon); $ lat1 = deg2rad ($ home_lat); $ lat2 = deg2rad ($ plane_lat);
$ a = sin ($ dLat / 2) * sin ($ dLat / 2) + cos ($ lat1) * cos ($ lat2) * sin ($ dLon / 2) * sin ($ dLon / 2);
$ c = 2 * atan2 (sqrt ($ a), sqrt (1- $ a)); $ d = $ R * $ c; returnează $ d; }
Pasul 11: Importul și definirea bazei de date a planului
Una dintre celelalte piese este că site-ul opensky oferă o bază de date descărcabilă de avioane, împreună cu indicativele și identificările lor. Câteva sute de mii de intrări. Deci, putem descărca acest lucru și îl putem încărca local într-o bază de date MariaDB pentru căutare (MySQL). Cu fiecare avion care apare deasupra capului, îi preluăm detaliile și actualizăm un contor pentru a arăta de câte ori a fost văzut.
În prezent, editez baza de date pentru a evidenția avioanele care mă interesează. În principal păsări de război vechi și alte avioane similare interesante. De vreo două ori în această vară a zburat un Mig-15. așa că scopul este să folosesc un câmp de alertă pe care l-am adăugat și apoi să aprind rapid lumina când se îndreaptă ceva interesant
Pasul 12: îmbunătățirea rezultatelor și a noilor caracteristici
Deci, în teorie, totul funcționează destul de bine, dar veți afla cu datele că există avioane care zboară peste care nu apar în API.
Acest lucru se datorează faptului că nu toate avioanele folosesc transponderul ADS-B și folosesc transpondere mai vechi bazate pe MLAT. Pentru a obține date de poziție pe aeronave folosind MLAT, este nevoie de o serie de receptoare la sol pentru a triangula poziția lor și unele site-uri precum flightradar24 au o rețea mai mare de contribuabili care fac acest lucru în comparație cu opensky. Sperăm că în timp acoperirea lor se va îmbunătăți, de asemenea, și îmi configurez propriul receptor MLAT pentru a adăuga la aceste date.
Pasul 13: Codebase
Nu uitați dacă aveți de gând să utilizați acest lucru, poate doriți să eliminați instrucțiunile SQL dacă nu aveți baza de date a avioanelor și adăugați, de asemenea, propria valoare Lon / Lat și cheia API pentru accesarea datelor de zbor.
github.com/ajax-jones/runway-light-awacs
define ("INTERVAL", (20 * 1)); funcția fexp () {$ lat = "latitudinea ta"; $ lon = "longitudinea ta"; latura $ = 15,75; $ box = get_bounding_box ($ lat, $ lon, $ side); $ latmin = $ casetă [0]; $ lonmin = $ cutie [1]; $ latmax = $ casetă [2]; $ lonmax = $ cutie [3]; $ flyurl = "https://opensky-network.org/api/states/all?lamin=$latmin&lomin=$lonmin&lamax=$latmax&lomax=$lonmax"; ecou „Scanarea cerului”; $ start_time = microtime (adevărat); $ json = file_get_contents ($ flyurl); $ data = cod_json ($ json, ADEVĂRAT); $ inbound = FALS; $ num_planes = count ($ date ['state']); if ($ num_planes> 0) {echo "și putem vedea $ num_planes plane / n"; pentru ($ x = 0; $ x 0) {$ plane_eta = $ distplane / $ air_speed_kmh; } else {$ eta = 1; } if ((($ intercept) 0)) && ($ distplane0) {$ inbound = TRUE; ecou "------------------------------------------------ -------------------- / n "; ecou „$ icao24 - [$ country $ callign] la [$ geo_altitude_m M - $ geo_altitude_f ft]”; ecou „[speed $ air_speed_kmh kmh and”, round ($ distplane, 1), „km away] n"; ecou "[pe un titlu de", rotund ($ plane_heading, 1), "] [homeangle $ heading_d]"; ecou "[$ latitude, $ longitudine] n"; ecou "[flypast in", decimal_to_time ($ plane_eta), "now", round ($ intercept, 1), "km distanță / n"; ecou "------------------------------------------------ -------------------- / n "; $ DBi = new mysqli ("127.0.0.1", "root", "parola ta", "awacs"); $ sql = "select * din baza de date a aeronavei unde` icao24` = '$ icao24' "; mysqli_set_charset ($ DBi, "utf8"); $ getplanedata = mysqli_query ($ DBi, $ sql) sau die (mysqli_error ($ DBi)); $ row_getplanedata = mysqli_fetch_assoc ($ getplanedata); $ rows_getplanedata = mysqli_num_rows ($ getplanedata); if ($ rows_getplanedata> 0) {do {echo "callsign ="; echo $ row_getplanedata ['înregistrare']; ecoul „este un”; echo $ row_getplanedata ['manufacturername']; ecou ""; echo $ row_getplanedata ['model']; ecou „de”; echo $ row_getplanedata ['manufacturericao']; ecou „deținut de”; echo $ row_getplanedata ['proprietar']; ecou „văzut”; echo $ row_getplanedata ['vizite']; ecou „ori”; ecou "rating special ="; echo $ row_getplanedata ['special']; ecou "\ n"; $ vizite = $ rând_getplanedată ['vizite'] + 1; } while ($ row_getplanedata = mysqli_fetch_assoc ($ getplanedata)); mysqli_free_result ($ getplanedata); $ sqli = "ACTUALIZARE baza de date a aeronavelor SET vizite = $ vizite UNDE icao24 = '$ icao24'"; mysqli_set_charset ($ DBi, "utf8"); $ updateplanedata = mysqli_query ($ DBi, $ sqli) sau die (mysqli_error ($ DBi)); } else {echo "Nu am putut găsi acest plan în DB așa că l-am adăugat"; $ sqli = "INSERT INTO databasedatings (icao24, vizite, speciale) VALORI ('$ icao24', 1, 1)"; $ updateplanedata = mysqli_query ($ DBi, $ sqli) sau die (mysqli_error ($ DBi)); } ecou "----------------------------------------------- --------------------- / n "; } else {// ecou „$ callign”; }}} altfel {ecou "și cerul este clar / n"; } if ($ inbound) {echo "Inbound plane / n"; $ command = "porci w 17 1"; execInBackground (comanda $); } else {echo "fără zboruri de intrare / n"; $ command = "porci w 17 0"; execInBackground (comanda $); }} function decimal_to_time ($ decimal) {$ offset = 0,002778; if ($ zecimal> $ offset) {$ zecimal = $ zecimal - 0,002778; } $ ore = gmdate ('H', etaj ($ zecimal * 3600)); $ minute = gmdate ('i', etaj ($ zecimal * 3600)); $ secunde = gmdate ('s', etaj ($ zecimal * 3600)); returnează str_pad ($ ore, 2, „0”, STR_PAD_LEFT). ":". str_pad ($ minute, 2, „0”, STR_PAD_LEFT). ":". str_pad ($ secunde, 2, „0”, STR_PAD_LEFT); } / * * calculați (inițial) purtând între două puncte * * din: Ed Williams 'Aviation Formulary, https://williams.best.vwh.net/avform.htm#Crs * source = instantglobe.com/CRANES/GeoCoordTool. html * / function get_bearing ($ home_lat, $ home_lon, $ plane_lat, $ plane_lon) {$ lat1 = deg2rad ($ home_lat); $ lat2 = deg2rad ($ plane_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; returnează $ zz; } funcție get_intercept ($ home_head, $ plane_head, $ plane_distance) {$ flight_angle = abs (abs ($ home_head - $ plane_head) - 180); $ flight_angle_r = deg2rad ($ flight_angle); $ flight_angle_t = tan ($ flight_angle_r); $ flight_intercept = $ flight_angle_t * $ plane_distance; returnează $ flight_intercept; } / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * / / * * Utilizați formula Haversine pentru a calcula distanța (în km) între două puncte specificate de * latitudine / longitudine (în grade numerice) * * din: formula Haversine - RWSinnott, „Virtues of the Haversine”, * Sky and Telescope, vol 68, nr 2, 1984 * https://williams.best.vwh.net/avform.htm#Crs * * exemplu de utilizare din formular: * result.value = LatLon.distHaversine (lat1.value.parseDeg (), long1.value.parseDeg (), * lat2.value.parseDeg (), long2.value.parseDeg ()); * unde lat1, long1, lat2, long2 și rezultatul sunt câmpuri de formular * sursă = instantglobe.com/CRANES/GeoCoordTool.html * / function get_distHaversine ($ home_lat, $ home_lon, $ plane_lat, $ plane_lon) {$ R = 6371; // raza medie a pământului în km $ dLat = deg2rad ($ plane_lat- $ home_lat); $ dLon = deg2rad ($ plane_lon- $ home_lon); $ lat1 = deg2rad ($ home_lat); $ lat2 = deg2rad ($ plane_lat); $ a = sin ($ dLat / 2) * sin ($ dLat / 2) + cos ($ lat1) * cos ($ lat2) * sin ($ dLon / 2) * sin ($ dLon / 2); $ c = 2 * atan2 (sqrt ($ a), sqrt (1- $ a)); $ d = $ R * $ c; returnează $ d; } funcție get_bounding_box ($ latitude_in_degrees, $ longitude_in_degrees, $ half_side_in_miles) {$ half_side_in_km = $ half_side_in_miles * 1.609344; $ lat = deg2rad ($ latitude_in_degrees); $ lon = deg2rad ($ longitude_in_degrees); $ raza = 6371; # Raza paralelei la latitudine dată; $ parallel_radius = $ radius * cos ($ lat); $ lat_min = $ lat - $ half_side_in_km / $ radius; $ lat_max = $ lat + $ half_side_in_km / $ radius; $ lon_min = $ lon - $ half_side_in_km / $ parallel_radius; $ lon_max = $ lon + $ half_side_in_km / $ parallel_radius; $ box_lat_min = rad2deg ($ lat_min); $ box_lon_min = rad2deg ($ lon_min); $ box_lat_max = rad2deg ($ lat_max); $ box_lon_max = rad2deg ($ lon_max); returnare matrice ($ 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 () {// returnare complet opțională (TRUE); } function start () {echo "start / n"; $ command = "porci w 17 1"; execInBackground (comanda $); $ activ = ADEVĂRAT; while ($ activ) {usleep (1000); // opțional, dacă doriți să fiți atenți dacă (microtime (adevărat)> = $ nextTime) {fexp (); $ nextTime = microtime (adevărat) + INTERVAL; } $ activ = checkForStopFlag (); }} fexp (); start(); ?>
Pasul 14: Cablarea LED-ului și a comutatorului de oprire
Cablarea acestui proiect nu poate fi mai simplă. Există doar un LED care este conectat la pinul 17 și la masă cu un rezistor 270R în linie.
Includ, de asemenea, un buton de oprire și pornire împreună cu un LED de alimentare care rulează pinul de date TXd. Puteți citi mai multe despre funcția de oprire și codul necesar la https://github.com/Howchoo/pi-power-button.git de pe site-ul https://howchoo.com/g/mwnlytk3zmm/how-to- add-a-pow … Puteți citi despre adăugarea unei lumini de alimentare aici
Recomandat:
Bazele zborului cu avionul RC: 13 pași
Noțiuni de bază ale zborului cu avionul RC: Bună tuturor, astăzi vom analiza elementele de bază ale modului de a zbura un avion RC pe un simulator și de a preveni prăbușirea modelului dvs. pe teren. În timp ce am explicat cum am FlySky FS -Controler i6X conectat cu un simulator RC, așa că acum vom
Neopixel Ws2812 Rainbow LED Glow Cu M5stick-C - Rularea Rainbow pe Neopixel Ws2812 Utilizarea M5stack M5stick C Utilizarea Arduino IDE: 5 pași
Neopixel Ws2812 Rainbow LED Glow Cu M5stick-C | Rularea Rainbow pe Neopixel Ws2812 Utilizarea M5stack M5stick C Utilizarea Arduino IDE: Bună băieți, în acest instructables vom învăța cum să utilizați LED-uri neopixel ws2812 sau benzi LED sau matrice LED sau inel cu LED cu placa de dezvoltare m5stack m5stick-C cu Arduino IDE și vom face un model curcubeu cu el
Makey Makey - Sistem de avertizare timpurie pentru vânt puternic: 5 pași
Makey Makey - Sistem de avertizare timpurie pentru vânt puternic: acest „sistem de avertizare timpurie” provocarea de proiectare ar fi dată unui grup de studenți. Obiectivul este ca o echipă de studenți (doi sau trei pe grup) să proiecteze un sistem care îi avertizează pe oameni să caute adăpost împotriva vânturilor care devin periculoase
Achiziționarea datelor și sistemul de vizualizare a datelor pentru o bicicletă electrică MotoStudent: 23 de pași
Achiziționarea datelor și sistemul de vizualizare a datelor pentru o bicicletă electrică MotoStudent: un sistem de achiziție de date este o colecție de hardware și software care lucrează împreună pentru a colecta date de la senzori externi, a le stoca și a le procesa ulterior, astfel încât să poată fi vizualizate grafic și analizate, permițând inginerilor să facă
Utilizarea Meshlab pentru curățarea și asamblarea datelor de scanare laser: 8 pași
Utilizarea Meshlab pentru curățarea și asamblarea datelor de scanare laser: Meshlab este un program software open source folosit pentru a manipula și edita datele mesh. Acest tutorial va arăta în mod specific cum să asamblați, să curățați și să reconstruiți datele dintr-un scaner laser 3D. Tehnicile utilizate cu scanerul folosit aici ar trebui să fie