جدول المحتويات:

الإنذار المبكر Raspberry PI ضوء المدرج باستخدام بيانات رسم خرائط الطيران: 14 خطوة (بالصور)
الإنذار المبكر Raspberry PI ضوء المدرج باستخدام بيانات رسم خرائط الطيران: 14 خطوة (بالصور)

فيديو: الإنذار المبكر Raspberry PI ضوء المدرج باستخدام بيانات رسم خرائط الطيران: 14 خطوة (بالصور)

فيديو: الإنذار المبكر Raspberry PI ضوء المدرج باستخدام بيانات رسم خرائط الطيران: 14 خطوة (بالصور)
فيديو: Raspberry Pi Light Sensor: A Simple LDR Tutorial 2024, يوليو
Anonim
الإنذار المبكر Raspberry PI ضوء المدرج باستخدام بيانات رسم خرائط الطيران
الإنذار المبكر Raspberry PI ضوء المدرج باستخدام بيانات رسم خرائط الطيران
الإنذار المبكر Raspberry PI ضوء المدرج باستخدام بيانات رسم خرائط الطيران
الإنذار المبكر Raspberry PI ضوء المدرج باستخدام بيانات رسم خرائط الطيران
الإنذار المبكر Raspberry PI ضوء المدرج باستخدام بيانات رسم خرائط الطيران
الإنذار المبكر Raspberry PI ضوء المدرج باستخدام بيانات رسم خرائط الطيران
الإنذار المبكر Raspberry PI ضوء المدرج باستخدام بيانات رسم خرائط الطيران
الإنذار المبكر Raspberry PI ضوء المدرج باستخدام بيانات رسم خرائط الطيران

نشأ هذا المصباح من عدة أسباب من حيث أنني مهتم دائمًا بالطائرات التي تحلق في السماء وخلال الصيف في عطلات نهاية الأسبوع ، غالبًا ما تكون هناك بعض الطائرات المثيرة التي تحلق حولها. على الرغم من أنك تميل إلى سماعهم فقط عندما يمرون. ثم السبب الآخر هو أنه يبدو أن مسار رحلة الطائرات المتجهة للخارج من مطار مدينة لندن سيتم سماعه في بعض الأحيان ولديهم بعض الرحلات الجوية الصاخبة جدًا. نظرًا لكوني أعمل في تسجيل بعض مقاطع الفيديو على YouTube ، فمن المزعج حقًا أن تضطر إلى إلغاء تسجيل بسبب وجود طائرة صاخبة. لذلك تساءلت عما إذا كانت البيانات التي تراها على مواقع مثل flightradar24 متاحة للجمهور ، بمجرد أن اكتشفت أن شيئًا مشابهًا متاحًا من شبكة openky ، ولد مصباح الإنذار المبكر. لم يستغرق الأمر وقتًا طويلاً للتوصل إلى فكرة استخدام نسخة طبق الأصل من مصباح مدرج لإيواء المشروع.

يمكنك معرفة المزيد عن شبكة OpenSky على https://www.opensky-network.org ، أردت أيضًا هذه المرة صنع عدسة راتنجية لطيفة بدلاً من استخدام PLA شبه الشفاف وعلى الرغم من أن لدي جهاز استقبال ADS-B كنت أرغب في الاحتفاظ به هذا بسيط ورخيص. يحتاج ADS-B أيضًا إلى هوائي وهذا لن يفعله مصباح يوضع على الرف في المكتب. لذلك نأمل أن تجد التصميم مثيرًا للاهتمام لأنه يغطي الطباعة ثلاثية الأبعاد وصب الراتينج والرياضيات أيضًا لاستقراء مواقع الطائرات التي من المحتمل أن تمر فوقها.

الخطوة 1: تصميم الحالة

يأتي بحث Google بالعديد من التصميمات المختلفة لمصباح المدرج وقد تم تصميم هذا المصباح باستخدام تأثيرات التصميم من العديد من الأنواع المختلفة للمصابيح الحقيقية. يمكن أيضًا تغيير حجمها للجلوس في غرفة أو على رف بدلاً من الحجم الكامل ، لأنها تميل إلى أن تكون أكبر كثيرًا في الحياة الواقعية.

تم وضع التصاميم في Fusion 360 وقمت باستيراد بعض العناصر السابقة مثل حامل raspberry pi zero من المشاريع السابقة. إن القدرة على إعادة استخدام العناصر تزيل الكثير من المتاعب من إزالة الأساسيات. يمكنك أيضًا تنزيل الملفات من هنا

الخطوة 2: صب العدسات - #fail

صب العدسات - #fail
صب العدسات - #fail
صب العدسات - #fail
صب العدسات - #fail
صب العدسات - #fail
صب العدسات - #fail

كانت العدسة هي أهم عنصر تصميم لهذا المصباح. لذلك تعاملت مع هذا أولاً لأنه بدون زجاج ذو مظهر أصيل لطيف ، كان المشروع يعمل. أقوم هنا بتوثيق الإخفاقات التي واجهتني في محاولتي تحقيق ذلك ، دون تحمل أنني قررت أيضًا في البداية صنع العدسة باللون الكهرماني. تأتي أضواء المدرج باللونين الكهرماني والأزرق ، وبعد أن بدأت في صنع اللون الكهرماني ، غيرت رأيي وقررت أنني أريد اللون الأزرق.

من بين ما يمكنني تحديده ، يتم استخدام الكهرمان في خط الانتظار ويتم استخدام الأزرق في خط المدرج ، وهذه هي تلك التي يبدو أنها الأكثر نموذجية التي تم العثور عليها إذا كنت تبحث عن أضواء المدرج. ومع ذلك ، فهذه هي محاولتي الأولى لصنع عدسة كهرمانية. لتصنيع العدسة ، كنت سأستخدم راتنج Clearcast مع مادة مضافة لونية ، وعلى الرغم من أنني قمت ببعض القوالب قبل أن أتساءل عما إذا كان من الممكن طباعة قالب ثلاثي الأبعاد واستخدامه. لذلك بدأت بصنع قالب مقسم ثلاثي الأبعاد وطباعته في PetG. الكميات الحكيمة من إطلاق القالب الذي كنت مقتنعاً به سيكون كافياً لإفشال العفن. كما اتضح مع المحاولتين ، جعلت الراتنج عالقًا في القالب مثل الغراء ولم يكن من الممكن فصلهما. على الرغم من أنني كنت أمتلك المقياس الكامل الذي كنت سأستخدمه ، فقد قررت عدم استخدامه وطبع العدسة لاستخدامها مع صب السيليكون التقليدي.

الخطوة 3: أنواع مختلفة من الراتنج

أنواع مختلفة من الراتنج
أنواع مختلفة من الراتنج
أنواع مختلفة من الراتنج
أنواع مختلفة من الراتنج
أنواع مختلفة من الراتنج
أنواع مختلفة من الراتنج
أنواع مختلفة من الراتنج
أنواع مختلفة من الراتنج

جانبا سريعًا ، استخدمت 3 أنواع من الراتنجات الشفافة / الملونة لهذا المشروع.

الأول كان نوع سوق هواية يسمى Pebeo - Gedeo ويباع عادة لتغليف العناصر الصغيرة ويستخدم للمجوهرات وأثقال الورق المكتبية وما إلى ذلك. وقد نجح هذا بشكل جيد وتم علاجه بشكل جيد في حوالي 24-36 ساعة. ومع ذلك ، فهي باهظة الثمن للغاية بالنسبة للمبلغ الذي تحصل عليه ، ولكنها سهلة الاستخدام ومتاحة بسهولة في متاجر الهوايات والحرف اليدوية. إنه مختلط بنسبة 2: 1. والثاني عبارة عن راتينج ملون مسبقًا يتم مزجه بنسبة 10: 1 مع مادة التقسية ، وقد استغرق هذا وقتًا أطول للشفاء ، حوالي أسبوع حتى نكون صادقين قبل أن يتم شفاؤه تمامًا. كان الأخير عبارة عن راتنج شفاف ، تم خلطه أيضًا بنسبة 2: 1 وتم علاجه في حوالي يومين ، يمكنك تلوين هذا بقطرات من الصباغ ، ولكن عليك التأكد من أنك تستخدم دائمًا نفس نسبة اللون إذا كنت يصنعون دفعات منفصلة. كما أنه يعمل بشكل أكثر فعالية من حيث التكلفة. أخيرًا ، كان 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: الطباعة ثلاثية الأبعاد والتحضير

الطباعة والتحضير ثلاثي الأبعاد
الطباعة والتحضير ثلاثي الأبعاد
الطباعة والتحضير ثلاثي الأبعاد
الطباعة والتحضير ثلاثي الأبعاد
الطباعة والتحضير ثلاثي الأبعاد
الطباعة والتحضير ثلاثي الأبعاد

تم تصميم النموذج بحيث يتم توصيل الجزء المركزي بالقاعدة. كان هذا لتجنب التقنيع أثناء عملية الطلاء. تمت طباعة النموذج بالكامل في Hatchbox ABS ثم تم صقله بالرمل. بدءًا من 60 حصى حتى 800 حصى تقريبًا ، أعطى سطحًا جيدًا بما يكفي لهذا الطراز.

الخطوة 6: التجميع والرسم

التجميع والرسم
التجميع والرسم
التجميع والرسم
التجميع والرسم
التجميع والرسم
التجميع والرسم

بمجرد أن يتم صقل المطبوعات ، يتم رسمها بعد ذلك ببعض المواد الأولية عالية البناء. غطى بالرمل قليلاً ثم رشه باللون الرمادي التمهيدي. تم طلاء الأجزاء الرئيسية باللون الأصفر من علامة فورد ، ثم تم طلاء أراضى البروكلي باللون الأخضر للقاعدة. تم بعد ذلك وضع اللمسات البارزة من الفضة الطامية على البراغي وبعض الكروم الفضي الحامض المستخدم على حامل العدسة.

الخطوة 7: البحث أولاً عن مستويات داخل منطقة إحاطة

مع فرز الأجهزة ، يلزم العمل على البرنامج. يوجد الآن موقعان يوفران تتبع الرحلات ، ولكن لا يوفر الكثير منها واجهة برمجة تطبيقات للوصول إلى تلك البيانات. البعض الذي يفعل ذلك ، لا يفعل ذلك إلا على أساس تجاري ولكن لحسن الحظ يوجد موقع واحد يسمى https://opensky-network.org يمكنك استخدامه مجانًا.

للوصول إلى هذه البيانات ، يجب عليك التسجيل ومن ثم يمكنك استخدام واجهة برمجة التطبيقات الخاصة بهم ، فهي توفر العديد من الوظائف والطرق لسحب البيانات. نحن مهتمون بجميع الرحلات الجوية داخل منطقة ولديهم دعوة Live API لذلك. https://opensky-network.org/apidoc/ يسمى الصندوق المحيط. يتطلب استدعاء API زوايا الصندوق التي تهتم بها بالطبع Lat / Lon كنقطة مركزية. يمكنك التحقق من عمل الرياضيات في هذا الموقع ، والذي يرسم مربعًا اعتمادًا على ما تكتبه. https://tools.geofabrik.de ولكن في الوقت الحالي يوفر النص التالي النقاط التي نحتاج إلى توصيلها بواجهة برمجة التطبيقات.

دالة get_bounding_box (خطوط الطول_في_الدولار $، 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 ؛ نصف القطر بالدولار = نصف القطر بالدولار * كوس (خط العرض بالدولار) ؛ lat_min = دولار Lat - دولار half_side_in_km / نصف قطر بالدولار ؛ lat_max $ = lat + $ half_side_in_km / نصف القطر بالدولار ؛ lon_min = $ lon - $ half_side_in_km / $allel_radius ؛ lon_max $ lon + $ half_side_in_km / $ المتوازي_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)؛

إذا كنت ترغب في اختبار الكود الخاص بك ، فهناك موقع يمكنك من خلاله إدخال خط العرض / الطول والاطلاع على النتائج على الخريطة: شاهد مثال الصندوق المحيط على الخريطة

الخطوة 8: حساب عنوان المستويات بالنسبة لنا

حساب عنوان الطائرات بالنسبة لنا
حساب عنوان الطائرات بالنسبة لنا

تعطينا النتائج من استدعاء واجهة برمجة التطبيقات للمربع المحيط قائمة بالطائرات وخط الطول / العرض والسرعة والارتفاع والعنوان. لذا فإن الشيء التالي الذي يتعين علينا القيام به هو الحصول على عنوان كل مستوى بالنسبة لنا حتى نتمكن من معالجة تلك التي تتجه على الأقل في اتجاهنا العام. يمكننا القيام بذلك كما نعرف موضعنا ويمكننا إيجاد الزاوية منا لكل مستوى.

للقيام بذلك ، أستخدم جزءًا من التعليمات البرمجية التي كانت في الأصل في جافا سكريبت ، لذا قمت بتحويلها هنا إلى PHP ،

* احسب (مبدئيًا) الاتجاه بين نقطتين * * من: دليل إد ويليامز للطيران ، 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؛

إذا كنت تريد إلقاء نظرة على الصفحة التي توجد بها إصدارات جافا سكريبت الأصلية ، فهذا هو الرابط:

ضمن هذا الرمز ، يمكنك أيضًا رؤية الإجراءات الفرعية المختلفة لكل نوع من أنواع الحسابات.

الخطوة 9: حساب التقاطع بالنظر إلى الدائرة

حساب التقاطع بالنظر إلى الدائرة
حساب التقاطع بالنظر إلى الدائرة

لذلك لدينا الآن مستوى حيث يكون الاتجاه بينه وبين موقعنا أقل من 90 (سواء كان موجبًا أو سالبًا) ، وهذا يعني أن هناك احتمالًا أن يطير بالقرب منه. باستخدام صيغة haversine ، يمكننا أيضًا معرفة استخدام Lon / Lat للطائرة و Lon / Lat لمنزلنا المسافة التي تبعدنا عنها.

بالنظر إلى الرسم التخطيطي ، إذا رسمنا دائرة حول منزلنا نصف قطرها حوالي 3 أميال ، فهذا يعطينا فرصة لرؤية أي شيء يطير فوقها. نحن نعلم الفرق في الاتجاه بيننا والمستوى ، ونعرف أيضًا مسافة الطائرة عنا حتى نتمكن بعد ذلك من حساب المثلث باستخدام SOHCAHTOA القديم الجيد ، وفي هذه الحالة باستخدام تان للزاوية يمكننا الحصول على طول الضلع المقابل. لذا ، إذا قارنا هذه القيمة بقيمة نصف قطر الدائرة حول المنزل ، يمكننا حينئذٍ معرفة ما إذا كانت الطائرة ستطير بالقرب من المنزل بما يكفي لرؤيتها. الشيء التالي الذي يمكننا القيام به هو معرفة الوقت الذي ستطير فيه الطائرة عبر استخدام سرعة الهواء والمسافة وإذا كان هذا أقل من قول حوالي 45 ثانية أو نحو ذلك فإننا نشغل الضوء. هذا جزء من الكود الذي أستخدمه لمعرفة فرصة الطيران. أفعل هذا لأن هناك مطارًا قريبًا وعندما تسير الطائرات حولها فإنها تشير حتماً إلى المنزل. ولكن نظرًا لأن ارتفاعها هو صفر والسرعة تسير بخطى سريعة ، فلا ينبغي أن يؤدي ذلك إلى إطلاق الإنذار.

دالة get_intercept ($ home_head، $ plane_head، $ plane_distance) {

$ flight_angle = القيمة المطلقة (القيمة المطلقة ($ home_head - $ plane_head) - 180) ؛ $ flight_angle_r = deg2rad ($ flight_angle)؛ $ flight_angle_t = tan ($ flight_angle_r) ؛ $ flight_intercept = $ flight_angle_t * $ plane_distance؛

إذا (($ 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). مع كل طائرة تظهر في السماء ، نسترجع تفاصيلها ونحدِّث عدادًا لإظهار عدد المرات التي تمت رؤيتها فيها.

أقوم حاليًا بتحرير قاعدة البيانات لتسليط الضوء على الطائرات التي أهتم بها. الطيور الحربية القديمة والطائرات الأخرى الممتعة المماثلة. بضع مرات هذا الصيف طارت ميغ 15. لذا فإن الهدف هو استخدام حقل تنبيه قمت بإضافته ثم وميض الضوء بسرعة عندما يتجه شيء مثير للاهتمام

الخطوة 12: تحسين النتائج والميزات الجديدة

تحسين النتائج والميزات الجديدة
تحسين النتائج والميزات الجديدة
تحسين النتائج والميزات الجديدة
تحسين النتائج والميزات الجديدة
تحسين النتائج والميزات الجديدة
تحسين النتائج والميزات الجديدة

لذلك من الناحية النظرية ، كل شيء يعمل بشكل جيد ، لكنك ستجد مع البيانات أن هناك طائرات تطير فوقها لا تظهر في واجهة برمجة التطبيقات.

هذا لأنه لا تستخدم جميع الطائرات جهاز الإرسال والاستقبال ADS-B وتستخدم أجهزة الإرسال والاستقبال القديمة القائمة على MLAT. للحصول على بيانات الموقع على الطائرات التي تستخدم MLAT ، يتطلب الأمر سلسلة من أجهزة الاستقبال على الأرض لتثليث موقعها ، كما أن بعض المواقع مثل flightradar24 لديها شبكة أكبر من المساهمين يقومون بذلك مقارنةً ب openky. نأمل بمرور الوقت أن تتحسن تغطيتهم أيضًا وأنا أقوم بإعداد مستقبل MLAT الخاص بي لإضافته إلى هذه البيانات.

الخطوة 13: قاعدة البيانات

لا تنسَ إذا كنت ستستخدم هذا ، فقد ترغب في إزالة عبارات SQL إذا لم يكن لديك قاعدة بيانات الطائرات وأيضًا إضافة قيمة Lon / Lat ومفتاح API للوصول إلى بيانات الرحلة.

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

تعريف ("INTERVAL" ، (20 * 1)) ؛ function fexp () {$ lat = "your latitude" ؛ $ 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 = microtime (صحيح) ؛ $ json = file_get_contents ($ flyurl) ؛ بيانات $ = json_decode ($ json، TRUE) ؛ الداخل = FALSE ؛ $ num_planes = count ($ data ['state'])؛ if (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؛ صدى صوت "------------------------------------------------ --------------------\ن"؛ صدى "$ icao24 - [$ country $ callign] عند [$ geo_altitude_m M - $ geo_altitude_f ft]"؛ صدى "[speed $ air_speed_kmh kmh and"، round ($ distplane، 1)، "km away] n"؛ صدى "[على عنوان"، round ($ plane_heading، 1)، "] [homeangle $eader_d]"؛ صدى "[$ latitude، $ longitude] n"؛ صدى "[flypast in"، decimal_to_time ($ plane_eta)، "now"، round ($ intercept، 1)، "km away / n"؛ صدى صوت "------------------------------------------------ --------------------\ن"؛ $ DBi = mysqli جديد ("127.0.0.1"، "root"، "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)؛ if (rows_getplanedata> 0) {do {echo "callsign ="؛ echo $ row_getplanedata ['تسجيل']؛ صدى "هو" ؛ echo $ row_getplanedata ['اسم المصنع'] ؛ صدى صوت " "؛ echo $ row_getplanedata ['model']؛ صدى "بواسطة" ؛ echo $ row_getplanedata ['Manufacturerericao']؛ صدى "ملك" ؛ echo $ row_getplanedata ['owner'] ؛ صدى "ينظر" ؛ echo $ row_getplanedata ['زيارة ']؛ صدى "مرات" ؛ صدى "تصنيف خاص =" ؛ echo $ row_getplanedata ['خاص']؛ صدى "\ n" ؛ الزيارات $ = $ row_getplanedata ['زيارة '] + 1 ؛ } while ($ row_getplanedata = mysqli_fetch_assoc ($ getplanedata)) ؛ mysqli_free_result ($ getplanedata)؛ $ sqli = "زيارات مجموعة قاعدة بيانات الطائرات المحدثة = زيارات $ حيث icao24 = '$ icao24'"؛ mysqli_set_charset ($ DBi، "utf8")؛ $ updateplanedata = mysqli_query ($ DBi، $ sqli) أو die (mysqli_error ($ DBi)) ؛ } else {echo "لا يمكن العثور على هذه الطائرة في قاعدة البيانات لذا إضافتها"؛ $ sqli = "إدراج في قاعدة بيانات الطائرات (icao24 ، الزيارات ، الخاصة) القيم ('$ icao24'، 1، 1)"؛ $ updateplanedata = mysqli_query ($ DBi، $ sqli) أو die (mysqli_error ($ DBi)) ؛ } صدى صوت "----------------------------------------------- ---------------------\ن"؛ } else {// echo "$ callsign" ؛ }}} else {echo "والسماء صافية / n"؛ } if ($ inbound) {echo "Inbound plane / n"؛ الأمر $ = "الخنازير w 17 1" ؛ execInBackground (الأمر $) ؛ } else {echo "no Flights / n"؛ الأمر $ = "الخنازير w 17 0" ؛ execInBackground (الأمر $) ؛ }} دالة decimal_to_time (عشري بالدولار) {تعويض $ = 0.002778؛ إذا ($ العشري> تعويض $) {$ عشري = $ عشري - 0.002778؛ } ساعات $ = gmdate ('H'، floor ($ عشري * 3600))؛ الدقائق بالدولار = gmdate ('i' ، الأرضية ($ عشري * 3600)) ؛ ثواني $ = gmdate ('s'، floor ($ عشري * 3600)) ؛ إرجاع str_pad ($ ساعة ، 2 ، "0" ، STR_PAD_LEFT). ":". str_pad ($ minutes، 2، "0"، STR_PAD_LEFT). ":". str_pad ($ ثانية ، 2 ، "0" ، STR_PAD_LEFT) ؛ } / * * احسب الاتجاه (الأولي) بين نقطتين * * من: وصفية طيران إد ويليامز ، 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 = tan ($ 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 ()) ؛ * حيث خطوط الطول 1 و 1 و 2 و 2 و 2 والنتيجة هي حقول النموذج * المصدر = 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 ($ longitude_in_degrees) ؛ نصف القطر بالدولار = 6371 ؛ # نصف قطر الموازي عند خط عرض معين ؛ نصف القطر بالدولار = نصف القطر بالدولار * كوس (خط العرض بالدولار) ؛ lat_min = دولار Lat - دولار half_side_in_km / نصف قطر بالدولار ؛ lat_max $ = lat + $ half_side_in_km / نصف القطر بالدولار ؛ lon_min = $ lon - $ half_side_in_km / $allel_radius ؛ lon_max $ lon + $ half_side_in_km / $ المتوازي_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) ؛ } وظيفة start () {echo "بدء / n"؛ الأمر $ = "الخنازير w 17 1" ؛ execInBackground (الأمر $) ؛ نشط $ = TRUE ؛ بينما ($ 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… يمكنك أن تقرأ عن إضافة مصباح طاقة هنا

موصى به: