Ардуино лунный календарь

Sun and Moon Times © GPL3+

The software library to calculate moon age, sunrise and sunset time.

Some Arduino projects may improve its functionality by calculating sunrise and sunsets times or current moon age. You can create the weather station or animated clock that starts an animation in the morning and stops it at sunset time. There was one software library for Arduino on the Internet that could calculate some astronomical events, but actually it is not compatible with the current Arduino IDE version and the Time library, which is very convenient to manipulate the time in Arduino sketches. The new sun-moon library can help you create such a interesting project.

Let’s build simple schematics on the breadboard.

The component list is very short, you can use any Arduino board you like: Nano or Uno, the breadboard and wires. The most valuable component of this project is a real time clock module. The DS3231 module has a high accuracy and uses only two wires to connect to the Arduino through the I2C bus.

The data sheet of DS3231 module states that the module requires power supply of 5V. In this case you should use the backup accumulator LIR2032 which is not widely available and expensive. In any hand, the clock module is proven to work at 3.3v and in this case you can use the battery CR2032 for backup.

Do not put CR2032 battery in to the clock module in case of using 5V power supply, the battery can be damaged.

The sunMoon class of the software library has the following methods:

  • julianDay — return Julian day number for the time specified or for the current time if no argument specified;
  • sunRise and sunSet functions return the time of sunrise and sunset of the current day or the day specified by the time argument;
  • moonDay — return the moon age in the days;

The sketch gives the handful example of using these functions.

Hope this library helps you build creative projects.

Источник

Блог@off

Узнал, проверил, поделился.

Электронные часы на Arduino. Часы и лунный календарь.

  • Получить ссылку
  • Facebook
  • Twitter
  • Pinterest
  • Электронная почта
  • Другие приложения

Вот и появилось у меня возможность поколдовать с кодом для часов. На данный момент работают две функции: часы и лунный календарь.

Переключение между экранами осуществляется с помощью кнопок. Всего кнопок планируется три. Две для управления функций часов и одна для включения подсветки. Пока никаких дополнительных функций нет. Подсветку я не стал делать программно. Повесил кнопку через сопротивление. Днем подсветку не видно, зато в темноте не слепит глаза.

На видео видно как это работает.

Когда я свел в один файл два скетча (часы и лунный календарь), то память на Arduino стремительно уменьшилась. Хочу уменьшить размер за счет оптимизации русскоязычных надписей.

Названия дней недели на русском языке сделаны картинкой и занимают примерно 55 байт. (если я правильно посчитал). Если использовать отдельные буквы для формирования слова, то объем уменьшится до 20 байт. Вроде выигрыш на лицо, но во сколько это выльется в итоге не известно. И еще здесь играет не только объем, но еще и удобство обслуживания.

P.S. Скачал Visual Studio Code от Microsoft. Есть возможность работы с большим количеством языков программирования. Я установил Python и Arduino.

Старая версия Arduino кода для календаря на один месяц.

Очень меня порадовала мини карта всего кода, невероятно удобная вещь :) К сожалению изменение языка интерфейса было не настолько понятным как в обычных программах. Нет отдельного пункта с выбором языков интерфейса.
Опишу кратко как поменять английский язык интерфейса на русский.
Моя версия под MacOS. Наверно в других ОС похожий алгоритм.
Открываем программу Visual Studio Code.

Источник

Моя самодельная домашняя метеостанция на Arduino Nano

Наблюдение за погодой — весьма увлекательное занятие. Я решил построить свою погодную станцию на базе популярного Arduino Nano 3.0.

Прототип метеостанции выглядит так:

Функции моей метеостанции:

  • измерение и отображение комнатной и наружной температур;
  • измерение и отображение атмосферного давления и тренда его изменения;
  • измерение и отображение относительной влажности воздуха;
  • отображение текущего времени (часы и минуты);
  • отображение текущих фазы Луны и лунного дня;
  • передача результатов измерений на компьютер через последовательное соединение;
  • передача результатов измерений по протоколу MQTT с помощью приложения на компьютере.


Hex
-файл
прошивки для Arduino Nano 3.0 (версия от 9 мая 2018 года) — ws.ino.eightanaloginputs.hex.
Как прошить hex-файл в плату Arduino, я описал здесь.

Микроконтроллер Arduino Nano 3.0

«Сердцем» моей метеостанции является микроконтроллер Arduino Nano 3.0 (приобретен на торговой площадке eBay):

Для управления индикацией и опросом датчиков я использую таймер 1 Arduino, вызывающий прерывания с частотой 200 Гц (период — 5 мс).

Индикатор

Для отображения измеряемых показаний датчиков и текущего времени я подключил к Arduino четырехразрядный светодиодный индикатор Foryard FYQ-5643BH с общими анодами (аноды одинаковых сегментов всех разрядов объединены).
Индикатор содежит четыре семисегментных разряда и две разделительные (часовые) точки:

Аноды индикатора подключены через токограничивающие резисторы к выводам Arduino:

разряд 1 2 3 4
вывод A3 A2 D3 D9

Катоды сегментов подключены к выводам Arduino:

сегмент a b c d e f g p
вывод D7 D12 D4 D5 D6 D11 D8 D13

Сегмент индикатора светится, если на аноде соответствующего разряда высокий потенциал (1), а на катоде — низкий (0).

Я использую динамическую индикацию для отображения информации на индикаторе — в каждый момент времени активен только один разряд. Активные разряды чередуются с частотой 200 Гц (период отображения 5 мс). При этом для глаз мерцание сегментов незаметно.

Датчик температуры DS18x20

Для возможности удаленного измерения температуры я подключил датчик DS1820, который обеспечивает измерение наружной температуры в широких пределах. Датчик подключается к шине 1-Wire и имеет три вывода — питание (VCC), данные (DAT), земля (GND):

вывод датчика VCC DAT GND
вывод Arduino 5V A1 GND

Между выводами VCC и DAT я включил подтягивающий резистор сопротивлением 4,7 кОм.

Для перевода между градусами Цельсия и Фаренгейта можно использовать такую табличку:

Я разместил датчик за окном дома в пластиковом корпусе от шариковой ручки:
\

В профессиональных метеостанциях для защиты термометра от прямых солнечных лучей и обеспечения циркуляции воздуха используется экран Стивенсона (англ. Stevenson screen):

Датчик давления и температуры BMP280

Для измерения атмосферного давления традиционно используют ртутные барометры и барометры-анероиды.

В ртутном барометре атмосферное давление уравновешивается весом столба ртути, высота которого и ипользуется для измерения давления:

В барометре-анероиде используется сжатие и растяжение коробки под действием атмосферного давления:

Для измерения атмосферного давления и комнатной температуры в своей домашней метеостанции я использую датчик BMP280 — маленький SMD-датчик размером 2 x 2,5 мм, основанный на пьезорезистивной технологии:

Платка с датчиком приобретена на торговой площадке eBay:

Датчик подключается к шине I2C (контакт данных — SDA/SDI, контакт синхронизации — SCL/SCK):

вывод датчика VCC GND SDI SCK
вывод Arduino 3V3 GND A4 A5

Для работы с датчиком я использую библиотеку от Adafruit — файлы Adafruit_Sensor.h, Adafruit_BMP280.h, Adafruit_BMP280.cpp.

Единицы измерения атмосферного давления

Датчик через функцию readPressure выдает значение атмосферного давления в паскалях. Основной единицей измерения атмосферного давления служит гектопаскаль (гПа) (1 гПа = 100 Па), аналогом которого является внесистемная единица «миллибар» (мбар) (1 мбар = 100Па = 1гПа). Для перевода между часто используемой внесистемной единицей измерения давления «миллиметр ртутного столба» (мм рт. ст.) и гектопаскалями используются соотношения:
1гПа = 0,75006 мм рт. ст. ≈ 3/4 мм рт.ст.; 1 мм рт.ст. =1,3332 гПа ≈ 4/3 гПа.

Зависимость атмосферного давления от высоты над уровнем моря

Атмосферное давление может быть представлено как в абсолютной, так и в относительной форме.
Абсолютное давление QFE (англ. absolute pressure) – это актуальное атмосферное давление, не учитывающее поправку над уровнем моря.
Атмосферное давление уменьшается примерно на 1 гПа при повышении высоты на 1 м:

Барометрическая формула позволяет определить коррекцию показаний барометра для получения относительного давления (в мм рт. ст.):
$\Delta P = 760 \cdot (1 — <1 \over <10^ < <0,0081350 \cdot H>\over >>>)$ ,
где $T$ — средняя температура воздуха по шкале Ранкина, °Ra, $H$ — высота над уровнем моря, футы.
Перевод градусов Цельсия в градусы Ранкина:
$^<\circ>Ra = <^<\circ>C \cdot 1,8> + 491,67$
Барометрическая формула используется при барометрическом нивелировании — определении высот (с погрешностью 0,1 — 0,5 %). В формуле не учитывается влажность воздуха и изменение ускорения свободного падения с высотой. Для небольших перепадов высоты эту экспоненциальную зависимость можно с достаточной точностью аппроксимировать линейной зависимостью.
Относительное давление QNH (англ. relative pressure, Q-code Nautical Height) – это атмосферное давление, учитывающее поправку к среднему уровню моря (англ. Mean Sea Level, MSL) (для ISA и температуры 15 градусов Цельсия), и первоначально выставляется с учётом высоты, на которой находится метеостанция. Его можно узнать из данных метеослужбы, показаний откалиброванных приборов в публичных местах, аэропорту (из сводок METAR), из Интернета.
Например, для расположенного рядом аэропорта Гомель (UMGG) я могу посмотреть сводку фактической погоды METAR на ru.allmetsat.com/metar-taf/russia.php?icao=UMGG:
UMGG 191800Z 16003MPS CAVOK M06/M15 Q1014 R28/CLRD// NOSIG ,
где Q1014 — давление QNH на аэродроме равно 1014 гПа.
Историю сводок METAR можно получить на aviationwxchartsarchive.com/product/metar.
За нормальное относительное давление воздуха QNH принимается давление 760 мм рт. ст. или 1013,25 гПа (при температуре 0ºС, под широтой 45º Северного или Южного полушария).
Я выставил для барометра-анероида давление QNH с помощью винта настройки чуткости:

Анализ изменения давления позволяет строить прогноз погоды, причем его точность тем выше, чем более резко меняется давление. Например, старое эмпирическое правило мореплавателей гласит — падение давления на 10 гПа (7,5 мм рт. ст.) за период 8 часов говорит о приближении сильного ветра.

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

За направление ветра в метеорологии принимается направление, откуда дует ветер:

Это направление сводится к восьми румбам.

Для предсказания погоды на основе атмосферного давления и направления ветра часто используется алгоритм Zambretti.

Датчик влажности

Для определения относительной влажности воздуха я использую модуль DHT11 (приобретен на торговой площадке eBay):

Датчик влажности DHT11 имеет три вывода — питание (+), данные (out), земля ():

вывод датчика + out
вывод Arduino 5V D10 GND

Для работы с датчиком я использую библиотеку от Adafruit — файлы DHT.h, DHT.cpp.

Влажность воздуха характеризует количество водяного пара, содержащегося в воздухе. Относительная влажность показывает долю влаги в воздухе (в процентах) по отношению к максимальному возможному количеству при текущей температуре. Для измерения относительной влажности служит гигрометр:

Для человека оптимальный интервал влажности воздуха — 40 . 60 %.

Часы реального времени

В качестве часов реального времени я применил модуль RTC DS1302 (платка с часиками приобретена на торговой площадке eBay):

Модуль DS1302 подключается к шине 3-Wire. Для использования этого модуля совместно с Arduino разработана библиотека iarduino_RTC (от iarduino.ru).

Плата с модулем DS1302 имеет пять выводов, которые я соединил с выводами платы Arduino Nano:

вывод RTC VCC GND RST CLK DAT
вывод Arduino 5V GND D2 D1 D0

Для сохранения верных показаний часов при отключенном питании в гнездо на плате я вставил батарейку CR2032.

Точность моего часового модуля оказалась не слишком высокой — часы спешат примерно на одну минуту за четверо суток. Поэтому я сделал сброс минут на «ноль» и часа на ближайший при удержании кнопки, подключенной к выводу A0 Arduino, после включения питания метеостанции. После инициализации вывод A0 используется для передачи данных через последовательное соединение.

Передача данных на компьютер и работа по протоколу MQTT

Для передачи данных через последовательное соединение к Arduino подключается USBUART преобразователь:

вывод преобразователя RXD GND
вывод Arduino A0 GND

Вывод Arduino используется для передачи данных в формате 8N1 (8 бит данных, без бита четности, 1 стоп-бит) со скоростью 9600 бит/с. Данные передаются пакетами, причем длина пакета — 4 символа. Передача данных осуществляется в «bit-bang» режиме, без использования аппаратного последовательного порта Arduino.

Формат передаваемых данных:

Параметр 1-й байт 2-й байт 3-й байт 4-й байт
наружная температура o пробел либо минус десятки градусов либо пробел единицы градусов
комнатная температура i пробел либо минус десятки градусов либо пробел единицы градусов
атмосферное давление p сотни мм р. ст . десятки мм рт.ст. единицы мм рт. с.
относительная влажность h пробел десятки процентов либо пробел единицы процентов
текущее время десятки часов единицы часов десятки минут единицы минут

Я разработал на языке программирования Golang приложение — клиент протокола MQTT, отправляющую принятую от метеостанции информации на сервер (MQTT-брокер) cloudmqtt.com:

Сервис CloudMQTT позволяет создать акаунт с бесплатным тарифным планом «Cute Cat» (ограничения: 10 соединений, 10 Кб/с):

Для мониторинга показаний метеостанции при этом можно использовать Android-приложение MQTT Dash:

Питание

Для питания метеостанции я использую зарядное устройство от старого мобильного телефона Motorola, выдающее напряжение 5 В с током до 0,55 А и подключаемое к контактам 5V (+) и GND (-):

Также можно использовать для питания батарейку напряжением 9 В, подключаемую к контактам VIN (+) и GND (-).

Эксплуатация метеостанции

При запуске происходит инициализация и проверка датчиков.

При отсутствии датчика DS18x20 выдается ошибка «E1», при отсутствии датчика BMP280 — ошибка «E3».

Затем запускается рабочий цикл метеостанции:

  • измерение и отображение наружной температуры;
  • измерение и отображение комнатной температуры;
  • измерение и отображение атмосферного давления и тренда его изменения;
  • измерение и отображение относительной влажности воздуха;
  • отображение текущего времени;
  • отображение фазы Луны и лунного дня.


Видео работы моей метеостанции доступно на моем YouTube-канале: https://youtu.be/vVLbirO-FVU

При измерении температуры индицируется две цифры температуры и для отрицательной температуры знак «минус» (с символом градуса в крайнем правом разряде);
для наружной температуры знак градуса отображается вверху:


для комнатной температуры — внизу:

При измерении давления индицируются три цифры давления в мм ртутного столба (с символом «P» в крайнем правом разряде):

Если давление резко упало, то вместо символа «P» в крайнем правом разряде отображается символ «L«, если резко выросло — то «H«. Критерий резкости изменения — 8 мм рт. ст. за 8 часов:

Так как моя метеостанция отображает абсолютное давление (QFE), то показания оказываются несколько заниженными по сравнению со сведениями в сводке METAR (в которой приводится QNH) (14 UTC 28 марта 2018 года):

UMGG 281400Z Q1015

1015 гПа

QFE = 998 гПА,
QNH = 1015 гПа

Отношение давлений (по сведениями ATIS) составило $ <1015 \over 998>= 1,017$. Возвышение аэропорта Гомель (код ИКАО UMGG) над уровнем моря составляет 143,6 м. Температура по данным ATIS составляла 1 °C.

Показания моей метеостанции практически совпали с абсолютным давлением QFE по сведениями ATIS!

Максимальное/минимальное давления (QFE), зарегистрированные моей метеостанцией за все время наблюдений:

771 мм рт. ст.

29 ноября 2018 года

BMP280 сводка METAR (для UMGG) ATIS (для UMGG)
749 мм рт.ст. ( 999 гПа)
733 мм рт. ст.
12 мая 2020 года

Отображение относительной влажности воздуха

Относительная влажность воздуха отображается в процентах (в двух правых разрядах отображается символ процента):

Отображение текущего времени

Текущее время отображается на индикаторе в формате «ЧЧ:ММ», причем разделительное двоеточие мигает раз в секунду:

Отображение фаз Луны и лунного дня

Первые два разряда индикатора отображают текущую лунную фазу, а следующие два — текущий лунный день:

У Луны выделяются восемь фаз (приведены английские и русские (синим цветом — неточные) названия):

На индикаторе фазы отображаются пиктограммами:

фаза пиктограмма
новолуние
растущий серп (полумесяц)
первая четверть
растущая выпуклая Луна
полнолуние
убывающая выпуклая Луна
последняя четверть
убывающий серп (полумесяц)

Передача данных на компьютер

Если соединить метеостанцию с USBUART преобразователем (например, на базе микросхемы CP2102), подключенным к USB-порту компьютера, то можно с помощью терминальной программы наблюдать передаваемые метеостанцией данные:

Я разработал на языке программирования golang программу, ведущую журнал метеонаблюдений и отправляющую данные в сервис CloudMQTT, и их можно просматривать на Android-смартфоне с помощью приложения MQTT Dash:

По данным журнала метеонаблюдений можно, например, строить график изменения атмосферного давления:
пример графика с заметным минимумом давления

пример графика с незначительным ростом давления

Планируемые доработки:

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

В метеостанциях для измерения скорости ветра используется трехчашечный анемометр (1), а для определения направления ветра — флюгер (2):

Также для измерения скорости ветра используются термоанемометры с нитью накала (англ. hot wire anemometer). В качестве нагреваемой проволоки можно использовать вольфрамовую нить накала от лампочки с разбитым стеклом. В промышленно выпускаемых термоанемометрах датчик обычно располагается на телескопической трубке:

Принцип действия этого прибора заключается в том, что тепло отводится от нагревательного элемента вследствие конвекции воздушным потоком — ветром. При этом сопротивление нити накала определяется температурой нити. Закон изменения сопротивления нити накала $R_T$ от температуры $T$ имеет вид:
$R_T = R_0 \cdot (1 + <\alpha \cdot (T - T_0)>)$ ,
где $R_0$ — сопротивление нити при температуре $T_0$, $\alpha$ — температурный коэффициент сопротивления (для вольфрама $\alpha = 4,5\cdot <10^<-3><^<\circ>>>>$).

С изменением скорости воздушного потока изменяется температура при неизменном токе накала (анемометр с постоянным током, англ. CCA). Если температура нагревательного элемента поддерживается постоянной, то ток через элемента будет пропорционален скорости воздушного потока (анемометр с постоянной температурой, англ. CTA).

Продолжение следует

Источник

Adblock
detector