В своём
предыдущем обзоре я рассказывал об автоматизации дачной теплицы. Обзор закончился на том, что наша теплица научилась поливать две независимые секции (огурцы и томаты) по расписанию, открывать и закрывать форточки по ситуациям внутри теплицы (полив, время, температура, закат/рассвет), использовать тёплую воду (для полива) и холодную (для дождевания во время жары) и, при этом, уметь безболезненно оправляться от сбоев по питанию/водоснабжению. Главным же недостатком являлось то, что теплица ничего не знала о погоде снаружи. Уже в прошлый сезон я наблюдал ситуации, когда льёт ливень, а фрамуги открыты. И хорошо ещё, что в прошлом году не было значительных порывов ветра, а то в интернете полно рассказов, как форточки теплиц выкорчёвывало вместе с петлями и механическими термоприводами.
Закроем эту проблему, построив независимый погодный модуль.
По сути, чёткой привязки погодного модуля именно для работы с теплицей и нет. Модуль — отдельное законченное устройство. Он просто получает информацию о силе ветра, температуре и осадках, программно анализирует порывы ветра и выносит суждения о хорошей или плохой погоде. Точнее, он выносит суждение о том, подходящая ли в данный момент погода для открытых или закрытых форточек в теплице. И по радиоканалу в теплицу сообщает контроллеру, что пора бы закрыть фрамуги или, наоборот, что погода наладилась. Но ничто не мешает принимать и использовать эту информацию не для теплицы, а по своему усмотрению (например, с минимальными доделками скетча, в домашней метеостанции; или сливать эти данные на НародМон).
Самым затратным в реализации проекта оказался датчик ветра, поэтому главным объектом обзора является именно он.
После анализа предложений на просторах интернета, мною был куплен чашечный анемометрический датчик, вынесенный в заголовок. Я ничего не знал о производителе и конструкции, приобретённый лот — это запчасть к их погодным станциям. Оказалось, что его конструкция настолько проста, что я даже не стал делать традиционных фоток типа «распаковка», «с разных ракурсов» и т.д.
Одной единственной картинки будет более чем достаточно.
Датчик конструкционно — это две литые пластмассовые детали: флюгерная часть (три чашки, объединённые с валом) и статорная часть, крепящаяся к опоре. В полусфере ротора расположен магнитик. В статорной части — геркон с припаянным проводом, оканчивающимся разъёмом RG11. И это всё.
За один полный оборот флюгерной части, по задумке конструкторов, геркон должен замкнуться и разомкнуться один раз.
Я подключил датчик к ноге ардуины и попытался посчитать обороты, вращая датчик рукой. Всё вышло именно так, как и ожидалось. Геркон — крайне шумный (в электронном смысле) и помехогенерирующий элемент. Я не знаю, как конструкторы собирались подавлять дребезг (ведь тут применён геркон только на замыкание). У меня каждый раз получалось «плюс/минус погода на Марсе». Потратил день на различные схемные решения и программные методы (включая несколько вилок библиотеки Bounce), вменяемого результата толком не добился: даже на малых оборотах куча ложных срабатываний и дребезга, а уж в боевых условиях, когда период срабатываний будет минимальным, и говорить нечего. Идею применять тут геркон я признал полностью бесперспективной. Я видел только единственную альтернативу: заменить геркон на датчик Холла.
Чтобы не терять времени на нудную и ненужную работу по покупке датчика Холла и постройке минимальной обвязки для нормальной его работы, поступил просто. Взял пыльный заклинивший вентилятор от старого процессорного кулера, у которого было три контакта (питание+датчик оборотов), достал оттуда плату управления целиком и освободил от катушек статора. Плата — кольцевой формы, идеально подходящая во внутренний объём корпуса датчика. Вместо выброшенных обмоток нагрузил микропроцессор бывшего вентилятора парой десятикилоомных резисторов (а иначе он сходил с ума), а сигналы от пробегающего флюгерного магнита штатно снимал с третьего контакта платки. Отличное решение! Никаких ложных срабатываний. Один оборот флюгера — один передний и один задний фронт импульса. А уж подсчитать ардуиной эти передние или задние фронты за секундный интервал — плёвая задача.
С электронной частью датчика ветра разобрались. Теперь его нужно отградуировать. Т.е. превратить частоту (или периоды) импульсов от датчика в метры/сек или км/ч реального ветра. А это уже зависит от количества чаш флюгера, от их объёма и формы, от трения качения в подшипнике, от массы флюгера и других факторов… Словом, калибровка необходима.
Но заставить ветер дуть с различной фиксированной силой, чтобы отградуировать датчик — я не могу. Я не шаман, хотя и сисадмин. Поступил проще. Если мы не можем заставить воздух двигаться с заданной скоростью относительно неподвижного флюгера, то уж заставить двигаться флюгер с заданной скоростью относительно неподвижного воздуха нам вполне по силам!
Для этого нам нужно:
— автомобиль со спидометром;
— открытое окно автомобиля;
— рука, держащая флюгер в этом окне на достаточном расстоянии от корпуса автомобиля;
— стенд, собирающий все данные, необходимые для калибровки.
Стенд в данном случае — это опытная конструкция, собирающая в лог текущую скорость, текущее время и частоту/период, получаемую с датчика ветра. Конструкция собирается лишь на время, и её главная задача — работать правильно и быть достаточно мобильной, чтобы разместиться в движущемся автомобиле.
Людям со слабой психикой, беременным и слабонервным не открывать
Конструкция временного стенда для градуировки датчика ветра:
На заднем фоне — пауэрбанк, питающий всю конструкцию; слева — ардуина, собирающая данные; на переднем плане — плата GPS, получающая точное значение текущей мгновенной скорости; внизу — антенна GPS. Справа — сам датчик ветра на проводе достаточной длины, включённый в разъём RG11. Синяя изолента — по вкусу.
А дальше был выбран тихий вечер, когда не шевелились даже макушки деревьев, был выбран прямой участок дороги полукилометровой длины, по которой автомобили ездят нечасто и было сделано много-много рейсов «туда-обратно», чтобы свести к минимуму погрешности от теоретически возможного слабого ветерка.
Данные не разочаровали. Всё довольно неплохо укладывалось в линейную зависимость:
Угол наклона прямой — и есть те физические параметры флюгера.
Ардуина пересчитывает частоту импульсов от датчика ветра в привычные нам метры/сек и в удобные для понимания
баллы Бофорта.
У того же продавца и в то же время был приобретён и
датчик дождя коромысельного типа.
Основой датчика является подвижное коромысло, которое может перекидываться в одно из двух устойчивых положений. Собранные воронкой осадки стекают точно в плоскости, проходящей через ось вращения коромысла. Таким образом, всегда будет наполняться то плечо, которое сейчас выше. И, по мере течения струйки, коромысло будет перекидываться из одного устойчивого положения в другое.
На самом коромысле закреплён магнитик. Догадались? Да-да, в стойке датчика закреплён знакомый геркон. По срабатыванию геркона можно определять, идёт ли сейчас дождь и с какой интенсивностью это происходит.
Вот тут видна плата с припаянным герконом, размещённым в плоскости оси коромысла:
В датчике дождя заменять геркон на датчик Холла я не стал. Тут это действительно неважно. Таких частот, как при вращении флюгера, тут не будет, опрашивать можно спокойно и не торопясь, программно отсекая весь дребезг.
Модуль располагается не внутри теплицы, а на определённом удалении от неё, что очевидно: он находится там, где мне было удобно размещать датчики ветра и дождя и где мне было несложно подать ему питание. Собственно, питание 12v — это единственное, что погодному модулю нужно для работы.
А для связи с теплицей организован радиоканал. Радиоканал я сделал на
UART-радиомодулях. Спасибо Юрию за обзор. С этими радиомодулями действительно удобно работать, мне они понравились. Соответственно, контроллер внутри теплицы был дооснащён ответным радиомодулем. Благо, у ArduinoMega аппаратных serial-интерфейсов полно: бери, да пользуйся.
Схематически погодный модуль совсем несложен.
Понижающий DC-DC преобразователь (у меня на KIS-3R33S, но подойдёт любой, токи совсем небольшие) питает ардуину, датчик ветра (поскольку у него внутри плата от старого вентилятора) и радиомодуль.
Ардуина собирает сигналы от платы датчика ветра и от геркона датчика осадков, обрабатывает их и посылает результаты символьным потоком в программный serial-порт, к которому подключён радиомодуль.
Как я уже сказал выше, этот поток можно использовать не только для теплицы. Можно просто логировать этот поток в файл и использовать логи погоды по своему усмотрению. Теплица, со своей стороны, ловит собственным радиомодулем этот поток, выделяет из этого потока только свои ключевые хештеги и реагирует только на них, игнорируя всё остальное, что к ней не относится.
Такой механизм реализован не просто так. Как я выяснил чуть ранее, данные радиомодули спокойно живут на одном канале и в бóльшем, чем 2 шт, количестве. Модули никак не мешают друг другу, а совершенно добросовестно принимают и отправляют всё то, что идёт в данном радиоканале. Если один радиомодуль что-то передаёт, все другие на этом канале спокойно примут этот поток. Если передают сразу два, то в принимаемом остальными модулями потоке никаких битовых коллизий не возникает.
Практически это означает, что на огороде или в доме в будущем могут быть организованы ещё какие-то точки, «подписанные» на радиоканал о погоде или о теплице, и алгоритм должен быть таким, чтобы засорение эфира не приводило к нежелательным последствиям. Да, в данной реализации радиообмен организован на достаточно низком уровне OSI, мне в моей конструкции этого хватает. Если структура разрастётся и станет более сложной, свяжу точки в беспроводную сетку, и тогда уже можно будет реализовать какой-нибудь MQTT поверх TCP/IP. Пока же мне обмена символьным потоком хватает «за глаза», всё просто, надёжно и устойчиво.
Конструктивно погодный модуль прост и лаконичен. Небольшая коробочка, к которой подводится питание и в разъёмы которой подключаются погодные датчики.
Ещё я оснастил эту коробочку маленькой незаметной тактовой кнопкой и парой светодиодов. Мне это было нужно на этапе тестирования всей системы. Помимо основного («боевого») режима, тактовой кнопочкой можно включить принудительную трансляцию в эфир сообщений о, якобы, «плохой» погоде (не взирая на реальные показания датчиков ветра и дождя) или принудительную трансляцию о «хорошей» погоде (аналогично). Тестовые режимы в EEPROM не сохраняются и после включения или перезагрузки погодный модуль будет функционировать в основном, правильном режиме.
Для тех, кто решит повторить описанную тут конструкцию, я приготовил
архив с исходником и всеми необходимыми библиотеками.
На случай, если архив протухнет, повторю код ещё и тут:
Исходный код
#include <TimeLib.h>
#include <EEPROM.h>
#include <MsTimer2.h>
#include <SoftwareSerial.h>
#include <Bounce.h>
#include <DHT.h>
#define ReposeTime 250 // Период времени, который будет считаться спокойствием
#define ReposeTheres 9 // Критическая сила ветра 9 единиц = 6 bft
#define MaxCountLife 60 // Период учёта максимальной силы ветра, сек
#define AlarmLockLife 4 // Критическое время между порывами ветра, сек
#define RainMaxTime 900 // Период времени, за который не выпадет осадков, сек
#define MaxWeatherInformer 25 //Сводки погоды каждые 25 секунд
#define DHT1PIN 8 // К этому пину подключается датчик температуры
#define DHT1TYPE DHT21 // DHT 21 (AM2301)
#define WindPin 2
#define RainPin 3
#define ButtonPin 10
#define GreenLed 11
#define RedLed 12
int Wcount, Wcount2, MaxWcount, CountLife=0;
int Rcount=0;
int BofortWind=0;
int Repose=0;
byte Alarm=0;
byte AlarmLock=0;
byte PrintLock=true;
byte WeatherPrintLock=true;
byte WeatherInformer=0;
byte Screen=false;
byte Screenmode;
byte Mode=0;
byte RainNow=false;
long RainLength=0;
long LastRainLength=0;
int LastRcount=0;
int LastMinuteRain, MinuteRain=0;
int RainPeriod=0;
byte firsttime;
byte MinuteCounter=0;
float h1, t1;
DHT dht1(DHT1PIN, DHT1TYPE);
SoftwareSerial ss(9, 7); // К этим пинам подключается RadioUART.
Bounce Button = Bounce(ButtonPin,40 );
Bounce Rain = Bounce(RainPin,400 );
void TickEvery1s()
{
Wcount2=Wcount;
Wcount=0;
if (CountLife>0) {CountLife--;}
if (Repose>0) {Repose--;}
if (AlarmLock>0) {AlarmLock--;}
if (second()%10 == 0) Screen=true;
if (MinuteCounter>0) {MinuteCounter--;} else {MinuteCounter=59; LastMinuteRain=MinuteRain; MinuteRain=0; PrintLock=false;}
if (RainNow==true) {
RainLength++;
}
if (RainPeriod>0) {RainPeriod--;}
if(WeatherInformer>0) {WeatherInformer--;} else {WeatherInformer=MaxWeatherInformer;}
WeatherPrintLock=false;
}
void D2Int() {
// Приращение счетчика по прерыванию
Wcount++;
}
void GetBofort(int w){
switch(w) {
case 0:{BofortWind=0; break;}
case 1:{BofortWind=1; break;}
case 2:{BofortWind=2; break;}
case 3:{BofortWind=3; break;}
case 4:{BofortWind=3; break;}
case 5:{BofortWind=4; break;}
case 6:{BofortWind=4; break;}
case 7:{BofortWind=5; break;}
case 8:{BofortWind=5; break;}
case 9:{BofortWind=6; break;}
case 10:{BofortWind=6; break;}
case 11:{BofortWind=7; break;}
case 12:{BofortWind=7; break;}
case 13:{BofortWind=7; break;}
case 14:{BofortWind=8; break;}
case 15:{BofortWind=8; break;}
case 16:{BofortWind=9; break;}
case 17:{BofortWind=9; break;}
case 18:{BofortWind=9; break;}
case 19:{BofortWind=10; break;}
case 20:{BofortWind=10; break;}
case 21:{BofortWind=10; break;}
case 22:{BofortWind=11; break;}
case 23:{BofortWind=11; break;}
case 24:{BofortWind=11; break;}
case 25:{BofortWind=12; break;}
case 26:{BofortWind=12; break;}
case 27:{BofortWind=12; break;}
case 28:{BofortWind=12; break;}
case 29:{BofortWind=13; break;}
case 30:{BofortWind=13; break;}
case 31:{BofortWind=13; break;}
case 32:{BofortWind=13; break;}
case 33:{BofortWind=14; break;}
case 34:{BofortWind=14; break;}
case 35:{BofortWind=14; break;}
case 36:{BofortWind=15; break;}
case 37:{BofortWind=15; break;}
case 38:{BofortWind=15; break;}
case 39:{BofortWind=15; break;}
case 40:{BofortWind=16; break;}
case 41:{BofortWind=16; break;}
case 42:{BofortWind=16; break;}
case 43:{BofortWind=17; break;}
default:{BofortWind=17; break;}
}
}
void setup()
{
pinMode (WindPin, INPUT_PULLUP);
pinMode (RainPin, INPUT_PULLUP);
attachInterrupt(0, D2Int, RISING);
pinMode (ButtonPin, INPUT_PULLUP);
pinMode (RedLed, OUTPUT); digitalWrite(RedLed, HIGH);
pinMode (GreenLed, OUTPUT); digitalWrite(GreenLed, HIGH);
MsTimer2::set(1000, TickEvery1s); // 1000ms period
MsTimer2::start();
ss.begin(9600);
dht1.begin();
Rcount=0;
Wcount=0;
MinuteRain=0;
RainPeriod=0;
PrintLock=true;
firsttime=1;
}
void printDHT()
{
String b;
char s[16];
if (isnan(t1) || isnan(h1) || (t1==0 && h1==0) ) {b=" ???";} else {
b += dtostrf(t1, 3, 1, s);
if (b=="-0.0") b=«0.0»;
int dotpos = b.indexOf('.');
int minuspos = b.indexOf('-');
if (minuspos==0)
{if (dotpos==2) b=" "+b;
} else {if (dotpos==1) b=" "+b; else b=" "+b;
}
b=b+"*C";
ss.print("#WeatherTem:"); ss.println(b);
b="";
b += dtostrf(h1, 2, 0, s);
b=b+"%";
ss.print("#WeatherHum: "); ss.println(b);
}
}
void loop()
{
if (Button.update()) {if (Button.read()== LOW) {if (Mode==2) Mode=0; else Mode++; }}
if (Mode==1) digitalWrite(RedLed,LOW); else digitalWrite(RedLed,HIGH);
if (Mode==2) digitalWrite(GreenLed,LOW); else digitalWrite(GreenLed,HIGH);
if (Rain.update()) {
if (firsttime==0){
Rcount++;
MinuteRain++;
RainPeriod=RainMaxTime; }
firsttime=0;
}
if (Wcount2>MaxWcount) {MaxWcount=Wcount2; CountLife=MaxCountLife;} if (CountLife==0) MaxWcount=0;
if (Wcount2>=ReposeTheres) {Repose=ReposeTime; if (AlarmLock==0) {AlarmLock=AlarmLockLife; Alarm++; PrintLock=false;}}
if (Alarm>=2) {if (PrintLock==false) {if (Mode==0) ss.println("#WeatherBadW"); PrintLock=true;}}
if (Repose==0) {Alarm=0; AlarmLock=0; if (PrintLock==false) { PrintLock=true;}}
if ((RainNow==false) && (Rcount>0))
{RainNow=true;
if (Mode==0) ss.println("#WeatherBadR"); }
if ((RainNow==true) && (RainPeriod==0))
{RainNow=false;
LastRainLength=RainLength;
LastRcount=Rcount;
Rcount=0;
RainLength=0; }
if (Screen==true)
{Screen=false;
if (Mode==0) {
if ((Repose==0) && (RainNow==false)) ss.println("#WeatherOki");
if (RainNow==true) ss.println("#WeatherBadR");
if (Alarm>=2) {ss.println("#WeatherBadW");}
}
if (Mode==1) {ss.println("#WeatherBadW"); delay (200); }
if (Mode==2) {ss.println("#WeatherOki"); delay (200); }
}
if ((WeatherInformer==0) && (WeatherPrintLock==false)) {
switch(Screenmode){
case 0:{ss.print("#WeatherRai: ");
if (RainNow==true) ss.print(«It's rain now. „); else ss.print(“There is no rain now. „);
ss.print(“Rain value in minute: „); ss.print(LastMinuteRain);
ss.print(“. Total lenght: „); ss.print(LastRainLength);
ss.print(“ sec. Total value: „); ss.print(LastRcount);ss.println(“.»);break;}
case 1:{ss.print("#WeatherWnd: ");
GetBofort(Wcount2);
ss.print(«Current wind „);ss.print(Wcount2*1.3,1);ss.print(“ m/s, „);ss.print(BofortWind);ss.print(“ bft. „);
GetBofort(MaxWcount);
ss.print(“Maximum wind in minute „);ss.print(MaxWcount*1.3,1);ss.print(“ m/s, „);ss.print(BofortWind);ss.println(“ bft. „); break;}
}
if (Screenmode==0) {Screenmode=1;} else {Screenmode--;}
h1 = dht1.readHumidity();
t1 = dht1.readTemperature();
printDHT();
WeatherPrintLock=true;
}
delay(10);
}
В константах менять, думаю, ничего не надо. В двух местах при выводе значений в «метрах в секунду» встречается коэффициент 1.3. В процедуре пересчёта в Бофорты этот коэффициент уже учтён внутри таблицы. Это значение «1.3» — и есть тот коэффициент, который мы получили в результате градуировки датчика ветра на испытательном стенде. Под флюгер с другими физическими параметрами или другой конструкции, градуировку придётся проводить заново и получить другой коэффициент, увязывающий электрические «импульсы в секунду» с «метрами в секунду» реального ветра.
Описанный тут датчик ветра удачно пережил зиму. Я его поставил прошлой осенью; на зиму, правда, натянул сверху большой полиэтиленовый пакет и обвязал. Весной освободил. Пока всё работает отлично.
Это лето наглядно доказало своими ураганами и дождями очевидную целесообразность применения такого погодного модуля. Урон от выдранных с корнем фрамуг, петель или механических открывалок, а также от залива объёмов дождя, превращающего грядки внутри теплицы в маленькую Венецию, был бы несравнимо выше затрат на построение данного модуля.
PS: Да, чуть не забыл. Для тех, кто интересуется проектом теплицы из моего предыдущего обзора.
Я там дописал несколько абзацев по итогам годовой эксплуатации теплицы.
PPS: Никто ничего для обзора не предоставлял и не спонсировал. Всё, что описано в конструкции, покупалось в разное время за свои собственные деньги или было найдено в собственных закромах.
В целом, вот так:
Разобрали вентилятор (фото не моё)
Убрали обмотки с магнитопроводом, оставили только кольцевую плату от вентилятора. Вместо двух отпаянных обмоток, нагрузили плату парой резисторов. Всё, кольцевая плата готова к установке. Три провода от неё так и будут использоваться штатно. Датчик Холла на этой фотке виден, он на переднем плане, четырёхногий «таракан». Возможно, его придётся чуть подогнуть в разные стороны, поискать положение, чтобы он чётче реагировал на пробегающий магнитик.
Вся эта кольцевая платка аккурат располагается внутри цилиндрической статорной части флюгера, они по диаметру совпали.
А магнитик располагается в роторной части, которая «шапочкой» над статорным цилиндром вращается.
Но там интуитивно всё будет понятно в процессе работы, если начнёте :)
По сути вот это уже в 433 диапазоне вещает.
ЗЫ: За «433 диапазон» спасибо, вы сделали мой вечер! )))
switch(w) {
case 0:{BofortWind=0; break;}
default:{BofortWind=17; break;}
}
}
я бы сделал как
void GetBofort(int w){
BofortWind =round(w/2.52);
}
Но дайте с таблицей поработать в удовольствие, это же классический индусский код :)
тничков микрософт — разве жнимфа кисть даётэто настоящая обфускация?;)вотъ какъ надо::
setup
int BofortWind[44] = {0, 1, 2, 3, 3, 4,… 17};
loop
Wcount2= BofortWind[Wcount2]
ss.print(Wcount2);
MaxWcount= BofortWind[MaxWcount]
ss.print(MaxWcount);
печально, это слишком просто; ну да адмирал нам немножко помог;)
PS если хочется простой деревенской красоты,
то придётся ограничиться скоростью ветрища до 25м/сек
int° BofortWind[20]=''0123344556677788999''
и
Wcount2= BofortWind[Wcount2]-0x30;
° только надо будет подобрать правильный тип, int-short-byte
На алгоритме «тупо проверку по истечении какого-то времени» с удовольствием готов глянуть вашу реализацию частотомера (измерителя периода).
Я уже говорил, повторюсь ещё раз. Смотрите в исходник, я же его не прячу. Геркон дождя я и опрашиваю примерно так; только чуть поэффективнее, программно отсекая дребезг. А в датчике ветра так не получается, потому что время одного оборота может быть сравнимо или даже меньше времени дребезга. Вы изобретаете велосипед. Программно такие вещи делать бессмысленно, ничего толкового у вас так не получится. А для решения вполне себе есть проверенные и эффективные алгоритмы и пути. Датчик Холла — не единственное решение, есть RS- триггеры с переключающимися контактами, например. Но я решил проблему просто, бюджетно и без трудозатрат.
По моему, изобретать велосипед — менять конструкцию вместо того, что бы сделать программно без всяких материальных затрат.
У меня есть обработчик нажатий трех разных кнопок для контроллера управления светом в спальне.
pastebin.com/4SsLQBKL
1. Я же попросил исходник не просто программной обработки дребезга, а исходник, где вы это измеряете в привязке ко времени. Напишите исходник с измерением периода или частоты нажатия на эти же три кнопки.
2. Вы не услышали фразу о том, что период срабатывания может быть РАВЕН или МЕНЬШЕ времени программного отсечения дребезга. Со своим алгоритмом вы прождёте отсечения вредного дребезга пустыми делеями, а в это время старый полезный импульс закончится и уйдёт, а придёт новый полезный импульс. А вы всё будете в делеях зависать.
Ну залезьте вы уже в гугль, почитайте, как на микроконтроллерах организуют подсчёт частоты/периода. Там сложного же нет ничего для понимания. Пересечение двух прерываний — аппаратного по фронтам/перепадам и счётчиков по внутреннему таймеру. Не надо никаких делеев и проверок состояния после.
PS: Да, и с библиотеками Bounce/Bounce2 весь ваш код сократится до трёх-четырёх строчек с опросами всех кнопок :)
Но это уже по вкусу, конечно.
Датчик Холла мгновенно и эффективно решил проблему. Вложений — 0 руб.
А вот к самодельной метеостанции пожалуй добавлю флюгер с анемометром.
Огорчает лишь одно, необходимость закрывать на зиму, все равно все снегом занесет, потом подтает и обмерзнет.
PS Интересно, сколько выдержит пластик под солнцем, дождем и ветром, пока начнет крошиться…
Можно сразу под датчик из еулера всё организовать
Мне кажется или у вас датчик с одной из сторон от ветра будет строением закрыт?
Тут за дорогой следить надо и за спидометром, чтобы равномерно было.
Да и фоткать-то особо нечего: пассажирское окно открыто, сквозняк свистит, крыльчатка поёт :)
Ардуина всё в лог складывает: импульсы в секунду от анемометра, мгновенную скорость от GPS и время. А анализ, таблицы и график — это дома на компе.
Ну он там не совсем закрыт стеной, он, как бы, на углу.
Но мне хватает вполне, мне направление совсем не важно под данную задачу, мне нужна именно скорость ветра и факты порывов. А это крылчатка отлично ловит в текущем расположении.
Но есть мнение что у MISOL примерно вот такие же датчики:
www.sparkfun.com/products/8942
А если это так — то подойдет вот такое описание:
www.sparkfun.com/datasheets/Sensors/Weather/Weather%20Sensor%20Assembly..pdf
Из которого следует:
— у анемометра одно срабатывание в секунду при ветре 1.492 MPH (2.4 km/h)
— у измерителя осадком одно срабатывание на каждые 0.011” (0.2794 mm) осадков
Ну и если кто-то флюгер возьмет то табличка есть какие сопротивления дает резисторная матрица при 16 положениях флюгера.
homes-smart.ru/index.php/component/kunena/4-zhelezo/1250-bityj-datchik-bme280-ili-chto-to-inoe — тут впечатления человека купившего набор датчиков от MISOL (ну и соотв отзывы о качестве их метеостанций)