Анемометри, зроблені своїми руками (для дітей підготовчої групи). Саморобний анемометр

Постало завдання зібрати для одного проекту анемометр, щоб знімати дані можна було на комп'ютері за інтерфейсом USB. У статті йдеться більше про сам анемометр, ніж про систему обробки даних з нього:

1. Компоненти

Отже, для виготовлення виробу знадобилися такі компоненти:
Кулькова миша Mitsumi - 1 шт.
М'ячик для пінг-понгу - 2 шт.
Шматок оргскла відповідного розміру
Мідний дріт перетином 2,5 мм2 - 3 см
Стрижень від кулькової ручки – 1 шт.
Паличка від цукерки чупа-чупс - 1 шт.
Кліпса для кабелю – 1 шт.
Порожня латунна барила 1 шт.

2. Виготовлення крильчатки

До латунного барила були припаяні 3 шматки мідного дроту довжиною 1 см кожен під кутом 120 градусів. В отвір барила я припаяв стійку з китайського плеєра з різьбленням на кінці.

Трубочку від цукерки розрізав на 3 частини довжиною близько 2 див.

Розрізав навпіл 2 кульки і за допомогою дрібних шурупів з того ж плеєра та полістирольного клею (клеєвим пістолетом) прикріпив половинки кульки до трубочок від чупа-чупса.

Трубочки з половинками кульки надів на припаяні шматки дроту, зверху все закріпив клеєм.

3. Виготовлення основної частини

Несучим елементом анемометра є металевий стрижень від кулькової ручки. У нижню частину стрижня (куди вставлялася пробка) я вставив диск від мишки (енкодер). У конструкції самої мишки нижня частина енкодера упиралася в корпус мишки утворюючи точковий підшипник, там було мастило, тому енкодер легко крутився. Але треба було зафіксувати верхню частину стрижня, для цього я підібрав відповідний шматок пластику з отвором точно по діаметру стрижня (такий шматок був вирізаний із системи висунення каретки CD-ROMa). Залишалося вирішити проблему для того, щоб стрижень з енкодером не випадав з точкового підшипника, тому на стрижні безпосередньо перед утримуючим елементом я напаяв кілька крапель припою. Таким чином, стрижень вільно крутився в утримувальній конструкції, але не випадав із підшипника.

Причина, через яку була обрана схема з енкодером, наступна: всі статті про саморобні анемометри в Інтернеті описували їх виготовлення на базі двигуна постійного струму від плеєра, CD-ROMa або іншого виробу. Проблема з такими пристроями в перших у тому калібруванні і мінімальної точності при мінімальної швидкості вітру, тоді як у других — в нелінійної характеристиці швидкості вітру стосовно вихідному напрузі, тобто. Для передачі на комп'ютер є певні проблеми, потрібно прораховувати закон зміни напруги або струму від швидкості вітру. При використанні енкодера такої проблеми немає, оскільки залежність виходить лінійною. Точність висока, так як енкодер дає близько 50 імпульсів на один оборот осі анемометра, але дещо ускладнюється схема перетворювача, в якому стоїть мікроконтролер, що вважає кількість імпульсів на секунду на одному з портів і видає це значення в порт USB.

4. Випробування та калібрування

Для калібрування використали лабораторний анемометр.

Звичайна побутова фірмова або саморобна метеостанція вимірює дві температури-вологості (у кімнаті та на вулиці), атмосферний тиск та додатково має годинник з календарем. Однак, справжня метеостанція має ще багато всього - датчик сонячної радіації, вимірювач опадів і таке інше, що, загалом, потрібно тільки для професійних потреб, за одним винятком. Вимірювач параметрів вітру (швидкості, і, головне, напрямки) – дуже корисне доповнення для заміського будинку. Причому фірмові датчики вітру досить дорогі навіть на Алі-Бабі, і має сенс придивитися до саморобних рішень.

Відразу скажу, що якби я заздалегідь знав, в який обсяг ручної роботи і витрачених на експерименти грошей виллється мій задум, можливо, і не почав би починати. Але цікавість переважила, а читачі цієї статті мають шанс уникнути того підводного каміння, про яке мені доводилося спотикатися.

Для вимірювання швидкості вітру(анемометрії) існує стопіцот способів, головні з яких такі:

Термоанемометричний,
- механічний - з пропелером (точніше, імпеллером) або чашковою горизонтальною крильчаткою (класичний чашковий анемометр), Вимірювання швидкості у цих випадках еквівалентне вимірюванню частоти обертання осі, на якій закріплена пропелер або крильчатка.
- а також ультразвуковий, що поєднує вимірювання швидкості та напрямки.
Для вимірювання напрямуспособів менше:
- згаданий ультразвуковий;
- механічний флюгер з електронним зніманням кута повороту. Для вимірювання кута повороту є багато різних способів: оптичні, резистивні, магнітні, індуктивні, механічні. Можна, до речі, просто закріпити на валу флюгера електронний компас - ось тільки надійні і прості (для «наколінкового» повторення) способи передачі показань з осі, що хаотично обертається, доведеться ще пошукати. Тому ми далі вибираємо традиційний оптичний метод.

При самостійному повторенні будь-якого з цих способів слід пам'ятати вимоги мінімального енергоспоживання та цілодобового (а, може, і цілорічного?) перебування на сонці та під дощем. Датчик вітру не можна розмістити під дахом у тіні - навпаки, він повинен бути максимально віддалений від усіх факторів, що заважають, і «відкритий усім вітрам». Ідеальне місце розташування - коник даху будинку або, на крайній край, сараю або альтанки, віддалених від інших будівель і дерев. Такі вимоги передбачають автономне живлення та, очевидно, бездротовий канал передачі даних. Цими вимогами обумовлені деякі навороти конструкції, яка описується далі.

Про мінімальне енергоспоживання

До речі, а мінімальне енергоспоживання – скільки це? Якщо виходити із звичайних побутових батарейок типу АА, то середнє споживання схеми в ідеальному випадку має становити не більше ніж 1-2 мА. Порахуйте самі: ємність пристойного лужного елемента типорозміру АА становить близько 2,5-3 А год, тобто схема із зазначеним споживанням пропрацює від нього близько 1500-2500 годин, або 2-3 місяці. В принципі це теж небагато, але відносно прийнятно - менше не можна ніяк: або розоріться на батарейках, або доведеться використовувати акумулятори, які потрібно буде заряджати ще частіше, ніж міняти батареї. Тому ми при складанні такої схеми зобов'язані ловити будь-які крихти: обов'язковий режим енергозбереження, ретельно продумана схемотехніка та послідовність дій у програмі. Далі ми побачимо, що в остаточній конструкції я все-таки не вклався в необхідні вимоги і довелося використовувати живлення від акумулятора.


Пізнавальну історію про те, як я намагався відтворити найсучасніший і найпросунутіший з способів - ультразвуковий, і зазнав невдачі, я розповім якось іншим разом. Всі інші методи припускають роздільний вимір швидкості та напрямки, тому довелося містити два датчики. Вивчивши теоретично термоанемометри, я зрозумів, що готовий чутливий елемент аматорського рівня у нас придбати не вдасться (на західному ринку вони доступні!), а самостійно винаходити – вплутуватися в чергові НДіГКР із відповідними витратами часу та грошей. Тому по деякому міркуванню я вирішив зробити уніфіковану конструкцію на обидва датчики: чашковий анемометр з оптичним вимірюванням швидкості обертання і флюгер з електронним зніманням кута повороту на основі диску, що кодує (енкодера).

Конструкції датчиків

Перевага механічних датчиків у тому, що ніякі НДіОКР там не потрібні, принцип простий і зрозумілий, а якість результату залежить тільки від акуратності виконання ретельно продуманої конструкції.

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

Для флюгера та анемометра потрібні такі деталі, які довелося замовити у токаря та фрезерувальника (кількість та матеріал вказані відразу для обох датчиків):

Осі, зауважимо, обов'язково виточуються на токарному верстаті: виготовити на коліні вісь із вістрям точно по центру практично неможливо. А розміщення вістря точно по осі обертання тут – визначальний фактор успіху. Крім того, вісь має бути ідеально прямою, ніякі відхилення не допускаються.

Механічний датчик напряму вітру - електронний флюгер

Основою флюгера (як і датчика швидкості далі) служить П-подібна скоба з дюралю Д-16, зображена на кресленні зверху ліворуч. У нижнє заглиблення запресовується шматочок фторопласту, у якому виробляється ступінчасте заглиблення послідовно свердлами 2 і 3 мм. У цей поглиблення гострим кінцем вставляється вісь (для флюгера - з латуні). Зверху вона вільно проходить через отвір 8 мм. Над цим отвором гвинтами М2 до скоби прикріплюється прямокутний шматочок того ж фторопласту завтовшки 4 мм так, щоб він перекривав отвір. У фторопласті виготовлений отвір точно по діаметру осі 6 мм (розташований точно по загальній осі отворів - див. складальний креслення нижче). Фторопласт вгорі та внизу тут грає роль підшипників ковзання.


Ось у місці тертя про фоторопласт можна відполірувати, а площа тертя зменшити, отзенковавши отвір у фторопласті. ( Див. на цю тему нижче UPD від 13.09.18 та 05.06.19). Для флюгера це не відіграє особливої ​​ролі – деяка «загальмованість» йому навіть корисна, а для анемометра доведеться постаратися мінімізувати тертя та інерцію.

Тепер про знімання величини кута повороту. Класичний енкодер Грея на 16 положень стосовно нашого випадку виглядає так, як показано на малюнку:

Розмір диска був обраний, виходячи з умови надійної оптичної ізоляції пар випромінювач-приймач один від одного. При такій конфігурації щілини шириною 5 мм розташовуються з проміжком 5 мм, а оптичні пари розташовані на відстані рівно 10 мм. Розміри скоби, до якої кріпиться флюгер, були розраховані виходячи з діаметра диска 120 мм. Все це, звичайно, можна зменшити (особливо, якщо підібрати світлодіоди та фотоприймачі якомога меншого діаметра), але було прийнято до уваги складність виготовлення енкодера: з'ясувалося, що фрезерувальники за таку тонку роботу не беруться, тому його довелося випилювати вручну надфілем. А тут чим більше розміри, тим надійніший результат і менше клопоту.

На складальному кресленні вище показано кріплення диска до осі. Ретельно відцентрований диск кріпиться гвинтиками М2 до капролонової втулки. Втулка розміщується на осі так, щоб зазор угорі був мінімальним (1-2 мм) - так, щоб вісь у нормальному положенні оберталася вільно, а при перевороті вістря не випадало з гнізда внизу. Блоки фотоприймачів і випромінювачів прикріплюються до скоби зверху і знизу диска, більш конкретно їх конструкції далі.

Вся конструкція міститься у пластиковий (АБС або полікарбонат) корпус 150×150×90 мм. У зібраному вигляді (без кришки та флюгера) датчик напрямку виглядає так:

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

На верхівку осі кріпиться власне флюгер. Він виготовлений на основі такої ж латунної осі, в розріз на тупому боці якої впаюється хвостовик з листової латуні. На гострому кінці на деяку довжину нарізається різьблення М6, і на ній за допомогою гайок закріплюється круглий протилежний вантаж, відлитий зі свинцю:

Вантаж розрахований так, щоб центр тяжіння припадав точно на місце кріплення (пересуваючи його вздовж різьблення, можна досягти ідеального балансування). Кріплення флюгера до осі здійснюється за допомогою нержавіючого гвинта М3, який проходить через отвір в осі флюгера і вкручується в різьблення, нарізане в осі обертання (гвинт, що кріпиться, видно на фото вище). Для точної орієнтації верхівка осі обертання має напівкругле заглиблення, в яке лягає вісь флюгера.

Датчик швидкості вітру - чашковий анемометр своїми руками

Як ви вже зрозуміли, основа для датчика швидкості з метою уніфікації була обрана та сама, що і для флюгера. Але вимоги до конструкції тут дещо інші: з метою зниження порога торкання анемометр має бути максимально полегшений. Тому, зокрема, вісь для нього зроблена з дюралю, диск з отворами (для вимірювання частоти обертання) зменшений у діаметрі:

Якщо для чотирибітного енкодера Грея потрібно чотири оптопари, то для датчика швидкості всього одна. По колу диска на рівній відстані просвердлено 16 отворів, таким чином один оберт диска в секунду еквівалентний 16 герцям частоти, що надходить з оптопари (можна більше отворів, можна менше - питання тільки в масштабі перерахунку та економії енергії на випромінювачі).

Саморобний датчик все одно вийде досить грубим (поріг торкання не менш як півметра-метра в секунду), але його знизити можна тільки якщо радикально змінити конструкцію: наприклад, замість чашечної вертушки поставити пропелер. У чашечной вертушки різниця сил опору потоку, що обумовлює крутний момент, відносно невелика - вона досягається виключно за рахунок різної форми поверхні, що зустрічає потік повітря, що набігає (тому форма чашок повинна бути якомога більш обтічної - в ідеалі це половинка яйця або кулі). У пропелера крутний момент набагато більший, його можна зробити набагато меншим за вагою, і, нарешті, саме виготовлення простіше. Але пропелер потрібно встановлювати за напрямком потоку повітря – наприклад, розмістивши його на кінці того самого флюгера.

Питання питань при цьому: як передавати показання з датчика, що хаотично обертається навколо вертикальної осі? Я його вирішити не зміг, і судячи з того, що професійні чашкові конструкції досі широко поширені, вирішується він аж ніяк не з полпинка (ручні анемометри до уваги не беремо - їх орієнтують по потоку повітря вручну).

Мій варіант чашкового анемометра зроблений на основі лазерного диска. Вид зверху та знизу показаний на фото:



Чашки зроблені з денця від пляшечок з-під дитячої води «Агуша». денце акуратно відрізається, причому всі три - на однаковій відстані, щоб мали рівну вагу, локально прогрівається по центру (ні в якому разі не грійте повністю - незворотно покоробиться!) і тильною стороною дерев'яної ручки від напилка вигинається назовні, щоб зробити його більш обтічним. Будете повторювати - запасіться пляшечками побільше, з п'яти-шести штук вам, ймовірно, вдасться зробити три більш-менш однакові чашки. У виготовлених чашках робиться збоку проріз і вони закріплюються по периметру диска під 120° один до одного за допомогою водостійкого клею-герметика. Диск суворо центрується щодо осі (я це робив за допомогою вкладеної металевої шайби) та закріплюється на капролоновій втулці гвинтами М2.

Загальна конструкція та встановлення датчиків

Обидва датчики, як говорилося, розміщуються у пластикових корпусах 150×150×90 мм. До вибору матеріалу корпусу треба підходити продумано: АБС або полікарбонат мають достатню атмосферостійкість, але полістирол, оргскло і тим більше поліетилен тут зовсім не підійдуть (і пофарбувати для захисту від сонця їх теж буде важко). Якщо немає можливості придбати фірмову коробку, краще самостійно спаяти корпус із фольгованого склотекстоліту, а потім пофарбувати для захисту від корозії та надання естетичного вигляду.

У кришці точно в місці виходу осі робиться отвір 8-10 мм, в який тим же клеєм-герметиком вклеюється пластиковий конус, вирізаний з носика від балончика з будівельним герметиком або клеєм:

Щоб відцентрувати конус по осі, закріпіть струбциною знизу кришки дерев'яшку, намітте на ній точний центр і трохи заглибитеся перовим свердлом 12 мм, зробивши навколо отвору кільцеве поглиблення. Конус туди має увійти точно, після чого його можна обмазувати клеєм. Можна додатково зафіксувати його у вертикальному положенні на час застигання гвинтом М6 з гайкою.

Датчик швидкості сам накриває вісь із цим конусом, як парасолькою, запобігаючи попаданню води всередину корпусу. Для флюгера варто додатково розмістити над конусом втулку, яка закриє зазор між віссю і конусом прямого стоку води (див. фото загального виду датчиків далі).

Провід від оптопар у мене виведено на окремий роз'єм типу D-SUB (див. фото датчика напрямку вище). Відповідна частина з кабелем вставляється через прямокутний отвір у підставі корпусу. Отвір потім прикривається кришкою з прорізом кабелю, яка утримує роз'єм від випадання. До основи корпусу пригвинчуються алюмінієві скоби для кріплення на місці. Конфігурація залежить від місця установки датчиків.

У зібраному вигляді обидва датчики виглядають так:

Тут вони показані вже встановленими на місце – на коник альтанки. Зверніть увагу, що поглиблення для гвинтів, що кріплять кришку, захищені від води заглушками з сирої гуми. Датчики встановлюються строго горизонтально за рівнем, для чого довелося використовувати підкладки зі шматочків лінолеуму.

Електронна частина

Метеостанція в цілому складається з двох модулів: виносного блоку (який обслуговує обидва датчики вітру, а також знімає показання із зовнішнього датчика температури-вологості), та основного модуля з дисплеями. Виносний блок обладнаний бездротовим передавачем для відправлення даних, встановленим усередині нього (антена стирчить збоку). Основний модуль приймає дані від виносного блоку (приймач для зручності його орієнтації винесений на кабелі в окремий блок), а також знімає показання з внутрішнього датчика температури вологості і виводить все це на дисплеї. Окрема складова основного блоку - годинник з календарем, який для зручності загального налаштування станції обслуговується окремим контролером Arduino Mini, і має свої дисплеї.

Виносний модуль та вимірювальна схема датчиків вітру

Як фотовипромінювачі були обрані світлодіоди ІЧ-діапазону АЛ-107Б. Ці старовинні світлодіоди, звичайно, не найкращі у своєму класі, зате мають мініатюрний корпус діаметром 2,4 мм та здатні пропускати струм до 600 мА в імпульсі. Між іншим, при випробуваннях з'ясувалося, що зразок цього світлодіода близько 1980 року випуску (в корпусі червоного кольору) має приблизно вдвічі більшу ефективність (що виразилася у дальності впевненої роботи фотоприймача), ніж сучасні екземпляри, куплені в «Чіпі-Діпі» (вони мають прозорий) жовтувато-зелений корпус). Навряд чи в 1980 році кристали були кращими, ніж зараз, хоча чим чорт не жартує? Можливо, однак, справа в різних кутах розсіювання у тому та іншому оформленні.

Через світлодіод у датчику швидкості пропускався постійний струм близько 20 мА (резистор 150 Ом при живленні 5 вольт), а в датчику напрямку - імпульсний (меандр зі шпаруватістю 2) струм близько 65 мА (ті ж 150 Ом при живленні 12 вольт). Середній струм через один світлодіод датчика напрямку при цьому близько 33 мА, всього через чотири канали - близько 130 мА.

Як фотоприймачі були обрані фототранзистори L-32P3C в корпусі діаметром 3 мм. Сигнал знімався з колектора, навантаженого на резистор 1,5 або 2 кОм від живлення 5 В. Ці параметри підібрані так, щоб на відстані ~20 мм між фотовипромінювачем та приймачем на вхід контролера надходив відразу повнорозмірний логічний сигнал у 5-вольтових рівнях без додаткового посилення . Струми, що фігурують тут, можуть здатися вам непомірно великими, якщо виходити з озвученої вище вимоги мінімального енергоспоживання, але як ви побачите, вони фігурують у кожному циклі вимірювання протягом максимум декількох мілісекунд так, що загальне споживання залишається невеликим.

Основою для кріплення приймачів та випромінювачів послужили відрізки кабельного каналу (видні на фото датчиків вище), вирізані так, щоб у підстави утворити «вушка» для кріплення на скобі. Для кожного з цих обрізків до кришки, що замикає, зсередини приклеювалася пластикова пластинка, по ширині рівна ширині каналу. Світлодіоди та фототранзистори закріплювалися на потрібній відстані в отворах, просвердлених у цій платівці так, щоб висновки опинилися всередині каналу, а назовні виступали лише опуклості на торці корпусів. Висновки розпаюються відповідно до схеми (див. нижче), зовнішні висновки робляться обрізками гнучкого різнокольорового дроту. Резистори для випромінювачів датчика напрямку також розміщуються всередині каналу, від них робиться загальний висновок. Після розпаювання кришка замикається на місце, всі щілини герметизуються пластиліном і додатково липкою стрічкою, якою також закривається отвір з боку, протилежного висновкам, і вся конструкція заливається епоксидною смолою. Зовнішні висновки, як можна побачити на фото датчиків, виводяться на клемну колодку, закріплену на тильній стороні скоби.

Принципова схемаблоку обробки датчиків вітру виглядає так:

Про те, звідки береться харчування 12-14 вольт, див. Крім компонентів, вказаних на схемі, виносний блок містить датчик температури вологості, який на схемі не показаний. Дільник напруги, підключений до виведення A0 контролера, призначений контролю напруги джерела живлення з метою своєчасної заміни. Світлодіод, підключений до традиційного виведення 13 (висновок 19 корпусу DIP) - суперяскравий, для його нормального, не сліпучого світіння достатньо струму в частки міліампера, що забезпечується незвичайно високим номіналом резистора 33 кОм.

У схемі використовується голий контролер Atmega328 в DIP-корпусі, запрограмований через Uno і встановлений на панельку. Такі контролери з уже записаним Arduino-завантажувачем, продаються, наприклад, у «Чіпі-Діпі» (або завантажувач можна записати самостійно). Такий контролер зручно програмувати у звичному середовищі, але, позбавлений компонентів на платі, він по-перше, виходить економічнішим, по-друге, займає менше місця. Повноцінний енергозберігаючий режим можна було б отримати, позбавившись і від завантажувача теж (і взагалі розписавши весь код на асемблері:), але це не дуже актуально, а програмування при цьому невиправдано ускладнюється.

На схемі сірими прямокутниками обведені компоненти, що відносяться окремо до каналів швидкості та напряму. Розглянемо функціонування схеми загалом.

Робота контролера загалом управляється сторожовим таймером WDT, включеним у режимі виклику переривання. WDT виводить контролер із режиму сну через задані проміжки часу. Якщо у викликаному перериванні таймер зводиться заново, перезавантаження з нуля не відбувається, всі глобальні змінні залишаються за своїми значеннями. Це дозволяє накопичувати дані від пробудження до пробудження і в якийсь момент обробляти їх, наприклад, усереднювати.

На початку програми зроблено такі оголошення бібліотек та глобальних змінних (щоб не захаращувати текст і без того великих прикладів, тут випущено все, що відноситься до датчика температури-вологості):

#include #include #include . . . . . #define ledPin 13 //виведення світлодіода (PB5 висновок 19 ATmega) #define IR_Pin 10 //управління транзистором IRLU (PB2 висновок 16 Atmega) #define in_3p 9 //вхід приймача розряд 3 #define in_2p 8 //2 приймача define in_1p 7 //вхід приймача розряд 1 #define in_0p 6 //вхід приймача розряд 0 #define IR_PINF 5 //(PD5,11) висновок для ІЧ-світлодіода частоти #define IN_PINF 4 //(PD4,6) вхід виявлення частоти volatile unsigned long ttime = 0; //Період спрацьовування датчика float ff; // значення частоти датчика швидкості для осреднения char msg; // посилається меседж byte count = 0; / / лічильник int batt; //для опосередкування батарейки byte wDir; //масив напрямів вітру byte wind_Gray=0; //байт коду напряму вітру
Для ініціації режиму сну та WDT (пробуження кожні 4 с) служать такі процедури:

// Переведення системи в режим сну void system_sleep() ( ADCSRA &= ~(1<< ADEN); //экв. cbi(ADCSRA,ADEN); выключим АЦП set_sleep_mode(SLEEP_MODE_PWR_DOWN); // режим сна sleep_mode(); // система засыпает sleep_disable(); // система продолжает работу после переполнения watchdog ADCSRA |= (1 << ADEN); /экв. sbi(ADCSRA,ADEN); включаем АЦП } //**************************************************************** // ii: 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms // 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec void setup_watchdog(int ii) { byte bb; if (ii >9) ii = 9; bb=ii & 7; if (ii > 7) bb|= (1<<5); //в bb - код периода bb|= (1<Датчик швидкості видає частоту переривання оптичного каналу, порядок величин – одиниці-десятки герц. Мірити таку величину економічніше та швидше через період (цьому була присвячена публікація автора «Оцінка методів вимірювання низьких частот на Arduino»). Тут вибрано метод через модифіковану функцію pulseInLong(), який не прив'язує вимірювання до певних висновків контролера (текст функції periodInLong() можна знайти у зазначеній публікації).

У функції setup() оголошуються напрями висновків, ініціалізуються бібліотека передавача 433 МГц і сторожовий таймер (рядок IN_PINF в принципі зайва, і вставлена ​​для пам'яті):

Void setup() ( pinMode(IR_PINF, OUTPUT); //на вихід pinMode(IN_PINF, INPUT); //виведення виявлення частоти на вхід pinMode(13, OUTPUT); //світлодіод vw_setup(1200); // швидкість з'єднання VirtualWire vw_set_tx_pin(2); //D2, PD2(4) висновок передачі VirtualWire // Serial.begin(9600); // Serial-порт для контролю при налагодженні setup_watchdog(8); //WDT період 4 c wdt_reset();
Нарешті, в основному циклі програми ми спочатку щоразу при пробудженні (кожні 4 секунди) зчитуємо напругу та розраховуємо частоту датчика швидкості вітру:

Void loop() ( wdt_reset(); //обнулюємо таймер digitalWrite(ledPin, HIGH); //включаємо світлодіод для контролю batt=analogRead(0); //читаємо та зберігаємо поточний код батареї /*=== частота === = * / digitalWrite (IR_PINF, HIGH); // Включаємо ІЧ-світлодіод датчика швидкості float f = 0; println(ttime);//для контролю при налагодженні if (ttime!=0) (//на випадок відсутності частоти f = 1000000/float(ttime);) // обчислюємо частоту сигналу в Гц digitalWrite(IR_PINF, LOW); /вимикаємо ІЧ-світлодіод ff=f;//зберігаємо обчислене значення в масиві.
Час горіння ІЧ-світлодіода (що споживає, нагадаю, 20 мА) тут, як бачите, буде максимальним за відсутності обертання диска датчика і становить при цьому близько 0,25 секунди. Мінімальна вимірювана частота, таким чином, складе 4 Гц (чверть оберту диска за секунду при 16 отворах). Як з'ясувалося при калібруванні датчика (див. далі), це відповідає приблизно 0,2 м/с швидкості вітру Підкреслимо, що це мінімальна вимірювана величина швидкості вітру, але не здатність, що дозволяє, і не поріг торкання (який виявиться набагато вище). За наявності частоти (тобто при обертанні датчика) час вимірювання (і, відповідно, час горіння LED, тобто споживання струму) пропорційно зменшуватиметься, а роздільна здатність - збільшуватися.

Далі йдуть процедури, які виконуються кожне четверте пробудження (тобто кожні 16 секунд). Значення частоти датчика швидкості із накопичених чотирьох значень ми передаємо не середнє, а максимальне – як показав досвід, це більш інформативна величина. Кожну з величин, незалежно від її типу, для зручності та одноманітності ми перед передачею перетворюємо на ціле позитивне число розміром у 4 десяткові розряди. За відліком числа пробуджень слідкує змінна count:

//кожні 16 сек усредняем батарейку і визначаємо максимальне значення //частоти з 4-х значень: if (count==3)( f=0; //значення частоти for (byte i=0; i<4; i++) if (fДалі – визначення коду Грея напряму. Тут для зниження споживання замість постійно увімкнених ІЧ-світлодіодів на всі чотири канали одночасно через ключовий польовий транзистор за допомогою функції tone() подається частота 5 кГц. Виявлення наявності частоти кожному з розрядів (висновки in_0p – in_3p) виробляється методом, аналогічним антидребезгу під час зчитування показань натиснутої кнопки. Спочатку в циклі чекаємо, чи є на виведенні високий рівень, а потім перевіряємо його через 100 мкс. 100 мкс є півперіоду частоти 5 кГц, тобто за наявності частоти мінімум з другого разу ми знову потрапимо на високий рівень (про всяк випадок повторюємо чотири рази) і це означає, що він точно там є. Цю процедуру повторюємо для кожного з чотирьох біт коду:

/* ===== Wind Gray ==== */ //напрямок: tone(IR_Pin,5000);//частоту 5 кГц на транзистор boolean yes = false; byte i=0; while(!yes)( //розряд 3 i++; boolean state1 = (digitalRead(in_3p)&HIGH); delayMicroseconds(100); // затримка в 100 мікросекунд yes=(state1 & !digitalRead(in_3p));; if (i> 4) break; //пробуємо чотири рази) if (yes) wDir=1; else wDir=0; yes = false; i=0; while(!yes)( //розряд 2 i++; boolean state1 = (digitalRead(in_2p)&HIGH); delayMicroseconds(100); // затримка в 100 мікросекунд yes=(state1 & !digitalRead(in_2p));; if (i> 4) break; //пробуємо чотири рази) if (yes) wDir=1; else wDir=0; yes = false; i=0; while(!yes)( //розряд 1 i++; boolean state1 = (digitalRead(in_1p)&HIGH); delayMicroseconds(100); // затримка в 100 мікросекунд yes=(state1 & !digitalRead(in_1p));; if (i> 4) break; //пробуємо чотири рази) if (yes) wDir=1; else wDir=0; yes = false; i=0; while(!yes)( //розряд 0 i++; boolean state1 = (digitalRead(in_0p)&HIGH); delayMicroseconds(100); // затримка в 100 мікросекунд yes=(state1 & !digitalRead(in_0p));; if (i> 4) break; //пробуємо чотири рази) if (yes) wDir=1; else wDir=0; noTone(IR_Pin); //вимикаємо частоту //збираємо в байт у коді Грея: wind_Gray=wDir+wDir*2+wDir*4+wDir*8; //Прямий переклад у дв. код int wind_G=wind_Gray*10+1000; //доповнюємо до 4-х дес. розрядів. . . . .
Максимальна тривалість однієї процедури буде за відсутності частоти приймача і дорівнює 4×100 = 400 мікросекунд. Максимальний час горіння 4-х світлодіодів напряму буде тоді, коли не засвічено жодного приймача, тобто 4×400 = 1,6 мілісекунди. Алгоритм, до речі, так само працюватиме, якщо замість частоти, період якої кратний 100 мкс, просто подати постійний високий рівень на світлодіоди. За наявності меандру замість постійного рівня ми просто заощаджуємо харчування вдвічі. Ми можемо ще заощадити, якщо завести кожен ІЧ-світлодіод через окрему лінію (відповідно, через окремий вивід контролера зі своїм ключовим транзистором), зате при цьому ускладнюється схема, розведення та управління, а струм в 130 мА протягом 2 мс кожні 16 секунд - це, погодьтеся, небагато.

Зрештою, бездротова передача даних. Для передачі даних від місця встановлення датчиків до табло метеостанції був обраний найпростіший, найдешевший і надійніший спосіб: пара передавач/приймач на частоті 433 МГц. Згоден, спосіб не найзручніший (через те, що девайси розраховані на передачу бітових послідовностей, а не цілих байтів, доводиться витончуватися в конвертації даних між потрібними форматами), і впевнений, що багато хто зі мною захочуть посперечатися щодо його надійності. Відповідь на останнє заперечення проста: «Ти просто не вмієш їх готувати!».

Секрет у тому, що зазвичай залишається за кадром різних описів обміну даними по каналу 433 МГц: оскільки ці прилади суто аналогові, то живлення приймача має бути дуже добре очищене від будь-яких сторонніх пульсацій. У жодному разі не слід живити приймач від внутрішнього 5-вольтового стабілізатора Arduino! Установка для приймача окремого малопотужного стабілізатора (LM2931, LM2950 або аналогічного) безпосередньо поблизу його висновків, з правильними ланцюгами фільтрації на вході і виході, радикально підвищує дальність і надійність передачі.

В даному випадку передавач працював безпосередньо від напруги акумулятора 12 В, приймач і передавач були забезпечені стандартними саморобними антенами у вигляді відрізка дроту довжиною 17 см. (Нагадаю, що провід для антен придатний тільки одножильний, а розміщувати антени в просторі необхідно паралельно один одному.) Пакет інформації довжиною в 24 байти (з урахуванням вологості та температури) без будь-яких проблем впевнено передавався зі швидкістю 1200 біт/с по діагоналі через садову ділянку 15 соток (близько 40-50 метрів), а потім через три зроблені з колод стіни всередину приміщення ( в якому, наприклад, стільниковий сигнал приймається насилу і не скрізь). Умови, практично недосяжні для будь-якого стандартного способу на 2,4 ГГц (типу Bluetooth, Zig-Bee і навіть аматорський Wi-Fi), при тому, що споживання передавача тут становить жалюгідні 8 мА і тільки в момент власне передачі, решту часу передавач споживає копійки. Передавач конструктивно розміщений усередині виносного блоку, антена стирчить збоку горизонтально.

Об'єднуємо всі дані в один пакет (в реальній станції до нього додадуться ще температура і вологість), що складається з одноманітних 4-байтних частин і що передує сигнатурою «DAT», відправляємо його на передавач і завершуємо всі цикли:

/*=====Transmitter=====*/ String strMsg="DAT"; //сигнатура - дані strMsg+=volt; //приєднуємо батарейку 4 розряди strMsg+=wind_G; //приєднуємо wind 4 розряди strMsg+=fi; //приєднуємо частоту 4 розряду strMsg.toCharArray(msg,16); //перекладаємо рядок у масив // Serial.println(msg); //Для контролю vw_send((uint8_t *)msg, strlen(msg)); // Передача повідомлення vw_wait_tx(); // Чекаємо завершення передачі – обов'язково! delay(50); //+ ще про всяк випадок затримка count = 0; //обнулюємо лічильник )//end count==3 else count++; digitalWrite(ledPin, LOW); //гасимо сигнальний світлодіод system_sleep(); //систему - у сон) //end loop
Розмір пакета можна скоротити, якщо відмовитися від вимоги подання кожної з величин різноманітних типів у вигляді одноманітного 4-байтового коду (наприклад, для Грейового коду, звичайно, вистачить і одного байта). Але заради універсалізації я залишив усе як є.

Живлення та особливості конструкції виносного блоку. Споживання виносного блоку підраховуємо таким чином:

20 мА (випромінювач) + ~20 мА (контролер з допоміжними ланцюгами) протягом приблизно 0,25 з кожні чотири секунди - у середньому 40/16 = 2,5 мА;
- 130 мА (випромінювачі) + ~20 мА (контролер з допоміжними ланцюгами) протягом приблизно 2 мс кожні 16 секунд - у середньому 150/16/50 ≈ 0,2 мА;

Накинувши на цей розрахунок споживання контролера при зніманні даних з датчика температури-вологості та при роботі передавача, сміливо доводимо середнє споживання до 4 мА (при піковому близько 150 мА, зауважте!). Батарейки (яких, до речі, потрібно аж 8 штук для забезпечення живлення передавача максимальною напругою!) доведеться міняти занадто часто, тому виникла ідея живити виносний блок від 12-вольтових акумуляторів для шуруповерта - їх у мене утворилося дві зайві штуки. Місткість їх навіть менша, ніж відповідної кількості АА-батарейок - всього 1,3 А години, зате ніхто не заважає їх міняти в будь-який час, тримаючи напоготові другий заряджений. При вказаному споживанні 4 мА ємності 1300 мА годин вистачить приблизно на два тижні, що виходить не дуже клопітко.

Зазначимо, що напруга свіжозрядженого акумулятора може становити до 14 вольт. На цей випадок поставлений вхідний стабілізатор 12 вольт - щоб не допустити перенапруження живлення передавача і не перевантажувати основний п'ятивольтовий стабілізатор.

Виносний блок у відповідному пластиковому корпусі розміщується під дахом, до нього на роз'ємах підведений кабель живлення від акумулятора та з'єднання з датчиками вітру. Основна складність у тому, що схема виявилася вкрай чутливою до вологості повітря: у дощову погоду вже за пару годин починає збоїти передавач, вимірювання частоти показують повну кашу, а вимірювання напруги акумулятора показують погоду на Марсі.

Тому після налагодження алгоритмів та перевірки всіх з'єднань корпус необхідно ретельно герметизувати. Всі роз'єми в місці входу в корпус промазуються герметиком, те саме стосується всіх головок гвинтів, що стирчать назовні, виходу антени і кабелю живлення. Стики корпусу промазуються пластиліном (з огляду на те, що їх доведеться рознімати), і додатково проклеюються зверху смужками сантехнічного скотчу. Непогано додатково акуратно зміцнити епоксидкою використовувані роз'єми всередині: так, вказаний на схемі виносного модуля DB-15 сам по собі не герметичний, і між металевим обрамленням та пластиковою основою буде повільно просочуватися вологе повітря.

Але всі ці заходи самі по собі дадуть лише короткочасний ефект - навіть якщо не буде підсмоктування холодного вологого повітря, то сухе повітря з кімнати легко перетворюється на вологе при падінні температури зовні корпусу (згадайте про явище, зване «точка роси»).

Щоб цього уникнути, необхідно всередині корпусу залишити патрончик або мішечок з вологопоглиначем - силікагелем (мішечки з ним іноді вкладають у коробки з взуттям або деякі упаковки з електронними пристроями). Якщо силікагель невідомого походження довго зберігався, його перед використанням необхідно прожарити в електродуховці при 140-150 градусах кілька годин. Якщо корпус герметизований як слід, то міняти вологопоглинач доведеться не частіше, ніж на початку кожного дачного сезону.

Основний модуль

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

Приймач винесений за межі корпусу основного модуля станції та поміщений у маленьку коробочку з вушками для кріплення. Антена виведена через отвір у кришці, всі отвори в корпусі загерметизовані сирою гумою. Контакти приймача виведені на дуже надійне вітчизняне роз'єм типу РС-4, з боку приймача він підключений через відрізок здвоєного екранованого AV-кабелю:

По одній із жил кабелю знімається сигнал, по іншій подається живлення у вигляді «сирих» 9 вольт від адаптера живлення модуля. Стабілізатор типу LM-2950-5.0 разом із фільтруючими конденсаторами встановлений у коробочці разом із приймачем на окремій хустці.

Вироблялися експерименти щодо збільшення довжини кабелю (про всяк випадок - раптом через стінку не запрацювало б?), У яких з'ясувалося, що в межах довжини до 6 метрів нічого не змінюється.

Дисплеїв типу OLED всього чотири: два жовті обслуговують метеодані, два зелені години і календар. Розміщення їх показано на фото:

Зверніть увагу, що в кожній групі один з дисплеїв – текстовий, другий – графічний, зі штучно створеними шрифтами у вигляді картинок гліфів. Тут ми надалі на питанні виведення інформації на дисплеї зупинятись не будемо, щоб не роздмухувати і без того великий текст статті та прикладів: через наявність картинок гліфів, які доводиться виводити індивідуально (часто простим перерахуванням варіантів шляхом оператора case) програми виведення можуть бути дуже громіздкі. Про те, як поводитися з такими дисплеями, див.

Принципова схема.Годинник та його дисплеї для зручності налаштування обслуговуються окремим контролером Arduino Mini і більше ми їх тут розбирати не будемо. Схема підключення компонентів до Arduino Nano, що управляє прийомом і виведенням метеоданих, наступна:

Тут, на відміну від виносного модуля, показано підключення метеодатчиків – барометра та внутрішнього датчика температури-вологості. Слід звернути увагу на розведення живлення - дисплеї живляться від окремого стабілізатора 5 типу LM1085. Від нього ж природно запитати дисплеї годинника, проте в цьому випадку контролер годинника також повинен харчуватися від цієї ж напруги, причому через висновок 5 В, а не Vin (для Mini Pro останній називається RAW). Якщо запитати контролер годинника так само, як Nano - 9 вольтами через виведення RAW, то його внутрішній стабілізатор буде конфліктувати із зовнішніми 5-ма вольтами і в цій боротьбі, природно, переможе найсильніший, тобто LM1085, а Mini залишиться зовсім без харчування. Також, щоб уникнути усіляких неприємностей перед програмуванням Nano і особливо Mini (тобто перед підключенням USB-кабелю), зовнішній адаптер слід відключати.

На стабілізаторі LM1085 при підключенні всіх чотирьох дисплеїв виділятиметься потужність біля вата, тому його слід встановити на маленький радіатор близько 5-10 см2 з алюмінієвого або мідного куточка.

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

Для прийому повідомлення каналом 433 МГц застосуємо стандартний спосіб, описаний у безлічі джерел. Підключаємо бібліотеку та оголошуємо змінні:

#include . . . . . int volt; //напруга акуумулятора в умовному коді float batt; //Реальна величина - напруга акумулятора byte wDir; //напрямок у коді Грея uint16_t t_time = 0; //інтервал часу прийому char str; //Рядок для даних uint8_t buf; //Змінна для прийнятого повідомлення uint8_t buflen = VW_MAX_MESSAGE_LEN; // max довжина прийнятого повідомлення. . . . .
З величиною розміру буфера buflen пов'язана одна особливість: оголосити її значення (VW_MAX_MESSAGE_LEN) раз на початку програми недостатньо. Оскільки функції прийому (див. далі) ця змінна фігурує за посиланням, то розмір повідомлення за умовчанням доводиться оновлювати кожен цикл. Інакше через прийом зіпсованих повідомлень значення buflen буде щоразу коротшати, доки ви не почнете отримувати всяку нісенітницю замість даних. У прикладах обидві ці змінні зазвичай оголошують локально в циклі loop(), тому розмір буфера оновлюється автоматично, а тут ми будемо повторювати привласнення потрібного значення на початку кожного циклу.

У процедурі setup робимо такі установки:

Void setup() ( delay (500); //для устаканивания живлення дисплеїв pinMode(16,INPUT_PULLUP); //висновок для кнопки vw_setup(1200); // Швидкість з'єднання VirtualWire vw_set_rx_pin(17); //A3 Висновок приймача VirtualWi . .. .
Перед тим, як приймати, перевіряється інтервал часу t_time, що минув з останнього прийому. Якщо він перевищив розумні межі (наприклад, 48 секунд - триразовий час повтору повідомлень із зовнішнього блоку), це сприймається, як втрата датчика і якимось чином індикується на дисплеї:

Void loop() ( vw_rx_start(); // Готовність прийому buflen = VW_MAX_MESSAGE_LEN; //розмір буфера щоразу заново if ((int(millis()) - t_time) > 48000) //якщо t_time не оновлювалося більше 48 сек (<отображаем прочерк на дисплее>)//end датчик не знайдений if (vw_have_message()) ( // чекаємо прийому if (vw_get_message(buf, &buflen)) // Якщо дані прийняті ( vw_rx_stop(); // зупиняємо прийом на час t_time = millis(); / /оновлюємо t_time for (byte i=0;i<3;i++) // Получить первые три байта str[i]= buf[i]; str="\0"; if((str=="D")&&(str=="A")&&(str=="T")) { //сигнатура принята //принимаем данные: for (byte i=3;i<7;i++) // извлечь четыре байта аккумулятора str= buf[i]; // упаковать их в строку volt=atoi(str); //преобразовать в целое число volt=(volt/10)-100; //удаляем добавки до 4-х байт batt=float(volt)/55.5; //преобразуем в реальный вид напряжения в вольтах //и пока храним в глобальной переменной for (byte i=7;i<11;i++) // извлечь четыре байта направления str= buf[i]; // упаковать их в строку int w_Dir=atoi(str); //преобразовать в целое число w_Dir=(w_Dir-1000)/10; //возвращаем к исходному виду wDir=lowByte(w_Dir); //младший байт - код Грея <выводим направление на дисплей через оператор case> . . . . .
Коефіцієнт 55.5 - перерахунок значення коду АЦП в реальну напругу, його величина залежить від опорної напруги та величин резисторів дільника.

До речі, код Грея має одну особливість: у ньому неважливий порядок біт, всі свої властивості код зберігає при будь-якій їхній перестановці. Оскільки при розшифровці ми тут все одно розглядаємо кожен випадок окремо, то біти можна розглядати в будь-якому порядку і навіть плутати при підключенні. Інша річ, якби захотіли цю справу якось упорядкувати – наприклад, створити масив значень напряму («с», «ссз», «сз», «зсз», «з» тощо), та замість індивідуального розгляду кожного варіанта витягувати позначення за номером у цьому масиві. Тоді довелося б перетворювати код Грея на впорядкований двійковий, і порядок біт відігравав би істотну роль.

І, нарешті, отримуємо значення швидкості та закриваємо всі оператори:

For (byte i=19;i<23;i++) // Получить четыре байта частоты str= buf[i]; // упаковать их в строку int wFrq=atoi(str); //преобразовать в целое число wFrq = (wFrq-1000)/10; //удаляем добавки до 4-х байт wFrq=10+0.5*wFrq;//скорость в целом виде с десятыми <отображаем ее на дисплее поразрядно>)//end if str=DAT )//end vw_get_message ) //end vw_have_message(); . . . . .
Тут 10+0.5*wFrq - калібрувальне рівняння. 10 дм/с (тобто 1.0 метри на секунду) є поріг торкання, а 0,5 - коефіцієнт перерахунку частоти швидкість (в дм/сек). При нульовому значенні вхідної частоти це рівняння видає 10 дм/с, тому окремо подбати, щоб при цьому виводити не 1 м/с, а саме нульове значення. Калібрувати датчик швидкості можна за допомогою будь-якого найдешевшого ручного анемометра та настільного вентилятора. Не намагайтеся визначити поріг торкання експериментально - набагато точніше вийде, якщо відзначити дві-три точки калібрування прямої значення швидкості V від частоти F: V = Vп + K×F при різних швидкостях потоку, тоді поріг торкання визначиться автоматично, як величина Vп (ордината точки перетину цієї прямої з віссю швидкостей).

Перш ніж закрити основний цикл, потрібно зробити ще одну річ. Напруга акумулятора у нас є, але виводити на екран весь час його не потрібно - тільки місце займати. Для цього потрібна кнопка Кн1 - натискаючи на неї, ми тимчасово (до наступного оновлення даних) замінюємо рядок зовнішньої температури-вологості значенням напруги:

If (digitalRead(16)==LOW)( //кнопка натиснута<выводим напряжение на дисплей, затирая значение температуры-влажности>) // кінець кнопка delay (500); )//кінець loop
Кнопка у мене була, як видно зі схеми, з перекидним контактом, але ніщо не заважає встановити звичайну із замикаючим, підключивши її до живлення через резистор. Можна також додати блимання символів на дисплеї, якщо напруга акумулятора знизиться нижче, наприклад, 10 вольт, як знак, що його пора змінювати.

На закінчення про метеодатчики.Як зовнішній датчик був використаний SHT-75 - єдиний зі знайдених мною аматорських датчиків, який не потребує калібрування та показує реальні величини та температури та вологості прямо «з коробки» (звідси і його висока ціна).

Бібліотеку для його підключення можна знайти.

Сконструйований SHT-75 досить по-дурному: металева підкладка плати добре проводить тепло, тому його потрібно повністю виносити за межі корпусу. Інакше наявності одного контролера типу ATmega328 зі стабілізатором живлення в замкнутому корпусі достатньо, щоб через підкладку плати підігріти датчик на пару градусів навіть у разі, якщо його головка винесена назовні. Моя схема з датчиками вітру, з її струмами в 20-130 мА (нехай навіть поточними мізерні мілісекунди) підігрівала SHT-75 градусів на п'ять, тому він був винесений назовні і встановлений окремо на пластикову пластину, що стирчить з корпусу вбік.

Дані з SHT-75 знімаються тим же контролером, що дані датчиків вітру, і посилаються з виносного модуля в єдиному пакеті через бездротовий канал 433 МГц. Для передачі попередньо вони також наводяться до формату 4-байтового рядка.

Для вимірювання температури та вологості всередині приміщення був обраний банальний DHT-22 - оскільки діапазон там невеликий у порівнянні з вулицею, то байдуже, який датчик використовувати (крім, зрозуміло, DHT-11, який взагалі використовувати не слід ні за яких обставин, в цільове призначення він просто непрацездатний). Температура DHT-22 була підправлена ​​за вимірюваннями ртутним термометром (з SHT-75 вони повністю збіглися!), а вологість трохи підрихтована порівнянням з SHT-75. Поправки вводяться перед індикацією на дисплеї.

До речі, DHT-22 теж необхідно виносити подалі від корпуса з дисплеями - інакше він неминуче підігріватиметься і брехатиме. Я його закріплюю на пластиковому кріпленні унизу корпусу, на відстані міліметрів десять від нього. Ця обставина, до речі, як я підозрюю, одна з причин (крім відсутності індивідуального калібрування) того, що всі фірмові побутові метеостанції RST та Oregon безбожно брешуть у показаннях, маючи розкид навіть самі з собою (внутрішній датчик із зовнішнім) у два-три градуси. та до десятка відсотків вологості.

Барометрне представляє проблем, оскільки майже всі наявні у продажу зроблені на одній і тій же основі - мікроелектромеханічній (MEMS) мікросхемі BMP180 або її модифікаціях. Мій особистий досвід спроби використання різновиду, що рідко зустрічається, на основі LPS331AP був негативним: бібліотеку для неї знайти важче, і в довершення був виявлений конфлікт з іншими пристроями на I2C-шині. Показання барометра, можливо, доведеться підігнати за місцем установки - кожні 10-12 метрів висоти над рівнем моря знижують тиск на 1 мм.рт. ст. Тому з показань доведеться відняти (або додати) певну величину, щоб величина тиску відповідала показанням офіційної метеостанції у цій місцевості.

Цілком усі програми метеостанції я не наводжу - вони досить громіздкі, а повторити конструкцію один в один вам все одно не вдасться. Якщо що, стукайте в особи.

UPD від 30.06.17.Встановив живлення від сонячної батареї. Комплект звідси:
сонячна панель
контролер
АКБ
Всі разом + доставка по Москві в межах 2,5 тир. Працює бездоганно.
Цікавою є методика підрахунку потужності сонячної батареї та АКБ, яку пропонують консультанти з цього сайту. Приклад розрахунку на 3 Вт споживаної потужності (у мене набагато менше), цитую:
«3Вт множимо на 24ч і ділимо на 6 = 12Ач це мінімальна ємність акумулятора
3Вт множимо на 24ч і ділимо на 3ч = 24Вт це мінімальна потужність сонячної батареї»
Без коментарів.
У моєму випадку потужність сонячної енергоустановки, що вийшла, в десятки разів перевищує необхідну за найгірших погодних умов. Тому в контролері датчика можна особливо не дбати про енергозбереження і застосувати будь-які необхідні частоти зняття показань та опосередкування величин.

UPD від 13.09.18.За майже два сезони експлуатації виявилися сильні та слабкі сторони станції. Слабкі - насамперед те, що цикл оновлення показань у 16 ​​секунд (з чотирьох серій вимірювань), як це було спочатку, надто довгий. Встановлення сонячної батареї з буферним акумулятором дозволило не думати про енергозбереження та погратись із тривалістю циклу. В результаті цикл був встановлений у 8 секунд (чотири виміри через дві секунди).
З механічних удосконалень було введено твердий підп'ятник під вістря датчика швидкості (так, мене ще тоді попереджали про його необхідність, але я тоді не придумав, як його зробити). Через деякий час вісь датчика повністю пропилила фторопластову опору і поріг торкання різко зріс (на чутливості флюгера це, до речі, зовсім не позначилося). Тому опора була замінена на підп'ятник з нержавіючої сталі, в якому тонким свердлом зроблено невелике заглиблення. Передчуваю, що доведеться потім ще щось вигадувати з вістрям, яке, як і вся вісь, зроблено з дюралю. Але я відклав це до моменту, коли датчик все одно доведеться переробляти: лазерний диск, взятий за основу конструкції, за два сезони помутнішав від сонця і почав розтріскуватися.

UPD від 05.06.19.
Про переробку датчика (флюгер залишений той самий). Датчик швидкості довелося переробити і через осі, що стерлася, і через лазерний диск, що прийшов у непридатність. Основа конструкції залишена тією самою, але новий лазерний диск пофарбований золотистою фарбою з балончика. Рішення для вістря осі знайшлося у такому вигляді. У алюмінієвій осі було висвердлено заглиблення точно по центру, і туди вставлений на секундному клеї обрізок верхівки китайського мітчика на 3 мм. Верхівка у мітчика є добре відцентрованим конусом з кутом близько 70-80 град., він був додатково відполірований шкуркою-нульовкою і потім пастою ГОІ. В якості основи я використав головку нержавіючого гвинта М3 зі спиляним шліцем, в якій звичайним свердлом D=2 мм намічено невелике заглиблення по центру. Цей гвинт загортався прямо на зростання у фторопласті, пропиляне віссю раніше, ніж забезпечувалася центрування.
Кінчик осі змащувався графітовим мастилом для захисту від корозії (оскільки нержавіючі властивості мітчика мені невідомі). Після деякого притирання поріг торкання знизився настільки, що його неможливо виміряти фірмовим анемометром, у якого поріг становить близько 0,3-0,5 см/с. За непрямими даними (побудовою прямий за двома точками) був волюнтаристськи прийнятий поріг у 0,3 м/с, хоча, ймовірно, він дещо менший.

Головна зміна в алгоритмах обчислення також стосується датчиків вітру, і я вважав за корисне винести це в .


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

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

Тобі знадобляться:

Товстий дерев'яний штир
тонкі дерев'яні стрижні
мотузка та виска
стаканчик з-під йогурту
клейка стрічка (водонепроникна)
креслярські кнопки
кольоровий картон
мідна трубка
клей
ножиці

1. Візьми товстий дерев'яний штир і щільно встав його в мідну трубку. Це буде стійка анемометра.

2. Попроси дорослих допомогти просвердлити дірку крізь стійку. Діаметр отвору повинен відповідати товщині одного з тонких стрижнів. Зроби проріз на одному з кінців цього тонкого стрижня. Встав його в стійку і закріпи, як показано на малюнку.

3. Виріж з картону наконечник і оперення стріли і закріпи на кінцях тонкого стрижня.

4. Виріж чверть кола з кольорового картону і прикріпи його до стріли за допомогою клейкої стрічки.

5. Візьми велику склянку з-під йогурту. Приклей його до одного кінця другого тонкого дерев'яного стрижня.

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

7. Вибери місце для спостереження на вулиці. Вбий мідну трубку в землю, а потім встав у неї стійку. Закріпи стійку у потрібному положенні за допомогою креслярської кнопки. Встанови стійку строго вертикально, підвісивши до стрілки схилу (як схилу можна використовувати гайку). Мотузка схилу повинна висіти строго паралельно стійці.

Вітер повертає стрілку анемометра так, що вона вказує напрямок, звідки дме вітер.
Склянка з-під йогурту і стрижень разом з ним підніматимуться вгорі. Що сильніший вітер, то вище піднімається стрижень покажчик.

Шкала Бофорта

Це шкала вимірювання швидкості вітру, основу якої лежать спостереження природою. Шкала була винайдена англійським адміралом сером Френсісом Бофортом майже 200 років тому.

Швидкість вітру на картах погоди вказується числом штрихів на значку сили вітру.

Швидкість вітру Словесна характеристика Ознаки оцінки швидкості вітру
м/сек км/год бал
Бофорта
0,0-1,5 0,0-1,8 0 Штиль Дим піднімається прямовисно або майже прямовисно, листя нерухомі
0,6-1,7 1,9-5,1 1 Тихий вітер Напрям вітру визначається за димом
1,8-3,3 5,2-11,7 2 Легкий вітер Рух вітру відчувається обличчям, шелестять листя
3,4-5,2 11,8-18,7 3 Слабкий вітер Листя і тонкі гілки дерев постійно хитаються, вітер розвіває легкі прапори, море вкрите суцільною легкою хвилею.
5,3-7,4 18,8-26,6 4 Помірний вітер Вітер піднімає пил, приводить у рух тонкі гілки дерев, на окремих хвилях зрідка з'являються білі, що швидко пропадають "баранці".
7,5-9,8 26,7-35,3 5 Свіжий вітер Гойдаються товсті сучки дерев; "баранчики" видно на кожній хвилі
9,9-12,4 35,4-44,0 6 Сильний вітер Гойдаються товсті суки дерев, гудуть телеграфні дроти, "баранчики" на хвилях більш тривалі (5-10 сек.)
12,5-15,2 44,1-54,7 7 Міцний вітер Гойдаються верхівки дерев, гнуться великі гілки, незручно йти проти вітру. Пінливі хвилі на морі
15,3-18,2 54,8-66,0 8 Дуже міцний вітер Вітер ламає тонкі гілки та сухі суки дерев, ускладнює рух
18,3-21,5 66,1-77,5 9 Шторм Вітер скидає димові труби, черепицю. Йти проти вітру дуже важко.
21,6-25,1 77,6-90,2 10 Сильний шторм Значні руйнування, дерева вириваються з корінням
25,2-29,0 90,3-104,4 11 Жорстокий шторм Великі руйнування: валить телеграфні стовпи, вагони
Понад 29,0 Понад 104,4 12 Ураган Руйнує будинки, робить великі руйнування

Мій новий анемометр. Анемометр вийшов не маленький, дисковий генератор, діаметр гвинта 0.5 м. Анемометр горизонтального типу з шестилопатевим гвинтом. У статті докладний опис з фото та відео

Нова стаття на тему + фото та відео - Анемометр андроїд + мікрофон

Нарешті, справа дійшла і до анемометра. Маючи досвід виготовлення вже трьох вітрогенераторів, я так і не знаю точно на якому вітрі і скільки дають мої вітряки. Зараз всього один вітрогенератор у строю, мій найуспішніший, хоч і зібраний весь "на коліні". Я приблизно і уявляю силу вітру і можу відрізнити вітер в 5 м/с від 10 м/с, але все-таки хочеться точно знати швидкість вітру щоб визначати потужність вітрогенератора.

Кілька днів час від часу думав з чого-небудь зробити анемометр, але з мотлоху, наявного будинку поки нічого розумного не вимальовувалося. Знайшов два маленькі моторчики від DVD плеєра, але вони щось надто крихітні і лопаті до тонкого валу важко придумати.

Потрапив мені на очі автомобільний вентилятор, такі у вантажних авто ставлять зазвичай. Ось його та я й замучив. Розібрав та дістав моторчик. З гвинта зламав лопаті і залишилася лише основа – центральна частина, яка на вал надягається. Далі думав які лопаті до нього приробити, пробував і денці пластикових пляшок та банки консервні, але все це мені не подобалося.

Потім знайшов шматок ПВХ труби діаметром 5см, і довжиною 50 см. З неї зробив 4 лопаті, просто порізав трубу вздовж на дві половинки, і половинки, кожну на дві частини, вийшло 4 лопаті. В основі, що залишилося від рідного гвинта просвердлив 4 отвори для кріплення лопатей, так само і в лопатях зробив 4 отвори. Усю цю справу скрутив на болтики і вийшов чотири лопатевий гвинт - савоніус (перша "серйозна" вертикалка).

Ну а далі знайшов дроти потрібної довжини, зростив метром 5 антенного кабелю і 8 метрів звичайного. дроти відразу під'єднав щоб заміряти параметри з урахуванням довжини дроту, так як дані можуть відрізнятися якщо робити виміри на метровому дроті, або на 13 м.

Потім знайшов шматок металевої трубки довжиною близько 80-90 см, її зігнув буквою Z і примотав моторчик. Цією трубкою анемометр кріпиться до щогли. Тут нічого складного можна використовувати будь-який підручний матеріал.

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

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

Катався туди сюди та в різних напрямках і записував у телефон показання мультиметра за різних швидкостей руху. Стартував анемометр зі швидкості 7 км/год, і я поступово відкотив туди сюди на різних швидкостях починаючи з 10 км/год і максимальна 40 км/год, можна було й більше, але ґрунтові дороги дуже не рівні й не розженешся.

>

Після покатушок намалювалися такі дані. Мультиметр показав при 10км/с =0.06V, при 20км/год=0.12V, при 30=0.20V, при 40км/ч=0.30V.

Потім за допомогою калькулятора я вирахував свідчення проміжних значень швидкості вітру.

Вольти - швидкість вітру м/с.

Дані вище 11 м/с вирахував намалювавши на аркуші паперу графік зростання напруги залежно від швидкості вітру, який плавно продовжив до 15 м/с. Цього ж дня, а точніше вже ввечері встановив анемометр на щоглу до вітрогенератора. Опустив вітряк і примотався нижче анемометра. Трубу тимчасово притягнув на дріт і обмотав додатково ізолентою, вийшло начебто міцно. Ну а далі підняв усю цю справу на місце і тепер поряд з вітрогенератором на щоглі тепер стоїть анемометр, який стартує при 3м/с і справно показує швидкість вітру.

>

>

Нижче на фото вже піднятий вітрогенератор із закріпленим анемометром. Більш докладно я не став фотографувати, бо там нічого складного немає, і повторювати нічого. Анемометр зібрати можна з будь-чого, з практично будь-якого моторчика. Калібрувати, звичайно, зручніше на автомобілі. Там і комфортне, і зручніше, і спідометр точніше. Але я ось вирішив на мотоциклі, і теж начебто вийшло непогано, сподіваюся, якщо спідометр і бреше, то не набагато.

>

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

Доповнення

З'явився вітер, і я випробував анемометр. Перші спостереження за силою вітру та показанням амперметра генератора наочно показали якийсь не постійний вітер. Тут унизу, так як щогла невисока, він складається в основному з коротких поривів, тривалість яких не перевищує двох трьох секунд, і за кілька секунд вітер може змінюватися у великих межах.

Не навантажений нічим гвинт анемометра різко реагує кожен порив і зміна швидкості вітру. А навантажений гвинт цього вітрогенератора все-таки запізнюється в реакціях, і тому не синхронні дані в показаннях. Сьогодні вітер 3-7 м/с, анемометр, правда, ловив пару поривів до 10м/с, але вони тривали менше секунди і вітрогенератор просто не впівав на них реагувати.

Через деякий час спостережень намалювалися деякі середні значення сили струму від вітрогенератора за певного вітру. Стартує гвинт із 3,5-4 м/с, зарядка 0.5А на 4м/с, 1А на 5м/с, 2,5А на 6м/с, 4А на 7м/с, 5А на 8м/с. Ці дані усереднені, тому що амперметр аналоговий стот, і я можу помилятися до 0.5А у показаннях сили струму від вітрогенератора.

Повинно було вийти щось таке

Етапи виготовлення самого датчика:

Корпус зробив так: узяв шматок квадратної труби в ній вирізав віконце, щоб через нього потім змонтувати начинку (до речі, віконце вирізав з температурою, але так мені дуже хотілося це зробити, що встав і пішов пиляти). Потім усередину приварив пластину (утримувач внутрішнього підшипника), тоді приварив низ (утримувач нижнього підшипника). Коли вирішив робити верх, задумав зробити скатний дах-для цього вирізав чотири трикутники і акуратно поприхоплював, а потім проварив повністю і так зробив загострений козирок. Тоді затиснув у лещата і свердлом на 0,5 мм менше, ніж діаметр підшипника просвердлив вертикально отвір у нижні кришці та середні, обидва для підшипників. Щоб підшипники стали з натяжкою підганяли розгорткою. Підшипники стали як рідні. Потім у них вставив трохи підшліфований цвях 100-ку при цьому в середині віконця одягнувши на нього пластмасову шайбу з чотирма прорізами. На цвяху знизу нарізав різьблення і на неї накрутив крильчатку.

Крильчатку виготовив так: до гайки електродом двійкою приварив три цвяхи, потім їх обрізав і на кінцях нарізав різьблення якої прикрутив половинки від м'ячика.

До корпусу приварив тримач-шестигранний пруток із нержавіючої сталі. Сам корпус пофарбував білою емаллю двічі, щоб точно не іржавів.

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

Світлодіодіодно – фототранзисторний датчик висмикнув із принтера, там таких навалом.

Спочатку зробив із тенісних м'ячиків

Довелося трохи модифікувати прилад. На крильчатку від тенісних м'ячиків він стартував за вітру 5м/с. було куплено м'ячики у магазині дитячих іграшок діаметром 55 мм. Стартує при 2м/с і веде виміри до 22 м/с, Мені вистачає.

Після того, як датчик був готовий. Потрібно було зробити електроніку.

Перший варіант був саморобний технологія ЛУТ + зелена маска з Китаю, сохне під ультрафіолетом.

55 на фотографії це обертів за секунду. Треба було якось перевести у м/с. Довго думав як, дістав навіть два анемометри старий ще з СРСР і китайський за 50$, але з перевіркою виникли проблеми, бо вітер рвучкий і не дме стабільно.

Тому придумав так: у вихідний день я з Папою знайшли за містом 2 км рівної дороги без машин, без вітру та з обох боків посадка дерев (Тато за кермом а я сидів наполовину за вікном) і давай ганяти туди-сюди вперед. Спочатку виставив СРСР і китайські анемометри я переконався, що вони обидва показують однаково і правильно, тому що якщо розділити швидкість на спідометрі машини на 3,6 то виходила цифра, яку показували анемометри в м/с. Тато їхав з однаковою швидкістю, і прилади показували однаковий вітер. Таким чином я перевіряв свій прилад. Папа додавав щоразу +5 км на годину, а я записував новий показник (обертів за секунду). Вимірювання провів тричі. Коли ми їхали більше 80 км/год (22м/с), мій анемометр уже не міг розкрутитися і цифра завмирала, тому більше 22м/с він не вимірює.

До речі, китайський показував до 28м/с. СРСР до 20м/с. Коли встановив його в місці з доопрацьованою програмою, ще раз звірив із китайською все зійшлося.

Наразі переробляється під Ардуїно.

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

Відео роботи

Результати роботи за зиму

с-сть --- годин за зиму
0 м/с --- 511,0
1 м/с --- 475,0
2 м/с --- 386,5
3 м/с --- 321,2
4 м/с --- 219,0
5 м/с --- 131,5
6 м/с --- 63,3
7 м/с --- 32,5
8 м/с --- 15,4
9 м/с --- 9,1
10 м/с --- 5,0
11 м/с --- 3,5
12 м/с --- 2,2
13 м/с --- 1,3
14 м/с --- 0,8
15 м/с --- 0,5
16 м/с --- 0,5
17 м/с --- 0,2
18 м/с --- 0,0
19 м/с --- 0,1


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

Тепер трохи про Arduino.

Знайшов в Інтернеті схему роботи мишки, вона наочно ілюструє, як працює моя система.

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

Імпульси надходять із фототранзистора на Arduino, а він сприймає їх як натискання кнопки.

Алгоритм роботи програми такий: Вважаємо скільки натискань кнопки відбулося за одну секунду і маємо частоту обертання. Щоб цю частоту перевести в м/с. ще коли я робив Атмел я зробив алгоритм розрахунку частоти в м / с. Виглядав він так:

int ob_per_sec=0; // Змінна в яку потрапляє частота обертів на секунду.

int speed_wind=0; // Сюди потраплятиме значення після перерахунку частоти м/с.

int speed_wind_max=0; // Сюди потрапляє максимальне значення свідчень вітру м/с.

int speed_wind_2=0; // К-ть секунд з початку роботи програми зі швидкістю вітру 2 м/с.

int speed_wind_3=0; // К-ть секунд з початку роботи програми зі швидкістю вітру 3 м/с.

int speed_wind_4=0; // К-ть секунд з початку роботи програми зі швидкістю вітру 4 м/с.

int speed_wind_5=0; // К-ть секунд з початку роботи програми зі швидкістю вітру 5 м/с.

…………………………………………………………..

int speed_wind_22=0; // К-ть секунд з початку роботи програми зі швидкістю вітру 22 м/с.

if (ob_per_sec >0 && ob_per_sec<4) { speed_wind=2; speed_wind_2++;}

if (ob_per_sec >4 && ob_per_sec<7) { speed_wind=3; speed_wind_3++; }

if (ob_per_sec >7 && ob_per_sec<11) { speed_wind=4; speed_wind_4++; }

if (ob_per_sec >11 && ob_per_sec<15) { speed_wind=5; speed_wind_5++; }

if (ob_per_sec >15 && ob_per_sec<18) { speed_wind=6; speed_wind_6++; }

if (ob_per_sec >18 && ob_per_sec<23) { speed_wind=7; speed_wind_7++; }

if (ob_per_sec >23 && ob_per_sec<27) { speed_wind=8; speed_wind_8++; }

if (ob_per_sec >27 && ob_per_sec<30) { speed_wind=9; speed_wind_9++; }

…………………………………………………………..

if (ob_per_sec >60 && ob_per_sec<67) { speed_wind=22; speed_wind_22++; }

if (speed_wind> speed_wind_max)( speed_wind_max = speed_wind ;)// перевіряємо і перезаписуємо, якщо максимальне значення більше ніж попереднє записане.

І виводимо на екран значення.

При необхідності можна потім переглянути скільки хвилин віяв вітер з певною швидкістю, для цього потрібно на екран вивести змінну (з необхідним індексом швидкості) speed_wind_№ (але розділити її на 60, щоб вийшли хвилини.).

Я у себе в програмі зробив так: при натисканні певної кнопки по черзі виводяться всі змінні, від speed_wind_1 до speed_wind_22.

Loading...Loading...