Πίνακας περιεχομένων:

Πρώιμη προειδοποίηση Raspberry PI Light Runway χρησιμοποιώντας δεδομένα χαρτογράφησης πτήσης: 14 βήματα (με εικόνες)
Πρώιμη προειδοποίηση Raspberry PI Light Runway χρησιμοποιώντας δεδομένα χαρτογράφησης πτήσης: 14 βήματα (με εικόνες)

Βίντεο: Πρώιμη προειδοποίηση Raspberry PI Light Runway χρησιμοποιώντας δεδομένα χαρτογράφησης πτήσης: 14 βήματα (με εικόνες)

Βίντεο: Πρώιμη προειδοποίηση Raspberry PI Light Runway χρησιμοποιώντας δεδομένα χαρτογράφησης πτήσης: 14 βήματα (με εικόνες)
Βίντεο: WALKING DEAD COMPLETE GAME FROM START LIVE 2024, Ιούλιος
Anonim
Early Warning Raspberry PI Light Runway Χρησιμοποιώντας δεδομένα χαρτογράφησης πτήσης
Early Warning Raspberry PI Light Runway Χρησιμοποιώντας δεδομένα χαρτογράφησης πτήσης
Early Warning Raspberry PI Light Runway Χρησιμοποιώντας δεδομένα χαρτογράφησης πτήσης
Early Warning Raspberry PI Light Runway Χρησιμοποιώντας δεδομένα χαρτογράφησης πτήσης
Πρώιμη προειδοποίηση Raspberry PI Light runway χρησιμοποιώντας δεδομένα χαρτογράφησης πτήσης
Πρώιμη προειδοποίηση Raspberry PI Light runway χρησιμοποιώντας δεδομένα χαρτογράφησης πτήσης
Πρώιμη προειδοποίηση Raspberry PI Light runway χρησιμοποιώντας δεδομένα χαρτογράφησης πτήσης
Πρώιμη προειδοποίηση Raspberry PI Light runway χρησιμοποιώντας δεδομένα χαρτογράφησης πτήσης

Αυτός ο λαμπτήρας προήλθε από διάφορους λόγους στο ότι με ενδιαφέρουν πάντα τα αεροπλάνα που πετούν πάνω και κατά τη διάρκεια του καλοκαιριού τα Σαββατοκύριακα υπάρχουν συχνά αρκετά συναρπαστικά. Αν και έχετε την τάση να τα ακούτε μόνο καθώς περνούν. Στη συνέχεια, ο άλλος λόγος είναι ότι φαίνεται ότι η διαδρομή πτήσης για τα εξερχόμενα αεροπλάνα από το αεροδρόμιο του Λονδίνου θα ακουστεί μερικές φορές και θα πραγματοποιηθούν αρκετά θορυβώδεις πτήσεις. Καθώς ασχολούμαι με την εγγραφή κάποιων βίντεο για το YouTube, είναι πραγματικά ενοχλητικό να πρέπει να διακόψω μια εγγραφή λόγω ενός θορυβώδους αεροπλάνου. Αναρωτήθηκα λοιπόν αν τα δεδομένα που βλέπετε σε ιστότοπους όπως το flightradar24 είναι δημόσια διαθέσιμα, μόλις ανακάλυψα ότι κάτι παρόμοιο ήταν διαθέσιμο από το δίκτυο ανοίγματος ανοίχθηκε ο λαμπτήρας έγκαιρης προειδοποίησης. Δεν χρειάστηκε πολύς χρόνος για να έρθει στη συνέχεια η ιδέα να χρησιμοποιήσετε ένα αντίγραφο ενός φωτός διαδρόμου για να στεγάσει το έργο.

Μπορείτε να μάθετε περισσότερα για το OpenSky Network στη διεύθυνση https://www.opensky-network.org Iθελα επίσης αυτή τη φορά να φτιάξω έναν όμορφο φακό ρητίνης αντί να χρησιμοποιώ διαφανές PLA και παρόλο που έχω δέκτη ADS-B που ήθελα να κρατήσω αυτό το απλό και φθηνό. Το ADS-B χρειάζεται επίσης κεραία και αυτό δεν θα μπορούσε να κάνει μια λάμπα στο ράφι στο γραφείο. Ελπίζουμε λοιπόν ότι θα βρείτε ενδιαφέρουσα την κατασκευή καθώς καλύπτει την τρισδιάστατη εκτύπωση, τη χύτευση με ρητίνη και τα μαθηματικά, καθώς και την παρέκταση των θέσεων των αεροσκαφών που ενδέχεται να περάσουν από πάνω.

Βήμα 1: Σχεδιασμός της θήκης

Η αναζήτηση Google έρχεται με πολλά διαφορετικά σχέδια λαμπτήρων διαδρόμου και ο σχεδιασμός αυτού έγινε με σχεδιαστικές επιρροές από πολλές διαφορετικές μάρκες πραγματικών λαμπτήρων. Είναι επίσης κλιμακωτό να κάθεστε σε ένα δωμάτιο ή σε ένα ράφι και όχι σε πλήρες μέγεθος, καθώς τείνουν να είναι πολύ μεγαλύτερα στην πραγματική ζωή.

Τα σχέδια καταρτίστηκαν στο Fusion 360 και εισήγαγα μερικά προηγούμενα στοιχεία, όπως το βατόμουρο pi zero, από προηγούμενα έργα. Η ικανότητα επαναχρησιμοποίησης στοιχείων αφαιρεί πολύ τον πονοκέφαλο από την αποδυνάμωση των βασικών. Μπορείτε επίσης να κατεβάσετε τα αρχεία εδώ

Βήμα 2: Χύτευση των φακών - #αποτυχία

Casting the Lenses - #fail
Casting the Lenses - #fail
Casting the Lenses - #fail
Casting the Lenses - #fail
Casting the Lenses - #fail
Casting the Lenses - #fail

Το πιο σημαντικό στοιχείο σχεδιασμού αυτής της λάμπας ήταν ο φακός. Έτσι το αντιμετώπισα αυτό πρώτα καθώς χωρίς ένα ωραίο αυθεντικό γυαλί το έργο επρόκειτο να λειτουργήσει. Τεκμηριώνω εδώ τις αποτυχίες που είχα στην προσπάθειά μου να το επιτύχω, χωρίς να αντέξω ότι επίσης αποφάσισα αρχικά να κάνω τον φακό πορτοκαλί. Τα φώτα του διαδρόμου έρχονται και σε πορτοκαλί και σε μπλε χρώμα και μόνο αφού είχα αρχίσει να φτιάχνω το κεχριμπαρένιο, άλλαξα γνώμη και αποφάσισα ότι ήθελα ένα μπλε.

Από ό, τι μπορώ να καταλάβω, τα κεχριμπαρένια χρησιμοποιούνται στη γραμμή συγκράτησης και τα μπλε χρησιμοποιούνται για την τοποθέτηση του διαδρόμου, και αυτά είναι που φαίνεται ότι είναι τα πιο αρχετυπικά, αν αναζητήσετε φώτα διαδρόμου. Ωστόσο, εδώ είναι η πρώτη μου προσπάθεια να φτιάξω έναν κεχριμπαρένιο φακό. Για να φτιάξω τον φακό, επρόκειτο να χρησιμοποιήσω ρητίνη διαυγούς με πρόσθετο χρώματος, και παρόλο που έχω κάνει μερικές φόρμες πριν αναρωτηθώ εάν θα ήταν δυνατό να εκτυπώσω ένα τρισδιάστατο καλούπι και να το χρησιμοποιήσω. Ξεκίνησα λοιπόν να φτιάχνω ένα σπαστό καλούπι σε 3D και να το εκτυπώνω σε PetG. Εύλογες ποσότητες απελευθέρωσης μούχλας ήμουν πεπεισμένος ότι θα ήταν αρκετές για να αιχμαλωτίσουν το καλούπι. Όπως αποδείχθηκε με τις δύο προσπάθειες έκανα τη ρητίνη κολλημένη στο καλούπι σαν κόλλα και απλά δεν φαινόταν δυνατό να τα διαχωρίσω. Παρόλο που είχα την πλήρη κλίμακα που επρόκειτο να χρησιμοποιήσω, αποφάσισα να το εκτυπώσω και εκτύπωσα τον φακό για χρήση με παραδοσιακό καλούπι σιλικόνης.

Βήμα 3: Διαφορετικοί τύποι ρητίνης

Διαφορετικοί τύποι ρητίνης
Διαφορετικοί τύποι ρητίνης
Διαφορετικοί τύποι ρητίνης
Διαφορετικοί τύποι ρητίνης
Διαφορετικοί τύποι ρητίνης
Διαφορετικοί τύποι ρητίνης
Διαφορετικοί τύποι ρητίνης
Διαφορετικοί τύποι ρητίνης

Ως γρήγορη άκρη, χρησιμοποίησα 3 τύπους διαφανών/χρωματιστών ρητινών για αυτό το έργο.

Ο πρώτος ήταν ένας τύπος αγοράς χόμπι που ονομάζεται Pebeo - Gedeo και πωλείται συνήθως για ενθυλάκωση μικρών αντικειμένων και χρησιμοποιείται για κοσμήματα και χαρτί χαρτιού κλπ. Αυτό λειτούργησε αρκετά καλά και θεραπεύτηκε όμορφα σε περίπου 24-36 ώρες. Ωστόσο, είναι αρκετά ακριβό για το ποσό που παίρνετε, αλλά είναι βολικό και εύκολα διαθέσιμο σε καταστήματα χόμπι και χειροτεχνίας. Αναμιγνύεται σε αναλογία 2: 1. Το δεύτερο ήταν μια προ-χρωματισμένη ρητίνη που αναμιγνύεται σε αναλογία 10: 1 με το σκληρυντικό και αυτό χρειάστηκε το μεγαλύτερο χρονικό διάστημα για να θεραπευτεί, περίπου μια εβδομάδα για να είμαι ειλικρινής πριν από την πλήρη σκλήρυνση. Το τελευταίο ήταν μια διαφανής ρητίνη, η οποία αναμίχθηκε επίσης σε αναλογία 2: 1 και θεραπεύτηκε σε περίπου 2 ημέρες, μπορείτε να το χρωματίσετε με σταγόνες χρωστικής, αλλά πρέπει να βεβαιωθείτε ότι χρησιμοποιείτε πάντα την ίδια αναλογία χρωμάτων εάν κάνουν ξεχωριστές παρτίδες. Λειτουργεί επίσης το πιο οικονομικά αποδοτικό. Τέλος, το RTV για το καλούπι ήταν ένα GP-3481 RTV και αυτό χρειάζεται περίπου 24 ώρες για να ρυθμιστεί και έχει πολύ μεγάλο χρόνο στο δοχείο, ώστε να έχετε πολύ χρόνο να το αναμίξετε και στη συνέχεια να το ρίξετε.

Προς το παρόν δεν έχω μια κατσαρόλα για φθινόπωρο (επί του παρόντος σε παραγγελία), έτσι ώστε να μπορείτε να σας περιβάλλουν φυσαλίδες τόσο στο καλούπι όσο και στη ρητίνη. Δεν είναι πολύ ζήτημα για αυτό, αλλά με καθαρό φακό ή παρόμοιο, τότε θα θέλατε να σκεφτείτε με κάποιο τρόπο για να βγάλετε τις φυσαλίδες από τα μίγματα.

Βήμα 4: Χύτευση του φακού σε καλούπι σιλικόνης #2

Image
Image
Χύτευση του φακού σε καλούπι σιλικόνης #2
Χύτευση του φακού σε καλούπι σιλικόνης #2
Χύτευση του φακού σε καλούπι σιλικόνης #2
Χύτευση του φακού σε καλούπι σιλικόνης #2

Αυτή είναι λοιπόν η δεύτερη προσπάθεια κατασκευής ενός φακού Resin και το πρώτο στάδιο ήταν να φτιάξουμε τόσο έναν φακό στο Fusion 360 και στη συνέχεια να τον εκτυπώσουμε σε ABS όσο και έναν κάδο για να τον κρατήσουμε. Αυτό θα ήταν το πρώτο για το καλούπι και βοηθά στη συγκράτηση της ποσότητας σιλικόνης που θα χρησιμοποιηθεί. Μπορείτε εύκολα να το κάνετε αυτό από κάρτα, αλλά είναι μια διαφορετική προσέγγιση. Για να του δώσω μια καλύτερη πιθανότητα να απελευθερωθεί από το καλούπι, το βερνίκωσα πρώτα και μετά του έδωσα μια καλή κάλυψη μέσου απελευθέρωσης κεριού.

Έπειτα έριξα λίγο GP-3481 που είναι περίπου στην ακτή 27 RTV και μετά το άφησα να δέσει τα επόμενα 24ωρα πριν ξεφορμάρεις. Μόλις αυτό έγινε, χρησιμοποίησα τη διαυγή ρητίνη αναμεμειγμένη σε αναλογία 2: 1 με περίπου 4/5 σταγόνες της χρωστικής χρωστικής και την ανακάτεψα καλά για τέσσερα λεπτά. Ρίξτε αυτό στο καλούπι και στη συνέχεια τοποθετήστε ένα γυάλινο γυαλί στη ρητίνη επίσης για να δημιουργήσετε ένα κενό αργότερα είτε για μια λάμπα είτε για τα LED. Μετά από περίπου 24 ώρες αυτή η ρητίνη ήταν έτοιμη για αφαίρεση και ο φακός βγήκε αρκετά καλός. Υπάρχουν φυσαλίδες αέρα, αλλά μέχρι στιγμής δεν έχω δοχείο κενού για να εξαερώσω τη ρητίνη πριν την έκχυση.

Βήμα 5: Τρισδιάστατη εκτύπωση και προετοιμασία

Τρισδιάστατη εκτύπωση και προετοιμασία
Τρισδιάστατη εκτύπωση και προετοιμασία
Τρισδιάστατη εκτύπωση και προετοιμασία
Τρισδιάστατη εκτύπωση και προετοιμασία
Τρισδιάστατη εκτύπωση και προετοιμασία
Τρισδιάστατη εκτύπωση και προετοιμασία

Το μοντέλο σχεδιάστηκε με τέτοιο τρόπο ώστε το κεντρικό τμήμα να συνδέεται στη βάση. Αυτό έγινε για να αποφευχθεί η μάσκα κατά τη διάρκεια της ζωγραφικής. Ολόκληρο το μοντέλο εκτυπώθηκε σε Hatchbox ABS και στη συνέχεια τρίφτηκε. Ξεκινώντας με 60 γρίβες έως περίπου 800 κόκκους έδωσε ένα αρκετά καλό φινίρισμα επιφάνειας για αυτό το μοντέλο.

Βήμα 6: Συναρμολόγηση και Ζωγραφική

Συναρμολόγηση και Ζωγραφική
Συναρμολόγηση και Ζωγραφική
Συναρμολόγηση και Ζωγραφική
Συναρμολόγηση και Ζωγραφική
Συναρμολόγηση και Ζωγραφική
Συναρμολόγηση και Ζωγραφική

Μόλις λειανθούν οι εκτυπώσεις, στη συνέχεια βάφτηκε με αστάρι υψηλής κατασκευής. Ελαφρώς λειανμένο και στη συνέχεια ψεκάζεται με γκρι αστάρι. Τα κύρια μέρη βάφτηκαν σε σήμα κίτρινου χρώματος ford και στη συνέχεια χρησιμοποιήθηκαν πράσινα για τις βάσεις. οι καλύτερες στιγμές του ασημένιου tamiya εφαρμόστηκαν στη συνέχεια στα μπουλόνια και λίγο ασημένιο χρώμιο molotow που χρησιμοποιήθηκε στη θήκη του φακού.

Βήμα 7: Πρώτα βρείτε αεροπλάνα εντός οριακής περιοχής

Με το υλικό ταξινομημένο, το λογισμικό έπρεπε να δουλευτεί. Υπάρχουν τώρα μερικοί ιστότοποι που παρέχουν παρακολούθηση πτήσεων, αλλά όχι πολλοί που παρέχουν API για πρόσβαση σε αυτά τα δεδομένα. Μερικά που το κάνουν, το κάνουν μόνο σε εμπορική βάση, αλλά ευτυχώς υπάρχει ένας ιστότοπος που ονομάζεται https://opensky-network.org τον οποίο μπορείτε να χρησιμοποιήσετε δωρεάν.

Για να αποκτήσετε πρόσβαση σε αυτά τα δεδομένα πρέπει να εγγραφείτε και στη συνέχεια να χρησιμοποιήσετε το API τους, παρέχει διάφορες λειτουργίες και τρόπους για να τραβήξετε τα δεδομένα. Μας ενδιαφέρουν όλες οι πτήσεις σε μια περιοχή και έχουν μια κλήση Live API για αυτό. https://opensky-network.org/apidoc/ ονομάζεται πλαίσιο οριοθέτησης. Η κλήση API απαιτεί τις γωνίες του κουτιού που σας ενδιαφέρουν φυσικά το Lat/Lon ως κεντρικό σημείο. Μπορείτε να ελέγξετε τα μαθηματικά που λειτουργούν σε αυτόν τον ιστότοπο, που σχεδιάζει ένα πλαίσιο ανάλογα με το τι πληκτρολογείτε. Http://tools.geofabrik.de, αλλά προς το παρόν το παρακάτω σενάριο δίνει τα σημεία που πρέπει να συνδέσουμε στο API.

συνάρτηση 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); $ ακτίνα = 6371; $ parallel_radius = $ radius*cos ($ lat); $ lat_min = $ lat - $ half_side_in_km/$ ακτίνα. $ lat_max = $ lat + $ half_side_in_km/$ ακτίνα. $ 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); πίνακας επιστροφής ($ box_lat_min, $ box_lon_min, $ box_lat_max, $ box_lon_max);

Εάν θέλετε να δοκιμάσετε τον κωδικό σας, υπάρχει ένας ιστότοπος στον οποίο μπορείτε να εισαγάγετε το lat/lon και να δείτε τα αποτελέσματα σε έναν χάρτη: Δείτε ένα παράθυρο οριοθέτησης στο χάρτη

Βήμα 8: Υπολογισμός της επικεφαλίδας των αεροπλάνων σε σχέση με εμάς

Υπολογισμός της επικεφαλίδας των αεροπλάνων σε σχέση με εμάς
Υπολογισμός της επικεφαλίδας των αεροπλάνων σε σχέση με εμάς

Τα αποτελέσματα από την κλήση API στο πλαίσιο οριοθέτησης μας δίνουν μια λίστα αεροπλάνων, τα Lon/lat, την ταχύτητα, το υψόμετρο και την κατεύθυνση. Επομένως, το επόμενο πράγμα που πρέπει να κάνουμε είναι να αποκτήσουμε τον τίτλο του κάθε αεροπλάνου σε σχέση με εμάς, ώστε να μπορέσουμε να επεξεργαστούμε περαιτέρω εκείνους που τουλάχιστον κατευθύνονται προς τη γενική μας κατεύθυνση. Μπορούμε να το κάνουμε αυτό καθώς γνωρίζουμε τη θέση μας και μπορούμε να επεξεργαστούμε τη γωνία από εμάς σε κάθε επίπεδο.

Για να το κάνω αυτό, χρησιμοποιώ ένα κομμάτι κώδικα από το οποίο ήταν αρχικά σε Javascript, οπότε το μετέτρεψα εδώ σε PHP, * υπολογίστε (αρχικά) τη σχέση μεταξύ δύο σημείων * * από: Ed Williams 'Aviation Formulary, https://williams.best.vwh.net/avform.htm#Crs * source = instantglobe.com/CRANES/GeoCoordTool.html */ συνάρτηση 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; επιστροφή $ zz?

Αν θέλετε να δείτε τη σελίδα όπου βρίσκονται οι αρχικές εκδόσεις javascript, αυτός είναι ο σύνδεσμος:

μέσα σε αυτόν τον κώδικα, μπορείτε επίσης να δείτε τις διάφορες υπορουτίνες για κάθε τύπο υπολογισμού.

Βήμα 9: Υπολογισμός μιας υποκλοπής κοιτάζοντας έναν κύκλο

Υπολογισμός μιας υποκλοπής κοιτάζοντας έναν κύκλο
Υπολογισμός μιας υποκλοπής κοιτάζοντας έναν κύκλο

Έτσι έχουμε τώρα ένα αεροπλάνο όπου η σχέση μεταξύ αυτού και της θέσης μας είναι μικρότερη από 90 (είτε θετική είτε αρνητική) και αυτό σημαίνει ότι υπάρχει πιθανότητα να πετάξει κοντά. Χρησιμοποιώντας τον τύπο haversine μπορούμε επίσης να ασκήσουμε χρησιμοποιώντας το Lon/Lat του αεροπλάνου και το Lon/Lat του σπιτιού μας την απόσταση που βρίσκεται μακριά μας.

Κοιτάζοντας το διάγραμμα, αν σχεδιάσουμε έναν κύκλο γύρω από το σπίτι μας, ας πούμε ακτίνα περίπου 3 μιλίων, αυτό μας δίνει την ευκαιρία να δούμε οτιδήποτε πετάει πάνω. Γνωρίζουμε τη διαφορά στην κατεύθυνση μεταξύ του αεροπλάνου και εμάς, γνωρίζουμε επίσης την απόσταση του αεροπλάνου από εμάς, ώστε να μπορέσουμε στη συνέχεια να επεξεργαστούμε το τρίγωνο χρησιμοποιώντας το παλιό καλό SOHCAHTOA, και σε αυτή την περίπτωση χρησιμοποιώντας το Tan της γωνίας μπορούμε να πάρουμε αντίθετο μήκος πλευράς. Έτσι, αν συγκρίνουμε αυτήν την τιμή με την τιμή της ακτίνας του κύκλου γύρω από το σπίτι, τότε μπορούμε να μάθουμε αν το αεροπλάνο θα πετάξει αρκετά κοντά για να το δούμε. Το επόμενο κομμάτι που μπορούμε να κάνουμε είναι να υπολογίσουμε την ώρα κατά την οποία το αεροπλάνο θα πετάξει χρησιμοποιώντας την ταχύτητα του αέρα και την απόσταση και αν αυτό είναι λιγότερο από περίπου 45 δευτερόλεπτα περίπου, ανάβουμε το φως. Αυτό είναι ένα κομμάτι του κώδικα που χρησιμοποιώ για να υπολογίσω την πιθανότητα μιας πτήσης από πάνω. Το κάνω αυτό καθώς υπάρχει ένα κοντινό αεροδρόμιο και όταν τα αεροπλάνα κάνουν ταξί, αναπόφευκτα δείχνουν προς το σπίτι. Ωστόσο, καθώς το υψόμετρό τους είναι μηδενικό και η ταχύτητα περπατά, αυτό δεν πρέπει να ενεργοποιεί τον συναγερμό.

συνάρτηση get_intercept ($ home_head, $ plane_head, $ plane_distance) {

$ flight_angle = abs (κοιλιακούς ($ home_head - $ plane_head) - 180); $ flight_angle_r = deg2rad ($ flight_angle); $ flight_angle_t = μαύρισμα ($ flight_angle_r); $ flight_intercept = $ flight_angle_t * $ plane_distance?

εάν (($ flight_angle <90) && ($ flight_intercept <3)) {// πιθανή πτήση

}

επιστροφή $ flight_intercept.

}

Βήμα 10: Απόσταση μεταξύ δύο σημείων σε έναν χάρτη - Τύπος Haversine

Απόσταση μεταξύ δύο σημείων σε έναν χάρτη - Τύπος Haversine
Απόσταση μεταξύ δύο σημείων σε έναν χάρτη - Τύπος Haversine

Πρέπει λοιπόν να υπολογίσουμε την απόσταση μεταξύ του αεροπλάνου και της θέσης μας. Σε μικρές αποστάσεις σε έναν χάρτη θα μπορούσατε να υπολογίσετε περίπου την απόσταση, αλλά καθώς η γη είναι σφαιρική, υπάρχει ένας τύπος που ονομάζεται τύπος haversine που σας επιτρέπει να λάβετε υπόψη την καμπύλη επιφάνεια. Μπορείτε να διαβάσετε περαιτέρω στον τύπο:

Τώρα με την απόσταση που υπολογίζεται και γνωρίζουμε την ταχύτητα του αεροπλάνου μπορούμε να υπολογίσουμε πόσα δευτερόλεπτα θα είναι πριν το αεροπλάνο είναι πάνω από το κεφάλι. Έτσι, το φως θα ανάψει εάν υπάρχει κάτι μέσα σε 30 δευτερόλεπτα από το flypast και επιτέλους έχουμε το προειδοποιητικό μας φως.

* βασίζεται σε 0n JS στο instantglobe.com/CRANES/GeoCoordTool.html και μετατράπηκε σε PHP */

συνάρτηση get_distHaversine ($ home_lat, $ home_lon, $ plane_lat, $ plane_lon) {$ R = 6371; // μέση ακτίνα της γης σε 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; επιστροφή $ d? }

Βήμα 11: Εισαγωγή και καθορισμός της βάσης δεδομένων αεροπλάνου

Ένα από τα άλλα κομμάτια είναι ότι ο ιστότοπος openky προσφέρει μια βάση δεδομένων αεροπλάνων με δυνατότητα λήψης, μαζί με τα διακριτικά τους και τα διακριτικά τους. Οι εκατοντάδες χιλιάδες καταχωρήσεις του. Μπορούμε λοιπόν να το κατεβάσουμε και να το φορτώσουμε τοπικά σε μια βάση δεδομένων MariaDB για αναζήτηση (MySQL). Με κάθε αεροπλάνο που εμφανίζεται από πάνω, ανακτάμε τα στοιχεία του και ενημερώνουμε έναν μετρητή για να δείξουμε πόσες φορές έχει δει.

Αυτή τη στιγμή επεξεργάζομαι τη βάση δεδομένων για να επισημάνω τα αεροπλάνα που με ενδιαφέρουν. Κυρίως παλιά πολεμικά πτηνά και άλλα παρόμοια ενδιαφέροντα αεροπλάνα. Μερικές φορές αυτό το καλοκαίρι πέταξε ένα Mig-15. έτσι ο στόχος είναι να χρησιμοποιήσω ένα πεδίο ειδοποίησης που έχω προσθέσει και στη συνέχεια να αναβοσβήνει το φως γρήγορα όταν κάτι ενδιαφέρον πηγαίνει

Βήμα 12: Βελτίωση αποτελεσμάτων και νέων δυνατοτήτων

Βελτίωση αποτελεσμάτων και νέων δυνατοτήτων
Βελτίωση αποτελεσμάτων και νέων δυνατοτήτων
Βελτίωση αποτελεσμάτων και νέων δυνατοτήτων
Βελτίωση αποτελεσμάτων και νέων δυνατοτήτων
Βελτίωση αποτελεσμάτων και νέων δυνατοτήτων
Βελτίωση αποτελεσμάτων και νέων δυνατοτήτων

Έτσι στη θεωρία όλα λειτουργούν αρκετά καλά, αλλά με τα δεδομένα θα διαπιστώσετε ότι υπάρχουν αεροπλάνα που πετούν πάνω και δεν εμφανίζονται στο API.

Αυτό συμβαίνει επειδή δεν χρησιμοποιούν όλα τα αεροπλάνα τον αναμεταδότη ADS-B και χρησιμοποιούν παλαιότερους αναμεταδότες που βασίζονται στο MLAT. Για να λάβετε δεδομένα θέσης σε αεροσκάφη που χρησιμοποιούν MLAT, απαιτείται μια σειρά δέκτων στο έδαφος να τριγωνοποιήσουν τη θέση τους και ορισμένες τοποθεσίες όπως το flightradar24 έχουν μεγαλύτερο δίκτυο συνεργατών που το κάνουν σε σύγκριση με το openky. Ας ελπίσουμε ότι με την πάροδο του χρόνου η κάλυψή τους θα βελτιωθεί επίσης και δημιουργώ τον δικό μου δέκτη MLAT για να προσθέσω σε αυτά τα δεδομένα.

Βήμα 13: Βάση κώδικα

Μην ξεχνάτε εάν πρόκειται να το χρησιμοποιήσετε, ίσως θέλετε να καταργήσετε τις δηλώσεις SQL εάν δεν έχετε τη βάση δεδομένων των αεροπλάνων και προσθέστε τη δική σας τιμή Lon/Lat και κλειδί API για πρόσβαση στα δεδομένα πτήσης.

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

define ("INTERVAL", (20 * 1)); συνάρτηση fexp () {$ lat = "το γεωγραφικό σας πλάτος"; $ lon = "το γεωγραφικό σας μήκος"; $ πλευρά = 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"; ηχώ "Σάρωση του ουρανού"? $ start_time = μικροχρόνος (αληθής); $ json = file_get_contents ($ flyurl); $ data = json_decode ($ json, TRUE); $ εισερχόμενα = FALSE; $ num_planes = count ($ data ['state']); εάν ($ num_planes> 0) {echo "και μπορούμε να δούμε $ num_planes αεροπλάνα / n"; για ($ x = 0; $ x 0) {$ plane_eta = $ distplane/$ air_speed_kmh; } else {$ eta = 1; } if ((($ intercept) 0)) && ($ distplane0) {$ inbound = TRUE; ηχώ "------------------------------------------------ -------------------- / n "; ηχώ "$ icao24 - [$ country $ callignign] σε [$ geo_altitude_m M - $ geo_altitude_f ft]"; ηχώ "[speed $ air_speed_kmh kmh and", round ($ distplane, 1), "km away] n"; ηχώ "[σε μια επικεφαλίδα του", στρογγυλή ($ plane_heading, 1), "] [homeangle $ heading_d]"; ηχώ "[$ γεωγραφικό πλάτος, $ γεωγραφικό μήκος] n"; ηχώ "[flypast in", decimal_to_time ($ plane_eta), "now", round ($ intercept, 1), "km away / n"; ηχώ "------------------------------------------------ -------------------- / n "; $ DBi = new mysqli ("127.0.0.1", "root", "your password", "awacs"); $ sql = "επιλέξτε * από τη βάση δεδομένων αεροσκαφών όπου` icao24` = '$ icao24' "; mysqli_set_charset ($ DBi, "utf8"); $ getplanedata = mysqli_query ($ DBi, $ sql) ή die (mysqli_error ($ DBi)); $ row_getplanedata = mysqli_fetch_assoc ($ getplanedata); $ rows_getplanedata = mysqli_num_rows ($ getplanedata); εάν ($ rows_getplanedata> 0) {do {echo "callign ="; echo $ row_getplanedata ['εγγραφή']; ηχώ "είναι α"? echo $ row_getplanedata ['manufacturername']; ηχώ " "; echo $ row_getplanedata ['model']; ηχώ "από"? echo $ row_getplanedata ['manufacturericao']; ηχώ "ανήκει στο"? echo $ row_getplanedata ['κάτοχος']; ηχώ "φαίνεται"? echo $ row_getplanedata ['επισκέψεις']; ηχώ "φορές"? ηχώ "ειδική βαθμολογία ="; echo $ row_getplanedata ['special']; ηχώ "\ n"; $ επισκέψεις = $ row_getplanedata ['επισκέψεις']+1; } while ($ row_getplanedata = mysqli_fetch_assoc ($ getplanedata)); mysqli_free_result ($ getplanedata); $ sqli = "ΕΝΗΜΕΡΩΣΗ βάσης δεδομένων αεροσκαφών SET επισκέψεις = $ επισκέψεις ΠΟΥ icao24 = '$ icao24'"; mysqli_set_charset ($ DBi, "utf8"); $ updateplanedata = mysqli_query ($ DBi, $ sqli) ή die (mysqli_error ($ DBi)); } else {echo "Δεν ήταν δυνατή η εύρεση αυτού του επιπέδου στο DB έτσι ώστε να το προσθέσω"; $ sqli = "ΕΙΣΑΓΩΓΗ ΣΕ μια βάση δεδομένων αεροσκαφών (icao24, επισκέψεις, ειδικές) ΤΙΜΕΣ ('$ icao24', 1, 1)"; $ updateplanedata = mysqli_query ($ DBi, $ sqli) ή die (mysqli_error ($ DBi)); } ηχώ "----------------------------------------------- --------------------- / n "; } else {// echo "$ callignign"; }}} else {echo "και ο ουρανός είναι καθαρός / n"; } if ($ εισερχόμενα) {echo "Inbound plane / n"; $ command = "γουρούνια w 17 1"; execInBackground (εντολή $); } else {echo "δεν υπάρχουν εισερχόμενες πτήσεις / n"; $ command = "χοίροι w 17 0"; execInBackground (εντολή $); }} συνάρτηση decimal_to_time (δεκαδικό $) {$ offset = 0.002778; εάν ($ δεκαδικό> $ offset) {$ δεκαδικό = $ δεκαδικό - 0,002778; } $ ώρες = gmdate ('H', όροφος (δεκαδικό $ * 3600)); $ minutes = gmdate ('i', floor ($ δεκαδικό * 3600)); $ δευτερόλεπτα = gmdate ('s', πάτωμα ($ δεκαδικό * 3600)); επιστροφή str_pad ($ ώρες, 2, "0", STR_PAD_LEFT). ":". str_pad ($ λεπτά, 2, "0", STR_PAD_LEFT). ":". str_pad ($ δευτερόλεπτα, 2, "0", STR_PAD_LEFT); }/ * * υπολογίστε (αρχικά) τη σχέση μεταξύ δύο σημείων * * από: 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; επιστροφή $ zz? } λειτουργία 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 = μαύρισμα ($ flight_angle_r); $ flight_intercept = $ flight_angle_t * $ plane_distance? επιστροφή $ flight_intercept. } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *// * * Χρησιμοποιήστε τον τύπο Haversine για να υπολογίσετε την απόσταση (σε χλμ) μεταξύ δύο σημείων που καθορίζονται από * γεωγραφικό πλάτος/γεωγραφικό μήκος (σε αριθμητικούς βαθμούς) * * από: Τύπος Haversine - RWSinnott, "Virtues of the Haversine", * Sky and Telescope, vol 68, no 2, 1984 * https://williams.best.vwh.net/avform.htm#Crs * * παράδειγμα χρήσης από τη φόρμα: * result.value = LatLon.distHaversine (lat1.value.parseDeg (), long1.value.parseDeg (), * lat2.value.parseDeg (), long2.value.parseDeg ()); * όπου lat1, long1, lat2, long2 και αποτέλεσμα είναι πεδία φόρμας * πηγή = instantglobe.com/CRANES/GeoCoordTool.html */λειτουργία get_distHaversine ($ home_lat, $ home_lon, $ plane_lat, $ plane_lon) {$ R = 6371; // μέση ακτίνα της γης σε 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; επιστροφή $ d? } λειτουργία 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); $ ακτίνα = 6371; # Ακτίνα του παράλληλου σε δεδομένο γεωγραφικό πλάτος. $ parallel_radius = $ radius*cos ($ lat); $ lat_min = $ lat - $ half_side_in_km/$ ακτίνα. $ lat_max = $ lat + $ half_side_in_km/$ ακτίνα. $ 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); πίνακας επιστροφής ($ box_lat_min, $ box_lon_min, $ box_lat_max, $ box_lon_max); } λειτουργία execInBackground ($ cmd) {if (substr (php_uname (), 0, 7) == "Windows") {pclose (popen ("start /B". $ cmd, "r")); } else {exec ($ cmd. "> /dev /null &"); }} function checkForStopFlag () {// εντελώς προαιρετική επιστροφή (TRUE); } λειτουργία έναρξης () {echo "εκκίνηση / n"; $ command = "γουρούνια w 17 1"; execInBackground (εντολή $); $ active = TRUE; while ($ active) {usleep (1000); // προαιρετικό, εάν θέλετε να είστε προσεκτικοί εάν (μικροχρόνος (αληθινός)> = $ επόμενος χρόνος) {fexp (); $ nextTime = μικροχρόνος (αληθινός) + INTERVAL; } $ active = checkForStopFlag (); }} fexp (); αρχή(); ?>

Βήμα 14: Καλωδίωση της λυχνίας LED και του διακόπτη τερματισμού λειτουργίας

Καλωδίωση της λυχνίας LED και του διακόπτη τερματισμού λειτουργίας
Καλωδίωση της λυχνίας LED και του διακόπτη τερματισμού λειτουργίας

Η καλωδίωση αυτού του έργου δεν θα μπορούσε να είναι απλούστερη. Υπάρχει μόνο ένα LED που συνδέεται με τον πείρο 17 και γείωση με εσωτερική αντίσταση 270R.

Περιλαμβάνω επίσης ένα κουμπί τερματισμού λειτουργίας και ενεργοποίησης, μαζί με μια λυχνία LED λειτουργίας που τρέχει από την ακίδα δεδομένων TXd. Μπορείτε να διαβάσετε περισσότερα για τη λειτουργία τερματισμού λειτουργίας και τον κωδικό που απαιτείται στη διεύθυνση https://github.com/Howchoo/pi-power-button.git από τον ιστότοπο https://howchoo.com/g/mwnlytk3zmm/how-to- add-a-pow… Μπορείτε να διαβάσετε για την προσθήκη ενός φωτισμού ισχύος εδώ

Συνιστάται: