Про ванную комнату - Потолок. Ванные. Кафель. Оборудование. Ремонт. Сантехника

Как сделать метеостанцию своими руками. Метеостанция своими руками (Погодная станция). Общая схема метеостанции

Просматривая разные проекты метеостанций, заметил одну тенденцию. Это или датчик температуры и влажности, чаще всего всеми любимый китайский DHT-11 или DHT-22, к которым добавляют либо датчик освещенности (Метеостанция на Arduino с визуализацией данных) либо давления (Ethernet метеостанция), или покупное-навороченное за много сотен долларов (Автоматическая метеостанция на даче)

Так как лично для меня - метеостанция без измерения направления и скорости ветра не метеостанция, а потратить порядка 700USD на по большому счету игрушку я не готов, то решено было сделать похожее на «дорогое-навороченное» но занедорого.

Электроника


Теперь о измерении направления ветра. Было много вариантов, от оптических энкодеров - заводских (дорого) или самодельных в виде нескольких пар светодиодов и фотодиодов, и диска с кодом Грея (сложно и много компонентов), до магнита и 4-8 герконов (слишком просто и неточно). В итоге выбор пал на AS5040 – магнитный энкодер. Так как особая точность не нужна, то аналоговый выход энкодера подключен к ADC микроконтроллера.

Микроконтроллер - PIC16F88. Выход - RS485 в внутреннюю сеть умного дома, о котором этот цикл статей. Вся электронная часть собрана на трех платах.

На этом с электроникой все, никаких нюансов, ничего интересного, все по даташитам. Переходим к механике.

Механика

К сожалению, напечатать корпус на 3D принтере возможности нет, а у заводских корпусов с водонепроницаемостью беда практически у всех. К тому же подшипники и все остальное - тела вращения, значит круглый корпус будет самым логичным выбором. Пришлось обратить взор на другие сферы - на водоснабжение. В качестве корпуса взята соединительная муфта «на 32» для канализации, и два патрубка для размещения в них подшипниковых узлов. Из латуни были выточены две заглушки, в которых запрессованы по два подшипника 626.

Магниты… Магнит для датчика скорости подойдет практически любой, а вот с датчиком направления было сложнее. Ему нужен круглый магнит с намагниченностью от края до края

В то время как у основной массы продающихся - разные полюса на разных сторонах.

Но, оказалось, что нужные магниты находятся на шпинделях двигателей CD/DVD приводов.

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

После изготовления и сборки плат - датчики скорости и направления ветра принимают окончательный вид

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

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

Собираем, подключаем и прикручиваем повыше

Интерфейс

Как я уже рассказывал (Очередной умный дом, в трех частях. Часть третья, пользовательско-интерфейсная) есть два вида интерфейса. Первый вид, в котором на экране отображаются практически все данные с устройства, выглядит так

Температура текущая, минимум, максимум, направление изменения. Давление, аналогично. Влажность. Ветер - направление и роза ветров. Цифры нужны скорее для отладки, показывают сколько времени в каком секторе был флюгер. Скорость ветра, время, показания датчика освещенности (без калибровки, то что измерил ADC) и датчик дождя. Все данные и обработка - ведутся в микроконтроллере метеостанции.

Второй тип интерфейса - на основе виджетов. Тут данных меньше, температура, влажность, давление, скорость и направление ветра

И куда уж без Android Wear - на часах

В связи с тем, что раз в минуту происходит опрос всех контроллеров с записью в БД- то любые метеоданные доступны для анализа или отображения в виде графиков

Вспомнил на досуге о простой самоделке, которую встречал в журнале «Юный натуралист» и делал в восьмидесятых годах прошлого века.

С ее помощью было интересно предсказывать погоду, наблюдать на последующий день за точностью сделанных показаний.

Конечно, сравнивать эту конструкцию с метрологическими приборами не стоит, но в качестве грубого прогноза она вполне работоспособна.

К тому же подобная система позволяет развивать у детей навыки наблюдения и анализа природных явлений.

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


Как работает самодельный барометр

Для предсказания погоды используется закрытое стеклом лампочки пространство с небольшим отверстием вверху. В эту емкость залита чистая вода. На нее воздействуют:

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

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

Необходимые инструменты

В обязательном порядке потребуется:

  • перегоревшая или целая лампа накаливания;
  • защитные перчатки;
  • надфиль или с алмазным сверлом;
  • один кристаллик марганцовки либо обломок от грифеля из химического карандаша - не всегда.

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

Технология изготовления

На руки надевают защитные перчатки. Они будут предохранять кожу от порезов и попадания мелких осколков стекла. Лампочка хрупкая, под случайным излишнем усилии она может развалиться на мелкие осколки. Работать с ней следует очень аккуратно.

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

Способы создания отверстия

Работа надфилем

Боковой гранью режущей кромки осторожно прорезают отверстие в стекле колбы.

Величину усилия необходимо контролировать: очень легко проточить большую щель или повредить хрупкое стекло. Работу выполняйте над емкостью, в которую будут падать стеклянные опилки. Это обезопасит уборку рабочего места.

Сверление отверстия в стекле

Этот метод позволяет сделать строго калиброванное отверстие круглой формы. Однако он требует практических навыков обработки стекол сверлами мелких диаметров. Работать можно дрелью или шуруповертом.

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

Поэтому для сверления отверстия подбирают специальные сверла с алмазным напылением наконечника. Работают ими очень осторожно.

Наполнение колбы водой

Внутрь лампочки через прорезанное отверстие необходимо налить чистой отстоявшейся или лучше кипяченной воды чуть меньше трети ее внутреннего объема.

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

  • подкрасить воду прибора, например, раствором марганцовки. Конденсат станет лучше виден;
  • снабдить устройством подвешивания или подставкой.

О креплении самодельного барометра

Крепежный узел прибора изготавливают для эксплуатации в одном из двух вариантах:

  1. подвешивании на ручку или крючок;
  2. стационарной установке на подоконнике.

Петля для подвешивания

Используют отрезок медной проволоки, сгибают его петлей, а свободные концы впаивают внутрь контакта цоколя.

Остается подвесить самодельный барометр на подготовленный крючок или ручку.

Подставка

Можно использовать подходящий по диаметру колпачок от бутылочки с косметикой или моющих средств.

В него вклеивают лампочку либо ее крепят другим доступным способом, например, на пластилин или замазку. Такую самодельную конструкцию прибора удобно ставить на подоконник в любом свободном месте.

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

Как расшифровать информацию и пользоваться прибором

Наблюдение за конденсатом

Анализировать состояние влажности в колбе, предсказывать по ней погоду поможет следующая таблица.

Состояние конденсата Прогноз погоды
Образование мелких капель конденсата на внутренних стенках колбы. Предстоит облачный день. Осадки не предвидятся.
Средней величины капли конденсата держатся на стенках. Между ними хорошо видны сухие полосы, расположенные по вертикали. Предсказывается переменная облачность.
На стенках колбы держатся капли конденсата большой величины. Ожидается кратковременная дождливая погода.
Крупные капли конденсата стекают со стенок. Предстоит дождь с грозой.
Верхняя половина колбы барометра сухая, а снизу около воды собрались крупные капли конденсата. Дождевой фронт пройдет на удалении, не затронув нашу территорию.
Стенки лампочки сухие, а на улице идет дождь. Назавтра ждем смену погоды с хорошим солнечным небом.
Влажные капли конденсата сконцентрировались на северной стенке барометра. После обеда ожидаются осадки.

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

Особенности эксплуатации

Пользоваться самодельным барометром придется только в отапливаемом помещении. При отрицательной температуре вода и конденсат просто замерзнут. Располагают его на окне либо подоконнике. Желательно, чтобы оно было установлено с северной стороны здания. Считается, что так обеспечиваются более точные показания.

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

О точности показаний

Наш организм, как и все живое, реагирует на изменения погоды. Особенное влияние на него оказывают давление и влажность воздуха. Поскольку они сменяются не мгновенно, а постепенно, то возникает возможность ее прогнозирования.

Для их отслеживания метеорологи используют:


Мы же значительно искажаем все эти процессы.

Исторически сложилось так, что под термином «барометр» люди стали понимать прибор, который позволяет предсказывать погоду по изменению атмосферного давления. Этому способствовало нанесение на анероидной шкале таких обозначений, как «Ясно», «Сухо», «Дождь» и других природных явлений.

Это довольно упрощенное представление о прогнозе метеорологических событий, но даже этот уровень наш самодельный прибор не сможет полностью охватить:

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

К тому же в последнее время в быту стали массово использоваться . А они тоже регулируют влажность в помещениях, влияют на работу самодельного барометра.

Однако даже с учетом этих условий в летнее время можно уверенно предсказывать поведение погоды с точностью до 70%. Зимой, благодаря действию отопления, этот показатель снижается, но не критично.

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

Этим не стоит пренебрегать, ведь изготовление самодельного барометра не составляет труда, занимает порядка десятка минут. Дети оценят вашу работу, получив обучающую игрушку-базу в виде развивающей внимание домашней метеостанции.

Сейчас предлагаю посмотреть видеоролик владельца MrSam0delkin «Барометр из лампочки».

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

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

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

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


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

Микроконтроллер 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

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

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

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

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

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

\

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

Датчик давления и температуры 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 + 0,00178308 \cdot H} }}})$ ,
где $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 подключается USB -UART преобразователь:

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

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

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

MQTT

Golang приложение - клиент протокола MQTT , отправляющую принятую от метеостанции информации на сервер (MQTT -брокер) :

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

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

Питание

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

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

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

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

При отсутствии датчика DS18x20 выдается ошибка "E1", при отсутствии датчика - ошибка "E3".

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

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


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

Отображение температуры

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


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

Отображение давления

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

В метеостанциях для измерения скорости ветра используется трехчашечный анемометр (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}{C^{-1}}}}$).

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

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

РУКОВОДСТВО ПО СОЗДАНИЮ ПРОСТОЙ ДОМАШНЕЙ МЕТЕОСТАНЦИИ СВОИМИ СИЛАМИ

Если целый день или вообще круглосуточно включен компьютер, его можно использовать для работы домашней метеостанции. Поставлена цель создать простую и недорогую метеостанцию, в которой будет задействован персональный компьютер (ПК). ПК выступает в роли считывателя, обработчика и отправителя на сайт "Метеопост" измеренных метеорологических данных. Связь между компьютером и измерительным блоком будет осуществляться по сети 1-Wire.

Состав измерительного комплекса
1. Персональный компьютер с операционной системой Windows XP и выше и наличием свободного COM порта.
2. Адаптер для COM порта (преобразователь 1wire - RS232)
3. 4-х жильный Ethernet кабель типа "витая пара", длины должно хватить от COM порта до измерительного блока
4. Блок питания на 5В постоянного тока с хорошей стабилизацией напряжения
5. Измерительный блок (установлен на улице)
6. Программное обеспечение для ПК - приложение "Метеостанция".

ВАРИАНТ №1 - ОДИН ДАТЧИК

Сначала рассмотрим самый простой вариант - это метеостанция с одним датчиком температуры. Для этого не нужен дополнительный блок питания (п.4). И система очень упрощается. Адаптер для COM порта (п.2) можно выполнить по такой схеме. Адаптер состоит из двух стабилитронов на 3.9В и 6.2В, двух диодов Шотки и одного резистора.

Схема адаптера для COM порта


Адаптер в корпусе D-SUB

Место пайки кабеля и датчика температуры, включительно и выводы датчика нужно хорошо защитить от влаги. Лучше всего применить клей на полиуретановой основе.


Гидроизоляция выводов датчика

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

СТОИМОСТЬ РАДИОДЕТАЛЕЙ - не выше 50 грн.

ВАРИАНТ №2 - ЧЕТЫРЕ ДАТЧИКА

Более сложная метеостанция с четырьмя датчиками: температура, влажность, освещенность, давление. Поскольку только датчик температуры будет цифровой, а остальные аналоговые - в системе используется четырехканальный АЦП ds2450. Этот АЦП поддерживает протокол 1-wire. Схема требует дополнительного источника питания. Источник питания должен обеспечивать высокую стабильность напряжения. Но поскольку схема выше описанного адаптера имеет недостаток - невозможность подключения к датчикам внешнего источника питания из-за отсутствия реальной массы (-), используем другую схему адаптера. Этот адаптер также умещается в корпусе разъема COM порта типа D-SUB. Теперь в кабеле задействованы три провода: масса (-), +5в и данные.


Схема адаптера для COM порта с внешним питанием

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


Схема измерительного блока

Измерительный блок нужно разместить в корпусе и таком, чтобы плата и датчики были защищены от прямого воздействия осадков и солнечного излучения. Для этих целей хорошо подходит коробка из плотного пенопласта. В стенках коробки (дно и стенка с теневой стороны) нужно сделать побольше отверстий для вентиляции. Стенки коробки изнутри желательно обклеить алюминиевой фольгой для дополнительной защиты от инфракрасного излучения, иначе будет погрешность измерения температуры. Все датчики, кроме освещенности, размещаются прямо на плате. Датчик освещенности (фоторезистор) выносится из платы на проводах и устанавливается в отверстии дна пенопластового корпуса. Так, чтобы поверхность датчика смотрела вниз. В таком случае на датчик не будут попадать осадки и особенно зимой это убережет его от обледенения. Датчик освещенности для гидроизоляции нужно обработать, например, прозрачным клеем на полиуретановой основе (силиконовый герметик тест не прошел, он давал утечку тока). Обработать включительно (!) и светочувствительную зону фоторезистора. Выводы датчика залить клеем и разместить их можно в изоляционной трубочке. Концы выводов припаять к маленькой плате. А уже провода от измерительного блока припаять к этой плате. Места пайки залить парафином. Иначе, когда идет проливной дождь с ветром, метеостанция может оказаться неработоспособной и придется разбирать ее и все высушивать. Блок можно соединить с кабелем с помощью разъема. Но нужно использовать специальный влагозащитный разъем - система будет работать в сложных погодных условиях.

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


Измерительный блок на кронштейне

Выходное напряжение блока питания (БП) должно быть в пределах 4.8-5.3В. Подойдет и зарядка от старого телефона. Однако если в блоке питания нет стабилизатора - нужно добавить его в блок питания, т.к. для точности измерений очень важно наличие стабильного напряжения. Можно хотябы проверить тестером - изменяются ли десятые или сотые волта на выходе БП. Скачки десятых волта не допускаются. Простая схема стабилизатора на 5в приведена ниже. На входе БП может быть от 7 до 17В. На выходе будет около 5В. После этого нужно подключить наш кабель (который идет к измерительному блоку) к БП и измерить напряжение тестером на другом конце кабеля. Это напряжение может быть несколько ниже, чем непосредственно на выходе БП, из-за сопротивления кабеля. Это измеренное напряжение нужно ввести в настройках приложения как "Напряжение питания датчиков".


Типичная схема стабилизатора напряжения

СТОИМОСТЬ КОМПЛЕКТУЮЩИХ ДЛЯ МЕТЕОСТАНЦИИ

Примерная стоимость радиодеталей (цены 2015 года по магазину ).
1. Датчик температуры ds18b20 - 25 грн
2. АЦП ds2450 - 120 грн
3. Фоторезистор LDR07 - 6 грн
4. Датчик влажности HIH-5030 - 180 грн
5. Датчик давления MPX4115A- 520 грн.
ВСЕГО: 850 грн или 37$

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


Маркировка радиоэлементов

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ДЛЯ МЕТЕОСТАНЦИИ

Мы разработали приложение для Windows, которое предоставим бесплатно любому желающему собрать такую метеостанцию. Оно позволит вам на своем ПК наблюдать за погодой.


Окно приложения для ПК

В системном трее отображается температура воздуха

Все измеренные данные приложение может отправлять на наш сервер "Метеопост" и на специальной странице (пример) можно просматривать все метеоданные с браузера ПК. Также страница адаптирована и для браузера мобильного телефона.


Снимок экрана браузера мобильного телефона

ЗАКЛЮЧЕНИЕ
Можно сэкономить на стоимости деталей, если покупать их у китайцев на AliExpress. Возможно собрать метеостанцию без любого из датчиков, за исключением датчика температуры. У нашего АЦП остался один свободный вход, поэтому на него можно еще подать сигнал от датчика ветра. Но поскольку мы находимся в городе - установить и протестировать такой датчик нам попросту негде. В городской застройке не будет адекватного измерения скорости и направления ветра. Способы самостоятельного изготовления датчика скорости ветра подробно описаны многими энтузиастами в сети. Заводской датчик стоит довольно дорого.

Собрать такую метеостанцию под силам радиолюбителю со средними навыками. Для еще большего упрощения можно не разводить печатную плату, а собрать навесным монтажом на макетной плате. Проверено - работает.

Мы попытались создать именно доступную, дешевую метеостанцию. В частности для этого в системе задействован компьютер. Если его исключить, то нужно делать еще блок индикации, блок передачи данных в сеть и т.д, что существенно прибавит в цене. Например, сейчас популярная "Netatmo Weather Station" с подобными измеряемыми параметрами стоит около 4000 грн (200$).

Всем желающим сделать себе такую метеостанцию готовы помочь консультациями. Также предоставим необходимое программное обеспечение и подключим вашу станцию к нашему сайту.

Метеостанция своими руками.

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

(под катом много фотографий!)

Сначала пробегусь по компонентам, ссылки давать не буду, так как на eBay (в личном кабинете) товары ушли в архив. Многие компоненты покупал неспеша на аукционе eBay. Впервые опробовал аукцион, раньше всегда покупал «buy it now». Что могу сказать, если не спешить с покупками, то некоторые компоненты можно купить дешевле (разница иногда бывает в два раза).

Датчик давления ВМР085
Это основной датчик. Когда я увидел его на eBay, то понял, что хочу собрать именно домашнюю метеостанцию.
Прилетел датчик в обычном конверте, внутри обклеенном пупыркой.

Внутри конверта была визитка продавца и датчик, запакованный в антистатический пакет и завёрнутый в ещё один слой пупырки

Антистатический пакет был запаян, дабы влага во время перелёта не грозила датчику

Достаём датчик. С одной стороны припаяна линейка контактов, которые были вставлены в пенопласт, чтобы не погнулись. С другой стороны располагается сам датчик и маркировка контактов.




Все бы хорошо, но маркировка контактов нанесена в зеркальном виде.
Подключается датчик по шине I2C и питается от 3,3 В. То есть для нормального функционирования нужно 4 провода (+, -, SDA, SCL)
Опрашивать датчик можно 2 способами: или через библиотеку, или используя функции прямо скетче.
Пример программы:

#include

#define BMP085_ADDRESS 0x77 // I2C address of BMP085

Const unsigned char OSS = 0; // Oversampling Setting

// Calibration values
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;

Short temperature;
long pressure;

Void setup()
{
Serial.begin(9600);
Wire.begin();
bmp085Calibration();
}

Void loop()
{
temperature = bmp085GetTemperature(bmp085ReadUT());
pressure = bmp085GetPressure(bmp085ReadUP());
Serial.print(«Temperature: „);
Serial.print(temperature/10.0, DEC);
Serial.println(“ C»);
Serial.print(«Pressure: „);
Serial.print(pressure/133.322, DEC);
Serial.println(“ mm Hg»);
Serial.println();
delay(1000);
}

Void bmp085Calibration()
{
ac1 = bmp085ReadInt(0xAA);
ac2 = bmp085ReadInt(0xAC);
ac3 = bmp085ReadInt(0xAE);
ac4 = bmp085ReadInt(0xB0);
ac5 = bmp085ReadInt(0xB2);
ac6 = bmp085ReadInt(0xB4);
b1 = bmp085ReadInt(0xB6);
b2 = bmp085ReadInt(0xB8);
mb = bmp085ReadInt(0xBA);
mc = bmp085ReadInt(0xBC);
md = bmp085ReadInt(0xBE);
}

Short bmp085GetTemperature(unsigned int ut)
{
long x1, x2;
x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
x2 = ((long)mc << 11)/(x1 + md);
b5 = x1 + x2;

Return ((b5 + 8)>>4);
}

Long bmp085GetPressure(unsigned long up)
{
long x1, x2, x3, b3, b6, p;
unsigned long b4, b7;
b6 = b5 - 4000;
// Calculate B3
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((long)ac1)*4 + x3)<>2;
// Calculate B4
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
b7 = ((unsigned long)(up - b3) * (50000>>OSS));
if (b7 < 0x80000000)
p = (b7<<1)/b4;
else
p = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
p += (x1 + x2 + 3791)>>4;
return p;
}

// Read 1 byte from the BMP085 at "address"
char bmp085Read(unsigned char address)
{
unsigned char data;

Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
while(!Wire.available())
;
return Wire.read();
}

Int bmp085ReadInt(unsigned char address)
{
unsigned char msb, lsb;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
while(Wire.available()<2)
;
msb = Wire.read();
lsb = Wire.read();
return (int) msb<<8 | lsb;
}

// Read the uncompensated temperature value
unsigned int bmp085ReadUT()
{
unsigned int ut;
// Write 0x2E into Register 0xF4
// This requests a temperature reading
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();
// Wait at least 4.5ms
delay(5);
// Read two bytes from registers 0xF6 and 0xF7
ut = bmp085ReadInt(0xF6);
return ut;
}

// Read the uncompensated pressure value
unsigned long bmp085ReadUP()
{
unsigned char msb, lsb, xlsb;
unsigned long up = 0;
// Write 0x34+(OSS<<6) into register 0xF4
// Request a pressure reading w/ oversampling setting
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();
// Wait for conversion, delay time dependent on OSS
delay(2 + (3< // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF6);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 3);
// Wait for data to become available
while(Wire.available() < 3)
;
msb = Wire.read();
lsb = Wire.read();
xlsb = Wire.read();
up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
return up;
}


Помимо этого в датчике есть собственный термо-сенсор для компенсации давления и альтиметр

Arduino Nano v3.0
Это сердце всей метеостанции. По простому говоря, контроллер в миниатюрном размере.
Покупал
Рассказывать подробно про контроллер не буду, так как до меня уже это сделали:


Посылка с lightake была сборная, контроллер пришел в пакете, где был USB-кабель и Arduino в запаянном антистатическом пакете.

Чтобы оценить размеры, рядом с Arduino положил монетку номиналом 1 руб.

Плата контроллера вблизи



USB-кабель хороший, с ферритовым кольцом. Питается Arduino по USB кабелю. Среду разработки можно скачать (страница для скачивания ). Язык «С»-подобный, с освоением проблем не было, так как на нем очень много программирую на работе.

LCD экран
На работе в закромах нашёл совместимый LCD 1602 экран. С подключением пришлось повозиться, так как даташита на него не нашёл. В результате LCD заработал.

Но после недолгой эксплуатации заметил, что мне этого экрана мало и вывести больше данных не получится, так как он имеет всего 2 строки по 16 символов в каждой. Поначалу кажется, что этих параметров хватит, но когда начинаешь программировать, то понимаешь, что максимум можно впихнуть 3-4 параметра. А если делать меню (я ведь подумывал сделать меню на этом экране), то свободного места остаётся на 1-2 параметра.
В итоге начал подыскивать себе другой экран. Сначала присматривался к графическому экрану от Nokia 3310 и даже в аукционе eBay участвовал, чтобы его купить, но не сложилось (чему я очень рад), поэтому мне пришлось отказаться от этого экрана. Сейчас я понимаю, что он был бы слишком мал для моих целей, так как есть с чем сравнивать.
Случайно просматривая шилды на Arduino, я наткнулся на графический экран 12864 на контроллере ST7920. У этого экрана и размер подходящий, и хорошее разрешение для моих нужд (128х64). То есть можно спокойно разместить 6-7 строк по 20 символов нормально читающегося шрифта. Так как экран графический, то помимо текста разными шрифтами можно разместить и графику. Короче, это именно то, что мне нужно было, все присутствовало в этом экране, поэтому я не выдержал и заказал.
Посылка пришла быстро и была упаковано стандартно: конверт-пупырка, внутри ещё слой пупырки и экран в антистатическом пакете:






Чтобы оценить размеры, рядом с LCD положил монетку номиналом 1 руб.




Чтобы быстро подключить экран к Arduino, к контактам LCD припаял линейку контактов. Подключать LCD можно по последовательной шине и по параллельной. Я выбрал первый вариант, так как свободных контактов Arduino и так мало.
Подключение (взято из сети):

- Контакт 1 (GND) подключается к общей шине
- Контакт 2 (VCC) подключается к шине питания +5V, причём потребляемый ток сравнительно небольшой и дисплей можно питать от встроенного стабилизатора Arduino.
- Контакты 4, 5 и 6 подключаются к цифровым выходам Arduino, образуя последовательный интерфейс SPI:
контакт 4 – (RS) – соответствует линии CS (например 7)
контакт 5 – (RW) – соответствует линии MOSI (например 8)
контакт 6 – (E) – соответствует линии SCK (например 3)
номера контактов Arduino могут быть любыми, главное не забыть потом правильно указать их в тексте программы при инициализации дисплея.
- Контакт 15 (PSB) соединяется с общей шиной.
- Контакты 19 (A) и 20 (K) – это питание подсветки (+5V и GND соответственно). Для регулировки яркости подсветки можно использовать переменный резистор 10кОм, включённый между шинами питания и GND. Напряжение с его движка подаётся на контакт 19 дисплея.
По этой инструкции я подключил все, кроме подсветки. В качестве питания подсветки я использовал ШИМ Arduino.
Для того, чтобы программно подключить LCD к Arduino, используется библиотека u8glib. Скачать можно . Если есть проблемы скачивания, то могу библиотеку залить на narod.ru.
Сама библиотека не сложная и позволяет выводить текст разным шрифтом, рисовать линию, рисовать простейшие геометрические фигуры (прямоугольник, круг), выводить на экран свои изображения, подготовленные специальным образом. В принципе, этого инструмента достаточно для большинства задач.
Вот результат простенькой программы:

Сама программа:

#include «U8glib.h»

U8GLIB_ST7920_128X64 u8g(3, 9, 8, U8G_PIN_NONE); // SPI E = 3, RW = 9, RS = 8

// Подпрограмма определения свободной памяти
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0? (int) &__heap_start: (int) __brkval);
}

Void setup(void) {
u8g.setFont(u8g_font_6x10); // шрифт
u8g.setRot180(); //Перевернул экран
analogWrite(6, 115); // Устанавливаем яркость экрана (анод подсветки на 6 pin)
}

Void loop(void) {
u8g.firstPage();
do {

u8g.setPrintPos(1, 12); // позиция
u8g.print(«Hello!!!»); // вывод текста
u8g.drawBox(0,22,128,9); // Закрашиваем прямоугольник белым
u8g.setColorIndex(0); // белые чернила, черный фон
u8g.setPrintPos(1, 30); // позиция
u8g.print(«Word...»); // вывод текста

U8g.setColorIndex(1); // белые чернила, черный фон
u8g.setPrintPos(1, 50); // позиция
u8g.print(«After start =»); // вывод текста
u8g.setPrintPos(85, 50); // позиция
u8g.print(millis() / 1000); // вывод число секунд после старта
u8g.setPrintPos(1, 64); // позиция
u8g.print(freeRam ()); // вывод сколько памяти занято
} while(u8g.nextPage());

Delay(200);
}

Часы реального времени DS1307
Ещё один компонент для моей метеостанции. На данном шилде реализованы часы реального времени. Заказывал их на аукционе eBay. Продавец прислал платку часов в нереально большой коробке


Внутри коробки было два листка А4 с рекламой и платка часов, обмотанная целлофаном


Хочу заметить, что плата не превышает размером 2 руб. монету, а коробка была размером 13х15х5 см.
Плата была упакована в антистатический пакет

Платка вблизи



С данным модулем мне пришлось повозиться. Во-первых, были трудности подключения. А во-вторых, кварц на данной плате никакой. Если бы знал, что на модуль потрачу столько времени, то, скорее всего, собрал бы его сам, благо в сети полно схем. Самая простейшая схема содержит 4-5 компонентов.
По поводу подключения. Я нашёл библиотеку, в которой было сказано, что интерфейс I2C можно подключать не на привычные аналоговые входы Arduino (А4 и А5), а на любые дискретные. Как написано, так и сделал. Сначала ничего не работало, после долгого танца с бубном часы завелись. Ну, подумал, всё, проблемы закончились, но после того, как я попытался этот же модуль подключить к другой Arduino, пляски с бубном продолжились. Много времени потратил на поиски решения данной проблемы и практически везде указывалось либо на неправильное подключение, либо на отсутствие подтягивающих резисторов на контактах SCL и SDA. Я уже хотел с паяльником в плату лезть, но на одном форуме случайно наткнулся на код, где было сказано, чтобы SCL и SDA подключать к стандартным портам I2C на Arduino. После стандартного подключения, все сразу заработало.
Теперь по поводу кварца. Не знаю, что там за кварц ставят китайцы, но часы с таким кварцем убегали в сутки на 10-11 сек. В месяц данная погрешность составляет 5 минут, а в год 1 час. Нафиг такие часы не нужны. Пришлось снова лезть в сеть и искать, как исправить данный баг. Первое попавшее решение говорит о том, что нужно заземлить кварц. Сделал - результат нулевой. Ещё где-то нашёл, что нужно найти старую материнку и выпаять оттуда часовой кварц. Сделал - результат есть. Теперь часы убегают не на 10-11 секунд, а на 1,5 секунды в сутки. Скажем так, стало лучше, но до идеала далеко. Так как больше с паяльником возится неохота, то было решено подводить часы программно, то есть раз в сутки подводить часы на нужную величину. После 10 суток, часы ушли не более, чем на секунду. Метод хорош, но только тогда, когда устройство синхронизации Arduino подключено к питанию, иначе часы работают от батарейки и все равно убегают.
Небольшая тестовая программа:

#include «Wire.h»
#define DS1307_I2C_ADDRESS 0x68 // SDA A4, SCL A5

Byte decToBcd(byte val)
{
return ((val/10*16) + (val%10));
}

Byte bcdToDec(byte val)
{
return ((val/16*10) + (val%16));
}

Void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour) // 0-99
{

Wire.write(0);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.endTransmission();
}

Void getDateDs1307(byte *second,
byte *minute,
byte *hour)
{

Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 3);

*second = bcdToDec(Wire.read());
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read());
}

Void setup()
{
byte second, minute, hour;
Wire.begin();
Serial.begin(9600);

Second = 45;
minute = 5;
hour = 16;

SetDateDs1307(second, minute, hour);
}

Void loop()
{
byte second, minute, hour;

GetDateDs1307(&second, &minute, &hour);
Serial.print(hour, DEC);
Serial.print(":");
Serial.print(minute, DEC);
Serial.print(":");
Serial.println(second, DEC);

Delay(1000);
}


Здесь не использована библиотека, да и функции усечены, для чтения и записи времени.

Датчик температуры и влажности DHT11
Про данный датчик рассказывать нечего. Я бы его даже не стал использовать, если бы не нужна была влажность. К сожалению, я его не сфотографировал, когда получил, поэтому фотографий не будет. Фотографии датчика можно будет посмотреть ниже, где я его подключил к Arduino. Подключение датчика простое (+, цифровой выход, -). Обычно датчики делают четырёх контактные. При таком форм-факторе третий контакт ни к чему не подключают.
Для подключения к Arduino можно использовать библиотеку. Скачать можно .
Небольшая тестовая программа c выводом информации на LCD дисплей 1602:

// include the library code:
#include
#include

// Declare objects
dht11 DHT11;
LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

#define DHT11PIN 7
int i;

Void setup()
{
lcd.begin(16, 2);
lcd.print(«Status: „);
i=0;
}

Void loop()
{
int chk = DHT11.read(DHT11PIN);
lcd.setCursor(8, 0);
switch (chk)
{
case 0: lcd.print(“OK „); break;// lcd.setCursor(11, 0); lcd.print(millis()/2000); break;
case -1: lcd.print(“Checksum error»); mErr(); break;
case -2: lcd.print(«Time out error»); mErr(); break;
default: lcd.print(«Unknown error»); mErr(); break;
}
delay(500);
lcd.setCursor(15, 0);
switch (i)
{
case 0: lcd.print("^"); lcd.setCursor(15, 1); lcd.print(" ");break;
case 1: lcd.print(«v»); lcd.setCursor(15, 1); lcd.print(" ");break;
default: lcd.setCursor(15, 1); lcd.print(«E»); break;
}
i=i+1;
if (i>1) i=0;
lcd.setCursor(0, 1);
lcd.print(«H=»);
lcd.setCursor(2, 1);
lcd.print((float)DHT11.humidity, 0);
lcd.setCursor(4, 1);
lcd.print("%");
lcd.setCursor(8, 1);
lcd.print(«T=»);
lcd.setCursor(10, 1);
lcd.print((float)DHT11.temperature, 0);
lcd.setCursor(12, 1);
lcd.print(«C»);

Void mErr()
{
lcd.setCursor(2, 1);
lcd.print("**");
lcd.setCursor(10, 1);
lcd.print("**");
i=5;
}


Минусы у датчика есть – данные с датчика идут только в целых числах, да и диапазон слабенький.

Вроде, про все компоненты написал. Осталось собрать все в единое целое.
Упс, чуть не забыл! Для того, чтобы все собрать устройство, нужен корпус. Корпус тоже заказывал на Ebay. Продавец оказался из Англии. Посылка дошла быстро, но фотографировать её не стал. Все фотографии корпуса ниже.

Сначала собрал все на столе с помощью специальных проводков. Написал тестовую программу и залил её в контроллер.



На самом деле синий цвет подсветки гораздо ярче. Даже при минимальной яркости (Bright=5) происходит засветка кадра.

Чтобы все собрать без проводов, было решено сделать мини материнскую плату, а платка Arduino и шилды надевались на разъёмы. В случае чего, их с лёгкостью можно быстро извлечь. LCD экран и кнопки для управления я решил также цеплять на разъёмах, только датчик температуры впаять на проводах.
Вот такая вышла платка



На последней фотографии я ещё до конца флюс не смыл. Под шилды рядом с разъёмами приклеил пористую резину, чтобы была хоть какая-то опора. Хотя на самом деле шилды в разъёмах на контактах и так прекрасно держатся.

Материнская плата с установленными шилдами и платой Arduino.

Вот так выглядит полное подключение к материнской плате


Вместо кнопок использовал самодельный шилд, спаянный на макетной плате. В качестве кнопок использовал кнопки из старых мышек.
Как видно, количество проводов убавилось.

Основная проблема размещения в корпус - это ровно выпилить паз под LCD экран. Как я ни старался, все равно идеально не получилось. Щели в некоторых местах были чуть больше 1 мм. Чтобы все смотрелось аккуратно, я взял чёрный герметик для аквариума и залил все щели, заодно экран крепил именно на этот герметик. После высыхания герметика снаружи обрезал излишки. При ярком освещении герметик видно, а при обычном - все сливается с корпусом.
Вот так выглядит корпус изнутри с установленным LCD экраном и материнской платой.

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

Долго думал, как приладить кнопки в корпус и, самое главное, какие использовать кнопки…
В радиоэлектронных магазинах приглянулись кнопка с длинным шпиньком и наконечники, которые надеваются на этот шпинёк. Эти кнопки используются для пайки на плату. Все бы хорошо, но у них есть минус – ход нажатия очень маленький и громкий.
Размещать кнопки пришлось в два этапа: первый - разместить кнопки на плате, второй - эту плату крепить ещё на одной плате. И все это потом засовывать в корпус на направляющие.

Вот так выглядит платка с кнопками:



Вот так выглядит плата-держатель:


Здесь видны направляющие, в которые вставляется плата с кнопками. Некоторые элементы паял для того, чтобы придать жёсткость плате.

Теперь все засовываем в корпус
Без подключения кнопок:


С подключением кнопок:

Закрываем корпус и включаем. Все прекрасно работает, кнопки отрабатывают, как нужно.

В конце размещаю небольшое видео работы устройства в разных режимах:
http://www.youtube.com/watch?v=KsiVaUWkXNA&feature=youtu.be
У кого видео здесь не отображается, вот ссылка на

Пора заканчивать обзор.
Немного напишу о программе, а потом краткие выводы. Когда писал программу, не думал, что очень быстро упрусь в ограничение в 30720 байт.


Пришлось оптимизировать код. Многие куски кода выносил в подпрограммы. Никогда бы не подумал, что оператор switch… case в компилированном виде занимает больше места, чем несколько if… else. Ещё экономит место правильное объявление переменных. Если объявлять массив long, хотя вполне можно обойтись byte, то перерасход памяти достигает 500 байт в зависимости от размерности массива. Когда пишешь программу, то об этом не думаешь, а уже потом, когда анализируешь программу, то понимаешь, что некоторые вещи сделал неправильно, и начинаешь оптимизировать код. После того, как проблемы с размером программы были решены, я упёрся в ограничение оперативной памяти. Выражалось это в том, что программа начинала виснуть после загрузки. Пришлось вводить подпрограмму подсчёта свободной оперативной памяти. В результате, был вынужден отказаться от одного алгоритма предсказывания погоды, так как он должен выводить пиктограммы на экран. Сам алгоритм работает, а вот вывод пиктограмм пришлось заремировать. У меня есть ещё задумки, как оптимизировать код, но в ближайшем будущем оставляю работать устройство, как есть, чтобы оценить работоспособность и выявить все баги.

Теперь небольшие выводы
Минусы
1) Цена. Оправдание этому минусу – хобби никогда не бывает дешёвым.

Плюсы
1) Большой функционал устройства
2) Наращивание функций ограничивается только используемым контроллером и собственным желанием
3) Эстетическое удовольствие от созерцания и моральное удовльствие от того, что я все-таки собрал и доделал это устройство

Планирую купить +86 Добавить в избранное Обзор понравился +137 +304

Понравилась статья? Поделитесь с друзьями!
Была ли эта статья полезной?
Да
Нет
Спасибо, за Ваш отзыв!
Что-то пошло не так и Ваш голос не был учтен.
Спасибо. Ваше сообщение отправлено
Нашли в тексте ошибку?
Выделите её, нажмите Ctrl + Enter и мы всё исправим!