Мазмуну:
- 1 -кадам: Дизайн
- 2 -кадам: Линзаларды чыгаруу - #ийгиликсиз
- 3 -кадам: Чайырдын ар кандай түрлөрү
- 4 -кадам: Линзаны силикон калыпка салуу #2
- 5 -кадам: 3D басып чыгаруу жана даярдоо
- 6 -кадам: Монтаждоо жана сүрөт тартуу
- 7 -кадам: Адегенде чек аранын ичиндеги учактарды табыңыз
- 8 -кадам: Бизге байланыштуу учактардын башын эсептөө
- 9 -кадам: Чөйрөгө карап кесүүнү эсептөө
- 10 -кадам: Картадагы эки чекиттин ортосундагы аралык - Haversine формуласы
- 11 -кадам: Импорттоо жана учактын маалымат базасын аныктоо
- 12 -кадам: Натыйжаларды жана жаңы функцияларды жакшыртуу
- 13 -кадам: Codebase
- 14 -кадам: Светодиоддун жана Өчүрүү которгучунун зымдары
Video: Эрте эскертүү Raspberry PI Учуу тилкесинин жарыгы Учуу карталарын колдонуу: 14 кадам (Сүрөттөр менен)
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:40
Бул чырак бир нече себептерден улам келип чыккан, анткени мен дайыма үстүндө учкан учактарга кызыгам, ал эми жай мезгилинде дем алыш күндөрү айланасында учуп бараткан абдан кызыктуу нерселер болот. Өткөндө эле аларды уккусу келет. Дагы бир себеби, Лондон Сити аэропортунан кетүүчү учактардын учуу жолу кээде угулуп калат окшойт жана алар абдан ызы -чуу менен учуп жатышат. Мен YouTube үчүн кээ бир видеолорду жазып жатканымда, учактын ызы -чуусунан улам жазууну кырып салуу абдан кыжырды келтирет. Ошентип, сиз flyhtradar24 сыяктуу сайттарда көргөн маалыматтар жалпыга жеткиликтүүбү деп ойлондум, ачкандан кийин окшош нерсе бар экенин ачкандан кийин, эскертүүчү чырак жарыкка чыкты. Долбоорду жайгаштыруу үчүн учуу -конуу тилкесинин жарыгынын көчүрмөсүн колдонуу идеясын ойлоп табууга көп убакыт кеткен жок.
The OpenSky Network жөнүндө көбүрөөк маалыматты https://www.opensky-network.org сайтынан таба аласыз, мен дагы бул жолу тунук PLAны колдонуунун ордуна жакшы чайыр линзасын жасоону кааладым жана менде ADS-B рецепиери бар болчу. бул жөнөкөй жана арзан. ADS-Bге антенна да керек жана бул офистин текчесинде лампанын иштешине жол бербейт. Ошентип, сиз 3D басып чыгарууну, чайырды калыптандырууну жана математиканы камтыгандыктан, курулушту кызыктуу деп табасыз деп үмүттөнөбүз, ошондой эле потенциалдуу ашыкча өтүшү мүмкүн болгон учактардын позицияларын экстраполяциялоо үчүн.
1 -кадам: Дизайн
Google издөө учуу -конуу тилкесинин чырагынын ар кандай конструкциялары менен келет жана анын дизайны чыныгы лампалардын ар кандай маркаларынын дизайн таасирлерин колдонуу менен жасалган. Ошондой эле толук көлөмдө эмес, бөлмөдө же текчеде отуруу масштабдуу, анткени алар чыныгы жашоодо бир топ чоңураак.
Дизайндар Fusion 360та түзүлгөн жана мен мурунку долбоорлордон малина pi нөл кармагычы сыяктуу мурунку элементтерди импорттоп алгам. Элементтерди кайра колдоно билүү, негиздерди түшүрүүдөн көп баш ооруну талап кылат. Файлдарды бул жерден жүктөп алсаңыз болот
2 -кадам: Линзаларды чыгаруу - #ийгиликсиз
Бул чырактын эң маанилүү дизайн элементи линза болмокчу. Ошентип, мен муну биринчи жолу чечтим, анткени чыныгы оригиналдуу стакан жок, долбоор иштей баштады. Мен бул жерге жетүү үчүн болгон ийгиликтеримди документтештирип жатам, бирок мен линзаны янтарь жасоону чечтим. Учуу -конуу тилкесинин жарыктары янтарь менен көк түстө болот жана мен янтарь жасап баштагандан кийин гана оюмду өзгөртүп, көк чыракты каалаганымды чечтим.
Мен эмнени түшүнсөм болот, янтарьлар холдинг линиясында колдонулат, ал эми көк түстөр учуу тилкесин бойлото колдонулат, жана булар, эгер сиз учуу -конуу тилкесинин чырактарын издесеңиз, архетиптик окшоштор. Бирок, бул жерде янтарь линзасын жасоого болгон биринчи аракетим. Объективти жасоо үчүн мен түстүү кошулмасы бар тунук чайырды колдонмокчумун, бирок мен 3D калыпты басып чыгаруу жана аны колдонуу мүмкүнбү деп ойлогонго чейин бир нече калыптарды жасаган болчумун. Ошентип мен 3D форматында бөлүү формасын жасап, аны PetGде басып чыгаруу менен баштадым. Көгөрүп кетүүнүн акылга сыярлык өлчөмдөрү, мен көктү чачуу үчүн жетиштүү болоруна ишендим. Белгилүү болгондой, бир нече аракет менен мен чайырды желимге окшоп калып калдым жана аларды бөлүп кароо мүмкүн эмес окшойт. Менде колдоно турган толук масштабдуу болгону менен, мен каршы болуп, линзаны салттуу силикон менен калыптоо үчүн басып чыгардым.
3 -кадам: Чайырдын ар кандай түрлөрү
Тез эле, мен бул долбоор үчүн ачык/түстүү чайырлардын 3 түрүн колдондум.
Биринчиси Pebeo - Gedeo деп аталган Хобби базарынын түрү болчу жана адатта майда нерселерди капсулдоо үчүн сатылат жана зергердик буюмдар жана стол кагаздары үчүн колдонулат. Бул абдан жакшы иштеген жана болжол менен 24-36 саатта жакшы айыгып кеткен. Бул сиз алган сумма үчүн абдан кымбат, бирок ыңгайлуу жана хобби жана кол өнөрчүлүк дүкөндөрүндө оңой жеткиликтүү. Бул 2: 1 катышында аралаштырылган. Экинчиси, катуулатуучу менен 10: 1 катышында аралаштырылган алдын ала түстүү чайыр болчу жана бул толугу менен айыкканга чейин, чынчыл болуу үчүн, бир жумага чейин эң узак убакыт бою айыккан. Акыркысы так чайыр болчу, ал дагы 2: 1 катышында аралаштырылган жана ал 2 күндүн ичинде айыгат, муну пигменттин тамчылары менен боёсоңуз болот, бирок эгерде сиз дайыма эле түс катышын колдонушуңуз керек. өзүнчө партияларды жасап жатышат. Ошондой эле эң үнөмдүү иштейт. Акырында, калып үчүн RTV GP-3481 RTV болчу жана аны орнотуу үчүн болжол менен 24 саат талап кылынат жана казандын узак убакыты бар, ошондуктан аны аралаштырып, анан куюуга көп убактыңыз бар.
Учурда менде бош идиш жок (учурда заказ боюнча), ошондо сиз формада да, чайырда да көбүкчөлөрдүн астында каласыз. Бул өтө көп маселе эмес, бирок ачык линза же ушуга окшош болсо, анда көбүкчөлөрдү аралашмадан чыгаруу үчүн кандайдыр бир жол менен ойлонуп көргүңүз келет.
4 -кадам: Линзаны силикон калыпка салуу #2
Ошентип, бул Чайыр линзаны жасоонун экинчи аракети жана биринчи этап Fusion 360та линзаны жасоо, андан кийин аны ABSде басып чыгаруу жана аны кармоо үчүн чака болгон. Бул калып үчүн мурунку болмок жана колдонулуучу силикон көлөмүн сактоого жардам берет. Сиз муну картадан оңой жасай аласыз, бирок бул башкача мамиле. Көктөн бошонууга жакшы мүмкүнчүлүк берүү үчүн мен аны алгач лактап, андан кийин мом чыгаруучу каражатты жакшы каптадым.
Мен андан кийин 27 RTV жээгинде болгон GP-3481ди куюп, андан кийин аны кайра түшүрүү алдында кийинки 24 саатта орнотууга уруксат бердим. Муну жасагандан кийин мен 2: 1 пропорциясында түстүү пигменттин 4/5 тамчысын аралаштырган тунук чайырды колдондум жана аны жакшы төрт мүнөт жакшы аралаштырдым. Муну формага куюп, андан кийин чыракка же светодиод үчүн боштукту камсыз кылуу үчүн чайырдын ичине бир стакан койду. Болжол менен 24 сааттан кийин бул чайыр алып салууга даяр жана линза абдан жакшы чыкты. Бул жерде аба көбүкчөлөрү бар, бирок азырынча менде чайырды төгүүдөн мурун газсыздандыруучу вакуумдук идиш жок.
5 -кадам: 3D басып чыгаруу жана даярдоо
Модель борбордук бөлүк базага туташтырылган түрдө иштелип чыккан. Бул сырдоо процессинде маскировкадан качуу үчүн болгон. Бүт модель Hatchbox ABSте басылып, андан кийин кумдалган. 60 грит менен башталып, болжол менен 800 гриттен баштап, бул модель үчүн жетишерлик жакшы жерди берди.
6 -кадам: Монтаждоо жана сүрөт тартуу
Басылмалар кумдалгандан кийин, кээ бир бийик курулуш праймери менен боёлгон. Бир аз кумдалган, анан боз праймер менен чачылган. Негизги бөлүктөр форд сигналына сары түскө боёлгон, андан кийин база үчүн колдонулган жашыл брукланддар. Тамия күмүштүн өзгөчөлүктөрү болттарга жана линзанын кармагычында колдонулган кээ бир молотовый күмүш хромдорго колдонулду.
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 = $ радиусу*cos ($ лат); $ lat_min = $ lat - $ half_side_in_km/$ радиусу; $ lat_max = $ lat + $ half_side_in_km/$ radius; $ 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ге айландырдым, * эсептөө (баштапкы) эки чекиттин ортосундагы * * тартып: Эд Уильямстын Авиация Формуляры, https://williams.best.vwh.net/avform.htm#Crs * source = instantglobe.com/CRANES/GeoCoordTool.html */ get_bearing функциясы ($ home_lat, $ home_lon, $ plan_lat, $ plan_lon) {$ lat1 = deg2rad ($ home_lat); $ lat2 = deg2rad ($ plan_lat);
$ dLon = deg2rad ($ flat_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дон азыраак (оң же терс), демек, анын жакын жерден учуп кетүү мүмкүнчүлүгү бар дегенди билдирет. Гаверсин формуласын колдонуу менен биз учактын Лон/Латын жана үйүбүздүн Лон/Латын бизден алыс аралыкта колдонуп иштей алабыз.
Диаграмманы карасак, эгер биз үйүбүздүн тегерегиндеги тегеректи 3 километрдей радиуста тартсак, бул бизге үстүнөн учуп бара жаткан нерсени көрүүгө мүмкүнчүлүк берет. Биз учак менен биздин ортобуздагы айырмачылыкты билебиз, ошондой эле бизден учактын алыстыгын билебиз, ошондо жакшы эски SOHCAHTOAнын жардамы менен үч бурчтукту иштеп чыга алабыз жана бул учурда бурчтун Танын колдонуп, карама -каршы тараптын узундугу. Ошентип, эгерде биз бул маанини үйдүн тегерегиндеги радиустун маанисине салыштырсак, анда учак биз көрө ала тургандай жакын учуп кетээрин биле алабыз. Биз кыла турган кийинки нерсе - бул учактын аба ылдамдыгын жана аралыкты колдонуу менен учуп өтө турган убактысын иштеп чыгуу, эгерде бул 45 секунддан аз болсо, анда биз жарыкты күйгүзөбүз. Бул мен учуп кетүү мүмкүнчүлүгүн иштеп чыгуу үчүн колдонгон коддун бир аз бөлүгү. Мен муну жакын жердеги аэропорт бар болгондуктан жасайм жана учактар такси менен айланып баратканда сөзсүз түрдө үйдү көрсөтүшөт. Бирок, алардын бийиктиги нөлгө барабар жана ылдамдык ылдамдыкта бараткандыктан, бул сигнализацияны иштетпеши керек.
get_intercept функциясы ($ home_head, $ flat_head, $ flat_distance) {
$ flight_angle = abs (abs ($ home_head - $ təyyarə_баш) - 180); $ flight_angle_r = deg2rad ($ flight_angle); $ flight_angle_t = tan ($ flight_angle_r); $ flight_intercept = $ flight_angle_t * $ plan_distance;
if (($ flight_angle <90) && ($ flight_intercept <3)) {// мүмкүн учуп кетүү
}
$ flight_intercept кайтаруу;
}
10 -кадам: Картадагы эки чекиттин ортосундагы аралык - Haversine формуласы
Ошентип, биз учак менен жайгашкан жерибиздин ортосундагы аралыкты эсептеп чыгышыбыз керек. Картадагы кыска аралыктарда болжол менен аралыкты эсептеп алса болот, бирок жер тоголок болгондуктан, ийри беттин эске алынышына мүмкүнчүлүк берген haversine формуласы деп аталган формула бар. Формуланы андан ары окуй аласыз:
Эми эсептелген аралык жана учактын аба ылдамдыгын билүү менен, учактын үстү ачылганга чейин канча секунд болорун аныктай алабыз. Ошентип, учуу 30 секунда ичинде бир нерсе болсо, жарык жанат жана биз акыры эскертүүчү жарыгыбызга ээ болобуз.
* 0n JSке негизделген instantglobe.com/CRANES/GeoCoordTool.html жана PHPге айланды */
get_distHaversine функциясы ($ home_lat, $ home_lon, $ plan_lat, $ plan_lon) {$ R = 6371; // жердин орточо радиусу км менен $ dLat = deg2rad ($ plan_lat- $ home_lat); $ dLon = deg2rad ($ flat_lon- $ home_lon); $ lat1 = deg2rad ($ home_lat); $ lat2 = deg2rad ($ plan_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). Ар бир учак үстүндө пайда болгондо, биз анын деталдарын алып, канча жолу көрүлгөнүн көрсөтүү үчүн эсептегичти жаңыртып турабыз.
Мен дагы учурда кызыкдар болгон учактарды бөлүп көрсөтүү үчүн маалымат базасын түзөтүп жатам. Негизинен эски согуштук куштар жана башка ушул сыяктуу кызыктуу учактар. Бул жайда бир нече жолу Миг-15 учуп кеткен. Ошентип, мен кошкон эскертүү талаасын колдонуп, андан кийин кызыктуу нерсе келе жатканда жарыкты тез күйгүзүү
12 -кадам: Натыйжаларды жана жаңы функцияларды жакшыртуу
Ошентип, теорияда баары жакшы иштейт, бирок сиз APIде көрүнбөгөн, үстүнөн учкан учактар бар экенин таба аласыз.
Себеби, бардык эле учактар ADS-B транспондерин колдонушпайт жана MLATтин негизинде эски транспондерлерди колдонушпайт. MLATты колдонгон аба кемесинин позициясы жөнүндө маалыматтарды алуу үчүн, алардын позициясын үч бурчтуу үчүн жерде бир катар кабыл алгычтар керек жана флихтрадар24 сыяктуу кээ бир сайттар openkyге салыштырмалуу муну жасоочулардын чоң тармагына ээ. Убакыттын өтүшү менен алардын камтуусу жакшырат жана мен бул маалыматка кошуу үчүн өзүмдүн 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 ($ лат, $ lon, $ side); $ latmin = $ кутуча [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 (true); $ json = file_get_contents ($ flyurl); $ data = json_decode ($ json, TRUE); $ inbound = FALSE; $ num_planes = count ($ data ['state']); if ($ num_planes> 0) {echo "жана биз $ num_planes учактарын көрө алабыз / n"; үчүн ($ x = 0; $ x 0) {$ təyyarə_ета = $ дистанция/$ air_speed_kmh; } else {$ eta = 1; } if ((($ intercept) 0)) && ($ distplane0) {$ inbound = TRUE; жаңырык "------------------------------------------------ -------------------- / n "; echo "$ icao24 - [$ country $ callsign] [$ geo_altitude_m M - $ geo_altitude_f ft]"; echo "[speed $ air_speed_kmh kmh and", round ($ distplane, 1), "км алыс] n"; echo "[аталышында", тегерек ($ учак_баш, 1), "] [homeangle $ heading_d]"; echo "[$ latitude, $ longitude] n"; echo "[flypast in", decimal_to_time ($ air_eta), "now", round ($ intercept, 1), "км алыс / 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) же өлүү (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 "бул"; echo $ row_getplanedata ['Manufacturing']; жаңырык ""; echo $ row_getplanedata ['model']; echo "by"; echo $ row_getplanedata ['Manufacturicao']; echo "таандык"; echo $ row_getplanedata ['ээси]; echo "көрүлгөн"; echo $ row_getplanedata ['visit']; echo "times"; echo "special rating ="; echo $ row_getplanedata ['special']; echo "\ n"; $ зыярат = $ row_getplanedata ['виза']+1; } while ($ row_getplanedata = mysqli_fetch_assoc ($ getplanedata)); mysqli_free_result ($ getplanedata); $ sqli = "UPDATE авиабазасынын SET баруулары = $ зыяраттары кайда icao24 = '$ icao24'"; mysqli_set_charset ($ DBi, "utf8"); $ updateplanedata = mysqli_query ($ DBi, $ sqli) же өлүү (mysqli_error ($ DBi)); } else {echo "Бул учак ДБда табылган жок, андыктан аны кошуу"; $ sqli = "INSERT INTO авиабазасына (icao24, баруулар, өзгөчө) БААЛЫКТАР ('$ icao24', 1, 1)"; $ updateplanedata = mysqli_query ($ DBi, $ sqli) же өлүү (mysqli_error ($ DBi)); } жаңырык "----------------------------------------------- --------------------- / n "; } else {// echo "$ callsign"; }}} else {echo "жана асман ачык / n"; } if ($ inbound) {echo "Кирүүчү учак / n"; $ command = "чочколор w 17 1"; execInBackground ($ command); } else {echo "кирүүчү каттамдар жок / n"; $ command = "чочколор w 17 0"; execInBackground ($ command); }} function decimal_to_time ($ decimal) {$ offset = 0.002778; if ($ decimal> $ offset) {$ decimal = $ decimal - 0.002778; } $ саат = gmdate ('H', кабат ($ ондук * 3600)); $ мүнөт = gmdate ('i', кабат ($ ондук * 3600)); $ seconds = gmdate ('s', floor ($ decimal * 3600)); str_pad кайтаруу ($ саат, 2, "0", STR_PAD_LEFT). ":". str_pad ($ мүнөт, 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 */ get_bearing функциясы ($ home_lat, $ home_lon, $ plan_lat, $ təyyarə_лон) {$ lat1 = deg2rad ($ home_lat); $ lat2 = deg2rad ($ plan_lat); $ dLon = deg2rad ($ flat_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, $ flat_head, $ plan_distance) {$ flight_angle = abs (abs ($ home_head - $ təyyarə_баш) - 180); $ flight_angle_r = deg2rad ($ flight_angle); $ flight_angle_t = tan ($ flight_angle_r); $ flight_intercept = $ flight_angle_t * $ plan_distance; $ flight_intercept кайтаруу; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *// * * Haversine формуласын колдонуу менен * кеңдик/узундук (сандык даражада) * * тарабынан көрсөтүлгөн эки чекиттин ортосундагы аралыкты (км менен) эсептөө: Haversine формуласы - RWСиннотт, "Гаверсинанын артыкчылыктары", * Асман жана Телескоп, том 68, № 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, $ plan_lat, $ plan_lon) {$ R = 6371; // жердин орточо радиусу км менен $ dLat = deg2rad ($ plan_lat- $ home_lat); $ dLon = deg2rad ($ flat_lon- $ home_lon); $ lat1 = deg2rad ($ home_lat); $ lat2 = deg2rad ($ plan_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 кайтаруу; } function get_bounding_box ($ latitude_in_degrees, $ longitude_in_degrees, $ half_side_in_miles) {$ half_side_in_km = $ half_side_in_miles * 1.609344; $ lat = deg2rad ($ latitude_in_degrees); $ lon = deg2rad ($ longitude_in_degrees); $ радиусу = 6371; # Берилген кеңдиктеги параллелдин радиусу; $ parallel_radius = $ радиусу*cos ($ лат); $ lat_min = $ lat - $ half_side_in_km/$ радиусу; $ lat_max = $ lat + $ half_side_in_km/$ radius; $ 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 () {// толугу менен кошумча кайтаруу (ЧЫН); } function start () {echo "Start / n"; $ command = "чочколор w 17 1"; execInBackground ($ command); $ активдүү = ЧЫН; while ($ active) {usleep (1000); // милдеттүү эмес, эгер сиз көңүл бурууну кааласаңыз (microtime (true)> = $ nextTime) {fexp (); $ nextTime = microtime (true) + INTERVAL; } $ активдүү = checkForStopFlag (); }} fexp (); баштоо (); ?>
14 -кадам: Светодиоддун жана Өчүрүү которгучунун зымдары
Бул долбоордун зымдары чындыгында жөнөкөй болушу мүмкүн эмес. 270R каршылыгы бар 17 пинге жана жерге туташтырылган бир эле LED бар.
Мен ошондой эле өчүрүү жана күйгүзүү баскычын, ошондой эле TXd маалымат пинин өчүрүп турган LEDди кошо камтыйм. Https://github.com/Howchoo/pi-power-button.git https://howchoo.com/g/mwnlytk3zmm/how-to- сайтынан өчүрүү функциясы жана керектүү код жөнүндө көбүрөөк окуй аласыз. add-a-pow … Күч жарыгын кошуу жөнүндө бул жерден окуй аласыз
Сунушталууда:
Neopixel Ws2812 Rainbow LED жарыгы M5stick-C - менен Rainbowту Neopixel Ws2812де иштетүү M5stack M5stick Cди колдонуу Arduino IDEди колдонуу: 5 кадам
Neopixel Ws2812 Rainbow LED Glow with M5stick-C | Rainbow боюнча Neopixel Ws2812де чуркоо M5stack M5stick Cди колдонуу Arduino IDEди колдонуу: Салам балдар бул көрсөтмөлөрдө биз неопиксел ws2812 светодиоддорун же LED тилкесин же LED матрицасын же LED шакегин m5stack m5stick-C өнүктүрүү тактасы менен Arduino IDE менен колдонууну үйрөнөбүз жана биз жасайбыз. аны менен асан -үсөн үлгүсү
Макей Макей - Катуу шамал үчүн эрте эскертүү системасы: 5 кадам
Макей Макей - Катуу шамал үчүн эрте эскертүү системасы: Бул " эрте эскертүү системасы " дизайн боюнча студенттердин тобуна тапшырма берилет. Максаты - студенттер тобу (ар бир топко эки же үчөө) адамдарды коркунучтуу болуп жаткан шамалдан баш калкалоону издей турган системаны иштеп чыгуу
Ретро LED тилкесинин аудио визуализатору: 4 кадам (сүрөттөр менен)
Ретро LED Strip Audio Visualizer: Музыкант жана электротехниканын студенти катары мен ушул эки талааны кесип өткөн долбоорду жакшы көрөм. Мен кээ бир DIY аудио визуализаторлорун көрдүм (бул жерде, бул жерде, бул жерде жана бул жерде), бирок алардын ар бири мен үчүн койгон эки максаттын жок дегенде бирин өткөрүп жиберишти: p
Интимдик видео жарыгы/ портативдүү фотография жарыгы: 7 кадам (сүрөттөр менен)
Интимдик видео жарыгы/ портативдүү фотография жарыгы: мен эмнени ойлоп жатканыңды билем. By " интимдик " Мен кыйын жарык шарттарда жакынкы жарыктандырууну айткам-бул сөзсүз түрдө " интимдик жагдайлар " үчүн эмес. (Бирок, бул үчүн да колдонсо болот …) Нью-Йорктун видеографы катары-же
Arduino магниттик тилкесинин декодери: 4 кадам (сүрөттөр менен)
Arduino магниттик тилкенин декодери: Бул көрсөтмө эркин жеткиликтүү кодду, ардуинону жана стандарттык магниттик тилке окурманды кантип колдонуу керектигин көрсөтүп турат, мисалы, кредиттик карталар, студенттик билеттер ж. муну кийин жаз