สารบัญ:

ไฟรันเวย์ Raspberry PI เตือนล่วงหน้าโดยใช้ข้อมูลการทำแผนที่เที่ยวบิน: 14 ขั้นตอน (พร้อมรูปภาพ)
ไฟรันเวย์ Raspberry PI เตือนล่วงหน้าโดยใช้ข้อมูลการทำแผนที่เที่ยวบิน: 14 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: ไฟรันเวย์ Raspberry PI เตือนล่วงหน้าโดยใช้ข้อมูลการทำแผนที่เที่ยวบิน: 14 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: ไฟรันเวย์ Raspberry PI เตือนล่วงหน้าโดยใช้ข้อมูลการทำแผนที่เที่ยวบิน: 14 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: ETIHAD'S Incredible Apartments! A380 First Class Trip Report【Abu Dhabi to London】 2024, พฤศจิกายน
Anonim
ไฟรันเวย์ Raspberry PI เตือนล่วงหน้าโดยใช้ข้อมูลการทำแผนที่เที่ยวบิน
ไฟรันเวย์ Raspberry PI เตือนล่วงหน้าโดยใช้ข้อมูลการทำแผนที่เที่ยวบิน
ไฟรันเวย์ Raspberry PI เตือนล่วงหน้าโดยใช้ข้อมูลการทำแผนที่เที่ยวบิน
ไฟรันเวย์ Raspberry PI เตือนล่วงหน้าโดยใช้ข้อมูลการทำแผนที่เที่ยวบิน
ไฟรันเวย์ Raspberry PI เตือนล่วงหน้าโดยใช้ข้อมูลการทำแผนที่เที่ยวบิน
ไฟรันเวย์ Raspberry PI เตือนล่วงหน้าโดยใช้ข้อมูลการทำแผนที่เที่ยวบิน
ไฟรันเวย์ Raspberry PI เตือนล่วงหน้าโดยใช้ข้อมูลการทำแผนที่เที่ยวบิน
ไฟรันเวย์ Raspberry PI เตือนล่วงหน้าโดยใช้ข้อมูลการทำแผนที่เที่ยวบิน

ตะเกียงนี้มาจากสาเหตุหลายประการที่ฉันมักจะสนใจเครื่องบินที่บินอยู่เหนือศีรษะ และในฤดูร้อนในช่วงสุดสัปดาห์ก็มักจะมีเที่ยวบินที่น่าตื่นเต้นอยู่บ้าง แม้ว่าคุณมักจะได้ยินพวกเขาเมื่อพวกเขาผ่านไปเท่านั้น อีกเหตุผลหนึ่งก็คือ ดูเหมือนว่าเส้นทางบินสำหรับเครื่องบินขาออกจากสนามบินลอนดอนซิตี้จะได้ยินบางครั้งและมีเที่ยวบินที่มีเสียงดังพอสมควร เมื่อฉันตะลุยบันทึกวิดีโอบางรายการสำหรับ YouTube มันน่ารำคาญจริงๆ ที่ต้องตัดการบันทึกเพราะมีเสียงรบกวน ดังนั้นฉันจึงสงสัยว่าข้อมูลที่คุณเห็นในไซต์เช่น flightradar24 นั้นเปิดเผยต่อสาธารณะหรือไม่ เมื่อฉันค้นพบสิ่งที่คล้ายกันจากเครือข่าย opensky ไฟเตือนล่วงหน้าก็ถือกำเนิดขึ้น ใช้เวลาไม่นานนักในการคิดที่จะใช้แบบจำลองแสงบนทางวิ่งเพื่อจัดวางโครงการ

คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับ The OpenSky Network ได้ที่ https://www.opensky-network.org ฉันยังต้องการเวลานี้เพื่อสร้างเลนส์เรซินที่ดีแทนที่จะใช้ PLA แบบโปร่งแสง และแม้ว่าฉันจะมีเครื่องรับ ADS-B ก็ตาม แต่ฉันก็อยากจะเก็บไว้ นี้ง่ายและราคาถูก ADS-B ยังต้องการเสาอากาศและสิ่งนี้จะไม่ทำเพื่อให้โคมไฟไปอยู่บนหิ้งในสำนักงาน หวังว่าคุณจะพบงานสร้างที่น่าสนใจเพราะมันครอบคลุมการพิมพ์ 3 มิติ การขึ้นรูปด้วยเรซิน และคณิตศาสตร์ รวมถึงการคาดคะเนตำแหน่งของเครื่องบินที่อาจผ่านเหนือศีรษะ

ขั้นตอนที่ 1: การออกแบบเคส

การค้นหาโดย Google มีการออกแบบโคมไฟรันเวย์ที่แตกต่างกันมากมาย และการออกแบบของโคมไฟนี้ได้รับอิทธิพลจากการออกแบบจากโคมไฟจริงหลายยี่ห้อ นอกจากนี้ยังปรับขนาดให้นั่งในห้องหรือบนชั้นวางมากกว่าขนาดเต็ม เนื่องจากในชีวิตจริงมักจะมีขนาดใหญ่กว่ามาก

การออกแบบถูกวาดขึ้นใน Fusion 360 และฉันได้นำเข้าองค์ประกอบก่อนหน้าบางอย่าง เช่น ที่ยึดราสเบอร์รี่ pi zero จากโครงการก่อนหน้านี้ ความสามารถในการนำองค์ประกอบกลับมาใช้ใหม่นั้นทำให้ปวดหัวอย่างมากในการทำให้พื้นฐานลดลง สามารถดาวน์โหลดไฟล์ได้ที่นี่

ขั้นตอนที่ 2: การแคสต์เลนส์ - #fail

การหล่อเลนส์ - #fail
การหล่อเลนส์ - #fail
การหล่อเลนส์ - #fail
การหล่อเลนส์ - #fail
การหล่อเลนส์ - #fail
การหล่อเลนส์ - #fail

องค์ประกอบการออกแบบที่สำคัญที่สุดของโคมไฟนี้คือเลนส์ ดังนั้นฉันจึงจัดการเรื่องนี้ก่อนเนื่องจากไม่มีกระจกที่ดูสวยงามจริงๆ โครงการนี้จึงจะได้ผล ฉันกำลังบันทึกความล้มเหลวที่ฉันมีในการพยายามทำสิ่งนั้น แม้ว่าในตอนแรกฉันตัดสินใจที่จะทำให้เลนส์เป็นสีเหลืองอำพัน ไฟรันเวย์มีทั้งสีเหลืองและสีน้ำเงิน และหลังจากที่ฉันเริ่มทำสีเหลืองอำพันแล้ว ฉันจึงเปลี่ยนใจและตัดสินใจว่าฉันต้องการไฟสีน้ำเงิน

จากสิ่งที่ฉันสามารถเห็นได้ สีเหลืองอำพันถูกใช้ที่แนวรับ และสีน้ำเงินใช้เพื่อเรียงตามรันเวย์ และสิ่งเหล่านี้ดูเหมือนจะเป็นแบบที่หาได้ตามแบบฉบับมากกว่าหากคุณค้นหาไฟบนทางวิ่ง อย่างไรก็ตาม นี่เป็นความพยายามครั้งแรกของฉันในการสร้างเลนส์สีเหลืองอำพัน ในการสร้างเลนส์ ฉันจะใช้เรซินแคสแคสต์กับสารเติมแต่งสี และถึงแม้ว่าฉันจะทำแม่พิมพ์มาสองสามแบบก่อนที่จะสงสัยว่าจะเป็นไปได้ไหมที่จะพิมพ์แม่พิมพ์ 3 มิติและใช้สิ่งนั้น ดังนั้นฉันจึงเริ่มต้นด้วยการทำแม่พิมพ์แยกเป็น 3 มิติและพิมพ์ออกมาใน 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

นี่เป็นความพยายามครั้งที่สองในการสร้างเลนส์เรซิน และขั้นตอนแรกคือการสร้างทั้งเลนส์ใน Fusion 360 จากนั้นพิมพ์ในระบบ ABS และถังเพื่อถือ นี้จะเป็นแบบเดิมสำหรับแม่พิมพ์และช่วยลดปริมาณซิลิโคนที่จะใช้ คุณสามารถทำสิ่งนี้ได้อย่างง่ายดายจากการ์ด แต่มันเป็นเพียงแนวทางที่แตกต่างออกไป เพื่อให้มีโอกาสถูกปลดปล่อยจากแม่พิมพ์ได้ดีขึ้น อันดับแรก ฉันจึงเคลือบเงามันก่อนแล้วจึงเคลือบสารปลดปล่อยแว็กซ์ให้ทั่ว

จากนั้นฉันก็เท GP-3481 ซึ่งมีขนาดประมาณ 27 RTV แล้วปล่อยให้มันตั้งค่าใน 24 ชั่วโมงข้างหน้าก่อนที่จะทำการถอดแยกชิ้นส่วน เมื่อเสร็จแล้ว ฉันใช้เรซินใสผสมในอัตราส่วน 2:1 กับรงควัตถุสีประมาณ 4/5 หยด และผสมให้เข้ากันดีเป็นเวลาสี่นาที เทลงในแม่พิมพ์แล้ววางแก้วชอตลงในเรซินเพื่อให้เป็นโมฆะในภายหลังสำหรับหลอดไฟหรือไฟ LED หลังจากผ่านไปประมาณ 24 ชั่วโมงเรซินนี้ก็พร้อมที่จะถอดออกและเลนส์ก็ออกมาค่อนข้างดี มีฟองอากาศอยู่ แต่ตอนนี้ฉันยังไม่มีภาชนะสูญญากาศที่จะขจัดแก๊สเรซินก่อนที่จะเท

ขั้นตอนที่ 5: การพิมพ์และการจัดเตรียม 3 มิติ

การพิมพ์และการจัดเตรียม 3 มิติ
การพิมพ์และการจัดเตรียม 3 มิติ
การพิมพ์และการจัดเตรียม 3 มิติ
การพิมพ์และการจัดเตรียม 3 มิติ
การพิมพ์และการจัดเตรียม 3 มิติ
การพิมพ์และการจัดเตรียม 3 มิติ

ตัวแบบได้รับการออกแบบในลักษณะที่ส่วนตรงกลางเสียบเข้ากับฐาน เพื่อหลีกเลี่ยงการปิดบังระหว่างขั้นตอนการทาสี โมเดลทั้งหมดถูกพิมพ์ด้วย Hatchbox ABS แล้วขัดด้วยทราย เริ่มต้นด้วย 60 กรวดถึงประมาณ 800 กรวดให้พื้นผิวที่ดีเพียงพอสำหรับรุ่นนี้

ขั้นตอนที่ 6: การประกอบและการทาสี

การประกอบและการทาสี
การประกอบและการทาสี
การประกอบและการทาสี
การประกอบและการทาสี
การประกอบและการทาสี
การประกอบและการทาสี

เมื่องานพิมพ์ถูกขัดแล้ว ก็ทาสีด้วยสีรองพื้นชั้นสูง ขัดเบา ๆ แล้วพ่นสีรองพื้นสีเทา ชิ้นส่วนหลักถูกทาด้วยสีเหลืองสัญญาณของฟอร์ด แล้วจึงใช้สีเขียวบรูคแลนด์เป็นฐาน จากนั้นจึงใช้ไฮไลท์สีเงินทามิย่ากับโบลต์ และโครเมียมสีเงินโมโลโทว์บางตัวที่ใช้กับตัวยึดเลนส์

ขั้นตอนที่ 7: ขั้นแรกให้ค้นหาเครื่องบินภายในพื้นที่ที่มีขอบเขต

เมื่อจัดเรียงฮาร์ดแวร์แล้ว ซอฟต์แวร์จำเป็นต้องทำงาน ขณะนี้มีไซต์สองสามแห่งที่ให้บริการติดตามเที่ยวบิน แต่มีไม่มากที่ให้ API เพื่อเข้าถึงข้อมูลนั้น บางอย่างที่ทำ จะทำในเชิงพาณิชย์เท่านั้น แต่โชคดีที่มีไซต์หนึ่งชื่อ https://opensky-network.org ที่คุณสามารถใช้ได้ฟรี

ในการเข้าถึงข้อมูลนี้ คุณต้องลงทะเบียนแล้วจึงจะสามารถใช้ API ได้ ซึ่งมีฟังก์ชันและวิธีต่างๆ มากมายในการดึงข้อมูล เรามีความสนใจในเที่ยวบินทั้งหมดภายในพื้นที่ และมีการเรียก Live API สำหรับสิ่งนั้น https://opensky-network.org/apidoc/ เรียกว่า bounding box การเรียก API ต้องใช้มุมของกล่องที่คุณสนใจ โดยที่ Lat/Lon ของเราเป็นจุดศูนย์กลาง คุณสามารถตรวจสอบว่าไซต์นี้ทำงานคณิตศาสตร์ได้ ซึ่งจะมีช่องขึ้นอยู่กับสิ่งที่คุณพิมพ์ https://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($ลองจิจูด_in_degrees); $รัศมี = 6371; $parallel_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 ของ bounding box ทำให้เรามีรายชื่อเครื่องบิน, Lon/lat, ความเร็ว, ระดับความสูงและทิศทางที่มุ่งหน้าไป ดังนั้นสิ่งต่อไปที่เราต้องทำคือได้ส่วนหัวของระนาบแต่ละระนาบที่สัมพันธ์กับเรา เพื่อที่เราจะได้ดำเนินการต่อไปที่อย่างน้อยก็มุ่งหน้าไปในทิศทางทั่วไปของเรา เราสามารถทำได้เมื่อเรารู้ตำแหน่งของเราและสามารถหามุมจากเราไปยังระนาบแต่ละระนาบได้

ในการทำเช่นนั้น ฉันใช้โค้ดส่วนหนึ่งซึ่งเดิมเป็น Javascript ดังนั้นฉันจึงแปลงเป็น PHP ที่นี่

* คำนวณ (เริ่มต้น) ระหว่างสองจุด * * จาก: สูตรการบินของ Ed Williams, 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 = บาป($dLon) * cos($lat2);

$x = cos($lat1)*sin($lat2) - sin($lat1)*cos($lat2)*cos($dLon); $x = cos($lat1)*sin($lat2) - บาป($lat1)*cos($lat2)*cos($dLon); $z = atan2($y, $x); $zz = (rad2deg($z) +360)% 360; ส่งคืน $zz;

หากคุณต้องการดูหน้าที่เป็นเวอร์ชันดั้งเดิมของจาวาสคริปต์ นี่คือลิงค์:

ภายในโค้ดนั้น คุณยังสามารถดูรูทีนย่อยต่างๆ สำหรับการคำนวณแต่ละประเภทได้อีกด้วย

ขั้นตอนที่ 9: คำนวณการสกัดกั้นโดยดูที่วงกลม

คำนวณการสกัดกั้นโดยดูที่วงกลม
คำนวณการสกัดกั้นโดยดูที่วงกลม

ตอนนี้เรามีระนาบที่แบริ่งระหว่างมันกับตำแหน่งของเราน้อยกว่า 90 (ทั้งบวกหรือลบ) ซึ่งหมายความว่ามีโอกาสที่มันจะบินอยู่ใกล้ ๆ การใช้สูตรแฮเวอร์ซีน เรายังสามารถคำนวณโดยใช้ลน/ลัตของระนาบและลน/ลัตของบ้านเราในระยะทางที่มันอยู่ห่างจากเรา

ดูจากแผนภาพ ถ้าเราวาดวงกลมรอบ ๆ บ้านของเราในรัศมีประมาณ 3 ไมล์ นี่จะทำให้เรามีโอกาสเห็นอะไรบินผ่าน เราทราบความแตกต่างในการมุ่งหน้าระหว่างระนาบและเรา เรายังทราบระยะห่างของระนาบจากเราด้วย เพื่อที่เราจะสามารถหาสามเหลี่ยมโดยใช้ SOHCAHTOA แบบเก่า และในกรณีนี้โดยใช้แทนของมุม เราจะได้ ความยาวด้านตรงข้าม ดังนั้นหากเราเปรียบเทียบค่านี้กับค่ารัศมีของวงกลมรอบ ๆ บ้าน เราจะสามารถทราบได้ว่าเครื่องบินจะบินเข้ามาใกล้พอที่เราจะได้เห็นหรือไม่ สิ่งต่อไปที่เราทำได้คือหาเวลาที่เครื่องบินจะบินผ่านโดยใช้ความเร็วลมและระยะทาง และถ้าน้อยกว่านี้ประมาณ 45 วินาที เราก็เปิดไฟ นี่เป็นรหัสเล็กๆ น้อยๆ ที่ฉันใช้เพื่อหาโอกาสที่จะบินข้าม ฉันทำเช่นนี้เพราะมีสนามบินอยู่ใกล้ ๆ และเมื่อเครื่องบินแล่นไปรอบ ๆ พวกเขาก็ชี้ไปที่บ้านอย่างหลีกเลี่ยงไม่ได้ อย่างไรก็ตาม เนื่องจากระดับความสูงเป็นศูนย์และความเร็วอยู่ในระยะเดิน จึงไม่ควรส่งสัญญาณเตือน

ฟังก์ชัน 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;

if (($flight_angle<90) && ($flight_intercept<3)){ // บินผ่านไปได้

}

ส่งคืน $flight_intercept;

}

ขั้นตอนที่ 10: ระยะห่างระหว่างจุดสองจุดบนแผนที่ - สูตร 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; // รัศมีเฉลี่ยของโลกเป็นกม. $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: การนำเข้าและกำหนดฐานข้อมูลเครื่องบิน

อีกชิ้นหนึ่งคือไซต์ opensky มีฐานข้อมูลเครื่องบินที่สามารถดาวน์โหลดได้พร้อมกับสัญญาณเรียกและรหัสประจำตัว มันหลายแสนรายการ ดังนั้นเราจึงสามารถดาวน์โหลดและโหลดลงในฐานข้อมูล MariaDB สำหรับการค้นหา (MySQL) ด้วยเครื่องบินทุกลำที่ปรากฏขึ้นเหนือศีรษะ เราจะดึงรายละเอียดและอัปเดตตัวนับเพื่อแสดงจำนวนครั้งที่เห็น

ฉันกำลังแก้ไขฐานข้อมูลเพื่อเน้นเครื่องบินที่ฉันสนใจ ส่วนใหญ่เป็นนกวอร์เบิร์ดเก่าและเครื่องบินที่น่าสนใจอื่นๆ ที่คล้ายกัน สองครั้งในฤดูร้อนนี้ที่ Mig-15 บินผ่าน จุดมุ่งหมายคือการใช้ช่องแจ้งเตือนที่ฉันได้เพิ่มเข้าไปแล้วจึงฉายแสงอย่างรวดเร็วเมื่อมีสิ่งที่น่าสนใจกำลังมุ่งหน้าไป

ขั้นตอนที่ 12: การปรับปรุงผลลัพธ์และคุณสมบัติใหม่

การปรับปรุงผลลัพธ์และคุณสมบัติใหม่
การปรับปรุงผลลัพธ์และคุณสมบัติใหม่
การปรับปรุงผลลัพธ์และคุณสมบัติใหม่
การปรับปรุงผลลัพธ์และคุณสมบัติใหม่
การปรับปรุงผลลัพธ์และคุณสมบัติใหม่
การปรับปรุงผลลัพธ์และคุณสมบัติใหม่

ตามทฤษฎีแล้ว ทุกอย่างทำงานได้ดี แต่คุณจะพบกับข้อมูลว่ามีเครื่องบินที่บินผ่านซึ่งไม่ปรากฏใน API

เนื่องจากไม่ใช่ทุกเครื่องบินที่ใช้ช่องสัญญาณ ADS-B และใช้ช่องสัญญาณรุ่นเก่าตาม MLAT ในการรับข้อมูลตำแหน่งบนเครื่องบินโดยใช้ MLAT นั้น จำเป็นต้องมีชุดรับบนพื้นดินเพื่อระบุตำแหน่ง และบางไซต์เช่น flightradar24 มีเครือข่ายผู้ร่วมให้ข้อมูลที่ใหญ่กว่าเมื่อเปรียบเทียบกับ opensky หวังว่าเมื่อเวลาผ่านไปความครอบคลุมของพวกเขาจะดีขึ้นเช่นกัน และฉันกำลังตั้งค่าตัวรับ MLAT ของตัวเองเพื่อเพิ่มข้อมูลนี้

ขั้นตอนที่ 13: Codebase

อย่าลืมถ้าคุณจะใช้สิ่งนี้ คุณอาจต้องการลบคำสั่ง SQL หากคุณไม่มีฐานข้อมูลของเครื่องบิน และเพิ่มค่า Lon/Lat ของคุณเองและคีย์ API สำหรับการเข้าถึงข้อมูลเที่ยวบิน

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

กำหนด ("INTERVAL", (20 * 1)); ฟังก์ชั่น fexp() { $lat = "ละติจูดของคุณ"; $lon = "ลองจิจูดของคุณ"; ด้าน $ = 15.75; $box = get_bounding_box($lat, $lon, $side); $latmin = $box[0]; $lonmin = $box[1]; $latmax = $กล่อง[2]; $lonmax = $กล่อง[3]; $flyurl = "https://opensky-network.org/api/states/all?lamin=$latmin&lomin=$lonmin&lamax=$latmax&lomax=$lonmax"; echo "การสแกนท้องฟ้า"; $start_time = microtime(จริง); $json = file_get_contents($flyurl); $data = json_decode($json, จริง); $ขาเข้า = FALSE; $num_planes = จำนวน($data['states']); if ($num_planes >0) { echo " และเราสามารถเห็น $num_planesplanes\n "; สำหรับ ($x =0; $x 0) { $plane_eta = $distplane/$air_speed_kmh; } อย่างอื่น { $eta = 1; } if ((($intercept)0)) && ($distplane0){ $inbound = TRUE; เสียงสะท้อน "------------------------------------------------ --------------------\NS"; echo "$icao24 - [$country $callsign] ที่ [$geo_altitude_m M -- $geo_altitude_f ft] "; echo "[speed $air_speed_kmh kmh and ', round($distplane, 1), "km away]\n"; echo "[บนหัวเรื่องของ ", round($plane_heading, 1), "] [homeangle $heading_d] "; echo "[$ละติจูด, $ลองจิจูด]\n"; echo "[flypast in ", decimal_to_time($plane_eta), " now ", round($intercept, 1), "ห่างออกไป\n"; เสียงสะท้อน "------------------------------------------------ --------------------\NS"; $DBi = new mysqli("127.0.0.1", "root", "รหัสผ่านของคุณ", "awacs"); $sql = "select * จากฐานข้อมูลเครื่องบิน โดยที่ `icao24`='$icao24'"; mysqli_set_charset($DBi, "utf8"); $getplanedata = mysqli_query($DBi, $sql) หรือตาย(mysqli_error($DBi)); $row_getplanedata = mysqli_fetch_assoc($getplanedata); $rows_getplanedata = mysqli_num_rows($getplanedata); if($rows_getplanedata>0) { ทำ { echo "callsign="; echo $row_getplanedata['การลงทะเบียน']; เสียงสะท้อน " คือ "; echo $row_getplanedata['ชื่อผู้ผลิต']; เสียงสะท้อน " "; echo $row_getplanedata['model']; เสียงสะท้อน " โดย "; echo $row_getplanedata['manufacturicao']; echo " เป็นเจ้าของโดย "; echo $row_getplanedata['owner']; เสียงสะท้อน " เห็น "; echo $row_getplanedata['visits']; เสียงสะท้อน " ครั้ง "; เสียงสะท้อน " คะแนนพิเศษ ="; echo $row_getplanedata['พิเศษ']; เสียงสะท้อน "\n"; $visits = $row_getplanedata['visits']+1; $visits = $row_getplanedata['visits']+1; } ในขณะที่ ($row_getplanedata = mysqli_fetch_assoc($getplanedata)); mysqli_free_result($getplanedata); $sqli = "UPDATE ฐานข้อมูลเครื่องบิน SET visits = $visits WHERE icao24 = '$icao24'"; mysqli_set_charset($DBi, "utf8"); $updateplanedata = mysqli_query($DBi, $sqli) หรือตาย(mysqli_error($DBi)); } else { echo "ไม่พบระนาบนี้ใน DB ดังนั้นให้เพิ่มเข้าไป"; $sqli = "INSERT INTO ฐานข้อมูลเครื่องบิน (icao24, การเข้าชม, พิเศษ) VALUES ('$icao24', 1, 1)"; $updateplanedata = mysqli_query($DBi, $sqli) หรือตาย(mysqli_error($DBi)); } echo "----------------------------------------------------------- ---------------------\NS"; } else { // echo "$callsign"; } } } else { echo " และท้องฟ้าแจ่มใส\n "; } if ($inbound) { echo "Inbound plane\n"; $command = "หมู w 17 1"; execInBackground(คำสั่ง $); } อื่น ๆ { echo "ไม่มีเที่ยวบินขาเข้า\n"; $command = "หมู w 17 0"; execInBackground(คำสั่ง $); } } ฟังก์ชั่น decimal_to_time ($ decimal) { $offset = 0.002778; ถ้า ($ทศนิยม>$ออฟเซ็ต) { ทศนิยม $ = ทศนิยม $ - 0.002778; } $hours = gmdate('H', floor($ทศนิยม * 3600)); $minutes = gmdate('i', floor($ทศนิยม * 3600)); $seconds = gmdate('s', floor($ทศนิยม * 3600)); ส่งคืน str_pad($hours, 2, "0", STR_PAD_LEFT) ":". str_pad($minutes, 2, "0", STR_PAD_LEFT) ":". str_pad($วินาที, 2, "0", STR_PAD_LEFT); } /* * คำนวณ (เริ่มต้น) ระหว่างจุดสองจุด * * จาก: สูตรการบินของ Ed Williams, 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 = บาป($dLon) * cos($lat2); $x = cos($lat1)*sin($lat2) - sin($lat1)*cos($lat2)*cos($dLon); $x = cos($lat1)*sin($lat2) - บาป($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 และผลลัพธ์เป็นฟิลด์แบบฟอร์ม * source = instantglobe.com/CRANES/GeoCoordTool.html */ function get_distHaversine ($home_lat, $home_lon, $plane_lat, $plane_lon) { $R = 6371; // รัศมีเฉลี่ยของโลกเป็นกม. $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($ลองจิจูด_in_degrees); $รัศมี = 6371; # รัศมีของเส้นขนานที่ละติจูดที่กำหนด $parallel_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 &"); } } ฟังก์ชัน checkForStopFlag() { // ตัวเลือกทั้งหมด return (TRUE); } ฟังก์ชั่น start() { echo "starting\n"; $command = "หมู w 17 1"; execInBackground(คำสั่ง $); $active = จริง; ในขณะที่($ใช้งานอยู่) { usleep(1000); // เป็นทางเลือก หากคุณต้องการมีน้ำใจ if (microtime(true) >= $nextTime) { fexp(); $nextTime = microtime(จริง) + 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… คุณสามารถอ่านเกี่ยวกับการเพิ่มไฟส่องสว่างได้ที่นี่

แนะนำ: