Съдържание:

Ранно предупреждение Raspberry PI Light за пистата, използвайки данни за картографиране на полета: 14 стъпки (със снимки)
Ранно предупреждение Raspberry PI Light за пистата, използвайки данни за картографиране на полета: 14 стъпки (със снимки)

Видео: Ранно предупреждение Raspberry PI Light за пистата, използвайки данни за картографиране на полета: 14 стъпки (със снимки)

Видео: Ранно предупреждение Raspberry PI Light за пистата, използвайки данни за картографиране на полета: 14 стъпки (със снимки)
Видео: Leap Motion SDK 2024, Юли
Anonim
Ранно предупреждение Raspberry PI Light за пистата, използвайки данни за картографиране на полета
Ранно предупреждение Raspberry PI Light за пистата, използвайки данни за картографиране на полета
Ранно предупреждение Raspberry PI Light за пистата, използвайки данни за картографиране на полета
Ранно предупреждение Raspberry PI Light за пистата, използвайки данни за картографиране на полета
Ранно предупреждение Raspberry PI Light за пистата, използвайки данни за картографиране на полета
Ранно предупреждение Raspberry PI Light за пистата, използвайки данни за картографиране на полета
Ранно предупреждение Raspberry PI Light за пистата, използвайки данни за картографиране на полета
Ранно предупреждение Raspberry PI Light за пистата, използвайки данни за картографиране на полета

Тази лампа се появи по няколко причини, тъй като винаги се интересувам от самолетите, които летят над главата и през лятото през уикендите често наоколо летят някои доста вълнуващи. Въпреки че сте склонни да ги чувате само когато минават. Другата причина е, че изглежда, че пътят на полета за изходящи самолети от летище Лондон Сити понякога ще бъде чут и те имат доста шумни полети. Тъй като се занимавам със записването на някои видеоклипове за YouTube, наистина е досадно да пренебрегвам запис поради шумен самолет. Затова се чудех дали данните, които виждате на сайтове като flightradar24, са публично достъпни, след като открих, че нещо подобно е налично от opensky network, се е родила лампата за ранно предупреждение. Не отне много време, за да дойде тогава идеята да се използва реплика на светлина за пистата, за да се помести проекта.

Можете да научите повече за мрежата OpenSky на 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

Image
Image
Леене на обектива в силиконова форма №2
Леене на обектива в силиконова форма №2
Леене на обектива в силиконова форма №2
Леене на обектива в силиконова форма №2

Така че това е вторият опит да се направи леща от смола, а първият етап беше да се направи и обектив във Fusion 360 и след това да се отпечата в ABS, както и кофа, която да го държи. Това би било първото за матрицата и помага да се намали количеството силикон, който трябва да се използва. Можете лесно да направите това от карта, но това е просто различен подход. За да му дам по -голям шанс да бъде освободен от формата, първо го лакирах и след това му дадох добро покритие от восъчно отделящо средство.

След това излях малко GP-3481, което е около RTV на брега 27 и след това го оставих да се втвърди през следващите 24 часа преди демонтиране. След като това беше направено, използвах бистрата смола, смесена в съотношение 2: 1 с около 4/5 капки оцветен пигмент и го разбърках добре за добри четири минути. Изсипете това във формата и след това поставете изстреляно стъкло в смолата, за да осигурите по -късно празнота за лампа или светодиоди. След около 24 часа тази смола беше готова за отстраняване и лещата излезе доста добре. Има въздушни мехурчета, но все още нямам вакуумен съд, който да дегазира смолата преди изливането.

Стъпка 5: 3D печат и подготовка

3D печат и подготовка
3D печат и подготовка
3D печат и подготовка
3D печат и подготовка
3D печат и подготовка
3D печат и подготовка

Моделът е проектиран по начин, че централната секция се включва в основата. Това е необходимо, за да се избегне маскиране по време на процеса на боядисване. Целият модел е отпечатан в Hatchbox ABS и след това е шлифован. Започвайки от 60 зърна до около 800 зърна, даде достатъчно добро покритие за този модел.

Стъпка 6: Монтаж и боядисване

Монтаж и боядисване
Монтаж и боядисване
Монтаж и боядисване
Монтаж и боядисване
Монтаж и боядисване
Монтаж и боядисване

След като отпечатъците са шлифовани, той е боядисан с грунд с висока конструкция. Леко шлифован и след това напръскан в сив грунд. Основните части бяха боядисани в форд сигнално жълто, а след това за основата бяха използвани зелени русла. след това върху болтовете бяха нанесени акценти от сребро tamiya, а върху държача на обектива - малко сребърен хром molotow.

Стъпка 7: Първо намерете самолети в граница

С подреждането на хардуера трябваше да се работи по софтуера. Сега има няколко сайта, които осигуряват проследяване на полети, но не много, които предоставят API за достъп до тези данни. Някои, които го правят, го правят само на търговска основа, но за щастие има един сайт, наречен https://opensky-network.org, който можете да използвате безплатно.

За достъп до тези данни трябва да се регистрирате и след това можете да използвате техния API, той предоставя няколко функции и начини за изтегляне на данните. Интересуваме се от всички полети в рамките на дадена зона и те имат обаждане на 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); $ 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);

Ако искате да тествате кода си, има сайт, където можете да въведете ширина/дължина и да видите резултатите на картата: Вижте пример за ограничаваща кутия на картата

Стъпка 8: Изчисляване на посоката на равнините във връзка с нас

Изчисляване на посоката на равнините във връзка с нас
Изчисляване на посоката на равнините във връзка с нас

Резултатите от извикването на API за ограничаващата кутия ни дават списък със самолети, техните дължина/ширина, скорост, надморска височина и посока. Така че следващото нещо, което трябва да направим, е да получим заглавието на всяка равнина по отношение на нас, за да можем допълнително да обработим тези, които поне се насочват в нашата обща посока. Можем да направим това, тъй като знаем позицията си и можем да определим ъгъла от нас към всяка равнина.

За да направя това, използвам парче код, от който първоначално беше в Javascript, така че го преобразувах тук в 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;

Ако искате да разгледате страницата, където са оригиналните версии на JavaScript, това е връзката:

в този код можете също да видите различните подпрограми за всеки тип изчисление.

Стъпка 9: Изчисляване на прихващане, като погледнете кръг

Изчисляване на прихващане чрез гледане на кръг
Изчисляване на прихващане чрез гледане на кръг

Така че сега имаме самолет, в който лагерът между него и нашето местоположение е по -малък от 90 (положителен или отрицателен) и това означава, че има шанс той да лети в близост. Използвайки формулата на хаверсина, ние също можем да определим, използвайки Lon/Lat на равнината и Lon/Lat на нашата къща, разстоянието, което е далеч от нас.

Гледайки диаграмата, ако начертаем кръг около къщата си с радиус около 3 мили, това ни дава шанс да видим каквото и да прелита. Ние знаем разликата в посоката между равнината и нас, ние също знаем разстоянието на равнината от нас, за да можем след това да определим триъгълника, използвайки добрия стар SOHCAHTOA, и в този случай, използвайки Tan на ъгъла, можем да получим противоположна дължина на страната. Така че, ако сравним тази стойност с стойността на радиуса на кръга около къщата, можем да разберем дали самолетът ще лети достатъчно близо, за да го видим. Следващият момент, който можем да направим, е да определим времето, през което самолетът ще мине, като използваме скоростта на въздуха и разстоянието и ако това е по -малко от да речем около 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: Разстояние между две точки на картата - Формула на хавърсин

Разстояние между две точки на картата - Формула на Хавърсин
Разстояние между две точки на картата - Формула на Хавърсин

Така че трябва да изчислим разстоянието между самолета и нашето местоположение. На къси разстояния на картата можете приблизително да изчислите разстоянието, но тъй като земята е сферична, има формула, наречена формула на хаверсина, която ви позволява да вземете предвид извитата повърхност. Можете да прочетете допълнително формулата:

Сега с изчисленото разстояние и знаем скоростта на въздуха на самолета можем да изчислим колко секунди ще бъде, преди самолетът да е отгоре. Така че светлината ще светне, ако има нещо в рамките на 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: Импортиране и дефиниране на равнинната база данни

Едно от другите парчета е, че отвореният сайт предлага база данни за самолети за изтегляне заедно с техните позивни и идентичности. Нейните няколкостотин хиляди записи. Така че можем да изтеглим това и да го заредим локално в база данни MariaDB за търсене (MySQL). С всеки самолет, който се появява над нас, ние извличаме неговите данни и актуализираме брояч, за да покажем колко пъти е бил видян.

В момента също редактирам базата данни, за да подчертая интересуващите ме самолети. Предимно стари бойни птици и други подобни интересни самолети. Няколко пъти това лято Миг-15 прелиташе. така че целта е да използвам поле за предупреждение, което добавих, и след това бързо да мига светлината, когато нещо интересно се насочва

Стъпка 12: Подобряване на резултатите и нови функции

Подобряване на резултатите и нови функции
Подобряване на резултатите и нови функции
Подобряване на резултатите и нови функции
Подобряване на резултатите и нови функции
Подобряване на резултатите и нови функции
Подобряване на резултатите и нови функции

Така че на теория всичко работи доста добре, но с данните ще откриете, че има самолети, които прелитат над тях, които не се появяват в API.

Това е така, защото не всички самолети използват ADS-B транспондер и използват по-стари транспондери, базирани на MLAT. За да се получат данни за местоположението на самолети, използващи MLAT, са необходими редица приемници на земята, за да триангулират тяхната позиция, а някои сайтове като flightradar24 имат по -голяма мрежа от сътрудници, които правят това в сравнение с opensky. Надявам се с течение на времето тяхното покритие също да се подобри и аз настройвам свой собствен MLAT приемник, за да добавя към тези данни.

Стъпка 13: Кодова база

Не забравяйте, че ако ще използвате това, може да искате да премахнете SQL изразите, ако нямате база данни със самолети, а също така да добавите своя собствена дължина/ширина и API ключ за достъп до данните за полета.

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

define ("ИНТЕРВАЛ", (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 = microtime (вярно); $ json = file_get_contents ($ flyurl); $ данни = json_decode ($ json, TRUE); $ inbound = FALSE; $ num_planes = count ($ данни ['състояния']); 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 $ позивна] на [$ geo_altitude_m M - $ geo_altitude_f ft]"; ехо "[скорост $ air_speed_kmh kmh и", кръгла ($ distplane, 1), "km away] n"; ехо "[на заглавие на", кръг ($ plane_heading, 1), "] [homeangle $ heading_d]"; ехо "[$ latitude, $ longitude] n"; ехо "[flypast in", decimal_to_time ($ plane_eta), "now", кръгъл ($ intercept, 1), "km away / n"; ехо "------------------------------------------------ --------------------\н"; $ DBi = нов mysqli ("127.0.0.1", "root", "вашата парола", "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 "callign ="; echo $ row_getplanedata ['регистрация']; ехо "е a"; echo $ row_getplanedata ['име на производителя']; ехо ""; echo $ row_getplanedata ['модел']; ехо "от"; echo $ row_getplanedata ['Manufacturericao']; ехо "собственост на"; echo $ row_getplanedata ['собственик']; ехо "видяно"; echo $ row_getplanedata ['посещения']; ехо "времена"; ехо "специална оценка ="; echo $ row_getplanedata ['специално']; ехо "\ n"; $ посещения = $ row_getplanedata ['посещения']+1; } while ($ row_getplanedata = mysqli_fetch_assoc ($ getplanedata)); mysqli_free_result ($ getplanedata); $ sqli = "АКТУАЛИЗИРАНЕ НА НАСТРОЙКИТЕ НА БАЗИТЕ НА БАЗАТА НА САМОЛЕТИИ = $ посещения WHERE icao24 = '$ icao24'"; mysqli_set_charset ($ DBi, "utf8"); $ updateplanedata = mysqli_query ($ DBi, $ sqli) или умре (mysqli_error ($ DBi)); } else {echo "Не можах да намеря тази равнина в БД, затова я добавих"; $ sqli = "ВЪВЕЖДАЙТЕ В базата данни на самолета (icao24, посещения, специални) ЦЕННОСТИ ('$ icao24', 1, 1)"; $ updateplanedata = mysqli_query ($ DBi, $ sqli) или die (mysqli_error ($ DBi)); } ехо "----------------------------------------------- ---------------------\н"; } else {// ехо "$ call sign"; }}} else {echo "и небето е ясно / n"; } if ($ inbound) {echo "Входяща равнина / n"; $ command = "прасета w 17 1"; execInBackground ($ команда); } else {echo "няма входящи полети / n"; $ command = "прасета w 17 0"; execInBackground ($ команда); }} функция decimal_to_time ($ decimal) {$ offset = 0.002778; if ($ decimal> $ offset) {$ decimal = $ decimal - 0.002778; } $ hours = gmdate ('H', етаж ($ decimal * 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, $ 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, за да изчислите разстоянието (в км) между две точки, посочени от * географска ширина/дължина (в числови градуси) * * от: Формула на хаверсина - RWSinnott, "Добродетели на Хвърката", * 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; // средният радиус на земята в 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 = $ радиус*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 () {// напълно незадължително връщане (TRUE); } функция start () {echo "стартиране / n"; $ command = "прасета w 17 1"; execInBackground ($ команда); $ active = TRUE; while ($ активен) {usleep (1000); // по избор, ако искате да бъдете внимателни, ако (microtime (true)> = $ nextTime) {fexp (); $ nextTime = микровреме (вярно) + ИНТЕРВАЛ; } $ active = checkForStopFlag (); }} fexp (); start (); ?>

Стъпка 14: Окабеляване на светодиода и превключвателя за изключване

Окабеляване на светодиода и превключвателя за изключване
Окабеляване на светодиода и превключвателя за изключване

Окабеляването на този проект наистина не може да бъде по -просто. Има само един светодиод, който е свързан към щифт 17 и заземен с вграден резистор 270R.

Включвам също бутон за изключване и включване заедно със светодиод за захранване, който изтича от пина за данни TXd. Можете да прочетете повече за функцията за изключване и необходимия код на https://github.com/Howchoo/pi-power-button.git от сайта https://howchoo.com/g/mwnlytk3zmm/how-to- add-a-pow … Можете да прочетете за добавяне на лампа за захранване тук

Препоръчано: