Оглавление:

Раннее предупреждение Raspberry PI Runway Light с использованием картографических данных: 14 шагов (с изображениями)
Раннее предупреждение Raspberry PI Runway Light с использованием картографических данных: 14 шагов (с изображениями)

Видео: Раннее предупреждение Raspberry PI Runway Light с использованием картографических данных: 14 шагов (с изображениями)

Видео: Раннее предупреждение Raspberry PI Runway Light с использованием картографических данных: 14 шагов (с изображениями)
Видео: Как заставить Raspberry Pi управлять дисплеем из семисегментных индикаторов. Реальный проект 2024, Июль
Anonim
Раннее предупреждение Raspberry PI Runway Light с использованием картографических данных
Раннее предупреждение Raspberry PI Runway Light с использованием картографических данных
Раннее предупреждение Raspberry PI Runway Light с использованием картографических данных
Раннее предупреждение Raspberry PI Runway Light с использованием картографических данных
Раннее предупреждение Raspberry PI Runway Light с использованием картографических данных
Раннее предупреждение Raspberry PI Runway Light с использованием картографических данных
Раннее предупреждение Raspberry PI Runway Light с использованием картографических данных
Раннее предупреждение Raspberry PI Runway Light с использованием картографических данных

Эта лампа возникла по нескольким причинам: меня всегда интересовали самолеты, которые летают над головой, а летом по выходным часто летают довольно захватывающие. Хотя вы склонны слышать их только когда они проходят мимо. Другая причина заключается в том, что кажется, что маршрут вылетающих самолетов из аэропорта Лондон-Сити иногда может быть подслушан, и у них есть довольно шумные полеты. Когда я занимаюсь записью некоторых видео для YouTube, мне действительно неприятно отказываться от записи из-за шумного самолета. Так что я подумал, общедоступны ли данные, которые вы видите на таких сайтах, как flightradar24. Как только я обнаружил, что нечто подобное доступно в сети opensky, родилась лампа раннего предупреждения. Вскоре возникла идея использовать копию фонарей взлетно-посадочной полосы для размещения проекта.

Вы можете узнать больше о сети OpenSky на https://www.opensky-network.org. Я также хотел на этот раз сделать красивую линзу из смолы вместо полупрозрачного PLA, и хотя у меня есть приемник ADS-B, я хотел бы сохранить это просто и дешево. ADS-B также нуждается в антенне, и это не годится для лампы, которая стоит на полке в офисе. Надеюсь, вы найдете эту сборку интересной, поскольку она охватывает 3D-печать, формование из смолы и математику, а также позволяет экстраполировать положения самолетов, которые потенциально могут пролететь над головой.

Шаг 1: Разработка корпуса

В поиске Google можно найти много разных дизайнов подиумных фонарей, и дизайн этого был создан с учетом дизайнерских влияний различных производителей настоящих ламп. Он также масштабируется, чтобы сидеть в комнате или на полке, а не в полный размер, поскольку в реальной жизни они, как правило, намного больше.

Дизайн был разработан в Fusion 360, и я импортировал некоторые предыдущие элементы, такие как держатель нуля Raspberry Pi из предыдущих проектов. Возможность повторного использования элементов избавляет от головной боли при изучении основ. Вы также можете скачать файлы здесь

Шаг 2. Отлив линз - #fail

Литье линз - #fail
Литье линз - #fail
Литье линз - #fail
Литье линз - #fail
Литье линз - #fail
Литье линз - #fail

Самым важным элементом дизайна этой лампы должен был стать линза. Так что я взялся за это первым, так как без красивого подлинного зеркала проект будет работать. Я документирую здесь неудачи, которые у меня были при попытке добиться этого, несмотря на то, что я также изначально решил сделать линзу янтарной. Огни взлетно-посадочной полосы бывают желтыми и синими, и только после того, как я начал делать янтарные, я передумал и решил, что хочу синий.

Насколько я могу судить, янтарные используются на линии ожидания, а синие - на взлетно-посадочной полосе, и это те, которые кажутся наиболее типичными, если вы ищете огни взлетно-посадочной полосы. Однако это моя первая попытка сделать линзу из янтаря. Чтобы сделать линзу, я собирался использовать прозрачную смолу с цветной добавкой, и, хотя я сделал несколько форм, прежде чем задаться вопросом, можно ли напечатать 3D-форму и использовать ее. Итак, я начал с изготовления разъемной формы в 3D и распечатал ее в PetG. Я был убежден, что разумного количества смазки для пресс-формы будет достаточно, чтобы протереть форму. Оказалось, что после пары попыток я заставил смолу прилипнуть к форме, как клей, и разделить их было просто невозможно. Хотя у меня была полноразмерная линза, которую я собирался использовать, я отказался от нее и распечатал линзу для использования с традиционным силиконовым литьем.

Шаг 3: разные типы смол

Различные типы смолы
Различные типы смолы
Различные типы смолы
Различные типы смолы
Различные типы смолы
Различные типы смолы
Различные типы смолы
Различные типы смолы

Вкратце, я использовал для этого проекта 3 типа прозрачных / цветных смол.

Первым был рынок для хобби под названием Pebeo-Gedeo, который обычно продавался для упаковки небольших предметов и использовался для изготовления ювелирных изделий, пресс-папье и т.д. Однако это довольно дорого для той суммы, которую вы получаете, но она удобна и легко доступна в магазинах для хобби и ремесел. Он смешан в соотношении 2: 1. Второй - это предварительно окрашенная смола, смешанная с отвердителем в соотношении 10: 1, и на ее отверждение ушло больше всего времени, примерно за неделю, прежде чем она полностью затвердела. Последняя была прозрачной смолой, которая также была смешана в соотношении 2: 1, и она затвердела примерно за 2 дня, вы можете покрасить ее каплями пигмента, но вам нужно убедиться, что вы всегда используете одно и то же цветовое соотношение, если вы делаем отдельные партии. Это также работает наиболее рентабельно. Наконец, RTV для пресс-формы был GP-3481 RTV, он застывает около 24 часов и имеет довольно длительное время приготовления, так что у вас есть достаточно времени, чтобы перемешать его, а затем вылить.

В настоящее время у меня нет вакуумного горшка (в настоящее время он заказан), поэтому вы можете столкнуться с пузырьками как в форме, так и в заливке смолы. Это не слишком большая проблема, но с прозрачной линзой или чем-то подобным вам стоит подумать о том, как удалить пузыри из смесей.

Шаг 4: заливка линзы в силиконовую форму №2

Image
Image
Отливка линзы в силиконовую форму №2
Отливка линзы в силиконовую форму №2
Отливка линзы в силиконовую форму №2
Отливка линзы в силиконовую форму №2

Итак, это вторая попытка сделать линзу из полимера, и на первом этапе было сделать линзу в Fusion 360, а затем напечатать ее в ABS, а также ведро для ее хранения. Это первый вариант для пресс-формы, который помогает сократить количество используемого силикона. Вы можете легко сделать это из карты, но это просто другой подход. Чтобы дать ему больше шансов высвободиться из формы, я сначала покрыл его лаком, а затем хорошо покрыл смазкой из воска.

Затем я налил немного GP-3481, примерно 27 RTV, и дал ему настояться в течение следующих 24 часов перед извлечением из формы. Как только это было сделано, я использовал прозрачную смолу, смешанную в соотношении 2: 1 с примерно 4/5 каплями цветного пигмента, и хорошо перемешивал ее в течение хороших четырех минут. Вылили его в форму, а затем поместили в смолу рюмку, чтобы позже создать пустоту либо для лампы, либо для светодиодов. Примерно через 24 часа эта смола была готова к удалению, и линза вышла довольно хорошо. Присутствуют пузырьки воздуха, но у меня пока нет вакуумного сосуда для дегазации смолы перед заливкой.

Шаг 5: 3D-печать и подготовка

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

Модель спроектирована таким образом, что центральная часть вставляется в основание. Это было сделано, чтобы избежать маскировки в процессе покраски. Вся модель была напечатана на Hatchbox ABS, а затем отшлифована. Зернистость от 60 до 800 давала достаточно хорошее качество поверхности для этой модели.

Шаг 6: Сборка и покраска

Сборка и покраска
Сборка и покраска
Сборка и покраска
Сборка и покраска
Сборка и покраска
Сборка и покраска

После шлифовки отпечатков на них наносится высокоструктурированный грунт. Слегка отшлифовать, а затем нанести серый грунт. Основные части были окрашены в желтый цвет Ford Signal, а затем в зеленый цвет Brooklands. Затем на болты были нанесены блики из серебра tamiya, а на держателе линзы было нанесено немного хрома молотовского серебра.

Шаг 7. Сначала найдите самолеты в ограничивающей области

Разобрав оборудование, нужно было поработать над программным обеспечением. Сейчас есть несколько сайтов, которые обеспечивают отслеживание полетов, но не многие из них предоставляют API для доступа к этим данным. Некоторые из них делают это только на коммерческой основе, но, к счастью, есть один сайт под названием https://opensky-network.org, которым вы можете пользоваться бесплатно.

Чтобы получить доступ к этим данным, вы должны зарегистрироваться, а затем вы можете использовать их API, он предоставляет несколько функций и способов извлечения данных. Нас интересуют все рейсы в пределах области, и для этого у них есть вызов Live API. https://opensky-network.org/apidoc/ называется ограничивающей рамкой. Для вызова API требуются углы поля, которые вас интересуют, конечно, с нашей широтой и долготой в качестве центральной точки. Вы можете проверить, как работает математика на этом сайте, который рисует поле в зависимости от того, что вы вводите. "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); $ radius = 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; return $ zz;

Если вы хотите посмотреть страницу с исходными версиями javascript, это ссылка:

в этом коде вы также можете увидеть различные подпрограммы для каждого типа вычислений.

Шаг 9: вычисление точки пересечения по кругу

Вычисление точки пересечения по кругу
Вычисление точки пересечения по кругу

Итак, теперь у нас есть самолет, в котором азимут между ним и нашим местоположением меньше 90 (положительный или отрицательный), и это означает, что есть шанс, что он может пролететь поблизости. Используя формулу гаверсинуса, мы также можем вычислить, используя долготу / широту плоскости и долготу / широту нашего дома на расстоянии, на котором он находится от нас.

Глядя на диаграмму, если мы нарисуем круг вокруг нашего дома, скажем, радиусом около 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 секунд после пролета, и у нас, наконец, есть предупреждающий свет.

* основан на 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; return $ d; }

Шаг 11: Импорт и определение базы данных плоскостей

Еще одна особенность заключается в том, что сайт opensky предлагает загружаемую базу данных самолетов вместе с их позывными и идентами. Его несколько сотен тысяч записей. Таким образом, мы можем загрузить его и загрузить локально в базу данных MariaDB для поиска (MySQL). С каждым самолетом, который появляется над головой, мы получаем информацию о нем и обновляем счетчик, чтобы показать, сколько раз его видели.

Я также в настоящее время редактирую базу данных, чтобы выделить интересующие меня самолеты. В основном старые боевые птицы и другие похожие интересные самолеты. Этим летом пару раз пролетал МиГ-15. поэтому цель состоит в том, чтобы использовать добавленное мной поле предупреждения, а затем быстро мигать светом, когда что-то интересное приближается

Шаг 12: Улучшение результатов и новые функции

Улучшение результатов и новые функции
Улучшение результатов и новые функции
Улучшение результатов и новые функции
Улучшение результатов и новые функции
Улучшение результатов и новые функции
Улучшение результатов и новые функции

Так что теоретически все работает довольно хорошо, но вы обнаружите, что есть пролетающие над самолетами самолеты, которых нет в API.

Это связано с тем, что не все самолеты используют транспондер ADS-B и используют более старые транспондеры, основанные на MLAT. Для получения данных о местоположении самолета с помощью MLAT требуется ряд наземных приемников для триангуляции их местоположения, а на некоторых сайтах, таких как flightradar24, сеть участников, делающих это, больше, чем у opensky. Надеюсь, со временем их покрытие также улучшится, и я настраиваю свой собственный приемник MLAT, чтобы добавить к этим данным.

Шаг 13: база кода

Не забывайте, что если вы собираетесь использовать это, вы можете удалить операторы SQL, если у вас нет базы данных самолетов, а также добавить свое собственное значение Lon / Lat и ключ API для доступа к данным полета.

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

определить ("ИНТЕРВАЛ", (20 * 1)); function 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); $ data = json_decode ($ json, ИСТИНА); $ inbound = FALSE; $ num_planes = count ($ data ['состояния']); if ($ num_planes> 0) {echo "и мы можем видеть плоскости $ num_planes / n"; для ($ x = 0; $ x 0) {$ plane_eta = $ distplane / $ air_speed_kmh; } else {$ eta = 1; } если ((($ intercept) 0)) && ($ distplane0) {$ inbound = TRUE; эхо "------------------------------------------------ -------------------- / n "; echo "$ icao24 - [$ country $ позывной] в [$ geo_altitude_m M - $ geo_altitude_f ft]"; echo "[скорость $ air_speed_kmh км / ч и", round ($ distplane, 1), "км далеко] n"; echo "[в заголовке", round ($ plane_heading, 1), "] [homeangle $ heading_d]"; echo "[$ широта, $ долгота] n"; echo «[пролет через», decimal_to_time ($ plane_eta), «сейчас», round ($ intercept, 1), «км отсюда / n»; эхо "------------------------------------------------ -------------------- / n "; $ DBi = новый mysqli («127.0.0.1», «root», «ваш пароль», «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); если ($ rows_getplanedata> 0) {делать {echo "callsign ="; echo $ row_getplanedata ['регистрация']; эхо "есть"; echo $ row_getplanedata ['название производителя']; эхо ""; echo $ row_getplanedata ['модель']; эхо "по"; echo $ row_getplanedata ['производство']; echo "принадлежит"; эхо $ row_getplanedata ['владелец']; эхо "видел"; echo $ row_getplanedata ['посещения']; эхо "раз"; echo "специальный рейтинг ="; эхо $ row_getplanedata ['особенный']; эхо "\ п"; $ посещений = $ row_getplanedata ['посещения'] + 1; } while ($ row_getplanedata = mysqli_fetch_assoc ($ getplanedata)); mysqli_free_result ($ getplanedata); $ sqli = "ОБНОВЛЕНИЕ базы данных самолета SET посещений = $ посещений ГДЕ 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) или умереть (mysqli_error ($ DBi)); } эхо "----------------------------------------------- --------------------- / n "; } else {// echo "$ callign"; }}} 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; если ($ десятичное> $ смещение) {$ десятичное = $ десятичное - 0,002778; } $ hours = gmdate ('H', этаж ($ decimal * 3600)); $ minutes = gmdate ('i', floor ($ decimal * 3600)); $ секунды = gmdate ('s', floor ($ decimal * 3600)); return str_pad ($ hours, 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 * / 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; return $ 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; } / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * / / * * Используйте формулу Хаверсинуса для вычисления расстояния (в км) между двумя точками, указанными * широтой / долготой (в числовых градусах) * * из: Формула Хаверсинуса - RWСиннотт, «Добродетели Хаверсина», * 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 и result - поля формы * 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; return $ 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); $ radius = 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 &"); }} function checkForStopFlag () {// полностью необязательный return (TRUE); } function start () {echo "начало / п"; $ command = "свиньи w 17 1"; execInBackground ($ команда); $ active = ИСТИНА; в то время как ($ active) {usleep (1000); // необязательно, если вы хотите быть внимательными if (microtime (true)> = $ nextTime) {fexp (); $ nextTime = микровремя (истина) + ИНТЕРВАЛ; } $ active = checkForStopFlag (); }} fexp (); Начните(); ?>

Шаг 14: Подключение светодиода и выключателя

Подключение светодиода и выключателя
Подключение светодиода и выключателя

Электромонтаж в этом проекте не может быть проще. Есть только один светодиод, который подключен к контакту 17 и заземлен с помощью встроенного резистора 270R.

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

Рекомендуемые: