Сензор за метеорологична станция на Arduino. BMP085 Модул на сензор за барометрично налягане за arduino (или как да направите метеорологична станция със собствените си ръце)



„И така, нека се съгласим веднага: няма да правите филм за Холивуд. Дори в Страната на чудесата не повече от пет процента от всички сценарии се одобряват и само един процент влиза в производство... Така че вместо всичко това, вие ще създадете свой собствен Холивуд."
Ед Гаскел „Снимане на цифрово кино или Холивуд у дома“

Предговор

Какво, още една метеорологична станция на Arduino?! Да, още един и, нещо ми подсказва, не последният в Интернет на нещата.


Точно както всеки програмист е длъжен да напише програма “Hello World!”, така и всеки разработчик на Arduino трябва да има опит в изграждането на проста или не толкова проста метеорологична станция.
Значителен брой вече създадени проекти за метеорологични станции са описани в Интернет, читателят може да избере всеки от тях за изпълнение. Няма да лъжа, внимателно проучих около дузина подобни проекти и куп сродни. Следователно не може да се каже, че създадох всичко от нулата, разбира се, че „стоях на раменете на гиганти“.


Веднага ще кажа, че моите планове не включват използването на услуги на трети страни за съхраняване и показване на данни. Исках лично да се докосна и да разбера как работи всичко отвътре от началото до края, от А до Я.


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



Този проект беше реализиран още през 2016 г., но се надявам, че все още е актуален.

Технологичен комплект

Ще изучаваме и работим с прости и сложни неща:

  • датчици за температура и влажност тип DHT22, DHT11
  • сензор за барометрично налягане тип BMP180
  • WiFi модул ESP8266
  • радиомодул тип nRF24 2.4 GHz
  • семейство Arduino Pro Mini, Arduino Mega
  • слънчева батерия и батерии
  • език за програмиране C/C++
  • PHP език за програмиране
  • MySQL система за управление на бази данни
  • Език за програмиране Java и Android framework (създаване на приложение за Adnroid за показване на данни за времето на смартфон).

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


Но ще започнем от самото началовярно А именно от описанието и дизайна на бъдещото устройство "на хартия"така че накрая всяка тухла да си дойде на мястото.

Прототипиране

Както Уикипедия правилно ни казва, създаване на прототипие бързо грубо внедряване на работеща система. Което, да, няма да работи съвсем неефективно и с някои грешки, но ще даде представа дали занаята трябва да се развие в индустриален дизайн. Процесът на създаване на прототип не трябва да бъде продължителен. Етапът на прототипиране е последван от системен анализ и усъвършенстване.


Но това е в индустрия, в която работниците са наети на пълен работен ден.


Всички, които вечер занитват своите pet-project занаяти за „интернет на нещата“, трябва да са наясно, че създават точно прототип, полуфабрикат. Много е далеч от нивото на нормален индустриален продукт. Ето защо На нашите любителски занаяти не трябва да се поверяват никакви критични области за поддържане на животаи се надяваме, че няма да ни подведат.


Индустриален продукт е изграден върху индустриална елементна база и след това преминава през още много етапи, включително отстраняване на грешки, тестване и поддръжка, преди да стане бестселър.


И така, вместо цялата тази досадна работа, ние ще създадем наша собствена играчка, но не проста. С елементи на техническо творчество, наченки на програмиране и знания (в процес на създаване) на много други свързани неща.


Разбира се, електронните инженери ще имат трудности на етапа на програмиране, а програмистите ще трябва да работят усилено върху дизайна на веригата, но авторът ще се опита да представи всичко възможно най-достъпно и ясно да опише защо са използвани определени решения.

Изисквания

Обикновено тази стъпка се пропуска. Да решиш да направиш нещо подобно точно сега и тогава стават ясни малки детайли, които поставят целия проект в задънена улица или дори го правят непосилен. Всички наши желания трябва да бъдат записани, аз използвам Google Drive за това, той е достъпен от компютър и мобилно устройство.


И така, нашата метеорологична станция трябва:

  • измервайте температурата и влажността навън
  • измервайте температурата и влажността в къщата
  • измерване на атмосферното налягане
  • покажете зададените стойности на дисплея
  • прехвърляне на данни към сървър в Интернет, където данните ще се съхраняват в база данни и ще се показват на уеб страница или ще се използват в мобилно приложение.

Използваните сензори са най-прости и евтини. Например, гледайки напред, ще кажа, че DHT22 измерва температурата доста точно, но с влажността е малко неточно. Но пак повтарям, това няма значение, тъй като това е прототип и разпространението на 5% влажност няма да повлияе на нищо важно в живота ни.


Архитектурата на системата, хардуерът и софтуерът трябва да позволяват непрекъснато разширяване на системата за добавяне на нови сензори и нови възможности.

Желязо. Избор на компонент

Това е най-важната част, а не запояване или програмиране изобщо. След определяне на изискванията към системата е необходимо да се реши как точно ще бъдат изпълнени.


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


Порочен кръг? Но порочните кръгове съществуват с цел прекъсването им.


Има изход. Можете просто да вземете и повторите проекта на някой друг. Проучих съществуващи проекти за метеорологични станции и се надявам, че съм направил крачка напред.


Така. Архитектурата на метеорологичната станция е базирана на Arduino. Тъй като Arduino има малка бариера за влизане и аз вече се справих с това. Тогава е по-лесно да изберете.


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


Централният, основен блок ще бъде разположен на закрито. Важно е да се определи това в началния етап, това ще повлияе на такива важни характеристики като работна температура и захранване.


Дистанционният сензор (или сензори) ще бъде без „мозък“, неговата задача е периодично да прави измервания и да предава данни на централното домашно устройство. Централното устройство получава данни от всички сензори, показва ги на екрана и ги изпраща в интернет в база данни. Е, там е много по-лесно, веднага щом данните са в базата данни, можете да правите каквото искате с тях, дори да рисувате графики.


За комуникация с външния свят интернет беше ясно избран за модула ESP8266 WiFi, без почти никаква алтернатива (приблизително може би такива алтернативи вече са се появили). Предлагат се Ethernet разширителни платки за Arduino, но не исках да бъда свързан с кабел.



Интересен въпрос беше как да се осигури комуникация между външния сензор (или сензори, помните ли изискването за разширяемост на системата?) и центъра. 433 MHz маяци определено не са подходящи (не стават за абсолютно нищо).


Трябва ли да използвам ESP8266 отново?


Недостатъци на това решение:

    имате нужда от стабилен WiFi извън дома

    Обхватът на комуникация няма да е дълъг

    Надеждността ще пострада; ако интернет изчезне, няма да видим нашите дистанционни сензори

    по-висока консумация на енергия.

    Консумирана мощност на ESP8266:

    при предаване 120-170 mA

    при получаване на 50-56 mA

    в режим Deep Sleep 10 µA (µA)

    в изключено състояние 5 µA (µA).

В крайна сметка за свързване на дистанционни сензори с основното домашно устройство беше избран чипът nRF24L01+ с 2,4 GHz предавател и приемник в една бутилка, с допълнителна външна антена, така че със сигурност да „пробие“ стените.



Консумирана мощност nRF24L01+ 2,4 GHz:

  • при получаване на 11 mA
  • при предаване със скорост 2Mbps - 13 mA
  • в режим на готовност-I - 26 μA (μA)
  • в изключено състояние 900 nA (nA).

Както ESP8266, така и nRF24L01+ имат подходящ работен температурен диапазон: от -40 ℃ до +80 ℃.


Можете да закупите nRF24L01+ за около $1 или с външна антена за $3. Можете да закупите ESP8266-01 за около $4. Прочетете внимателно описанието на продукта! В противен случай купете една антена.


Появи се ядрото на системата. Нека да преминем към самите сензори.


На улицата, както знаете, температурата може да достигне отрицателни стойности, така че сензорът DHT11 не е подходящ, но DHT22 е точно.



Характеристики на DHT22/AM2302:

  • Захранване 3.3V до 5V, 5V препоръчително
  • консумация 2.5mA максимум, в момента на измерване и трансфер на данни
  • Диапазон на измерване на влажност 0-100% с грешка 2-5%
  • диапазон на измерване на температурата от -40 до +125°C с грешка ±0,5°C
  • заявка за измерване не повече от 0,5 Hz - веднъж на всеки 2 секунди.

Вътре в къщата, надявам се, няма да има отрицателни температури, така че можете да използвате DHT11, особено след като вече го имах.


Характеристики на DHT11:

  • захранване 3.3V до 5V
  • консумация 2,5 mA максимум, в момента на измерване и предаване на данни
  • Диапазон на измерване на влажност 20-80% с грешка 5%
  • диапазон на измерване на температурата от 0 до +50°C с грешка ±2°C
  • заявка за измерване не повече от 1 Hz - веднъж в секунда.

Можете да закупите DHT22 за около $3. DHT11 е по-евтин - $1, но е и по-малко точен.


Сега се връщаме отново към Arduino. Коя дъска да избера?


Тествах отделни части от системата на Arduino UNO. Тези. Свързах ESP модула към uno и го проучих, изключих го, след това свързах nRF24 и т.н. За окончателното внедряване на сензора за прозорец избрах Arduino Pro Mini като най-близката миниатюра до Uno.



По отношение на консумацията на енергия Arduino Pro Mini също изглежда добре:

  • няма USB-TTL конвертор, който сам по себе си „яде“ много,
  • Светодиодът е свързан чрез резистор 10k.

За усъвършенствано енергоспестяване беше планирано:

  • премахнете LED - индикатора за захранване на Arduino Pro Mini (съжалявах, не повредих платката)
  • или използвайте „голо“ сглобяване на микропроцесор Atmel ATmega328 (не е използван)
  • използвайте Low Power Library или JeeLib.

От библиотеките избрах Low Power Library, тя е проста и съдържа само това, което е необходимо.


За централното устройство, тъй като беше планирано да се свържат множество периферни устройства към него, беше избрана платката Arduino Mega. Освен това е напълно съвместим с UNO и има повече памет. Гледайки напред, ще кажа, че този избор беше напълно оправдан.


Можете да закупите Arduino Mega за около $8.

Мощност и консумация на енергия

Сега относно мощността и консумацията на енергия.


Arduino Pro Mini се предлага в два вида:

  • за захранващо напрежение 5V и честота 16MHz
  • за захранващо напрежение 3.3V и честота 8MHz.

Тъй като радиомодулът nRF24L01+ изисква 3,3 V за захранване и скоростта тук не е важна, тогава купете Arduino Pro Mini с 8 MHz и 3,3 V.


В този случай обхватът на захранващото напрежение на Arduino Pro Mini е:

  • 3.35-12V за 3.3V модел
  • 5-12V за 5V модел.

Вече имах Arduino Pro Mini на 5V, затова го използвах. Можете да закупите Arduino Pro Mini за около $4.


Централното устройство ще се захранва от 220 V мрежа чрез малко захранване, осигуряващо изход от 12 V, 450 mA, 5 W. Като това за $5. Има и отделен 5V щифт.



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


Следователно Arduino Pro Mini и радиомодулът nRF24 ще се захранват от куп 4 Ni-Mh батерии.


И запомни максимален капацитет на съвременна батерияприблизително 2500-2700mAh, всичко повече е или маркетингов трик (Ansmann 2850) или измама (UltraFire 3500).


Не използвам Li-Ion батерии поради няколко причини:

  • много скъп
  • когато температурата на околната среда падне под 0°C, мощността на литиево-йонната батерия намалява до 40-50%
  • тези, които са евтини, се произвеждат без защита и не са безопасни (при късо съединение или разряд могат да експлодират и да изгорят, вижте куп клипове в YouTube)
  • стареят, дори и да не се използват (все пак това може да се каже за всички химически елементи), след 2 години Li-Ion батерията губи около 20% от капацитета си.

За прототипа е напълно възможно да се мине с висококачествени Ni-MH AA или AAA батерии. Освен това не се нуждаем от големи токове. Единственият недостатък на Ni-MH батериите е дългото им време за зареждане.

Обща схема на метеорологичната станция

Нека да обобщим. Ето обща диаграма за това как работи всичко.



Следва продължение.

Препоръчително е да изтеглите фърмуера, преди да свържете компонентите, за да сте сигурни, че платката работи. След сглобяването можете да го флашнете отново, платката трябва да мига гладко. При проекти с мощни консуматори в 5V захранващата верига на платката (адресируема LED лента, серво, мотори и т.н.), е необходимо да се подаде външно 5V захранване към веригата, преди да свържете Arduino към компютъра, тъй като USB няма да осигури необходим ток, ако например лентата го изисква. Това може да доведе до изгаряне на защитния диод на платката Arduino. Ръководство за изтегляне и качване на фърмуера може да се намери под спойлера на следващия ред.

Съдържанието на папките в архива

  • библиотеки– проектни библиотеки. Заменете съществуващите версии
  • фърмуер– фърмуер за Arduino
  • схеми– схеми на свързване на компоненти

Допълнително

  • Както показа експериментът, температурният сензор извън кутията показва 0,5 градуса по-малко, отколкото вътре! Необходимо е по-добро подреждане на електрониката, отстраняване и екраниране на топлината от нагревателните елементи...

  • Ако дисплеят е твърде слаб/на бял фон
    На платката на драйвера на дисплея има копче за контраст (към което са свързани проводниците), с негова помощ можете да регулирате контраста до желания. Освен това контрастът зависи от ъгъла на гледане на дисплея (това е LCD) и можете да настроите дисплея да показва ясно дори под ъгъл „дисплей на нивото на пъпа, гледайки отгоре“. И контрастът силно зависи от захранването: от 5V дисплеят показва възможно най-ясно и ярко, докато при захранване от USB през Arduino напрежението ще бъде около 4.5V (част от него пада върху защитния диод по USB линията ), и дисплеят вече не е толкова ярък. Регулирайте изхода с помощта на въртящо се копче с външно захранване от 5V!

  • Ако сензорът за CO2 не работи правилно (информация от Евгений Иванов)
    Е, има скици за калибриране в папката на библиотеката на сензора в примери. може също да се стартира чрез сляпо късо свързване на конектора „HD“ към маса за 7+ секунди.
    Разбира се, не е нужно да правите това навън на студа... можете просто да напълните бутилка с чист въздух със сензор вътре и да я затворите. Калибрирането отнема поне 20 минути.
    По подразбиране сензорът се доставя с включено автоматично калибриране, което се случва всеки ден и ако сензорът се използва в непроветрено помещение, тогава това калибриране бързо премества стойностите извън нормата, така че трябва да бъде деактивирано.
    Документация.

  • Автоматично калибриране на сензора CO2 е деактивиран в скицата!

  • Ако имате Сензорът BME280 не работи, най-вероятно адресът му е друг. Проектът използва библиотеката Adafruit_BME280, която няма отделна функция за промяна на адреса, така че адресът се задава ръчно във файла на библиотеката Adafruit_BME280.h почти в самото начало на файла ( е в папката Adafruit_BME280 в папката на вашите библиотеки, трябва да сте го инсталирали там), моят модул имаше адрес 0x76. Как мога да разбера адреса на моя модул BME280? Има специална скица, наречена i2c скенер. Можете да го търсите в Google, можете. Мигате тази скица, отваряте порта и получавате списък с адреси на устройства, свързани към i2c шината. За да не ви пречат другите модули, можете да ги деактивирате и да оставите само BME280. Посочваме получения адрес в библиотеката, запазваме файла и зареждаме фърмуера на метеорологичния часовник. Всичко!

  • Ако часовникът е бавен, проблемът най-вероятно е в захранването на веригата. Ако проблемът не изчезне, когато смените захранването с по-добро, прикрепете кондензатор за захранване на RTC модула (запоен директно върху платката при VCC и GND): винаги керамичен, 0,1-1 µF (маркировка 103 или 104 , вижте таблицата за маркиране). Можете също така да предоставите електролит (6.3V, 47-100 uF)

Настройки на фърмуера

#define RESET_CLOCK 0 // нулиране на часовника, докато фърмуерът се зарежда (за модул с несменяема батерия). Не забравяйте да поставите 0 и да го флашнете отново! #define SENS_TIME 30000 // време за актуализиране на показанията на сензора на екрана, милисекунди #define LED_MODE 0 // RGB LED тип: 0 - основен катод, 1 - основен анод #define LED_BRIGHT 255 // CO2 LED яркост (0 - 255) # define BLUE_YELLOW 1 // жълт цвят вместо син (1 да, 0 не), но поради характеристиките на връзката жълтото не е толкова ярко #define DISP_MODE 1 // показване в горния десен ъгъл: 0 - година, 1 - ден от седмицата, 2 - секунди #define WEEK_LANG 1 // език на деня от седмицата: 0 - английски, 1 - руски (транслитериран) #define DEBUG 0 // показване на дневника за инициализация на сензора при стартиране #define PRESSURE 1 // 0 - графика на налягането, 1 - графика на прогнозата за дъжд (вместо налягане). Не забравяйте да коригирате границите на графиката // ограниченията за показване на графиките #define TEMP_MIN 15 #define TEMP_MAX 35 #define HUM_MIN 0 #define HUM_MAX 100 #define PRESS_MIN -100 #define PRESS_MAX 100 #define CO2_MIN 300 #define CO2_MAX 2000

Един ден, докато се разхождах из града, видях нов магазин за радиоелектроника, който отвори врати. След като влязох в него, намерих голям брой щитове за Arduino, защото... Имах Arduino Uno и Arduino Nano у дома и веднага дойде идеята да играя с предаватели на сигнал от разстояние. Реших да купя най-евтиния предавател и приемник на 433 MHz:

Предавател на сигнал.


Приемник на сигнал.

След като записах проста скица за предаване на данни (пример, взет от тук), се оказа, че предавателните устройства могат да бъдат доста подходящи за предаване на прости данни, като температура, влажност.

Предавателят има следните характеристики:
1. Модел: MX-FS - 03V
2. Обхват (в зависимост от наличието на блокиращи обекти): 20-200 метра
3. Работно напрежение: 3.5 -12V
4. Размери на модула: 19 * 19 мм
5. Модулация на сигнала: AM
6. Мощност на предавателя: 10mW
7. Честота: 433MHz
8. Необходима дължина на външна антена: 25см
9. Лесен за свързване (само три проводника): DATA ; VCC ; Земята.

Характеристики на приемния модул:
1. Работно напрежение: DC 5V
2. Ток: 4mA
3. Работна честота: 433.92 MHz
4. Чувствителност: - 105dB
5. Размери на модула: 30 * 14 * 7 мм
6. Необходима външна антена: 32 см.

В интернет се казва, че обхватът на предаване на информация при 2Kb/sec може да достигне до 150m. Не съм го проверявал сам, но в двустаен апартамент се приема навсякъде.

Хардуер за домашна метеорологична станция

След няколко експеримента реших да свържа сензор за температура, влажност и предавател към Arduino Nano.


Температурният сензор DS18D20 е свързан към Arduino, както следва:

1) GND към минуса на микроконтролера.
2) DQ през изтеглящ резистор към земята и към щифт D2 на Arduino
3) Vdd до +5V.

Предавателният модул MX-FS - 03V се захранва от 5 волта, изходът за данни (ADATA) е свързан към пин D13.

Свързах LCD дисплей и барометър BMP085 към Arduino Uno.


Схема на свързване към Arduino Uno

Приемникът на сигнала е свързан към щифт D10.

Модул BMP085 - цифров датчик за атмосферно налягане. Сензорът ви позволява да измервате температура, налягане и надморска височина. Интерфейс за свързване: I2C. Захранващо напрежение на сензора 1.8-3.6 V

Модулът е свързан към Arduino по същия начин като другите I2C устройства:

  • VCC - VCC (3,3 V);
  • GND - GND;
  • SCL - към аналогов пин 5;
  • SDA - към аналогов пин 4.
  • Много ниска цена
  • Захранване и I/O 3-5 V
  • Определяне на влажност 20-80% с 5% точност
  • Откриване на температура 0-50 градуса. с 2% точност
  • Честота на запитване не повече от 1 Hz (не повече от веднъж на 1 секунда)
  • Размери 15.5mm x 12mm x 5.5mm
  • 4 пина с 0,1" разстояние между щифтовете

DHT има 4 пина:

  1. Vcc (захранване 3-5V)
  2. Data out - Извеждане на данни
  3. Не се използва
  4. Общ

Свързва се към D8 на Arduino.

Софтуерна част от домашна метеорологична станция

Предавателният модул измерва и предава температурата на всеки 10 минути.

По-долу е програмата:

/* Версия на скица 1.0 Изпращайте температурата на всеки 10 минути. */ #include #include #include #define ONE_WIRE_BUS 2 //Пин за свързване на сензора Dallas OneWire oneWire(ONE_WIRE_BUS); Далас Температурни сензори (&oneWire); DeviceAddress insideThermometer; void setup(void) ( //Serial.begin(9600); vw_set_ptt_inverted(true); // Необходимо за DR3100 vw_setup(2000); // Задаване на скоростта на предаване (bit/s) сензори.begin(); if (! сензори .getAddress(insideThermometer, 0)); printAddress(insideThermometer); sensors.setResolution(insideThermometer, 9); ) void printTemperature(DeviceAddress deviceAddress) ( float tempC = sensors.getTempC(deviceAddress); //Serial.print("Temp C : "); //Serial.println(tempC); //Формиране на данни за изпращане int number = tempC; char symbol = "c"; //Сервисен символ за определяне, че това е сензор String strMsg = "z" ; strMsg += символ; strMsg += " "; strMsg += число; strMsg += " "; char msg; strMsg.toCharArray(msg, 255); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx (); // Изчакайте, докато прехвърлянето приключи delay(200); ) void loop(void) ( for (int j=0; j<= 6; j++) { sensors.requestTemperatures(); printTemperature(insideThermometer); delay(600000); } } //Определение адреса void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16); //Serial.print("0"); //Serial.print(deviceAddress[i], HEX); } }

Приемащото устройство получава данни, измерва налягането и температурата в помещението и ги предава на дисплея.

#include #include LiquidCrystal lcd(12, 10, 5, 4, 3, 2); #включете сензор dht11; #define DHT11PIN 8 #include #include BMP085 dps = BMP085(); дълга температура = 0, налягане = 0, надморска височина = 0; void setup() ( Serial.begin(9600); vw_set_ptt_inverted(true); // Необходимо за DR3100 vw_setup(2000); // Задаване на скоростта на приемане vw_rx_start(); // Стартиране на мониторинг на излъчване lcd.begin(16, 2) ; Wire.begin(); delay(1000); dps.init(); //lcd.setCursor(14,0); //lcd.write(byte(0)); //lcd.home(); ) void loop() ( uint8_t buf; // Буфер за съобщението uint8_t buflen = VW_MAX_MESSAGE_LEN; // Дължина на буфера if (vw_get_message(buf, &buflen)) // Ако съобщението е получено ( // Стартиране на анализиране на int i; // Ако съобщението не е адресирано до нас, излезте, ако (buf != "z") ( return; ) char command = buf; // Командата е с индекс 2 // Числовият параметър започва с индекс 4 i = 4; int number = 0; // Тъй като предаването е символ по знак, тогава трябва да преобразувате набора от знаци в число, докато (buf[i] != " ") ( число *= 10; число += buf[i] - "0"; i++; ) dps.getPressure(&Налягане); dps.getAltitude (&Надморска височина); dps.getTemperature(&Температура); //Serial.print(команда); Serial.print(" "); Serial.println( номер); lcd.print("T="); lcd.setCursor(2,0); lcd.print(номер); lcd.setCursor(5,0); lcd.print("P="); lcd.print(Налягане/133,3); lcd.print("mmH"); lcd.setCursor(0,1); lcd.print("T="); lcd.print(температура*0,1); lcd.print("H="); lcd.print(sensor.humidity); lcd.home(); // забавяне (2000); int chk = sensor.read(DHT11PIN); превключвател (chk) ( case DHTLIB_OK: //Serial.println("OK"); break; case DHTLIB_ERROR_CHECKSUM: //Serial.println("Checksum error"); break; case DHTLIB_ERROR_TIMEOUT: //Serial.println("Time out" грешка"); прекъсване; по подразбиране: //Serial.println("Неизвестна грешка"); прекъсване; ) ) )

P.S. В бъдеще смятам да добавя следното:
- сензор за влажност към предавателя, преработете алгоритъма за предаване на данни
- сензор за измерване на скоростта и посоката на вятъра.
- добавяне на друг дисплей към приемащото устройство.
- прехвърлете приемника и предавателя на отделен микроконтролер.

По-долу има снимка на случилото се:

Списък на радиоелементите

Обозначаване Тип Деноминация Количество ЗабележкаМагазинМоят бележник
Предавателна част.
Ардуино платка

Arduino Nano 3.0

1 Към бележника
температурен сензор

DS18B20

1 Към бележника
Резистор

220 ома

1 Към бележника
Предавателен модулMX-FS-03V (433 MHz)1 Към бележника
Радио приемна част.
Ардуино платка

Ардуино Уно

1 Към бележника
Тример резистор 1 Към бележника
Резистор

Исках да имам собствена метеорологична станция, която предава показания от сензори към обществена карта за наблюдение (търсене в Google за 5 секунди). Оказа се, че не е толкова трудно, колкото изглежда. Да видим какво е направено.

За това действие си взех Arduino Uno и Ethernet Shield w5100 за него. Всичко това е поръчано от Китай на Aliexpress.

Там поръчах и сензори: DHT22, DHT11, DS18B20, BMP280 (планирани са и сензори за газ и дим...)

След търсене във форуми, Google, Yandex, намерих добра версия на скицата - https://student-proger.ru/2014/11/meteostanciya-2-1/

Там в коментарите човек публикува завършена скица със сензори за светлина и газ. Взех ги за основа.

В тези скици нямаше поддръжка за 280-ия сензор за налягане, говорихме с автора, той замени 180 с 280. Всичко работи перфектно (много му благодаря за това)

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

В момента имам свързани сензори:
DHT22 - 1 бр.
DHT11 - 1 бр.
BMP280 - 1 бр.
DS18B20 - 2 бр.

ВНИМАНИЕ! Преди да качите скицата, не забравяйте да промените MAC адреса на устройството, за да не пречите на другите (например вземете Mac адреса на мобилния си телефон и променете последните букви/цифри в него, което няма да „безпокои“ ” вашата локална мрежа!

Приблизителна схема на свързване (снимка, направена от тази скица в Интернет):

По технически причини не мога да публикувам скицата директно тук. Сложих го в архива. Линкът към него е в горния ред.

Както можете да видите, има показания и те работят правилно; например ще публикувам няколко екранни снимки от моите сензори:

Гледането на времето е много вълнуващо занимание. Реших да изградя собствена метеорологична станция на базата на популярната .

Прототипът на метеорологичната станция изглежда така:

Функции на моята метеорологична станция:

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


шестнадесетичен
-файл
фърмуер за (версия от 9 май 2018 г.) - .
Как се флашва шестнадесетичен-файл към борда Ардуино, описах.

Микроконтролер Arduino Nano 3.0

„Сърцето“ на моята метеорологична станция е микроконтролер eBay):

За да контролирам показването и запитването на сензорите, използвам таймер 1 Ардуино, предизвикващи прекъсвания с честота 200 Hz (период - 5 ms).

Индикатор

За показване на измерените показания на сензора и текущото време, свързах се с Ардуиночетирицифрен LED индикатор Foryard FYQ-5643BHс общи аноди (анодите на еднакви сегменти от всички разряди се комбинират).
Индикаторът съдържа четири седемсегментни цифри и две разделителни (часови) точки:

Индикаторните аноди са свързани чрез токоограничаващи резистори към клемите Ардуино:

освобождаване от отговорност 1 2 3 4
заключение A3 A2 D3 D9

Катодите на сегментите са свързани към щифтовете Ардуино:

сегмент а b ° С д д f ж стр
заключение D7 D12 D4 D5 D6 D11 D8 D13

Индикаторният сегмент светва, ако има висок потенциал на анода на съответния разряд (1) и нисък потенциал на катода (0).

Използвам динамичен дисплей за показване на информация на индикатора - само една цифра е активна в даден момент. Активните разряди се редуват с честота 200 Hz (период на показване 5 ms). В същото време трептенето на сегментите е невидимо за окото.

Датчик за температура DS18x20

За да мога да измервам температурата дистанционно, свързах сензор , който осигурява измерване на външната температура в широк диапазон. Сензорът е свързан към шината 1-проводники има три изхода - мощност ( VCC), данни ( DAT), Земята ( GND):

сензорен изход VCC DAT GND
заключение Ардуино 5V A1 GND

Между щифтове VCCИ DATВключих 4,7 kOhm издърпващ резистор.

За да конвертирате между градуси по Целзий и Фаренхайт, можете да използвате следната таблица:

Поставих сензора извън прозореца на къщата в пластмасова кутия за химикал:

\

Професионалните метеорологични станции използват екран на Stevenson, за да предпазят термометъра от пряка слънчева светлина и да осигурят циркулация на въздуха. Екран на Стивънсън):

Сензор за налягане и температура BMP280

Живачните барометри и анероидните барометри традиционно се използват за измерване на атмосферното налягане.

IN живачен барометъратмосферното налягане се балансира от теглото на живачен стълб, чиято височина се използва за измерване на налягането:

IN анероиден барометъризползва се компресия и разширяване на кутията при атмосферно налягане:

За измерване на атмосферното налягане и стайната температура в моята домашна метеорологична станция използвам сензор - малък SMD-размер на сензора 2 x 2,5 mm, базиран на пиезорезистивна технология:

Шалът със сензора е закупен на платформата за търговия eBay:

Сензорът е свързан към шината I2C(данни за контакт - SDA/SDI, контакт за синхронизация - SCL/SCK):

сензорен изход VCC GND SDI SCK
заключение Ардуино 3V3 GND A4 A5

Adafruit- файлове Adafruit_Sensor.h, Adafruit_BMP280.h, Adafruit_BMP280.cpp.

Единици за атмосферно налягане

Сензор чрез функция readPressureпоказва атмосферното налягане в паскали. Основната единица за измерване на атмосферното налягане е хектопаскал(hPa) (1 hPa = 100 Pa), чийто аналог е несистемната единица " милибар" (mbar) (1 mbar = 100Pa = 1hPa). За преобразуване между често използвани единици за налягане извън системата " милиметър живачен стълб" (mmHg) и хектопаскали се използват следните съотношения:
1 hPa = 0,75006 mm Hg. Изкуство. ≈ 3/4 mmHg; 1 mmHg =1,3332 hPa ≈ 4/3 hPa.

Зависимостта на атмосферното налягане от надморската височина

Атмосферното налягане може да бъде представено както в абсолютна, така и в относителна форма.
Абсолютно налягане QFE(Английски) абсолютно налягане) е текущото атмосферно налягане, което не отчита корекцията над морското равнище.
Атмосферното налягане намалява с приблизително 1 hPa с увеличаване на надморската височина с 1 m:

Барометричната формула ви позволява да определите корекцията на показанията на барометъра, за да получите относително налягане (в mmHg):
$\Delta P = 760 \cdot (1 - (1 \over (10^ ( (0.0081350 \cdot H) \over (T + 0.00178308 \cdot H) ))))$ ,
където $T$ е средната температура на въздуха по скалата на Ранкин, ° Ра, $H$ - надморска височина, футове.
Преобразуване на градуси Целзий в градуси Ранкин:
$^(\circ)Ra = (^(\circ)C \cdot 1.8) + $491,67
Барометричната формула се използва за барометрична нивелация - определяне на височини (с грешка 0,1 - 0,5%). Формулата не отчита влажността на въздуха и изменението на гравитационното ускорение с височината. При малки разлики във височината тази експоненциална зависимост може да се апроксимира с достатъчна точност чрез линейна зависимост.
Относително налягане QNH(Английски) относително налягане, Морска височина с Q-код) е атмосферното налягане, коригирано спрямо средното морско ниво. Средно морско ниво, MSL) (За Еи температура 15 градуса по Целзий) и първоначално се задава, като се вземе предвид надморската височина, на която се намира метеостанцията. Може да се установи от данни от метеорологичните служби, показания от калибрирани инструменти на обществени места, летища (от доклади METAR), от интернет.
Например за близкото летище Гомел ( UMGG) Мога да видя действителния доклад за времето METARна ru.allmetsat.com/metar-taf/russia.php?icao=UMGG:
UMGG 191800Z 16003MPS CAVOK M06/M15 Q1014 R28/CLRD//NOSIG ,
Където Q1014- налягане QNHна летището е 1014 hPa.
История на отчетите METARналичен на aviationwxchartsarchive.com/product/metar.
За нормално относително атмосферно налягане QNHсе приема налягане от 760 mmHg. Изкуство. или 1013,25 hPa (при температура 0ºС, на ширина 45º на северното или южното полукълбо).
Настроих налягането за анероидния барометър QNHс помощта на винта за настройка на чувствителността:

Прогноза за времето

Анализът на промените в налягането ви позволява да изградите прогноза за времето и нейната точност е по-висока, колкото по-рязко се променя налягането. Например, старо правило за моряците е, че спад на налягането от 10 hPa (7,5 mm Hg) за период от 8 часа показва приближаването на силни ветрове.

Откъде идва вятърът? Въздухът тече към центъра на зоната с ниско налягане, създавайки вятър- хоризонтално движение на въздуха от области с високо налягане към области с ниско налягане (високото атмосферно налягане изтласква въздушни маси в области с ниско атмосферно налягане). Ако налягането е много ниско, вятърът може да достигне силен бури. В същото време в района намаленаналягане (депресия на налягането или циклон), топлият въздух се издига и образува облаци, които често носят дъждили сняг.

В метеорологията посоката на вятъра се приема за посоката, от която вятърът духа:

Тази посока се свежда до осем точки.

Често се използва алгоритъм за прогнозиране на времето въз основа на барометрично налягане и посока на вятъра. Замбрети.

Сензор за влажност

За определяне на относителната влажност на въздуха използвам модула DHT11(закупен от пазара eBay):

Сензор за влажност DHT11има три изхода - захранване ( + ), данни ( навън), Земята ( - ):

сензорен изход + навън -
заключение Ардуино 5V D10 GND

За работа със сензора използвам библиотеката от Adafruit- файлове DHT.h, DHT.cpp.

Влажността на въздуха характеризира количеството водни пари, съдържащи се във въздуха. Относителна влажностпоказва процентното съдържание на влага във въздуха спрямо максимално възможното количество при текущата температура. Използва се за измерване на относителна влажност :

За хората оптималният диапазон на влажност на въздуха е 40 ... 60%.

Часовник за реално време

Използвах модула като часовник за реално време RTC DS1302(шалът с часовника е закупен от платформата за търговия eBay):

Модул DS1302свързва се с автобуса 3-жилен. За да използвате този модул заедно с Ардуиноразработена библиотека iarduino_RTC (от iarduino.ru).

Табло с модул DS1302има пет пина, които свързах към щифтовете на платката Ардуино Нано:

заключение RTC VCC GND RST CLK DAT
заключение Ардуино 5V GND D2 D1 D0

За да поддържам правилни показания на часовника, когато захранването е изключено, поставих батерия в слота на платката CR2032.

Точността на часовниковия ми модул се оказа не много висока - часовникът избързва с около една минута за четири дни. Затова нулирам минутите до „нула“ и часа до най-близката, като задържам бутона, свързан към щифта A0 на Arduino, след включване на захранването на метеорологичната станция. След инициализацията щифтът A0 се използва за предаване на данни чрез серийна връзка.

Прехвърляне на данни към компютър и работа по протокола MQTT

За прехвърляне на данни чрез серийна връзка към Ардуиносвързва USB-UARTконвертор:

Заключение Ардуиноизползвани за предаване на данни във формат 8N1(8 бита данни, без паритет, 1 стоп бит) при 9600 bps. Данните се предават на пакети, като дължината на пакета е 4 знака. Прехвърлянето на данни се извършва в " малко взрив" режим, без да използвате хардуерен сериен порт Ардуино.

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

Параметър 1-ви байт 2-ри байт 3-ти байт 4-ти байт
външна температура о интервал или минус десетки градуси или пространство единици градуси
стайна температура аз интервал или минус десетки градуси или пространство единици градуси
Атмосферно налягане стр стотни mm r. Изкуство. десетки mmHg единици mmHg с.
относителна влажност ч пространство десетки процента или интервал единици проценти
текущо време десетки часове единици часове десетки минути единици минути

MQTT

Голангпротоколно клиентско приложение MQTT, изпращане на информация, получена от метеорологичната станция към сървъра ( MQTT-брокер) :

Обслужване ви позволява да създадете акаунт с безплатен тарифен план" " (лимит: 10 връзки, 10 Kb/s):

За да наблюдавате показанията на метеорологичните станции, можете да използвате Android-приложение :

Хранене

За захранване на метеостанцията използвам зарядно от стар мобилен телефон Motorola, произвеждащи напрежение от 5 V с ток до 0,55 A и свързани към контактите 5V(+) и GND (-):

За захранване можете да използвате и 9 V батерия, свързана към контактите. VIN номер(+) и GND (-).

Работа на метеорологичната станция

При стартиране сензорите се инициализират и тестват.

При липса на сензор DS18x20грешка "E1" се показва, когато няма сензор - грешка "E3".

След това започва работният цикъл на метеостанцията:

  • измерване и показване на външна температура;
  • измерване и показване на стайна температура;
  • измерване и показване на атмосферното налягане и неговата тенденция;
  • измерване и показване на относителна влажност на въздуха;
  • показване на текущо време;
  • показване на лунната фаза и лунния ден.


Видеозапис на моята метеорологична станция в действие е достъпен на моя -канал: https://youtu.be/vVLbirO-FVU

Температурен дисплей

При измерване на температурата се показват две температурни цифри, а за отрицателна температура знак минус (със символ за градус в най-дясната цифра);
за външна температура знакът за градус се показва в горната част:


за стайна температура - по-долу:

Дисплей за налягане

При измерване на налягането се показват три цифри на налягането в mmHg (със символа " П" най-вдясно):

Ако налягането спадне рязко, тогава вместо символа " П"символът" се показва в най-дясната цифра Л"ако е нараснал рязко, тогава" з". Критерият за остротата на промяната е 8 mm Hg за 8 часа:

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

Коефициент на налягане (според АТИС) възлиза на $(1015 \над 998) = $1,017. Надморска височина на летище Гомел (код на ICAO UMGG) над морското равнище е 143,6 м. Температурата според ATIS е 1 ° ° С.

Показанията от моята метеостанция почти съвпаднаха с абсолютното налягане QFEспоред информацията АТИС!

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

Показване на относителната влажност

Относителната влажност на въздуха се показва като процент (символът за процент се показва в двете десни цифри):

Показване на текущото време

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

Показване на лунните фази и лунния ден

Първите две цифри на индикатора показват текущата лунна фаза, а следващите две - текущия лунен ден:

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

Фазите се показват на индикатора с пиктограми:

фаза пиктограма
нарастващ сърп (полумесец)
намаляващ сърп (полумесец)

Прехвърляне на данни към компютър

Ако свържете метеорологична станция с USB-UARTпреобразувател (например, базиран на микросхема CP2102), свързан с USB- компютърен порт, можете да използвате терминална програма, за да наблюдавате данните, предавани от метеорологичната станция:

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

Според дневника за наблюдение на времето можете например да изградите графика на промените в атмосферното налягане:
пример за графика със забележимо минимално налягане


пример за графика с леко повишаване на налягането

Планирани подобрения:

  • добавяне на сензори за посока и скорост на вятъра

В метеорологичните станции анемометър с три чаши (1) се използва за измерване на скоростта на вятъра, а ветропоказател (2) се използва за определяне на посоката на вятъра:

Използва се и за измерване на скоростта на вятъра анемометри с гореща жица(Английски) анемометър с гореща тел). Като нагрята жица можете да използвате волфрамова жичка от електрическа крушка със счупено стъкло. В промишлено произведените анемометри с горещ проводник сензорът обикновено се намира върху телескопична тръба:

Принципът на работа на това устройство е, че топлината се отстранява от нагревателния елемент поради конвекция от въздушен поток - вятър. В този случай съпротивлението на нишката се определя от температурата на нишката. Законът за промяна на съпротивлението на нишката $R_T$ в зависимост от температурата $T$ има формата:
$R_T = R_0 \cdot (1 + (\alpha \cdot (T - T_0)))$,
където $R_0$ е съпротивлението на нишката при температура $T_0$, $\alpha$ е температурният коефициент на съпротивление (за волфрам $\alpha = 4,5\cdot(10^(-3) (^(\circ)( C^( -1))))$).

При промяна на скоростта на въздушния поток температурата се променя при постоянен ток на нажежаема жичка (анемометър с постоянен ток, английски. CCA). Ако температурата на нагревателния елемент се поддържа постоянна, токът през елемента ще бъде пропорционален на скоростта на въздушния поток (анемометър с постоянна температура, английски). CTA).

Следва продължение