İçindekiler:

Uçuş Haritalama Verilerini Kullanarak Erken Uyarı Raspberry PI Pist Işığı: 14 Adım (Resimlerle)
Uçuş Haritalama Verilerini Kullanarak Erken Uyarı Raspberry PI Pist Işığı: 14 Adım (Resimlerle)

Video: Uçuş Haritalama Verilerini Kullanarak Erken Uyarı Raspberry PI Pist Işığı: 14 Adım (Resimlerle)

Video: Uçuş Haritalama Verilerini Kullanarak Erken Uyarı Raspberry PI Pist Işığı: 14 Adım (Resimlerle)
Video: Patron görmesin :) 2024, Temmuz
Anonim
Uçuş Haritalama Verilerini Kullanan Erken Uyarı Raspberry PI Pist Işığı
Uçuş Haritalama Verilerini Kullanan Erken Uyarı Raspberry PI Pist Işığı
Uçuş Haritalama Verilerini Kullanan Erken Uyarı Raspberry PI Pist Işığı
Uçuş Haritalama Verilerini Kullanan Erken Uyarı Raspberry PI Pist Işığı
Uçuş Haritalama Verilerini Kullanan Erken Uyarı Raspberry PI Pist Işığı
Uçuş Haritalama Verilerini Kullanan Erken Uyarı Raspberry PI Pist Işığı
Uçuş Haritalama Verilerini Kullanan Erken Uyarı Raspberry PI Pist Işığı
Uçuş Haritalama Verilerini Kullanan Erken Uyarı Raspberry PI Pist Işığı

Bu lamba birkaç nedenden dolayı ortaya çıktı, çünkü her zaman tepeden uçan uçaklarla ilgileniyorum ve yaz aylarında hafta sonları genellikle etrafta uçan oldukça heyecan verici uçaklar var. Her ne kadar onları yalnızca geçtiklerinde duyma eğiliminde olsanız da. Diğer bir neden de, London City havaalanından giden uçakların uçuş yolunun bazen kulak misafiri olması ve oldukça gürültülü uçuşları olması. YouTube için bazı videolar kaydederken, gürültülü bir uçak nedeniyle bir kaydı silmek zorunda kalmak gerçekten can sıkıcı. Bu yüzden, Flightradar24 gibi sitelerde gördüğünüz verilerin herkese açık olup olmadığını merak ettim, opensky ağından benzer bir şeyin mevcut olduğunu keşfettiğimde, erken uyarı lambası doğdu. Projeyi barındırmak için bir pist ışığının bir kopyasını kullanma fikrinin ortaya çıkması çok uzun sürmedi.

OpenSky Ağı hakkında daha fazla bilgiyi https://www.opensky-network.org adresinde bulabilirsiniz. Ayrıca bu sefer yarı saydam PLA kullanmak yerine güzel bir reçine lensi yapmak istedim ve bir ADS-B alıcım olmasına rağmen saklamak istedim. bu basit ve ucuz. ADS-B'nin de bir antene ihtiyacı var ve bu, bir lambanın ofisteki rafta durması için yeterli değil. Bu nedenle, 3D baskıyı, Reçine kalıplamayı ve matematiği kapsadığı için, potansiyel olarak tepeden geçebilecek uçakların konumlarını tahmin etmek için yapıyı ilginç bulacağınızı umuyoruz.

Adım 1: Kasayı Tasarlamak

Google araması, birçok farklı pist lambası tasarımıyla karşımıza çıkıyor ve bunun tasarımı, birçok farklı gerçek lamba markasının tasarım etkileri kullanılarak yapıldı. Ayrıca, gerçek hayatta çok daha büyük olma eğiliminde olduklarından, tam boy yerine bir odaya veya bir rafa oturacak şekilde ölçeklendirilmiştir.

Tasarımlar Fusion 360'ta yapıldı ve ahududu pi sıfır tutucu gibi bazı eski öğeleri önceki projelerden ithal ettim. Öğeleri yeniden kullanabilmek, temel bilgileri almanın baş ağrısının çoğunu alır. Dosyaları buradan da indirebilirsiniz

2. Adım: Lensleri Dökme - #fail

Lensleri Döküm - #fail
Lensleri Döküm - #fail
Lensleri Döküm - #fail
Lensleri Döküm - #fail
Lensleri Döküm - #fail
Lensleri Döküm - #fail

Bu lambanın en önemli tasarım öğesi lens olacaktı. Bu yüzden ilk önce güzel, otantik görünümlü bir cam olmadan proje işe yarayacakmış gibi ele aldım. Burada, lensi kehribar yapmaya karar vermiş olmama rağmen, bunu başarmaya çalışırken yaşadığım başarısızlıkları belgeliyorum. Pist ışıkları hem kehribar hem de mavi renkte gelir ve ancak kehribar rengi yapmaya başladıktan sonra fikrimi değiştirdim ve mavi bir tane istediğime karar verdim.

Anladığım kadarıyla, Amber olanlar bekleme hattında, mavi olanlar ise pisti hizalamak için kullanılıyor ve bunlar, pist ışıklarını araştırırsanız bulunan daha arketipsel olanlar gibi görünüyor. Ancak, işte ilk amber lens yapma denemem. Lensi yapmak için, renk katkılı şeffaf döküm reçine kullanacaktım ve daha önce birkaç kalıp yapmama rağmen 3D kalıp basıp bunu kullanmanın mümkün olup olmayacağını merak ettim. Bu yüzden 3D'de bölünmüş bir kalıp yapmaya ve PetG'de yazdırmaya başladım. Makul miktarda kalıp bırakma, kalıbı parçalamak için yeterli olacağına ikna oldum. Birkaç denemede reçineyi tutkal gibi kalıba yapıştırdım ve ayırmak pek mümkün görünmüyordu. Kullanacağım tam ölçekli olmasına rağmen, buna karşı karar verdim ve geleneksel silikon kalıplama ile kullanmak için merceğin çıktısını aldım.

Adım 3: Farklı Reçine Türleri

Farklı Reçine Türleri
Farklı Reçine Türleri
Farklı Reçine Türleri
Farklı Reçine Türleri
Farklı Reçine Türleri
Farklı Reçine Türleri
Farklı Reçine Türleri
Farklı Reçine Türleri

Kısaca bu proje için 3 çeşit şeffaf/renkli reçine kullandım.

İlki, Pebeo - Gedeo adlı bir Hobi pazarıydı ve normalde küçük eşyaları kapsüllemek için satılıyor ve mücevher ve masa kağıt ağırlıkları vb. için kullanılıyordu. Bu oldukça iyi çalıştı ve yaklaşık 24-36 saat içinde güzelce kürlendi. Bununla birlikte, aldığınız miktar için oldukça pahalıdır, ancak kullanışlıdır ve hobi ve el sanatları dükkanlarında kolayca bulunur. 2: 1 oranında karıştırılır. İkincisi, sertleştirici ile 10:1 oranında karıştırılan önceden renklendirilmiş bir reçineydi ve bu, tam olarak sertleşmeden önce dürüst olmak gerekirse yaklaşık bir hafta boyunca sertleşmesi en uzun sürdü. Sonuncusu da 2:1 oranında karıştırılan ve yaklaşık 2 gün içinde kürlenen şeffaf bir reçineydi, bunu pigment damlalarıyla renklendirebilirsiniz, ancak her zaman aynı renk oranını kullandığınızdan emin olmanız gerekir. ayrı partiler yapıyor. Aynı zamanda en uygun maliyetli olanı da sağlar. Son olarak, kalıbın RTV'si bir GP-3481 RTV idi ve bunun ayarlanması yaklaşık 24 saat sürüyor ve oldukça uzun bir kap süresine sahip, bu nedenle karıştırıp dökmek için bolca zamanınız var.

Şu anda bir vakum kabım yok (şu anda sipariş üzerine) böylece hem kalıpta hem de reçine dökümünde kabarcıklar yaşayabilirsiniz. Bunun için çok fazla bir sorun değil, ancak şeffaf bir lens veya benzeri ile, o zaman karışımlardan baloncukları çıkarmak için bir şekilde düşünmek istersiniz.

Adım 4: Lensi Silikon Kalıp #2'ye Dökme

Image
Image
Lensi Silikon Kalıp #2'ye Döküm
Lensi Silikon Kalıp #2'ye Döküm
Lensi Silikon Kalıp #2'ye Döküm
Lensi Silikon Kalıp #2'ye Döküm

Bu, Reçine lens yapımındaki ikinci girişim ve ilk aşama, hem Fusion 360'ta bir lens yapmak hem de ABS'ye basmak ve onu tutmak için bir kova yapmaktı. Bu kalıp için eskidir ve kullanılacak silikon miktarını azaltmaya yardımcı olur. Bunu kolayca karttan yapabilirsiniz, ancak bu sadece farklı bir yaklaşım. Kalıptan çıkması için daha iyi bir şans vermek için önce cilaladım ve sonra iyi bir mum ayırma maddesi kapladım.

Daha sonra kıyı 27 RTV ile ilgili olan bir miktar GP-3481 döktüm ve ardından kalıptan çıkarmadan önce 24 saat boyunca beklemesine izin verdim. Bu yapıldıktan sonra, 2:1 oranında yaklaşık 4/5 damla renk pigmenti ile karıştırılmış berrak reçineyi kullandım ve dört dakika boyunca iyice karıştırdım. Bunu kalıba dökün ve daha sonra bir lamba veya LED'ler için bir boşluk sağlamak için reçineye bir shot bardağı da yerleştirin. Yaklaşık 24 saat sonra bu reçine çıkarılmaya hazırdı ve lens oldukça iyi çıktı. Hava kabarcıkları var, ancak henüz dökmeden önce reçinenin gazını gidermek için bir vakum kabım yok.

Adım 5: 3D Baskı ve Hazırlık

3D Baskı ve Hazırlık
3D Baskı ve Hazırlık
3D Baskı ve Hazırlık
3D Baskı ve Hazırlık
3D Baskı ve Hazırlık
3D Baskı ve Hazırlık

Model, orta kısım tabana takılacak şekilde tasarlanmıştır. Bu, boyama işlemi sırasında maskelemeyi önlemek içindi. Modelin tamamı Hatchbox ABS'de basıldı ve ardından zımparalandı. 60 kumdan başlayarak 800 kuma kadar bu model için yeterince iyi bir yüzey kalitesi sağladı.

Adım 6: Montaj ve Boyama

Montaj ve Boyama
Montaj ve Boyama
Montaj ve Boyama
Montaj ve Boyama
Montaj ve Boyama
Montaj ve Boyama

Baskılar zımparalandıktan sonra, yüksek yapılı bir astar ile boyandı. Hafifçe zımparalanmış ve ardından gri astar ile püskürtülmüştür. Ana parçalar ford sinyali sarıya boyandı ve ardından taban için brooklands yeşili kullanıldı. Tamiya gümüşünün vurguları daha sonra cıvatalara uygulandı ve lens tutucusunda bir miktar molotov gümüşü krom kullanıldı.

Adım 7: İlk Sınırlama Alanı İçindeki Uçakları Bulun

Donanım sıralandığında, yazılımın üzerinde çalışılması gerekiyordu. Artık uçuş takibi sağlayan birkaç site var, ancak bu verilere erişmek için bir API sağlayan pek fazla site yok. Bazıları bunu sadece ticari olarak yapıyor ama neyse ki ücretsiz olarak kullanabileceğiniz https://opensky-network.org adlı bir site var.

Bu verilere erişmek için kaydolmanız gerekir ve ardından API'lerini kullanabilirsiniz, verileri çekmek için çeşitli işlevler ve yollar sağlar. Bir bölgedeki tüm uçuşlarla ilgileniyoruz ve bunun için Live API çağrıları var. https://opensky-network.org/apidoc/ sınırlayıcı kutu olarak adlandırılır. API çağrısı, kutunun ilgilendiğiniz köşelerini, elbette merkez nokta olarak Lat/Lon'umuzu gerektirir. Ne yazdığınıza bağlı olarak bir kutu çizen bu sitenin matematik çalışmalarını kontrol edebilirsiniz. https://tools.geofabrik.de ama şimdilik aşağıdaki script API'ye takmamız gereken noktaları veriyor.

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 = derece2rad($latitude_in_degrees); $boylam = derece2rad($boylam_derece); $yarıçap = 6371; $parallel_radius = $yarıçap*cos($lat); $lat_min = $lat - $yarım_yan_in_km/$yarıçap; $lat_max = $lat + $half_side_in_km/$yarıçap; $lon_min = $lon - $yarım_yan_in_km/$paralel_yarıçap; $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); dönüş dizisi($box_lat_min, $box_lon_min, $box_lat_max, $box_lon_max);

Kodunuzu test etmek istiyorsanız, enlem/boylam girebileceğiniz ve sonuçları harita üzerinde görebileceğiniz bir site var: Haritada sınırlayıcı kutu örneğine bakın

Adım 8: Uçakların Bize Yönelik Yönlerinin Hesaplanması

Uçakların Bize Yönelik Yönlerinin Hesaplanması
Uçakların Bize Yönelik Yönlerinin Hesaplanması

Sınırlayıcı kutu API çağrısından elde edilen sonuçlar, bize uçakların, boylam/enlem, hız, yükseklik ve istikametlerinin bir listesini verir. Bu yüzden yapmamız gereken bir sonraki şey, en azından genel yönümüze gidenleri daha fazla işleyebilmemiz için her bir düzlemin bize göre yönünü elde etmektir. Bunu konumumuzu bildiğimiz için yapabiliriz ve bizden her bir düzleme olan açıyı hesaplayabiliriz.

Bunu yapmak için, orijinal olarak Javascript'te olan bir kod parçası kullanıyorum, bu yüzden onu burada PHP'ye dönüştürdüm, * iki nokta arasındaki (ilk) kerterizi hesaplayı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 = derece2rad($plane_lat);

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

$y = günah($dLon) * cos($lat2);

$x = cos($lat1)*sin($lat2) - günah($lat1)*cos($lat2)*cos($dLon); $z = atan2($y, $x); $zz = (rad2deg($z) +360)% 360; $zz döndür;

Orjinal javascript sürümlerinin olduğu sayfaya bakmak isterseniz link:

bu kod içinde, her bir hesaplama türü için çeşitli alt rutinleri de görebilirsiniz.

Adım 9: Bir Çembere Bakarak Bir Kesişmeyi Hesaplama

Bir Çembere Bakarak Bir Kesişmeyi Hesaplama
Bir Çembere Bakarak Bir Kesişmeyi Hesaplama

Şimdi, konumumuzla arasındaki mesafenin 90'dan az olduğu (olumlu veya olumsuz) bir uçağımız var ve bu, yakınlardan uçma şansı olduğu anlamına geliyor. Haversine formülünü kullanarak, uçağın Boylam/Lat'ını ve evimizin Boylam/Lat'ını kullanarak, evin bizden uzaklığını da bulabiliriz.

Şemaya baktığımızda, evimizin etrafına diyelim ki yaklaşık 3 mil yarıçaplı bir daire çizersek, bu bize üzerinden uçan herhangi bir şeyi görme şansı verir. Uçakla aramızdaki yön farkını biliyoruz, ayrıca uçağın bizden uzaklığını da biliyoruz, böylece eski güzel SOHCAHTOA'yı kullanarak üçgeni bulabiliriz ve bu durumda açının Tan'ını kullanarak elde edebiliriz. karşı kenar uzunluğu. Yani bu değeri evin etrafındaki dairenin yarıçap değeriyle karşılaştırırsak, uçağın onu görebileceğimiz kadar yakına uçup uçamayacağını öğrenebiliriz. Yapabileceğimiz bir sonraki kısım, hava hızını ve mesafeyi kullanarak uçağın uçacağı zamanı hesaplamak ve bu yaklaşık 45 saniyeden azsa ışığı yakarız. Bu, uçma şansını hesaplamak için kullandığım kodun bir kısmı. Bunu yakınlarda bir havaalanı olduğu için yapıyorum ve uçaklar taksiye binerken ister istemez evi gösteriyorlar. Ancak irtifaları sıfır ve hızları yürüme hızı olduğu için bu alarmı tetiklememelidir.

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

$uçuş_açı = 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_mesafe;

if (($flight_angle<90) && ($flight_intercept<3)){ // olası uçma

}

dönüş $flight_intercept;

}

Adım 10: Haritadaki İki Nokta Arasındaki Uzaklık - Haversine Formülü

Haritada İki Nokta Arasındaki Uzaklık - Haversine Formülü
Haritada İki Nokta Arasındaki Uzaklık - Haversine Formülü

Bu yüzden uçak ile bulunduğumuz yer arasındaki mesafeyi hesaplamamız gerekiyor. Bir harita üzerinde kısa mesafelerde mesafeyi yaklaşık olarak hesaplayabilirsiniz, ancak dünya küresel olduğu için kavisli yüzeyi dikkate almanızı sağlayan haversine formülü adı verilen bir formül vardır. Formülün devamını okuyabilirsiniz:

Şimdi hesaplanan mesafe ve uçağın hava hızını bildiğimize göre, uçağın tepesine çıkmadan önce kaç saniye olacağını hesaplayabiliriz. Yani uçuştan 30 saniye sonra bir şey olursa ışık yanacak ve sonunda uyarı ışığımız yanacak.

* instantglobe.com/CRANES/GeoCoordTool.html adresinde 0n JS tabanlı ve PHP'ye dönüştürülmüş */

function get_distHaversine ($home_lat, $home_lon, $plane_lat, $plane_lon) { $R = 6371; // dünyanın km cinsinden ortalama yarıçapı $dLat = deg2rad($plane_lat-$home_lat); $dLon = deg2rad($plane_lon-$home_lon); $lat1 = deg2rad($ev_lat); $lat2 = derece2rad($plane_lat);

$a = günah($dLat/2) * günah($dLat/2) + cos($lat1) * cos($lat2) * günah($dLon/2) * günah($dLon/2);

$c = 2 * atan2(sqrt($a), sqrt(1-$a)); $d = $R * $c; $d döndür; }

Adım 11: Uçak Veritabanını İçe Aktarma ve Tanımlama

Diğer parçalardan biri, opensky sitesinin, çağrı işaretleri ve kimlikleriyle birlikte indirilebilir bir uçak veritabanı sunmasıdır. Birkaç yüz bin girdisi var. Böylece bunu indirebilir ve yerel olarak arama için bir MariaDB veritabanına (MySQL) yükleyebiliriz. Tepede görünen her uçakla birlikte ayrıntılarını alır ve kaç kez görüldüğünü göstermek için bir sayacı güncelleriz.

Ayrıca şu anda ilgilendiğim uçakları vurgulamak için veri tabanını düzenliyorum. Ağırlıklı olarak eski savaş kuşları ve diğer benzer ilginç uçaklar. Bu yaz birkaç kez bir Mig-15 üzerinden uçtu. bu yüzden amaç, eklediğim bir uyarı alanını kullanmak ve ardından ilginç bir şey giderken ışığı hızlı bir şekilde yakmak

Adım 12: Sonuçları ve Yeni Özellikleri İyileştirme

Sonuçları İyileştirme ve Yeni Özellikler
Sonuçları İyileştirme ve Yeni Özellikler
Sonuçları İyileştirme ve Yeni Özellikler
Sonuçları İyileştirme ve Yeni Özellikler
Sonuçları İyileştirme ve Yeni Özellikler
Sonuçları İyileştirme ve Yeni Özellikler

Yani teoride her şey oldukça iyi çalışıyor, ancak API'de görünmeyen, üzerinden uçan uçaklar olduğunu verilerle bulacaksınız.

Bunun nedeni, tüm uçakların ADS-B aktarıcısını kullanmaması ve MLAT tabanlı daha eski aktarıcıları kullanmamasıdır. MLAT kullanarak uçakta konum verisi elde etmek için, yerdeki bir dizi alıcının konumlarını üçgenleştirmesi gerekir ve Flightradar24 gibi bazı siteler, opensky ile karşılaştırıldığında bunu yapan daha büyük bir katılımcı ağına sahiptir. Umarım zamanla kapsama alanları da gelişecektir ve bu verilere eklemek için kendi MLAT alıcımı kuruyorum.

Adım 13: Kod Tabanı

Bunu kullanacaksanız, uçakların veritabanına sahip değilseniz SQL ifadelerini kaldırmak ve ayrıca uçuş verilerine erişmek için kendi Lon/Lat değerinizi ve API anahtarınızı eklemek isteyebileceğinizi unutmayın.

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

define("ARALIK", (20 * 1)); function fexp() { $lat = "enleminiz"; $lon = "boylamınız"; $yan = 15,75; $kutu = get_bounding_box($lat, $boy, $yan); $latmin = $kutu[0]; $lonmin = $kutu[1]; $latmax = $kutu[2]; $lonmaks = $kutu[3]; $flyurl = "https://opensky-network.org/api/states/all?lamin=$latmin&lomin=$lonmin&lamax=$latmax&lomax=$lonmax"; echo "SKY Taranıyor"; $start_time = mikrozaman(doğru); $json = file_get_contents($flyurl); $veri = json_decode($json, DOĞRU); $gelen = YANLIŞ; $num_planes = sayım($veri['durumlar']); if ($num_planes >0) { echo " ve $num_planes düzlemlerini görebiliriz\n "; for ($x =0; $x 0) { $plane_eta = $distplane/$air_speed_kmh; }else { $eta = 1; } if ((($intercept)0)) && ($distplane0){ $gelen = DOĞRU; Eko "------------------------------------------------ --------------------\n"; echo "$icao24 - [$ülke $çağrı işareti], [$geo_altitude_m M -- $geo_altitude_f ft] "; echo "[hız $air_speed_kmh kmh ve ", yuvarlak($distplane, 1), "km uzakta]\n"; echo "[" başlığında, round($plane_heading, 1), "] [homeangle $heading_d] "; echo "[$enlem, $boylam]\n"; echo "[flypast in ", decimal_to_time($plane_eta), " now ", round($intercept, 1), "km uzakta\n"; Eko "------------------------------------------------ --------------------\n"; $DBi = new mysqli("127.0.0.1", "root", "parolanız", "awacs"); $sql = "uçak veri tabanından * seçin, burada `icao24`='$icao24'"; mysqli_set_charset($DBi, "utf8"); $getplanedata = mysqli_query($DBi, $sql) veya 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['kayıt']; yankı " bir "; echo $row_getplanedata['üreticiadı']; Eko " "; echo $row_getplanedata['model']; yankı " by "; echo $row_getplanedata['manufacturericao']; echo " sahibi "; echo $row_getplanedata['sahip']; yankı " görüldü "; echo $row_getplanedata['ziyaret']; yankı " kez"; echo " özel değerlendirme="; echo $row_getplanedata['özel']; yankı "\n"; $ziyaret = $row_getplanedata['ziyaret']+1; } while ($row_getplanedata = mysqli_fetch_assoc($getplanedata)); mysqli_free_result($getplanedata); $sqli = "Uçak veritabanı SET ziyaretlerini GÜNCELLE = $ziyaret NEREDE icao24 = '$icao24'"; mysqli_set_charset($DBi, "utf8"); $updateplanedata = mysqli_query($DBi, $sqli) veya die(mysqli_error($DBi)); } else { echo "Bu düzlem DB'de bulunamadı, bu yüzden onu ekliyorum"; $sqli = "INSERT INTO uçakveritabanı (icao24, ziyaretler, özel) DEĞERLER ('$icao24', 1, 1)"; $updateplanedata = mysqli_query($DBi, $sqli) veya die(mysqli_error($DBi)); } Eko "----------------------------------------------- ---------------------\n"; } başka { // echo "$çağrı işareti"; } } } else { echo " ve gökyüzü açık\n "; } if ($gelen) { echo "Gelen uçak\n"; $command = "domuzlar w 17 1"; execInBackground($komut); } else { echo "gelen uçuş yok\n"; $komut = "domuzlar w 17 0"; execInBackground($komut); } } function decimal_to_time($decimal) { $ofset = 0.002778; if ($decimal>$offset) { $decimal = $decimal - 0.002778; } $saat = gmdate('H', kat($decimal * 3600)); $dakika = gmdate('i', kat($ondalık * 3600)); $saniye = gmdate('s', floor($decimal * 3600)); return str_pad($saat, 2, "0", STR_PAD_LEFT). ":". str_pad($dakika, 2, "0", STR_PAD_LEFT). ":". str_pad($saniye, 2, "0", STR_PAD_LEFT); } /* * iki nokta arasındaki (ilk) kerterizi hesaplayın * * şu kaynaktan: 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 = derece2rad($plane_lat); $dLon = deg2rad($plane_lon-$home_lon); $y = günah($dLon) * cos($lat2); $x = cos($lat1)*sin($lat2) - günah($lat1)*cos($lat2)*cos($dLon); $z = atan2($y, $x); $zz = (rad2deg($z) +360)% 360; $zz döndür; } function 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_mesafe; dönüş $flight_intercept; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* * Enlem/boylam (sayısal derece olarak) tarafından belirtilen iki nokta arasındaki mesafeyi (km olarak) hesaplamak için Haversine formülünü kullanın * * from: Haversine formülü - RWSinnott, "Virtues of the Haversine", * Sky and Telescope, cilt 68, no 2, 1984 * https://williams.best.vwh.net/avform.htm#Crs * * formdan örnek kullanım: * sonuç.değer = LatLon.distHaversine(lat1.value.parseDeg(), long1.value.parseDeg(), * lat2.value.parseDeg(), long2.value.parseDeg()); * burada lat1, long1, lat2, long2 ve sonuç form alanlarıdır * source = instantglobe.com/CRANES/GeoCoordTool.html */ function get_distHaversine ($home_lat, $home_lon, $plane_lat, $plane_lon) { $R = 6371; // dünyanın km cinsinden ortalama yarıçapı $dLat = deg2rad($plane_lat-$home_lat); $dLon = deg2rad($plane_lon-$home_lon); $lat1 = deg2rad($ev_lat); $lat2 = derece2rad($plane_lat); $a = günah($dLat/2) * günah($dLat/2) + cos($lat1) * cos($lat2) * günah($dLon/2) * günah($dLon/2); $c = 2 * atan2(sqrt($a), sqrt(1-$a)); $d = $R * $c; $d döndür; } 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 = derece2rad($latitude_in_degrees); $boylam = derece2rad($boylam_derece); $yarıçap = 6371; # Verilen enlemdeki paralelin yarıçapı; $parallel_radius = $yarıçap*cos($lat); $lat_min = $lat - $yarım_yan_in_km/$yarıçap; $lat_max = $lat + $half_side_in_km/$yarıçap; $lon_min = $lon - $yarım_yan_in_km/$paralel_yarıçap; $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); dönüş dizisi($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() { // tamamen isteğe bağlı dönüş(DOĞRU); } function start() { echo "başlangıç\n"; $command = "domuzlar w 17 1"; execInBackground($komut); $etkin = DOĞRU; while($aktif) { usleep(1000); // isteğe bağlı, düşünceli olmak istiyorsanız if (microtime(true) >= $nextTime) { fexp(); $nextTime = mikrozaman(doğru) + ARALIK; } $aktif = checkForStopFlag(); } } feks(); Başlat(); ?>

Adım 14: LED'i ve Kapatma Anahtarını Kablolama

LED'i ve Kapatma Anahtarını Kablolama
LED'i ve Kapatma Anahtarını Kablolama

Bu projenin kablolaması gerçekten daha kolay olamazdı. Pin 17'ye bağlı olan ve 270R'lik bir rezistör ile topraklanmış tek bir LED vardır.

Ayrıca TXd veri pinini kapatan bir güç LED'i ile birlikte bir kapatma ve açma düğmesi de ekledim. Kapatma işlevi ve gereken kod hakkında daha fazla bilgiyi https://github.com/Howchoo/pi-power-button.git adresinde https://howchoo.com/g/mwnlytk3zmm/how-to- adresinden okuyabilirsiniz. add-a-pow… Güç ışığı ekleme hakkında buradan bilgi edinebilirsiniz

Önerilen: