Купил когда-то по случаю “на поиграться” недорогую метеостанцию на arduino.ua – WS1041 – накопились скидки, решил в конце лета 2021 взять что-то этакое:
Станция простенькая, без wifi, хотя и с возможностью подключения к компьютеру. Не обошлось без косяков – флюгер и анемометр за что-то цепляли внутри, пришлось отправлять обратно “на ремонт”. Явно не косяк сборки, просто где-то внутри провод влез в подвижную часть. Через время вернули и проблема больше не проявлялась.
Станция, кстати, после моей покупки пропала из продажи, а через время примерно за те же деньги появилась более продвинутая, уже с wifi. Обидно, досадно, но ладно.
В управлении девайс не особо удобен, я вечно путался в меню. Кроме того все настройки сбрасывались стоило снять питание. С учетом блекаутов – я в итоге забросил выставлять каждый раз время – а автоматическая радионастройка не работала. Остальные параметры можно было и не двигать; в целом, станция что-то показывала – и ладно. Можно было примерно ориентироваться на ветер или прогноз дождя, а также глянуть температуру на улице и в доме.
Наружный блок сменил 3 места жительства: сначала на уголке “поля” солнечных панелей (разместил по-быстрому, прижав к уголку струбциной); потом – на дымоходе сауны. Когда дымоход решил снести – сделал небольшую мачту над коньком гостевого и перенес все туда. В общей сложности оно прожило пару лет, в итоге внешний блок отказал в одну из зим. Сначала думал, что на холоде пришли в негодность аккумуляторы (туда поставил далеко не новые Ni-MH), но по весне разборка показала, что вышел из строя блок электроники – появилась ржавчина на деталях, да и пайки (а особенно контакты разъемов) были не в лучшем состоянии. Следующие полгода пользовался внутренним блоком в качестве домашнего термометра – хотя в целом, остались еще функции предсказания погоды по атмосферному давлению. Идей по ремонту не было. Через время (после изготовления датчиков температуры и радиации+давления) подумал, что можно было бы хотя бы иметь датчик дождя. Нашел, даже напечатал его на принтере, но потом надолго отложил – были другие заботы.
В итоге, когда дошли руки развивать тему дальше и я наконец-то разобрал оставшуюся часть наружного блока, подумал – а зачем что-то придумывать, если есть готовый набор датчиков и можно просто сделать к ним новые “мозги” на МК, в которых и реализовать все желаемое? Тем более датчик дождя был по принципу совершенно точно такой же самый, как и тот, что я печатал: качелька, на которую льется вода с перекидыванием по переполнению емкости; при перекидывании закрепленный на качельке магнит проходил мимо геркона.
Температура, влажность, давление – это все привычные BME280 и DS18B20. Оставалось разобраться с флюгером и анемометром.
Анемометр состоял из пары магнитов на крыльчатке и одного геркона; на каждое вращение получалось 2 импульса.
С флюгером было чуть интереснее: магнит на подвижной части, который может перекрывать до 2 герконов. Сами герконы подключены последовательно с резисторами разных номиналов – 47 кОм, 64 кОм, 100 кОм и 120 кОм, а дальше все сводится впараллель на 2 провода. Т.е., делаем делитель, в одном плече которого данная конструкция, меряем АЦП напряжение на выходе и исходя из его уровня определяем, куда сейчас смотрит флюгер. Все бы хорошо, но в 8 возможных комбинациях сопротивлений есть достаточно близко расположенные значения (например, 33,6 и 38,7 кОм) с одной стороны, а с другой – широкий диапазон в целом (27 – 120 кОм). Пробовал даже подобрать более подходящие значения сопротивлений – и они нашлись – но даже так в итоге отлавливать изменения напряжения на уровне сотен милливольт не особо точным АЦП может быть не сильно удобно:
С математической теорией расчета значений сопротивлений идей не было; в целом – мне совершенно не сложно было кинуть отдельные провода на каждый геркон, благо ног у контроллера хватало. Так как флюгер и анемометр собирались в одну конструкцию и подключались друг к другу – кинул до них витую пару. Датчик дождя оставил со штатным проводом. Вместо солнечной панели (автономное питание метеостанции не предполагалось) решил разместить датчик освещенности – как раз в хозяйстве был TSL2591. Выпилил окно в уже изрядно помутневшем пластике и сверху на 2 разных типа силикона посадил кусочек стекла:
Надеюсь, все будет держаться нормально и герметично.
Электронный блок – на ESP32 C3 и традиционной макетке. Разместил все в старом корпусе, только сделал пропилы в нужных местах и герметизировал неиспользуемые теперь отверстия от RJ11 и решетки. Ввод проводов – через батарейный отсек, дальше – герметизация силиконом:
В последний момент изменил подключение пары I2C-датчиков, чтобы освободить pin 8 для status_led – было удобно наблюдать подключение, пока возился со станцией в доме. В остальном – ряд ног под герконы с подтяжками, а также шина 1 wire под термодатчик.
Если с цифровыми датчиками все плюс-минус просто – завел себе DS18B20 или BME280 в конфиг и снимаешь показания, то для импульсных дальше – расчеты и поиск решений в сети.
Для флюгера чаще всего использовался вариант с АЦП, поэтому в моем случае набросал шаблон, обрабатывающий сигналы с 4 GPIO-входов и показывающих значение у сенсора исходя из состояний этих входов.
С дождем и ветром веселее. Уровень осадков в мм – это число литров дождя, вылитое на 1 квадратный метр площади. В моем случае дождь собирается не на квадратном метре, а на гораздо меньшей площади. Сначала даже вырезал из картона фигурку по форме датчика дождя, дальше, пока рисовал – возникло понимание того, как правильно считать.
Форма – прямоугольник и 2 полукруга по бокам. В итоге площадь – сумма площадей прямоугольника со сторонами 5 на 6 см и круга диаметром 5 см, что дает нам 0.05*0.06 + 3.1415926*0.025*0.025 = 0.0049635 м^2 площади поверхности сбора осадков. Это в 1/0.0049635 = 201.471 раз меньше, чем 1 м^2, что и надо будет учитывать в расчетах. Однако есть еще другой параметр датчика – число срабатываний на некое собранное число осадков. Тут пошел опытным путем: лил на датчик воду и считал число срабатываний. Не скажу, что получалось сильно точно; опыт повторял несколько раз и итоговое значение зависело в том числе от скорости потока – значение плавало в диапазоне 220-250 имп/литр. Остановился на 250. Итого: на 1 литр воды, попавшей на датчик, имеем эквивалентные 201.471 литра для квадратного метра, что даст нам 250 импульсов – или, иначе говоря, 0.805884 импульса на каждый литр на мм^2 (или 1 мм осадков). Делаем в конфиге pulse_meter, у которого в filter вносим multiply на 0.805884 для текущего “уровня дождя в минуту”, а также для общего числа осадков в сутки.
Дальше можно строить производные для более удобного наблюдения уровня осадков с усреднением за час или сутки. Добавил еще интегратор “за минуту”, что должно было сходиться в итоге с данными с самого датчика. И, честно говоря, получалась какая-то чушь, расхождение было сильно большим.
Проблем добавили и ложные срабатывания датчика дождя при выносе метеостанции на крышу – возможно, от проходящей рядом ЛЭП. Добавлял защиту от ложных срабатываний софтово (вряд ли будет лить так, что датчик сможет срабатывать, например, чаще раза в 10 секунд); пробовал батарейное питание; несколько раз снимал станцию для доработок: попробовал сначала заменить провод на датчик (ведь электрически принцип у датчиков ветра и дождя одинаковый, но проблемы только с дождевым. В чем разница? Вероятно, витая пара) – это хотя бы можно было попробовать без разборки блока электроники. Не помогло. Дальше в ход пошло изменение схемы: конденсатор параллельно геркону (не помогло); в процессе даже оставил замкнутой линию возле геркона – и даже просто на эту петлю (примерно 80 см провода в сумме) ловились помехи. Когда пришлось разбирать блок электроники (а для этого приходилось убирать силикон на вводе проводов) – сначала попробовал сменить вывод МК, потом добавил подтяжку. Смена подтяжки с 4,7 кОм до примерно 800 Ом ощутимо снизило число помех, но они все равно остались. Решил действовать радикально и сделал опторазвязку: подтяжка у МК остается старая – 4,7 кОм, а геркон подает через 910 Ом сигнал на PC817. После этого помехи исчезли совсем. Что касается интеграторов – то в последнее время не так много осадков, чтобы делать активное наблюдение. Однако при нескольких зарегистрированных мм осадков в сутки интеграторы не показывают вообще ничего и на пока бесполезны. Буду разбираться позже.
С ветром – номинально вроде все просто: представляем крыльчатку как “колесо”, которое “катится” по ветровому потоку. Длину окружности “колеса” можно измерить и высчитать – “просто добавь спидометр”. Длина рычага анемометра до центра чашки – 8 см, что дает нам 2*3.1415*0.08 = 0.50264 метра длины окружности – или, иначе говоря, один оборот анемометра при скорости ветра 0.50264 м/с. Датчик дает 2 импульса на оборот, отсюда получаем 0.25132 м/с на импульс. Так как pulse_counter дает значения в импульсах в минуту – делим на 60, что дает значение для multiply у filter равным 0.00418867. Сделал; подобавлял шаблоны для получения скорости в км/час, а также регистрацию пиковых значений за период. Вроде все красиво.
По факту получилось ощутимое занижение показаний. Сравнил с ручным анемометром – тот при той же конструкции (правда, меньших размерах рычагов) крутился явно бодрее и выдавал большие значения. Единственное, что не успел попробовать – разместить оба анемометра совсем уж в одних условиях (вылезти с ним на крышу). Да, насчет “колеса, катящегося по ветру”, конечно, упрощение, так как ветер влияет на чашки с обеих сторон относительно оси, поэтому обычно вводятся коэффициенты, но с этим анемометром разница вышла в разы даже относительно ручного.
Из полезного – нашел пару статей на тему анемометров:
- https://skootsone.yolasite.com/wind-pow-02.php – самоделки + немного расчетов. Из полезного, о чем не догадался – делать замеры скорости потока, перемещаясь в руках с анемометром по какому-нибудь коридору.
- https://pmc.ncbi.nlm.nih.gov/articles/PMC4279541/ – какая-то научная работа, где рассчитывается в том числе влияние формы чашек анемометра и тому подобные тонкости.
Так или иначе, анемометр немного “странный”. Для более реалистичных показаний скорректировал в итоге multiply в фильтре, исходя из того, что видел на windy и у себя – пришлось поднять значение в 4 раза. Для удобства позже сделал еще усредненные значения ветра: когда открыл для себя кастомные панели в Home Assistant, то начал активно использовать стрелочные индикаторы и там актуальнее оказалось усредненное значение. Но при этом хотелось сохранить “тени” для графика:
В остальном – вроде получил то, что хотел. Из сенсоров – добавил еще “точку росы” – в некотором роде показатель, насколько комфортные сейчас условия.
Пока так, потом что-то решу насчет интеграторов для дождя и ошметков параметров после различных экспериментов.