Innehållsförteckning:

Tidig varning Raspberry PI startbelysning med flygmappningsdata: 14 steg (med bilder)
Tidig varning Raspberry PI startbelysning med flygmappningsdata: 14 steg (med bilder)

Video: Tidig varning Raspberry PI startbelysning med flygmappningsdata: 14 steg (med bilder)

Video: Tidig varning Raspberry PI startbelysning med flygmappningsdata: 14 steg (med bilder)
Video: Модернизация Raspberry Pi 4 - модуль X857, mSATA SSD диск KingSpec, ставим Supervised Home Assistant 2024, Juli
Anonim
Tidig varning Raspberry PI Runway Light med hjälp av flygmappningsdata
Tidig varning Raspberry PI Runway Light med hjälp av flygmappningsdata
Tidig varning Raspberry PI Runway Light med hjälp av flygmappningsdata
Tidig varning Raspberry PI Runway Light med hjälp av flygmappningsdata
Tidig varning Raspberry PI Runway Light med hjälp av flygmappningsdata
Tidig varning Raspberry PI Runway Light med hjälp av flygmappningsdata
Tidig varning Raspberry PI Runway Light med hjälp av flygmappningsdata
Tidig varning Raspberry PI Runway Light med hjälp av flygmappningsdata

Denna lampa kom till av flera anledningar genom att jag alltid är intresserad av planen som flyger över huvudet och under sommaren på helgerna är det ofta några ganska spännande som flyger runt. Även om du bara tenderar att höra dem när de går förbi. Sedan är den andra anledningen att det verkar som att flygvägen för utgående flygplan från London City flygplats ibland kommer att bli hörd och de har några ganska bullriga flyg. Eftersom jag försöker spela in några videor för YouTube är det verkligen irriterande att behöva skrota en inspelning på grund av ett bullrigt plan. Så jag undrade om data som du ser på webbplatser som flightradar24 är allmänt tillgänglig, när jag upptäckte att något liknande var tillgängligt från opensky -nätverket föddes varningslampan. Det tog inte alltför lång tid att sedan komma på idén att använda en kopia av ett banljus för att hysa projektet.

Du kan läsa mer om OpenSky-nätverket på https://www.opensky-network.org Jag ville också att den här gången skulle göra ett fint hartsobjektiv istället för att använda genomskinlig PLA och även om jag har en ADS-B-mottagare som jag ville behålla så enkelt och billigt. ADS-B behöver också en antenn och detta skulle inte göra för en lampa att gå på hyllan på kontoret. Så förhoppningsvis hittar du byggnaden intressant eftersom den täcker 3D -utskrift, hartsformning och matematik för att extrapolera positionerna för flygplan som eventuellt kan passera över huvudet.

Steg 1: Designa fodralet

Googles sökning kommer med många olika mönster av banan lampa och designen av denna gjordes med hjälp av design influenser från många olika märken av riktiga lampor. Det är också skalat att sitta i ett rum eller på en hylla snarare än full storlek, eftersom de tenderar att vara mycket större i verkliga livet.

Mönster ritades i Fusion 360 och jag importerade några tidigare element som hallon pi zero -hållaren från tidigare projekt. Att kunna återanvända element tar mycket av huvudvärken för att få ner grunderna. Du kan också ladda ner filerna här

Steg 2: Gjutning av linserna - #fail

Gjutning av linserna - #fail
Gjutning av linserna - #fail
Gjutning av linserna - #fail
Gjutning av linserna - #fail
Gjutning av linserna - #fail
Gjutning av linserna - #fail

Det viktigaste designelementet i denna lampa skulle vara linsen. Så jag tacklade det här först som utan ett snyggt autentiskt glas som projektet skulle fungera. Jag dokumenterar här de misslyckanden jag hade när jag försökte uppnå det, utan att stå emot att jag också först bestämde mig för att göra objektivet gult. Banbelysning kommer både gult och blått och det var först efter att jag hade börjat göra det gula som jag ändrade mig och bestämde att jag ville ha en blå.

Av vad jag kan ta reda på används de gula på hålllinjen och de blåa används för att linja banan, och det är de som verkar vara de mer arketypiska som finns om du söker efter banljus. Men här är mitt första försök att göra en gul lins. För att göra linsen tänkte jag använda klargjord harts med en färgadditiv, och även om jag har gjort några formar innan undrade jag om det skulle vara möjligt att skriva ut en 3D -form och använda den. Så jag började med att göra en delad form i 3D och skriva ut den i PetG. Sköna mängder mögelfrisättning var jag övertygad om att skulle räcka för att spruta formen. Som det visar sig med några försök gjorde jag att hartset fastnade i formen som lim och det verkade bara inte vara möjligt att skilja dem åt. Även om jag hade den fullskaliga som jag tänkte använda, bestämde jag mig för det och skrev ut linsen för att använda med traditionell silikonformning.

Steg 3: Olika typer av harts

Olika typer av harts
Olika typer av harts
Olika typer av harts
Olika typer av harts
Olika typer av harts
Olika typer av harts
Olika typer av harts
Olika typer av harts

Som en snabb sida använde jag tre typer av klara/färgade hartser för detta projekt.

Den första var en Hobby -marknadstyp som heter Pebeo - Gedeo och säljs normalt för inkapsling av små föremål och används för smycken och skrivbordspapper etc. Detta fungerade ganska bra och botade fint på cirka 24-36 timmar. Det är dock ganska dyrt för det belopp du får, men är praktiskt och lätt tillgängligt i hobby- och hantverksbutiker. Det blandas i ett förhållande 2: 1. Den andra var ett förfärgat harts som blandas i 10: 1-förhållande med härdaren och detta tog längst tid att härda, ungefär en vecka för att vara ärlig innan det hade härdat helt. Den sista var ett klart harts, som också blandades i 2: 1 -förhållandet och detta härdades på cirka 2 dagar, du kan färga detta med droppar pigment, men du måste se till att du alltid använder samma färgförhållande om du gör separata omgångar. Det fungerar också som det mest kostnadseffektiva. Slutligen var RTV för formen en GP-3481 RTV och det tar ungefär 24 timmar att ställa in och har ganska lång gryttid så att du har gott om tid att blanda den och sedan hälla den.

För närvarande har jag ingen vakuumkruka (för närvarande på beställning) så att du kan besväras av bubblor i både formen och hartshällningen. Inte för mycket ett problem för detta, men med en klar lins eller liknande då skulle du vilja tänka på något sätt för att få ut bubblorna ur blandningarna.

Steg 4: Gjutning av linsen i silikonform #2

Image
Image
Gjutning av linsen i silikonform #2
Gjutning av linsen i silikonform #2
Gjutning av linsen i silikonform #2
Gjutning av linsen i silikonform #2

Så detta är det andra försöket att göra ett hartsobjektiv och det första steget var att göra både ett objektiv i Fusion 360 och sedan skriva ut det i ABS samt en hink för att hålla det. Detta skulle vara det första för formen och hjälper till att hålla nere mängden silikon som ska användas. Du kan enkelt göra detta av kort, men det är bara ett annat tillvägagångssätt. För att ge den en bättre chans att släppas ur formen lackade jag först den och gav den sedan en bra täckning av vaxsläppmedel.

Jag hällde sedan lite GP-3481 som handlar om strand 27 RTV och lät den sedan ställa in sig under de närmaste 24 timmarna innan de formades. När detta var gjort använde jag det klara hartset blandat i 2: 1 -förhållande med cirka 4/5 droppar av färgpigmentet och blandade det väl i bra fyra minuter. Hällde detta i formen och placerade sedan ett skottglas i hartset också för att ge ett tomrum senare för antingen en lampa eller lysdioderna. Efter cirka 24 timmar var detta harts klart att ta bort och linsen kom ut ganska bra. Det finns luftbubblor närvarande, men ännu har jag inget vakuumkärl för att avgasa hartset innan det hälls.

Steg 5: 3D -utskrift och förberedelse

3D -utskrift och förberedelse
3D -utskrift och förberedelse
3D -utskrift och förberedelse
3D -utskrift och förberedelse
3D -utskrift och förberedelse
3D -utskrift och förberedelse

Modellen är utformad på ett sätt som den centrala sektionen ansluts till basen. Detta var för att undvika maskering under målningsprocessen. Hela modellen trycktes i Hatchbox ABS och slipades sedan. Börjar med 60 korn upp till ca 800 korn gav en tillräckligt bra ytfinish för denna modell.

Steg 6: Montering och målning

Montering och målning
Montering och målning
Montering och målning
Montering och målning
Montering och målning
Montering och målning

När utskrifterna har slipats målades det sedan med en högprimer. Lättslipad och sedan sprayad i grå primer. Huvuddelarna målades i ford signal gult, och sedan brooklands grönt som används för basen. höjdpunkter av tamiya silver applicerades sedan på bultarna och lite molotow silver krom användes på linshållaren.

Steg 7: Hitta först plan inom ett gränsområde

Med hårdvaran sorterad behövde man arbeta med programvaran. Det finns ett par sajter nu som tillhandahåller flygspårning, men inte många som tillhandahåller ett API för att komma åt data. Vissa som gör det, gör det bara på kommersiell basis men lyckligtvis finns det en webbplats som heter https://opensky-network.org som du kan använda gratis.

För att komma åt dessa data måste du registrera dig och sedan kan du använda deras API, det ger flera funktioner och sätt att dra data. Vi är intresserade av alla flygningar inom ett område och de har ett Live API -samtal för det. https://opensky-network.org/apidoc/ kallad begränsningsruta. API -samtalet kräver de hörn av rutan som du är intresserad av, naturligtvis vår Lat/Lon som mittpunkt. Du kan kontrollera matematik fungerar den här webbplatsen, som ritar en ruta beroende på vad du skriver in. Http://tools.geofabrik.de men för närvarande ger följande skript de punkter vi behöver för att ansluta till API: et.

funktion 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 ($ longitud_in_degrees); $ radie = 6371; $ parallel_radius = $ radie*cos ($ lat); $ lat_min = $ lat - $ half_side_in_km/$ radie; $ lat_max = $ lat + $ half_side_in_km/$ radie; $ 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); returmatris ($ box_lat_min, $ box_lon_min, $ box_lat_max, $ box_lon_max);

Om du vill testa din kod finns det en webbplats där du kan ange lat/lon och se resultaten på en karta: Se ett exempel på en begränsningsruta på en karta

Steg 8: Beräkning av planen för planerna i förhållande till oss

Beräkning av planen för planen i förhållande till oss
Beräkning av planen för planen i förhållande till oss

Resultaten från gränsrutan API -anrop ger oss en lista över plan, deras Lon/lat, hastighet, höjd och kurs. Så nästa sak som vi behöver göra är att få kursen för varje plan i förhållande till oss så att vi kan bearbeta dem som åtminstone är på väg i vår allmänna riktning. Vi kan göra detta som vi känner till vår position och kan räkna ut vinkeln från oss till varje plan.

För att göra det använder jag en kodbit som ursprungligen fanns i Javascript så jag konverterade den här till PHP, * beräkna (initial) bäring mellan två punkter * * från: Ed Williams 'Aviation Formulary, https://williams.best.vwh.net/avform.htm#Crs * source = instantglobe.com/CRANES/GeoCoordTool.html */ funktion 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; returnera $ zz;

Om du vill titta på sidan där de ursprungliga javascript -versionerna finns är detta länken:

inom den koden kan du också se de olika delrutinerna för varje beräkningstyp.

Steg 9: Beräkna en avlyssning genom att titta på en cirkel

Beräkna en avlyssning genom att titta på en cirkel
Beräkna en avlyssning genom att titta på en cirkel

Så vi har nu ett plan där bäringen mellan det och vår plats är mindre än 90 (antingen positivt eller negativt) och det betyder att det finns en chans att det kan flyga nära. Med hjälp av haversine -formeln kan vi också räkna ut med planet Lon/Lat och Lon/Lat i vårt hus det avstånd som det är från oss.

Om vi tittar på diagrammet, om vi ritar en cirkel runt vårt hus med en radie på cirka 3 miles ger detta oss en chans att se något flyga över. Vi vet skillnaden i kursen mellan planet och oss, vi vet också planetens avstånd från oss så att vi sedan kan räkna ut triangeln med hjälp av den gamla goda SOHCAHTOA, och i det här fallet kan vi använda Tan av vinkeln motsatt sidolängd. Så om vi jämför detta värde med radievärdet för cirkeln runt huset kan vi sedan ta reda på om planet kommer att flyga tillräckligt nära för att vi ska kunna se det. Nästa bit vi kan göra är att räkna ut tiden då planet kommer att flyga förbi med hjälp av lufthastigheten och avståndet och om detta är mindre än säga cirka 45 sekunder eller så tänder vi ljuset. Detta är lite av koden som jag använder för att räkna ut chansen att flyga över. Jag gör detta eftersom det finns en närliggande flygplats och när flygplanen taxisar runt pekar de oundvikligen på huset. Men eftersom deras höjd är noll och hastigheten går i takt bör detta inte utlösa larmet.

funktion 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)) {// ev. flyga förbi

}

retur $ flight_intercept;

}

Steg 10: Avstånd mellan två punkter på en karta - Haversine Formula

Avståndet mellan två punkter på en karta - Haversine Formula
Avståndet mellan två punkter på en karta - Haversine Formula

Så vi måste beräkna avståndet mellan planet och vår plats. På korta avstånd på en karta kan du ungefär beräkna avståndet, men eftersom jorden är sfärisk finns det en formel som kallas haversinformel som gör att du kan ta hänsyn till den böjda ytan. Du kan läsa vidare i formeln:

Nu med avståndet beräknat och vi känner till flygets hastighet kan vi räkna ut hur många sekunder det kommer att vara innan planet är över huvudet. Så lampan tänds om det är något inom 30 sekunder efter flypast och vi äntligen har vår varningslampa.

* baserade 0n JS på instantglobe.com/CRANES/GeoCoordTool.html och förvandlades till PHP */

funktion get_distHaversine ($ home_lat, $ home_lon, $ plane_lat, $ plane_lon) {$ R = 6371; // jordens medelradie i 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; retur $ d; }

Steg 11: Importera och definiera plandatabasen

En av de andra delarna är att openskysajten erbjuder en nedladdningsbar databas med flygplan tillsammans med deras anropssignaler och identer. Dess flera hundra tusen poster. Så vi kan ladda ner detta och ladda det lokalt i en MariaDB -databas för sökning (MySQL). Med varje plan som dyker upp ovanför hämtar vi detaljerna och uppdaterar en räknare för att visa hur många gånger det har setts.

Jag redigerar också för närvarande databasen för att markera plan som jag är intresserad av. Främst gamla warbirds och andra liknande intressanta plan. Ett par gånger i sommar har en Mig-15 flög över. så målet är att använda ett varningsfält som jag har lagt till och sedan blinka snabbt när något intressant är på väg över

Steg 12: Förbättra resultat och nya funktioner

Förbättra resultat och nya funktioner
Förbättra resultat och nya funktioner
Förbättra resultat och nya funktioner
Förbättra resultat och nya funktioner
Förbättra resultat och nya funktioner
Förbättra resultat och nya funktioner

Så i teorin fungerar allt ganska bra, men du hittar med data att det finns plan som flyger över som inte visas i API: et.

Detta beror på att inte alla plan använder ADS-B-transpondern och använder äldre transpondrar baserade på MLAT. För att få positionsdata om flygplan som använder MLAT krävs en rad mottagare på marken för att triangulera sin position och vissa platser som flightradar24 har ett större nätverk av bidragsgivare som gör detta jämfört med opensky. Förhoppningsvis kommer deras täckning med tiden att förbättras också och jag håller på att skapa en egen MLAT -mottagare för att lägga till dessa data.

Steg 13: Kodbas

Glöm inte att om du ska använda detta kanske du vill ta bort SQL -satserna om du inte har databasen över plan och även lägga till ditt eget Lon/Lat -värde och API -nyckel för åtkomst till flygdata.

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

definiera ("INTERVAL", (20 * 1)); funktion fexp () {$ lat = "din latitud"; $ lon = "din longitud"; $ sida = 15,75; $ box = get_bounding_box ($ lat, $ lon, $ side); $ latmin = $ box [0]; $ lonmin = $ box [1]; $ latmax = $ box [2]; $ lonmax = $ box [3]; $ flyurl = "https://opensky-network.org/api/states/all?lamin=$latmin&lomin=$lonmin&lamax=$latmax&lomax=$lonmax"; eko "Skanning av SKY"; $ start_time = microtime (true); $ json = file_get_contents ($ flyurl); $ data = json_decode ($ json, TRUE); $ inbound = FALSE; $ num_planes = count ($ data ['tillstånd']); if ($ num_planes> 0) {echo "och vi kan se $ num_planes plan / n"; för ($ x = 0; $ x 0) {$ plane_eta = $ distplane/$ air_speed_kmh; } annat {$ eta = 1; } if ((($ intercept) 0)) && ($ distplane0) {$ inbound = TRUE; eko "------------------------------------------------ -------------------- / n "; echo "$ icao24 - [$ country $ callign] vid [$ geo_altitude_m M - $ geo_altitude_f ft]"; eko "[hastighet $ air_speed_kmh kmh och", runda ($ distansplan, 1), "km bort] n"; echo "[på en rubrik", rund ($ plane_heading, 1), "] [homeangle $ heading_d]"; eko "[$ latitud, $ longitud] n"; echo "[flypast in", decimal_to_time ($ plane_eta), "now", round ($ intercept, 1), "km away / n"; eko "------------------------------------------------ -------------------- / n "; $ DBi = new mysqli ("127.0.0.1", "root", "ditt lösenord", "awacs"); $ sql = "välj * från flygplansdatabas där` icao24` = '$ icao24' "; mysqli_set_charset ($ DBi, "utf8"); $ getplanedata = mysqli_query ($ DBi, $ sql) eller 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 ['registrering']; eko "är a"; echo $ row_getplanedata ['tillverkarnamn']; eko ""; eko $ row_getplanedata ['modell']; eko "av"; echo $ row_getplanedata ['tillverkare']; eko "ägs av"; echo $ row_getplanedata ['ägare']; eko "sett"; echo $ row_getplanedata ['besök']; eko "tider"; echo "special rating ="; echo $ row_getplanedata ['special']; eko "\ n"; $ besök = $ row_getplanedata ['besök']+1; } medan ($ row_getplanedata = mysqli_fetch_assoc ($ getplanedata)); mysqli_free_result ($ getplanedata); $ sqli = "UPPDATERA flygdatabas SET besök = $ besök VAR icao24 = '$ icao24'"; mysqli_set_charset ($ DBi, "utf8"); $ updateplanedata = mysqli_query ($ DBi, $ sqli) eller die (mysqli_error ($ DBi)); } else {echo "Kunde inte hitta det här planet i DB så lägger till det"; $ sqli = "SÄTT IN I flygplanets databas (icao24, besök, special) VÄRDEN ('$ icao24', 1, 1)"; $ updateplanedata = mysqli_query ($ DBi, $ sqli) eller die (mysqli_error ($ DBi)); } echo "----------------------------------------------- --------------------- / n "; } annat {// echo "$ callign"; }}} annat {echo "och himlen är klar / n"; } if ($ inbound) {echo "Inkommande plan / n"; $ command = "grisar w 17 1"; execInBackground ($ kommando); } annat {echo "inga inkommande flygningar / n"; $ command = "grisar w 17 0"; execInBackground ($ kommando); }} funktion decimal_to_time ($ decimal) {$ offset = 0.002778; if ($ decimal> $ offset) {$ decimal = $ decimal - 0.002778; } $ timmar = gmdate ('H', golv ($ decimal * 3600)); $ minuter = gmdate ('i', golv ($ decimal * 3600)); $ sekunder = gmdate ('s', golv ($ decimal * 3600)); retur str_pad ($ timmar, 2, "0", STR_PAD_LEFT). ":". str_pad ($ minuter, 2, "0", STR_PAD_LEFT). ":". str_pad ($ sekunder, 2, "0", STR_PAD_LEFT); }/ * * beräkna (initial) bäring mellan två punkter * * från: 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; returnera $ zz; } funktion 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; retur $ flight_intercept; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *// * * Använd Haversine -formel för att beräkna avstånd (i km) mellan två punkter som anges av * latitud/longitud (i numeriska grader) * * från: Haversine -formel - RWSinnott, "Virtues of the Haversine", * Sky and Telescope, vol 68, nr 2, 1984 * https://williams.best.vwh.net/avform.htm#Crs * * exempelanvändning från form: * result.value = LatLon.distHaversine (lat1.value.parseDeg (), long1.value.parseDeg (), * lat2.value.parseDeg (), long2.value.parseDeg ()); * där lat1, long1, lat2, long2 och resultat är formulärfält * source = instantglobe.com/CRANES/GeoCoordTool.html */function get_distHaversine ($ home_lat, $ home_lon, $ plane_lat, $ plane_lon) {$ R = 6371; // jordens medelradie i 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; retur $ d; } funktion 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 ($ longitud_in_degrees); $ radie = 6371; # Parallellens radie vid given latitud; $ parallel_radius = $ radie*cos ($ lat); $ lat_min = $ lat - $ half_side_in_km/$ radie; $ lat_max = $ lat + $ half_side_in_km/$ radie; $ 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); returmatris ($ box_lat_min, $ box_lon_min, $ box_lat_max, $ box_lon_max); } funktion execInBackground ($ cmd) {if (substr (php_uname (), 0, 7) == "Windows") {pclose (popen ("start /B". $ cmd, "r")); } annat {exec ($ cmd. "> /dev /null &"); }} function checkForStopFlag () {// helt valfri retur (TRUE); } funktionsstart () {echo "starter / n"; $ command = "grisar w 17 1"; execInBackground ($ kommando); $ active = TRUE; medan ($ active) {usleep (1000); // valfritt, om du vill vara hänsynsfull om (microtime (true)> = $ nextTime) {fexp (); $ nextTime = mikrotid (true) + INTERVAL; } $ active = checkForStopFlag (); }} fexp (); Start(); ?>

Steg 14: Anslutning av lysdioden och avstängningsomkopplaren

Anslutning av lysdioden och avstängningsomkopplaren
Anslutning av lysdioden och avstängningsomkopplaren

Anslutning av detta projekt kan inte vara enklare egentligen. Det finns bara en LED som är ansluten till stift 17 och jordad med ett 270R -motstånd inline.

Jag inkluderar också en avstängnings- och strömknapp tillsammans med en ström -LED som kör bort TXd -datapinnen. Du kan läsa mer om avstängningsfunktionen och koden som krävs på https://github.com/Howchoo/pi-power-button.git från sajten https://howchoo.com/g/mwnlytk3zmm/how-to- add-a-pow … Du kan läsa om hur du lägger till en strömlampa här

Rekommenderad: