Inhoudsopgave:

Early Warning Raspberry PI Runway Light met behulp van Flight Mapping-gegevens - Ajarnpa
Early Warning Raspberry PI Runway Light met behulp van Flight Mapping-gegevens - Ajarnpa

Video: Early Warning Raspberry PI Runway Light met behulp van Flight Mapping-gegevens - Ajarnpa

Video: Early Warning Raspberry PI Runway Light met behulp van Flight Mapping-gegevens - Ajarnpa
Video: CAMPING on MOUNTAIN - Elevated TENT - RAIN 2024, Juli-
Anonim
Vroege waarschuwing Raspberry PI Runway Light met behulp van vluchtkaartgegevens
Vroege waarschuwing Raspberry PI Runway Light met behulp van vluchtkaartgegevens
Vroege waarschuwing Raspberry PI Runway Light met behulp van vluchtkaartgegevens
Vroege waarschuwing Raspberry PI Runway Light met behulp van vluchtkaartgegevens
Vroege waarschuwing Raspberry PI Runway Light met behulp van vluchtkaartgegevens
Vroege waarschuwing Raspberry PI Runway Light met behulp van vluchtkaartgegevens
Vroege waarschuwing Raspberry PI Runway Light met behulp van vluchtkaartgegevens
Vroege waarschuwing Raspberry PI Runway Light met behulp van vluchtkaartgegevens

Deze lamp is om verschillende redenen ontstaan, namelijk dat ik altijd geïnteresseerd ben in de vliegtuigen die overvliegen en in de zomer in de weekenden vliegen er vaak behoorlijk spannende rond. Al hoor je ze meestal pas als ze voorbij komen. Dan is de andere reden dat het lijkt alsof de vliegroute voor uitgaande vliegtuigen vanaf de luchthaven van London City soms wordt afgeluisterd en dat ze behoorlijk luidruchtige vluchten hebben. Omdat ik bezig ben met het opnemen van enkele video's voor YouTube, is het echt vervelend om een opname te moeten schrappen vanwege een lawaaierig vliegtuig. Dus ik vroeg me af of de gegevens die je ziet op sites zoals flightradar24 openbaar beschikbaar zijn, toen ik ontdekte dat iets soortgelijks beschikbaar was via opensky-netwerk, werd de vroege waarschuwingslamp geboren. Het duurde niet lang voordat het idee ontstond om een replica van een baanverlichting te gebruiken om het project te huisvesten.

U kunt meer te weten komen over The OpenSky Network op https://www.opensky-network.org Ik wilde deze keer ook een mooie harslens maken in plaats van doorschijnend PLA te gebruiken en hoewel ik een ADS-B-ontvanger heb, wilde ik deze behouden dit eenvoudig en goedkoop. De ADS-B heeft ook een antenne nodig en dit zou niet voldoende zijn voor een lamp op de plank op kantoor. Dus hopelijk vind je de build interessant omdat deze ook betrekking heeft op 3D-printen, harsvormen en wiskunde om de posities van vliegtuigen te extrapoleren die mogelijk over je hoofd vliegen.

Stap 1: De behuizing ontwerpen

Google-zoekopdracht komt met veel verschillende ontwerpen van runway-lampen en het ontwerp van deze is gemaakt met behulp van ontwerpinvloeden van veel verschillende merken echte lampen. Het is ook geschaald om in een kamer of op een plank te zitten in plaats van op ware grootte, omdat ze in het echte leven veel groter zijn.

Ontwerpen zijn gemaakt in Fusion 360 en ik heb enkele eerdere elementen geïmporteerd, zoals de raspberry pi zero-houder uit eerdere projecten. Het kunnen hergebruiken van elementen neemt een groot deel van de hoofdpijn weg om de basis onder de knie te krijgen. Je kunt de bestanden ook hier downloaden

Stap 2: De lenzen gieten - #fail

De lenzen gieten - #fail
De lenzen gieten - #fail
De lenzen gieten - #fail
De lenzen gieten - #fail
De lenzen gieten - #fail
De lenzen gieten - #fail

Het belangrijkste ontwerpelement van deze lamp zou de lens worden. Dus ik pakte dit eerst aan, want zonder een mooi authentiek ogend glas zou het project werken. Ik documenteer hier de mislukkingen die ik had om dat te bereiken, ondanks het feit dat ik in eerste instantie ook besloot om de lens oranje te maken. Baanverlichting is er in zowel oranje als blauw en pas nadat ik was begonnen met het maken van de oranje lamp, veranderde ik van gedachten en besloot ik een blauwe te willen.

Voor zover ik kan zien, worden de Amberkleurige gebruikt aan de wachtlijn en de blauwe worden gebruikt om de landingsbaan te omlijnen, en dit zijn degenen die de meer archetypische lijken te zijn die worden gevonden als je naar baanlichten zoekt. Hier is echter mijn eerste poging om een amberkleurige lens te maken. Om de lens te maken, zou ik clearcast hars met een kleuradditief gebruiken, en hoewel ik eerder een paar mallen had gemaakt, vroeg ik me af of het mogelijk zou zijn om een 3D-mal te printen en die te gebruiken. Dus begon ik met het maken van een gesplitste mal in 3D en deze uit te printen in PetG. Verstandige hoeveelheden loskomen van de schimmel Ik was ervan overtuigd dat dit voldoende zou zijn om de mal te scheiden. Het bleek dat ik met de paar pogingen de hars als lijm aan de mal had laten plakken en het leek gewoon niet mogelijk om ze te scheiden. Hoewel ik de volledige schaal had die ik ging gebruiken, besloot ik het niet te doen en printte ik de lens uit om te gebruiken met traditioneel siliconengieten.

Stap 3: Verschillende soorten hars

Verschillende soorten hars
Verschillende soorten hars
Verschillende soorten hars
Verschillende soorten hars
Verschillende soorten hars
Verschillende soorten hars
Verschillende soorten hars
Verschillende soorten hars

Even terzijde, ik heb voor dit project 3 soorten heldere/gekleurde harsen gebruikt.

De eerste was een soort hobbymarkt genaamd Pebeo - Gedeo en wordt normaal gesproken verkocht voor het inkapselen van kleine voorwerpen en gebruikt voor sieraden en presse-papiers enz. Dit werkte redelijk goed en genas mooi in ongeveer 24-36 uur. Het is echter vrij prijzig voor het bedrag dat je krijgt, maar is handig en gemakkelijk verkrijgbaar in hobby- en handwerkwinkels. Het is gemengd in een verhouding van 2:1. De tweede was een voorgekleurde hars die werd gemengd in een verhouding van 10:1 met de verharder en dit duurde het langst om uit te harden, ongeveer een week om eerlijk te zijn voordat het volledig was uitgehard. De laatste was een heldere hars, die ook in de 2:1 verhouding was gemengd en dit hardde in ongeveer 2 dagen uit, je kunt dit kleuren met druppels pigment, maar je moet ervoor zorgen dat je altijd dezelfde kleurverhouding gebruikt als je maken aparte batches. Het werkt ook het meest kosteneffectief. Ten slotte was de RTV voor de mal een GP-3481 RTV en dit duurt ongeveer 24 uur om op te zetten en heeft een behoorlijk lange pottijd, dus je hebt genoeg tijd om het te mengen en vervolgens te gieten.

Op dit moment heb ik geen vacuümpot (momenteel in bestelling) zodat je zowel in de mal als bij het gieten van hars kunt worden geplaagd door luchtbellen. Dit is niet zo'n probleem, maar met een heldere lens of iets dergelijks zou je willen nadenken over een manier om de bubbels uit de mixen te krijgen.

Stap 4: De lens gieten in siliconen mal # 2

Image
Image
De lens gieten in siliconen mal #2
De lens gieten in siliconen mal #2
De lens gieten in siliconen mal #2
De lens gieten in siliconen mal #2

Dit is dus de tweede poging om een Resin-lens te maken en de eerste fase was om zowel een lens in Fusion 360 te maken en deze vervolgens in ABS te printen, evenals een emmer om hem vast te houden. Dit zou de eerste zijn voor de mal en helpt de hoeveelheid siliconen die moet worden gebruikt, te beperken. Je kunt dit gemakkelijk van kaart maken, maar het is gewoon een andere benadering. Om het beter uit de mal te laten komen heb ik het eerst gevernist en daarna goed ingesmeerd met waslosmiddel.

Ik heb toen wat GP-3481 gegoten, ongeveer 27 RTV op de kust en liet het de volgende 24 uur staan voordat ik het uit de vorm haalde. Toen dit eenmaal was gedaan, gebruikte ik de heldere hars gemengd in een verhouding van 2: 1 met ongeveer 4/5 druppels van het kleurpigment en mengde het goed gedurende een goede vier minuten. Giet dit in de mal en plaatste toen ook een borrelglas in de hars om later een leegte te creëren voor een lamp of de LED's. Na ongeveer 24 uur was deze hars klaar om te verwijderen en kwam de lens redelijk goed uit. Er zijn luchtbellen aanwezig, maar ik heb nog geen vacuümvat om de hars voor het gieten te ontgassen.

Stap 5: 3D printen en voorbereiden

3D printen en voorbereiden
3D printen en voorbereiden
3D printen en voorbereiden
3D printen en voorbereiden
3D printen en voorbereiden
3D printen en voorbereiden

Het model is zo ontworpen dat het middendeel in de basis steekt. Dit was om maskering tijdens het schilderen te voorkomen. Het hele model is geprint in Hatchbox ABS en daarna geschuurd. Beginnend met korrel 60 tot ongeveer 800 grit gaf een voldoende oppervlakteafwerking voor dit model.

Stap 6: Montage en schilderen

Montage en schilderen
Montage en schilderen
Montage en schilderen
Montage en schilderen
Montage en schilderen
Montage en schilderen

Nadat de afdrukken zijn geschuurd, is deze vervolgens geverfd met een high-build primer. Licht geschuurd en daarna in grijze primer gespoten. De belangrijkste delen werden geschilderd in Ford signaalgeel, en vervolgens werden Brooklands groen gebruikt voor de basis. highlights van tamiya-zilver werden vervolgens op de bouten aangebracht en wat molotow-zilverchroom op de lenshouder.

Stap 7: Zoek eerst vliegtuigen binnen een grensgebied

Met de hardware gesorteerd, moest er aan de software worden gewerkt. Er zijn nu een aantal sites die vluchten volgen, maar niet veel die een API bieden om toegang te krijgen tot die gegevens. Sommigen die dat wel doen, doen dit alleen op commerciële basis, maar gelukkig is er een site genaamd https://opensky-network.org die u gratis kunt gebruiken.

Om toegang te krijgen tot deze gegevens, moet u zich registreren en vervolgens kunt u hun API gebruiken, deze biedt verschillende functies en manieren om de gegevens op te halen. Wij zijn geïnteresseerd in alle vluchten binnen een gebied en daarvoor hebben ze een Live API call. https://opensky-network.org/apidoc/ genaamd begrenzingsvak. De API-aanroep vereist de hoeken van de doos waarin u geïnteresseerd bent met natuurlijk onze Lat/Lon als middelpunt. U kunt controleren of de wiskunde werkt op deze site, die een kader tekent afhankelijk van wat u typt. https://tools.geofabrik.de maar voor nu geeft het volgende script de punten die we nodig hebben om in de API in te pluggen.

functie 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_graden); $lon = deg2rad($longitude_in_degrees); $ straal = 6371; $parallel_radius = $radius*cos($lat); $lat_min = $lat - $half_side_in_km/$straal; $lat_max = $lat + $half_side_in_km/$straal; $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); return array ($box_lat_min, $box_lon_min, $box_lat_max, $box_lon_max);

Als u uw code wilt testen, is er een site waar u de lat/lon kunt invoeren en de resultaten op een kaart kunt zien: Zie een voorbeeld van een begrenzingsvak op een kaart

Stap 8: Bereken de koers van de vliegtuigen in relatie tot ons

De koers van de vliegtuigen berekenen in relatie tot ons
De koers van de vliegtuigen berekenen in relatie tot ons

De resultaten van de API-aanroep van het begrenzende vak geven ons een lijst met vliegtuigen, hun lengte/breedte, snelheid, hoogte en koers. Dus het volgende dat we moeten doen, is de koers van elk vlak ten opzichte van ons verkrijgen, zodat we die, die op zijn minst in onze algemene richting gaan, verder kunnen verwerken. We kunnen dit doen omdat we onze positie kennen en de hoek van ons naar elk vlak kunnen bepalen.

Om dat te doen gebruik ik een stukje code dat oorspronkelijk in Javascript stond, dus ik heb het hier omgezet naar PHP, * bereken (initiële) peiling tussen twee punten * * uit: Ed Williams' Aviation Formulary, https://williams.best.vwh.net/avform.htm#Crs * source = instantglobe.com/CRANES/GeoCoordTool.html */ functie 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; retourneer $zz;

Als je de pagina wilt bekijken waar de originele javascript-versies staan, is dit de link:

binnen die code kun je ook de verschillende subroutines zien die voor elk type berekening zijn.

Stap 9: Een intercept berekenen door naar een cirkel te kijken

Een intercept berekenen door naar een cirkel te kijken
Een intercept berekenen door naar een cirkel te kijken

Dus we hebben nu een vliegtuig waarvan de peiling tussen het en onze locatie minder dan 90 is (positief of negatief) en dus is er een kans dat het dichtbij vliegt. Met behulp van de haversine-formule kunnen we ook berekenen met behulp van de Lon/Lat van het vliegtuig en de Lon/Lat van ons huis de afstand die het van ons af is.

Kijkend naar het diagram, als we een cirkel rond ons huis tekenen met een straal van ongeveer 3 mijl, geeft dit ons een kans om iets over te zien vliegen. We kennen het verschil in koers tussen het vliegtuig en ons, we kennen ook de afstand van het vliegtuig van ons, dus we kunnen dan de driehoek uitwerken met behulp van de goede oude SOHCAHTOA, en in dit geval met behulp van de Tan van de hoek die we kunnen krijgen lengte tegenoverliggende zijde. Dus als we deze waarde vergelijken met de straalwaarde van de cirkel rond het huis, kunnen we erachter komen of het vliegtuig dichtbij genoeg zal vliegen zodat we het kunnen zien. Het volgende wat we kunnen doen is de tijd berekenen dat het vliegtuig voorbij zal vliegen met behulp van de luchtsnelheid en de afstand en als dit minder is dan pakweg 45 seconden of zo, doen we het licht aan. Dit is een stukje van de code die ik gebruik om de kans op een fly-over te berekenen. Ik doe dit omdat er een nabijgelegen vliegveld is en wanneer de vliegtuigen rond taxiën, wijzen ze onvermijdelijk naar het huis. Aangezien hun hoogte echter nul is en de snelheid stapvoets is, zou dit het alarm niet moeten activeren.

functie 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)){ // mogelijk voorbij vliegen

}

retourneer $flight_intercept;

}

Stap 10: Afstand tussen twee punten op een kaart - Haversine-formule

Afstand tussen twee punten op een kaart - Haversine-formule
Afstand tussen twee punten op een kaart - Haversine-formule

We moeten dus de afstand tussen het vliegtuig en onze locatie berekenen. Op korte afstanden op een kaart zou je de afstand ongeveer kunnen berekenen, maar aangezien de aarde bolvormig is, is er een formule genaamd de haversine-formule waarmee je rekening kunt houden met het gebogen oppervlak. U kunt verder lezen in de formule:

Nu de afstand is berekend en we de vliegsnelheid van het vliegtuig kennen, kunnen we berekenen hoeveel seconden het duurt voordat het vliegtuig boven ons is. Dus het licht gaat aan als er iets is binnen 30 seconden van flypast en we hebben eindelijk ons waarschuwingslampje.

* gebaseerd 0n JS op instantglobe.com/CRANES/GeoCoordTool.html en omgezet in PHP */

functie get_distHaversine ($home_lat, $home_lon, $plane_lat, $plane_lon) { $R = 6371; // gemiddelde straal van de aarde in 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; retourneer $d; }

Stap 11: De vliegtuigdatabase importeren en definiëren

Een van de andere stukken is dat de opensky-site een downloadbare database van vliegtuigen biedt, samen met hun roepnamen en idents. Het zijn enkele honderdduizenden inzendingen. We kunnen dit dus downloaden en lokaal in een MariaDB-database laden om op te zoeken (MySQL). Bij elk vliegtuig dat boven ons verschijnt, halen we de details op en werken we een teller bij om te laten zien hoe vaak het is gezien.

Ik ben momenteel ook bezig met het bewerken van de database om vliegtuigen te markeren waarin ik geïnteresseerd ben. Voornamelijk oude oorlogsvogels en andere soortgelijke interessante vliegtuigen. Deze zomer is er al een paar keer een Mig-15 overgevlogen. dus het doel is om een waarschuwingsveld te gebruiken dat ik heb toegevoegd en dan snel het licht te laten flitsen wanneer er iets interessants aankomt

Stap 12: Resultaten en nieuwe functies verbeteren

Resultaten en nieuwe functies verbeteren
Resultaten en nieuwe functies verbeteren
Resultaten en nieuwe functies verbeteren
Resultaten en nieuwe functies verbeteren
Resultaten en nieuwe functies verbeteren
Resultaten en nieuwe functies verbeteren

Dus in theorie werkt alles redelijk goed, maar je zult met de gegevens ontdekken dat er vliegtuigen zijn die overvliegen die niet in de API voorkomen.

Dit komt omdat niet alle vliegtuigen de ADS-B-transponder gebruiken en oudere transponders gebruiken op basis van MLAT. Om positiegegevens over vliegtuigen te verkrijgen met behulp van MLAT, is een reeks ontvangers op de grond nodig om hun positie te trianguleren en sommige sites zoals flightradar24 hebben een groter netwerk van bijdragers die dit doen in vergelijking met opensky. Hopelijk zal hun dekking na verloop van tijd ook verbeteren en ben ik mijn eigen MLAT-ontvanger aan het opzetten om aan deze gegevens toe te voegen.

Stap 13: Codebase

Vergeet niet dat als je dit gaat gebruiken, je misschien de SQL-statements wilt verwijderen als je de database met vliegtuigen niet hebt en ook je eigen Lon/Lat-waarde en API-sleutel wilt toevoegen voor toegang tot de vluchtgegevens.

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

definiëren("INTERVAL", (20 * 1)); function fexp() { $lat = "uw breedtegraad"; $lon = "uw lengtegraad"; $zijde = 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"; echo "De HEMEL scannen"; $start_time = microtime(true); $json = file_get_contents($flyurl); $data = json_decode($json, TRUE); $inkomend = ONWAAR; $num_planes = count($data['states']); if ($num_planes >0) { echo " en we kunnen $num_planes planes\n " zien; voor ($x =0; $x 0) { $plane_eta = $distplane/$air_speed_kmh; }anders { $eta = 1; } if ((($intercept)0)) && ($distplane0){ $inbound = TRUE; echo "------------------------------------------------ --------------------\N"; echo "$icao24 - [$country $callsign] op [$geo_altitude_m M -- $geo_altitude_f ft] "; echo "[speed $air_speed_kmh kmh and ", round($distplane, 1), "km away]\n"; echo "[op een kop van ", round($plane_heading, 1), "] [homeangle $heading_d] "; echo "[$breedtegraad, $lengtegraad]\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", "uw wachtwoord", "awacs"); $sql = "selecteer * uit de vliegtuigdatabase waar `icao24`='$icao24'"; mysqli_set_charset($DBi, "utf8"); $getplanedata = mysqli_query($DBi, $sql) of die(mysqli_error($DBi)); $row_getplanedata = mysqli_fetch_assoc($getplanedata); $rows_getplanedata = mysqli_num_rows($getplanedata); if($rows_getplanedata>0) { doe { echo "callsign="; echo $row_getplanedata['registratie']; echo " is een "; echo $row_getplanedata['fabrikantnaam']; echo " "; echo $row_getplanedata['model']; echo " door "; echo $row_getplanedata['manufacturericao']; echo " eigendom van "; echo $row_getplanedata['eigenaar']; echo "gezien"; echo $row_getplanedata['bezoeken']; echo "tijden"; echo " speciale beoordeling = "; echo $row_getplanedata['speciaal']; echo "\n"; $bezoeken = $row_getplanedata['bezoeken']+1; } while ($row_getplanedata = mysqli_fetch_assoc($getplanedata)); mysqli_free_result($getplanedata); $sqli = "UPDATE vliegtuigendatabase SET bezoeken = $bezoeken WHERE icao24 = '$icao24'"; mysqli_set_charset($DBi, "utf8"); $updateplanedata = mysqli_query($DBi, $sqli) of die(mysqli_error($DBi)); } else { echo "Kon dit vlak niet vinden in de database, dus voeg het toe"; $sqli = "INSERT INTO vliegtuigendatabase (icao24, bezoeken, speciaal) VALUES ('$icao24', 1, 1)"; $updateplanedata = mysqli_query($DBi, $sqli) of die(mysqli_error($DBi)); } echo "----------------------------------------------- ---------------------\N"; } else { // echo "$ roepnaam"; } } } else { echo " en de lucht is helder\n "; } if ($inkomend) { echo "Inkomend vliegtuig\n"; $command = "varkens w 17 1"; execInBackground ($ opdracht); } else { echo "geen inkomende vluchten\n"; $command = "varkens w 17 0"; execInBackground ($ opdracht); } } functie decimal_to_time($decimaal) { $offset = 0.002778; if ($decimaal>$offset) { $decimaal = $decimaal - 0,002778; } $hours = gmdate('H', floor($decimaal * 3600)); $minutes = gmdate('i', floor($decimaal * 3600)); $seconds = gmdate('s', floor($decimaal * 3600)); return str_pad($hours, 2, "0", STR_PAD_LEFT). ":". str_pad($minuten, 2, "0", STR_PAD_LEFT). ":". str_pad ($ seconden, 2, "0", STR_PAD_LEFT); } /* * bereken (initiële) peiling tussen twee punten * * van: 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; retourneer $zz; } functie 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; retourneer $flight_intercept; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* * Gebruik de Haversine-formule om de afstand (in km) te berekenen tussen twee punten gespecificeerd door * breedte-/lengtegraad (in numerieke graden) * * from: Haversine-formule - RWSinnott, "Deugden van de Haversine", * Sky and Telescope, vol 68, nr 2, 1984 * https://williams.best.vwh.net/avform.htm#Crs * * voorbeeldgebruik van formulier: * result.value = LatLon.distHaversine(lat1.value.parseDeg(), long1.value.parseDeg(), * lat2.value.parseDeg(), long2.value.parseDeg()); * waarbij lat1, long1, lat2, long2 en resultaat formuliervelden zijn * source = instantglobe.com/CRANES/GeoCoordTool.html */ function get_distHaversine ($home_lat, $home_lon, $plane_lat, $plane_lon) { $R = 6371; // gemiddelde straal van de aarde in 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; retourneer $d; } function 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_graden); $lon = deg2rad($longitude_in_degrees); $ straal = 6371; # Straal van de parallel op bepaalde breedtegraad; $parallel_radius = $radius*cos($lat); $lat_min = $lat - $half_side_in_km/$straal; $lat_max = $lat + $half_side_in_km/$straal; $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); 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() { // volledig optioneel return(TRUE); } function start() { echo "start\n"; $command = "varkens w 17 1"; execInBackground ($ opdracht); $actief = WAAR; while($actief) { usleep(1000); // optioneel, als je attent wilt zijn if (microtime(true) >= $nextTime) {fexp(); $nextTime = microtime(true) + INTERVAL; } $active = checkForStopFlag(); } } fexp(); begin(); ?>

Stap 14: Bedrading van de LED en de uitschakelschakelaar

Bedrading van de LED en de uitschakelschakelaar
Bedrading van de LED en de uitschakelschakelaar

De bedrading van dit project kan eigenlijk niet eenvoudiger. Er is slechts één LED die is aangesloten op pin 17 en is geaard met een 270R-weerstand inline.

Ik heb ook een uitschakel- en opstartknop samen met een aan / uit-LED die van de TXd-gegevenspin loopt. U kunt meer lezen over de afsluitfunctie en de vereiste code op https://github.com/Howchoo/pi-power-button.git van de site https://howchoo.com/g/mwnlytk3zmm/how-to- add-a-pow… U kunt hier lezen over het toevoegen van een aan/uit-lampje

Aanbevolen: