สารบัญ:
- ขั้นตอนที่ 1: การออกแบบเคส
- ขั้นตอนที่ 2: การแคสต์เลนส์ - #fail
- ขั้นตอนที่ 3: เรซินประเภทต่างๆ
- ขั้นตอนที่ 4: การหล่อเลนส์ในแม่พิมพ์ซิลิโคน #2
- ขั้นตอนที่ 5: การพิมพ์และการจัดเตรียม 3 มิติ
- ขั้นตอนที่ 6: การประกอบและการทาสี
- ขั้นตอนที่ 7: ขั้นแรกให้ค้นหาเครื่องบินภายในพื้นที่ที่มีขอบเขต
- ขั้นตอนที่ 8: การคำนวณส่วนหัวของเครื่องบินที่เกี่ยวข้องกับเรา
- ขั้นตอนที่ 9: คำนวณการสกัดกั้นโดยดูที่วงกลม
- ขั้นตอนที่ 10: ระยะห่างระหว่างจุดสองจุดบนแผนที่ - สูตร Haversine
- ขั้นตอนที่ 11: การนำเข้าและกำหนดฐานข้อมูลเครื่องบิน
- ขั้นตอนที่ 12: การปรับปรุงผลลัพธ์และคุณสมบัติใหม่
- ขั้นตอนที่ 13: Codebase
- ขั้นตอนที่ 14: การเดินสายไฟ LED และสวิตช์ปิดเครื่อง
วีดีโอ: ไฟรันเวย์ Raspberry PI เตือนล่วงหน้าโดยใช้ข้อมูลการทำแผนที่เที่ยวบิน: 14 ขั้นตอน (พร้อมรูปภาพ)
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:04
ตะเกียงนี้มาจากสาเหตุหลายประการที่ฉันมักจะสนใจเครื่องบินที่บินอยู่เหนือศีรษะ และในฤดูร้อนในช่วงสุดสัปดาห์ก็มักจะมีเที่ยวบินที่น่าตื่นเต้นอยู่บ้าง แม้ว่าคุณมักจะได้ยินพวกเขาเมื่อพวกเขาผ่านไปเท่านั้น อีกเหตุผลหนึ่งก็คือ ดูเหมือนว่าเส้นทางบินสำหรับเครื่องบินขาออกจากสนามบินลอนดอนซิตี้จะได้ยินบางครั้งและมีเที่ยวบินที่มีเสียงดังพอสมควร เมื่อฉันตะลุยบันทึกวิดีโอบางรายการสำหรับ 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
องค์ประกอบการออกแบบที่สำคัญที่สุดของโคมไฟนี้คือเลนส์ ดังนั้นฉันจึงจัดการเรื่องนี้ก่อนเนื่องจากไม่มีกระจกที่ดูสวยงามจริงๆ โครงการนี้จึงจะได้ผล ฉันกำลังบันทึกความล้มเหลวที่ฉันมีในการพยายามทำสิ่งนั้น แม้ว่าในตอนแรกฉันตัดสินใจที่จะทำให้เลนส์เป็นสีเหลืองอำพัน ไฟรันเวย์มีทั้งสีเหลืองและสีน้ำเงิน และหลังจากที่ฉันเริ่มทำสีเหลืองอำพันแล้ว ฉันจึงเปลี่ยนใจและตัดสินใจว่าฉันต้องการไฟสีน้ำเงิน
จากสิ่งที่ฉันสามารถเห็นได้ สีเหลืองอำพันถูกใช้ที่แนวรับ และสีน้ำเงินใช้เพื่อเรียงตามรันเวย์ และสิ่งเหล่านี้ดูเหมือนจะเป็นแบบที่หาได้ตามแบบฉบับมากกว่าหากคุณค้นหาไฟบนทางวิ่ง อย่างไรก็ตาม นี่เป็นความพยายามครั้งแรกของฉันในการสร้างเลนส์สีเหลืองอำพัน ในการสร้างเลนส์ ฉันจะใช้เรซินแคสแคสต์กับสารเติมแต่งสี และถึงแม้ว่าฉันจะทำแม่พิมพ์มาสองสามแบบก่อนที่จะสงสัยว่าจะเป็นไปได้ไหมที่จะพิมพ์แม่พิมพ์ 3 มิติและใช้สิ่งนั้น ดังนั้นฉันจึงเริ่มต้นด้วยการทำแม่พิมพ์แยกเป็น 3 มิติและพิมพ์ออกมาใน PetG ฉันเชื่อว่าการปลดปล่อยเชื้อราในปริมาณที่เหมาะสมก็เพียงพอที่จะทำให้แม่พิมพ์แตกตัวได้ ปรากฏว่าทำสองสามครั้ง ฉันทำให้เรซินติดอยู่กับแม่พิมพ์เหมือนกาว และดูเหมือนว่าเป็นไปไม่ได้ที่จะแยกพวกมันออกจากกัน แม้ว่าฉันจะมีเลนส์ฟูลสเกลที่กำลังจะใช้งาน แต่ฉันตัดสินใจต่อต้านและพิมพ์เลนส์ออกมาเพื่อใช้กับแม่พิมพ์ซิลิโคนแบบเดิม
ขั้นตอนที่ 3: เรซินประเภทต่างๆ
นอกจากนี้ ฉันยังใช้เรซินใส/สี 3 ประเภทสำหรับโครงการนี้
อย่างแรกคือประเภทตลาดงานอดิเรกที่เรียกว่า Pebeo - Gedeo และปกติจะขายเพื่อห่อหุ้มสินค้าชิ้นเล็ก ๆ และใช้สำหรับอัญมณีและที่ทับกระดาษโต๊ะ ฯลฯ วิธีนี้ใช้ได้ผลดีและหายขาดได้ภายใน 24-36 ชั่วโมง อย่างไรก็ตามมันค่อนข้างแพงสำหรับจำนวนเงินที่คุณได้รับ แต่สะดวกและหาซื้อได้ง่ายในร้านขายงานอดิเรกและงานฝีมือ ผสมในอัตราส่วน 2:1 อย่างที่สองคือเรซินทำสีล่วงหน้าที่ผสมในอัตราส่วน 10:1 กับตัวชุบแข็ง และใช้เวลานานที่สุดในการรักษา ประมาณหนึ่งสัปดาห์ก่อนที่จะแข็งตัวเต็มที่ สุดท้ายเป็นเรซินใส ซึ่งผสมในอัตราส่วน 2:1 ด้วย และหายได้ภายใน 2 วัน คุณสามารถระบายสีด้วยเม็ดสีหยด แต่คุณต้องแน่ใจว่าคุณใช้อัตราส่วนสีเดียวกันเสมอหากคุณ กำลังทำแบทช์แยกต่างหาก นอกจากนี้ยังใช้งานได้คุ้มค่าที่สุด สุดท้าย RTV สำหรับแม่พิมพ์คือ GP-3481 RTV ซึ่งใช้เวลาประมาณ 24 ชั่วโมงในการตั้งค่าและมีเวลาในหม้อค่อนข้างนาน ดังนั้นคุณจึงมีเวลาเหลือเฟือที่จะผสมแล้วเทลงไป
ปัจจุบันฉันไม่มีหม้อเปล่า (กำลังสั่งซื้ออยู่) เพื่อให้คุณสามารถถูกรุมเร้าด้วยฟองอากาศทั้งในแม่พิมพ์และเทเรซิน ไม่ใช่ปัญหามากนักสำหรับเรื่องนี้ แต่ด้วยเลนส์ใสหรือสิ่งที่คล้ายกัน คุณควรคิดหาวิธีเอาฟองอากาศออกจากส่วนผสม
ขั้นตอนที่ 4: การหล่อเลนส์ในแม่พิมพ์ซิลิโคน #2
นี่เป็นความพยายามครั้งที่สองในการสร้างเลนส์เรซิน และขั้นตอนแรกคือการสร้างทั้งเลนส์ใน Fusion 360 จากนั้นพิมพ์ในระบบ ABS และถังเพื่อถือ นี้จะเป็นแบบเดิมสำหรับแม่พิมพ์และช่วยลดปริมาณซิลิโคนที่จะใช้ คุณสามารถทำสิ่งนี้ได้อย่างง่ายดายจากการ์ด แต่มันเป็นเพียงแนวทางที่แตกต่างออกไป เพื่อให้มีโอกาสถูกปลดปล่อยจากแม่พิมพ์ได้ดีขึ้น อันดับแรก ฉันจึงเคลือบเงามันก่อนแล้วจึงเคลือบสารปลดปล่อยแว็กซ์ให้ทั่ว
จากนั้นฉันก็เท GP-3481 ซึ่งมีขนาดประมาณ 27 RTV แล้วปล่อยให้มันตั้งค่าใน 24 ชั่วโมงข้างหน้าก่อนที่จะทำการถอดแยกชิ้นส่วน เมื่อเสร็จแล้ว ฉันใช้เรซินใสผสมในอัตราส่วน 2:1 กับรงควัตถุสีประมาณ 4/5 หยด และผสมให้เข้ากันดีเป็นเวลาสี่นาที เทลงในแม่พิมพ์แล้ววางแก้วชอตลงในเรซินเพื่อให้เป็นโมฆะในภายหลังสำหรับหลอดไฟหรือไฟ LED หลังจากผ่านไปประมาณ 24 ชั่วโมงเรซินนี้ก็พร้อมที่จะถอดออกและเลนส์ก็ออกมาค่อนข้างดี มีฟองอากาศอยู่ แต่ตอนนี้ฉันยังไม่มีภาชนะสูญญากาศที่จะขจัดแก๊สเรซินก่อนที่จะเท
ขั้นตอนที่ 5: การพิมพ์และการจัดเตรียม 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
เราจึงต้องคำนวณระยะทางระหว่างระนาบกับตำแหน่งของเรา ในระยะทางสั้น ๆ บนแผนที่ คุณสามารถคำนวณระยะทางโดยประมาณได้ แต่เนื่องจากโลกเป็นทรงกลม มีสูตรที่เรียกว่าสูตรฮาเวอร์ซีนที่ให้คุณพิจารณาพื้นผิวโค้งได้ สามารถอ่านเพิ่มเติมในสูตร:
ตอนนี้ด้วยระยะทางที่คำนวณได้และเราทราบความเร็วของเครื่องบินแล้ว เราก็สามารถคำนวณได้ว่าจะใช้เวลากี่วินาทีก่อนที่เครื่องบินจะบินเหนือศีรษะ ดังนั้นไฟจะสว่างขึ้นหากมีบางอย่างภายใน 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 เพียงดวงเดียวที่เชื่อมต่อกับพิน 17 และกราวด์ด้วยตัวต้านทานแบบอินไลน์ 270R
ฉันยังรวมปุ่มปิดเครื่องและเปิดเครื่องพร้อมกับไฟ LED แสดงการทำงานที่ปิดขาข้อมูล TXd คุณสามารถอ่านเพิ่มเติมเกี่ยวกับฟังก์ชันการปิดระบบและรหัสที่ต้องการได้ที่ https://github.com/Howchoo/pi-power-button.git จากเว็บไซต์ https://howchoo.com/g/mwnlytk3zmm/how-to- add-a-pow… คุณสามารถอ่านเกี่ยวกับการเพิ่มไฟส่องสว่างได้ที่นี่
แนะนำ:
บ้านอัจฉริยะโดย Raspberry Pi: 5 ขั้นตอน (พร้อมรูปภาพ)
บ้านอัจฉริยะโดย Raspberry Pi: มีผลิตภัณฑ์หลายอย่างที่ทำให้แฟลตของคุณฉลาดขึ้น แต่ส่วนใหญ่เป็นโซลูชันที่เป็นกรรมสิทธิ์ แต่ทำไมคุณต้องเชื่อมต่ออินเทอร์เน็ตเพื่อเปลี่ยนไฟด้วยสมาร์ทโฟนของคุณ นั่นเป็นเหตุผลหนึ่งที่ทำให้ฉันสร้าง Smar ของตัวเอง
จอแสดงผลเกม LED ทำจากไม้ที่ขับเคลื่อนโดย Raspberry Pi Zero: 11 ขั้นตอน (พร้อมรูปภาพ)
จอแสดงผล LED สำหรับเล่นเกมแบบไม้ที่ขับเคลื่อนโดย Raspberry Pi Zero: โปรเจ็กต์นี้ใช้จอแสดงผล LED แบบ WS2812 ขนาด 20x10 พิกเซลที่มีขนาด 78x35 ซม. ซึ่งสามารถติดตั้งได้ง่ายในห้องนั่งเล่นเพื่อเล่นเกมย้อนยุค เมทริกซ์เวอร์ชันแรกนี้สร้างขึ้นในปี 2016 และสร้างขึ้นใหม่โดยคนอื่นๆ อีกหลายคน ประสบการณ์นี้
Bolt - DIY Wireless Charging Night Clock (6 ขั้นตอน): 6 ขั้นตอน (พร้อมรูปภาพ)
Bolt - DIY Wireless Charging Night Clock (6 ขั้นตอน): การชาร์จแบบเหนี่ยวนำ (เรียกอีกอย่างว่าการชาร์จแบบไร้สายหรือการชาร์จแบบไร้สาย) เป็นการถ่ายโอนพลังงานแบบไร้สาย ใช้การเหนี่ยวนำแม่เหล็กไฟฟ้าเพื่อจ่ายกระแสไฟฟ้าให้กับอุปกรณ์พกพา แอปพลิเคชั่นที่พบบ่อยที่สุดคือ Qi Wireless Charging st
4 ขั้นตอน Digital Sequencer: 19 ขั้นตอน (พร้อมรูปภาพ)
4 ขั้นตอน Digital Sequencer: CPE 133, Cal Poly San Luis Obispo ผู้สร้างโปรเจ็กต์: Jayson Johnston และ Bjorn Nelson ในอุตสาหกรรมเพลงในปัจจุบัน ซึ่งเป็นหนึ่งใน “instruments” เป็นเครื่องสังเคราะห์เสียงดิจิตอล ดนตรีทุกประเภท ตั้งแต่ฮิปฮอป ป๊อป และอีฟ
ป้ายโฆษณาแบบพกพาราคาถูกเพียง 10 ขั้นตอน!!: 13 ขั้นตอน (พร้อมรูปภาพ)
ป้ายโฆษณาแบบพกพาราคาถูกเพียง 10 ขั้นตอน!!: ทำป้ายโฆษณาแบบพกพาราคาถูกด้วยตัวเอง ด้วยป้ายนี้ คุณสามารถแสดงข้อความหรือโลโก้ของคุณได้ทุกที่ทั่วทั้งเมือง คำแนะนำนี้เป็นการตอบสนองต่อ/ปรับปรุง/เปลี่ยนแปลงของ: https://www.instructables.com/id/Low-Cost-Illuminated-