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

  • Цена: $15,29 + $11.69 (покупалось за $14,44+$9.94)

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

По сути, чёткой привязки погодного модуля именно для работы с теплицей и нет. Модуль — отдельное законченное устройство. Он просто получает информацию о силе ветра, температуре и осадках, программно анализирует порывы ветра и выносит суждения о хорошей или плохой погоде. Точнее, он выносит суждение о том, подходящая ли в данный момент погода для открытых или закрытых форточек в теплице. И по радиоканалу в теплицу сообщает контроллеру, что пора бы закрыть фрамуги или, наоборот, что погода наладилась. Но ничто не мешает принимать и использовать эту информацию не для теплицы, а по своему усмотрению (например, с минимальными доделками скетча, в домашней метеостанции; или сливать эти данные на НародМон).

Самым затратным в реализации проекта оказался датчик ветра, поэтому главным объектом обзора является именно он.
После анализа предложений на просторах интернета, мною был куплен чашечный анемометрический датчик, вынесенный в заголовок. Я ничего не знал о производителе и конструкции, приобретённый лот — это запчасть к их погодным станциям. Оказалось, что его конструкция настолько проста, что я даже не стал делать традиционных фоток типа «распаковка», «с разных ракурсов» и т.д.
Одной единственной картинки будет более чем достаточно.

Датчик конструкционно — это две литые пластмассовые детали: флюгерная часть (три чашки, объединённые с валом) и статорная часть, крепящаяся к опоре. В полусфере ротора расположен магнитик. В статорной части — геркон с припаянным проводом, оканчивающимся разъёмом 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: Никто ничего для обзора не предоставлял и не спонсировал. Всё, что описано в конструкции, покупалось в разное время за свои собственные деньги или было найдено в собственных закромах.
Планирую купить +85 Добавить в избранное +99 +183
+
avatar
+1
У меня четвёртый год погодная станция трудится в полном составе от того же продавца.
+
avatar
  • yurok
  • 27 июля 2017, 18:38
+4
Спасибо за обзор! с меня плюсик
+
avatar
  • Dimon_
  • 27 июля 2017, 18:40
+5
Спасибо Юрий. Очень приятна ваша реакция. Я много ссылаюсь на ваши тексты. Они нужны и полезны. Спасибо.
+
avatar
  • piggi
  • 27 июля 2017, 18:46
0
я бы купил такую готовую. Пора бизнес открывать )
+
avatar
0
Нет проблем. Подключается по USB, а дальше крути верти как хочешь.
+
avatar
+1
Интересно посмотреть переделанную конструкцию флюгера.
+
avatar
  • Dimon_
  • 27 июля 2017, 19:16
+5
Ну, это только если наверх к флюгеру зачем-нибудь полезу :)
В целом, вот так:

Разобрали вентилятор (фото не моё)


Убрали обмотки с магнитопроводом, оставили только кольцевую плату от вентилятора. Вместо двух отпаянных обмоток, нагрузили плату парой резисторов. Всё, кольцевая плата готова к установке. Три провода от неё так и будут использоваться штатно. Датчик Холла на этой фотке виден, он на переднем плане, четырёхногий «таракан». Возможно, его придётся чуть подогнуть в разные стороны, поискать положение, чтобы он чётче реагировал на пробегающий магнитик.

Вся эта кольцевая платка аккурат располагается внутри цилиндрической статорной части флюгера, они по диаметру совпали.
А магнитик располагается в роторной части, которая «шапочкой» над статорным цилиндром вращается.
+
avatar
+1
Принцип-то понятен, интересна конкретика для повторения.
+
avatar
  • Dimon_
  • 27 июля 2017, 19:51
+2
Ок, при случае сфоткаю :)
Но там интуитивно всё будет понятно в процессе работы, если начнёте :)
+
avatar
+2
Это не флюгер, это анемометр. Флюгер показывает направление, а не силу ветра. Кстати, флюгер у этих китайских ребят тоже на герконах (8 штук или даже 4 достаточно). Учимся, как надо деньги делать! Простейшие конструкции из пластика, герконов и простых подшипников продают за реально приличные бабки (набор из флюгера, анемометра и дождемера стоит около 50-60 бакинских). Не могу, зная, что у них внутри, разрешить себе такую покупку. Жаба не велит! )))
+
avatar
0
Удавите свою жабу
По сути вот это уже в 433 диапазоне вещает.
+
avatar
+1
Чем её удавить? 85 баксами? Вы ошиблись адресом, мушшына.

ЗЫ: За «433 диапазон» спасибо, вы сделали мой вечер! )))
+
avatar
0
там 40 баксов вообще то.
+
avatar
  • demonk
  • 28 июля 2017, 13:46
0
И доставка минимум 46
+
avatar
0
А то что это конструкция в своём 433 диапазоне вещает уже расшифровывать?
+
avatar
0
+
avatar
+1
void GetBofort(int w){
switch(w) {
case 0:{BofortWind=0; break;}

default:{BofortWind=17; break;}
}
}

я бы сделал как

void GetBofort(int w){
BofortWind =round(w/2.52);
}
+
avatar
  • Dimon_
  • 27 июля 2017, 20:05
+2
Угу, совершенно справедливо. Без шуток.
Но дайте с таблицей поработать в удовольствие, это же классический индусский код :)
+
avatar
+1
дайте с таблицей поработать в удовольствие, это же классический индусский код :)
вот сейчас в мумбае серьёзно обиделась пара сотен тыщ работничков микрософт — разве ж нимфа кисть даёт это настоящая обфускация?;)

вотъ какъ надо::
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
+
avatar
+1
Ух, молодца! Плюс. Сам только теплицу поставил. Но наверное все-таки, что-то по проще буду делать для автополива (таже бочка на помосте)
+
avatar
  • Dimon_
  • 27 июля 2017, 20:10
0
После бочки, главное, ставьте фильтр. Иначе органика все капельницы убьёт за неделю.
+
avatar
+2
Офигительно! Спасибо за такой обзор.
+
avatar
  • IIIap
  • 27 июля 2017, 21:52
0
Потратил день на различные схемные решения и программные методы
Т.е. обычная RC-цепочка вообще никакне помогала?
+
avatar
  • dansar
  • 27 июля 2017, 22:00
0
Автор в программных методах какие-то библиотеки описывает. Интересно, тупо проверку, что геркон все еще замкнут по истечении какого-то времени трудно было сделать?
+
avatar
  • Dimon_
  • 27 июля 2017, 22:04
+1
Не трудно. Посмотрите алгоритм. Для измерения скорости ветра используется нога с внешним прерыванием. Ничего не надо проверять ни через какое время. Нужен нормальный сформированный фронт импульса. А иначе как вы будете подсчитывать частоту или период импульсов? Я знаю только способ: внешнее прерывание+отбор значений по прерыванию таймера.
На алгоритме «тупо проверку по истечении какого-то времени» с удовольствием готов глянуть вашу реализацию частотомера (измерителя периода).
+
avatar
  • dansar
  • 05 августа 2017, 22:41
0
Можно просто достаточно часто опрашивать геркон. Если состояние геркона изменилось на 1, а через, допустим, 10 тиков вернулось обратно, значит это был дребезг. Посчитав число «тиков», прошедшее от состояния 0->1->0, можно определить время одного оборота.
+
avatar
  • Dimon_
  • 06 августа 2017, 09:51
0
Теперь этот свой алгоритм попытайтесь привязать к секундам. Чтобы получать нк просто факт срабатывания, а период или частоту. Покажите рабочий код.

Я уже говорил, повторюсь ещё раз. Смотрите в исходник, я же его не прячу. Геркон дождя я и опрашиваю примерно так; только чуть поэффективнее, программно отсекая дребезг. А в датчике ветра так не получается, потому что время одного оборота может быть сравнимо или даже меньше времени дребезга. Вы изобретаете велосипед. Программно такие вещи делать бессмысленно, ничего толкового у вас так не получится. А для решения вполне себе есть проверенные и эффективные алгоритмы и пути. Датчик Холла — не единственное решение, есть RS- триггеры с переключающимися контактами, например. Но я решил проблему просто, бюджетно и без трудозатрат.
+
avatar
  • dansar
  • 06 августа 2017, 10:38
0
Как я покажу вам рабочий код, если у меня нет ни геркона, ни этой «крутилки»?
По моему, изобретать велосипед — менять конструкцию вместо того, что бы сделать программно без всяких материальных затрат.

У меня есть обработчик нажатий трех разных кнопок для контроллера управления светом в спальне.
pastebin.com/4SsLQBKL
+
avatar
  • Dimon_
  • 06 августа 2017, 10:58
0
Очень жалко, что в беседе вы не слушаете оппнента. Трудно вести беседу.

1. Я же попросил исходник не просто программной обработки дребезга, а исходник, где вы это измеряете в привязке ко времени. Напишите исходник с измерением периода или частоты нажатия на эти же три кнопки.
2. Вы не услышали фразу о том, что период срабатывания может быть РАВЕН или МЕНЬШЕ времени программного отсечения дребезга. Со своим алгоритмом вы прождёте отсечения вредного дребезга пустыми делеями, а в это время старый полезный импульс закончится и уйдёт, а придёт новый полезный импульс. А вы всё будете в делеях зависать.

Ну залезьте вы уже в гугль, почитайте, как на микроконтроллерах организуют подсчёт частоты/периода. Там сложного же нет ничего для понимания. Пересечение двух прерываний — аппаратного по фронтам/перепадам и счётчиков по внутреннему таймеру. Не надо никаких делеев и проверок состояния после.

PS: Да, и с библиотеками Bounce/Bounce2 весь ваш код сократится до трёх-четырёх строчек с опросами всех кнопок :)
Но это уже по вкусу, конечно.
+
avatar
  • dansar
  • 06 августа 2017, 12:05
0
Не хочу уже спорить. Меня просто удивила замена геркона на датчик Холла. Если мне потребуется реализовать похожую конструкцию, я все-таки обойдусь герконом, какой бы дребезжащий он не был.
+
avatar
  • Dimon_
  • 27 июля 2017, 22:00
0
Нет. Я много попробовал. Герконы очень подвержены дребезгу. А мне, для внешнего прерывания, нужен был нормальный фронт. Был бы он (геркон) переключающим, — нет проблем, пара элементов жёсткой логики или триггер. А так…
Датчик Холла мгновенно и эффективно решил проблему. Вложений — 0 руб.
+
avatar
  • IIIap
  • 27 июля 2017, 23:01
0
Герконы очень подвержены дребезгу.
Просто уже из интереса — какой там геркон стоял? Я заметил, что бывают с чётким переключением, даже слышен слабый щелчок. Насчёт дребезга у таких герконов не знаю.
+
avatar
+1
не бывает плохих герконов, бывают слабые магнитики)
+
avatar
+1
Датчик холла, наверное, еще и дольше проработает. В теории у герконов количество срабатываний ограничено, хоть и очень большое :)
+
avatar
0
в старых ауди герконы стояли в датчиках скорости. уверяю, там срабатываний как минимум на порядок больше, чем в ветряке этом. и ничо, работают десятилетиями…
+
avatar
  • Dimon_
  • 03 декабря 2018, 15:51
0
Ммм. А точно там обычные герконы были? С механическими контактами (в смысле, не ртутными?)
+
avatar
0
не знаю. на вид — геркон как геркон
+
avatar
  • mikuni
  • 27 июля 2017, 22:14
+2
Сисадмин-дачник. Все на битву за урожай. Позеленил.
+
avatar
  • flyup
  • 28 июля 2017, 06:37
0
Спасибо за обзор, теплицей не интересуюсь, хотя она присутствует.
А вот к самодельной метеостанции пожалуй добавлю флюгер с анемометром.
Огорчает лишь одно, необходимость закрывать на зиму, все равно все снегом занесет, потом подтает и обмерзнет.
PS Интересно, сколько выдержит пластик под солнцем, дождем и ветром, пока начнет крошиться…
+
avatar
+1
Четыре года трудится. Никаких проблем.
+
avatar
+1
Хотелось бы узнать габариты крыльчатки, есть мысль напечатать похожую конструкцию на 3D принтере. Ну и размеры коромысла в датчике осадков тоже не помешали бы :)
+
avatar
0
Гениально. Ведь действительно такое легко повторить на 3д принтере, тем более что электроники внутри нет.
Можно сразу под датчик из еулера всё организовать
+
avatar
0
Все же лучше делать не на датчике Холла, а на оптопаре — вращающийся диск с кучей отверстий. Как показала практика, такая конструкция в сочетании с легкой крыльчаткой хорошо реагирует на порывы ветра. Мой ручной анемометр промышленного изготовления работает именно так.
+
avatar
0
Так на thingiverse полно моделей на любой вкус, ищите там по anemometer
+
avatar
0
Бывал там :) Видел разные конструкции, но все таки интересно — какие размеры крыльчатки были бы наиболее оптимальны?
+
avatar
  • Dimon_
  • 28 июля 2017, 13:03
0
При случае залезу, попробую померить. Но очень скоро не обещаю. Отпишусь сюда.
+
avatar
  • sim31r
  • 31 июля 2017, 17:14
0
Там нет оптимальности. Большая крыльчатку чувствительней, но дороже и хрупче. Маленькая дешевле, прочнее, но и порог измерения выше.
+
avatar
0
Вот и хотелось бы найти оптимум — не сильно большой, хрупкий и тяжелый, при этом обладающий нормальной чувствительностью и малой инерционностью. Когда-то очень давно я игрался с лабораторным механическим чашечным анемометром, там была довольно миниатюрная, легкая крыльчатка. При этом прибор оказался очень чувствительный — чашки вращаются от малейшего движения воздуха.
+
avatar
  • sim31r
  • 01 августа 2017, 19:21
0
Там подвес вероятно на ниточках микронного диаметра. А если поры ветра дунет в 100 км/с, да еще и со льдинками?
+
avatar
  • IIIap
  • 05 августа 2017, 23:13
0
Скорее там «каменные» опоры — как в часах.
+
avatar
  • sim31r
  • 31 июля 2017, 17:13
0
Габариты чем больше, тем чувствительней. Еще есть вариант ультразвуковой измеритель из датчиков расстояния, точность и надежность на порядок выше, при цене датчиков в 2$.
+
avatar
0
на Thingiverse давно уже модели лежат в ассортименте.
+
avatar
+1
Жаль у вас нет фотографий процесса калибровки. Как по мне так самая увлекательная часть статьи.

Мне кажется или у вас датчик с одной из сторон от ветра будет строением закрыт?
+
avatar
  • Dimon_
  • 28 июля 2017, 12:59
0
Жаль у вас нет фотографий процесса калибровки. Как по мне так самая увлекательная часть статьи
Ну, я за рулём был, мне не до фото. :)
Тут за дорогой следить надо и за спидометром, чтобы равномерно было.
Да и фоткать-то особо нечего: пассажирское окно открыто, сквозняк свистит, крыльчатка поёт :)
Ардуина всё в лог складывает: импульсы в секунду от анемометра, мгновенную скорость от GPS и время. А анализ, таблицы и график — это дома на компе.
Мне кажется или у вас датчик с одной из сторон от ветра будет строением закрыт?
Ну он там не совсем закрыт стеной, он, как бы, на углу.
Но мне хватает вполне, мне направление совсем не важно под данную задачу, мне нужна именно скорость ветра и факты порывов. А это крылчатка отлично ловит в текущем расположении.
+
avatar
0
Раскройте немного конструкцию анемометра: он с подшипником качения?
+
avatar
  • Dimon_
  • 29 июля 2017, 11:52
+1
Такое впечатление, что да. Запросто снять роторную часть не получилось. Но после толкания лопастей, вращается довольно легко и долго. Думаю, подшипник качения. Будет случай разобрать — обязательно отпишусь и обзор дополню.
+
avatar
  • Chhag
  • 30 июля 2017, 18:28
0
Не совсем понял, раз уж разбирали куллер то почему не мерять напряжение сделав его генератором?
+
avatar
  • Dimon_
  • 31 июля 2017, 08:56
0
Потому что компьютерный кулер — не электромеханическая машина. Это не электродвигатель, который обратим в генератор. Конструкция современного компьютерного вентилятора — это электрическая схема с процессором, формированием фронтов, несколькими обмотками и обратной связью. Обратимости в генератор такое устройство не имеет.
+
avatar
  • SolarW
  • 31 июля 2017, 15:42
+2
Однако метод калибровки анемометра с помощью автомобиля — сымаю шляпу :-)
Но есть мнение что у 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 (ну и соотв отзывы о качестве их метеостанций)
+
avatar
  • sim31r
  • 31 июля 2017, 17:12
0
На 3D принтере можно всё распечатать. А геркон и магнитик менее 1$ стоят. Интересная идея, буду вникать глубже )
+
avatar
+1
Все же рекомендую не геркон-магнитик, а оптрон-колёсико :)
+
avatar
0
блин, я вот каждый раз начинаю хотеть себе метеостанцию, но потом прикидываю что относительно простая станция с интерфейсом к компу стоит ну примерно 120 баксов, а комплект датчиков порядка 80 — и мне начинает плохеть. ну вот реально — за 40 баксов можно было бы попробовать поиграться. но 80 с доставкой?! жуть какая-то.