2017-01-27 2 views
0

Два вопроса:на основе микроконтроллера реализации восход/установить алгоритм

Я пытаюсь реализовать алгоритм для определения времени восхода и захода солнца, с широты, долготы и даты в качестве входов микроконтроллера. Я знаю, что есть алгоритмы для этого, но я не мог найти никаких подробностей о том, как это сделать на микроконтроллере. Это возможно?

Во-вторых, если я должен это реализовать, сколько памяти мне понадобится и какой контроллер мне придется использовать?

Пожалуйста, дайте мне знать.

+0

Да, это возможно. Но вам нужно будет рассмотреть дополнительные материалы, прежде чем сузить ответ на свой второй вопрос. Например, насколько точны расчеты? Как быстро/как часто нужно выполнять расчет? Как геолокация будет предоставлена ​​микроконтроллеру? Как будет предоставляться пользователю время восхода/захода солнца? Является ли эта часть критически важной для безопасности системы или это хобби? – kkrambo

+0

Допуск +/- 15 минут будет прекрасным. Расчет должен выполняться один раз в день - идея состоит в том, чтобы вызывать выход при восходе и закате солнца. Геолокация будет предоставляться в качестве входа пользователем (через сенсорный экран или смартфон). Это не хобби, и это не критически важная система безопасности - просто думать о идеях :) – genesis

+0

Я подозреваю, что требования к интерфейсу более значительны, чем требования к восходу/закату. Я имею в виду, что если микроконтроллер может управлять сенсорным экраном или Bluetooth-радио для связи со смартфоном, то он, вероятно, может справиться с этим алгоритмом. Еще одна вещь, которую стоит рассмотреть - это ваш бюджет власти. Работает ли батарея устройства? – kkrambo

ответ

0

хорошо на MCU не так много памяти, а также FPU не всегда присутствует, поэтому вам нужно много делать самостоятельно. Есть несколько способов, как вычислить это.

  1. календарь Восход

    Это самый простой, но требует, чтобы хранить данные календаря (может быть в программной памяти, нет необходимости в оперативной памяти). Этот подход ограничивается одним географическим местоположением, поэтому, если местоположение меняется со временем, то оно непригодно. Для получения дополнительной информации см:

  2. уравнение Кеплера

    Это будет работать для большого количества времени (например, 1000 лет), когда кодированное право. Но для этого подхода нужны вычисления FPU. Если нет, вам нужно закодировать его самостоятельно (например: double,sin,cos,+,-,*,/)

    Уравнение Кеплера даст вам фактическое относительное положение Земли и Солнца в гелиоцентрической системе координат. Если вы добавите ежедневное вращение Земли и локальные преобразования NEH (северо-восток/высота), вы получите положение Солнца в азимутальных координатах для любой геолокации и времени. Тогда это просто вопрос проверки высоты над геометрическими пределами восхода/захода солнца. Для получения дополнительной информации см:

    Этот подход должен RAM для хранения фактических координат (3x двухместный в положение + один темп), преобразование 3x двойные матрицы преобразования 4x4 (земля, NEH, темп) и несколько переменных итерации. По моим оценкам, для этого достаточно 512 байт.

  3. Прямое уравнение

    Вы должны Google для этого. Существуют некоторые уравнения приближения, которые дадут вам непосредственно азимутальные cooridnates Солнца для любой геолокации. Это немного проще, чем # 2, но нуждается в более продвинутых гониометрических функциях, таких как arctan,acos и не уверен, если бы не некоторые гиперболические функции. В случае, если у вас нет поддержки FPU, этот подход может быть трудно реализовать с необходимой точностью.

[Примечания]

Для повышения точности необходимо преобразовать положение геометрического солнца, чтобы визуально. Есть таблицы, сколько нужно сдвинуть угол места ...

+0

Для (1); по календарным данным, вы имеете в виду время восхода и захода солнца для определенного места? В течение года этот набор данных составляет около 4 Кб на моем компьютере. – genesis

+0

@genesis вы можете хранить таблицу в памяти программ вместо RAM в настоящее время. У MCU обычно есть «256,512,1024 KB» FLASH, поэтому проблем с ее хранением не должно быть ... также вы можете аппроксимировать его полиномиальным или BEZIER кубическим, чтобы он всего несколько двумерных точек ... это можно сделать и на целочисленной арифметике, если у вас нет FPU, см. [Как я могу создать многоточечную линейную интерполяцию?] (http://stackoverflow.com/a/30438865/2521214) – Spektre

Смежные вопросы