Метеорологична станция на arduino с примерна графика на налягането. Безжична метеорологична станция



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

Предговор

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


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


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


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



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

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

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

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

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


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

създаване на прототипи

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


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


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


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


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


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

Изисквания

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


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

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

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


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

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

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


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


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


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


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


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


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


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


За комуникация с външния свят интернет беше недвусмислено избран от WiFi модула ESP8266 без почти никаква алтернатива (забележете, може би сега са се появили такива алтернативи). Предлагат се 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,3 V до 5 V, препоръчва се 5 V
  • консумация 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.3V за захранване и скоростта не е важна тук, купете Arduino Pro Mini на 8MHz и 3.3V.


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

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

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


Захранването на централата ще бъде от мрежата 220 V чрез малък захранващ блок, даващ мощност 12V, 450mA, 5W. Нещо подобно за $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 батериите е дългото им време за зареждане.

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

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



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

AT свободно време, и този път написа инструкции за направата на малка метеорологична станция. Той ще функционира като часовник с дата и ще показва температурите вътре и извън помещението. Ще използваме Arduino UNO като основен контролер, но друга платка с Atmega328p на борда ще свърши работа. За показване използваме графичния екран WG12864B. Ще свържем и два температурни сензора ds18b20. Единият е на закрито, другият е изнесен навън. Да започваме.

В процеса на производство на домашни продукти се нуждаем от:

Arduino UNO (Или всяка друга платка, съвместима с Arduino)
- WG12864B графичен екран
- температурен датчик ds18b20 2 бр
- Захранване 6 - 12 V
- Резистори 4.7 Kom 0.25 W 2 бр.
- Резистори 100 ома 0,25 W
- Батерийно отделение за 4 батерии ААА "малък пръст".
- Кутия от касетата на конзолата SEGA
- Изолирбанд
- Свързващи проводници
- Платка
- Бутони
- Канцеларски нож
- поялник
- Припой, колофон
- Двустранна касета

Стъпка 1 Подгответе WG12864B3.
Тези, които не са работили с екрани преди, може да се уплашат от големия брой модификации на привидно идентични екрани. Ще обясня малко. Повечето екрани от този тип работят на чипове ks0107/ks0108. Всички екрани могат да бъдат разделени на 4 вида:

Вариант A: HDM64GS12L-4, Crystalfontz CFAG12864B, Sparkfun LCD-00710CM, NKC Electronics LCD-0022, WinStar WG12864B-TML-T

Option B: HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ Displays AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-88, Topway LM12864LDW, Digitron SG12864J4, QY-12864F, TM12864J4, QY-12864F, TM12864F

Вариант C: Shenzhen Jinghua Displays Co Ltd. JM12864

Опция D: Wintek- Cascades WD-G1906G, Wintek - GEN/WD-G1906G/KS0108B, Wintek/WD-G1906G/S6B0108A, TECDIS/Y19061/HD61202, Varitronix/MGLS19264/HD61202

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

Кратки характеристики:

В интернет има много различни схеми за свързване и всичко изглежда работи. Работата е там, че има не само различни екрани, но и два начина за свързването им: сериен и паралелен. Когато използваме връзка със сериен порт, имаме нужда само от 3 изхода на микроконтролера. С паралелен минимум 13. Изборът в случая е очевиден, Arduino така или иначе няма много изводи. За паралелно свързване схемата на свързване е както следва:

За серийна връзка, която ще използваме, схемата е следната:

WG12864B - Arduino UNO 1 (GND) - GND 2 (VCC) - +5V 4 (RS) - 10 5 (R/W) - 11 6 (E) - 13 15 (PSB) - GND 19 (BLA) - чрез резистор 100 Ohm - +5V 20 (BLK) - GND

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

Необходим е резистор от 100 ома, така че напрежението от 5 волта да не изгори случайно диодите за подсветка.

Стъпка 2 Изработване на кутията.
За случая вземете кутията от касетата на приставката Sega. Ако не намерите тази кутия под ръка, можете да използвате друг калъф. Основното е, че екранът и Arduino пасват в него.

Отрежете прозрачното фолио отгоре на кутията, така че да не останат парчета:

След това с помощта на чиновнически нож изрежете прозорец 37x69 за екрана.

ОТ обратна странаЗалепете двустранна лента по ръба на изреза, за предпочитане черна:

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

Отвън трябва да изглежда така:

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

От двете страни на кутията трябва да се направят изрези за гнездата на Arduino, така че да може да се затваря свободно:

Стъпка 3 Температурни сензори.
Ще използваме цифрови температурни сензори DS18B20. Използвайки ги, получаваме по-голяма точност на измерване, грешка не повече от 0,5 ° C, в широк температурен диапазон от -55 ... + 125 ° C. Освен това сензорът е цифров и сам извършва всички изчисления, а Arduino просто получава готови показания. Когато свързвате този сензор, не забравяйте за 4,7KΩ издърпващ резистор между щифтовете DQ и VDD. Възможни са и няколко опции за свързване. С външно захранване според мен най-добрият вариант, и ще го използваме:

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

Ще поставим сензора за вътрешна температура на малка дъска заедно с два бутона, които ще използваме, за да настроим часа и датата на часовника:

Свързваме общия проводник от двата бутона към GND, свързваме проводника от първия бутон към A0, от втория към A1.
Фиксираме го на двустранна лента до Arduino:

Сензорът, който трябва да бъде поставен извън помещението, е по-добре да изберете в метален, прахоустойчив корпус:

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

Свързваме проводника от DQ шината за данни на двата сензора към пин 5 на Arduino.
Vdd - +5 Arduino.
GND - GND Arduino.

Стъпка 4 Хранене.
За захранване можете да използвате захранване с напрежение от 6 до 12 волта. В края на захранващия кабел за запояване щепсел, който пасва на захранващия контакт на Arduino:

Или можете да поставите отделение за батерии за четири батерии "AAA", "малък пръст" в кутията. И свържете положителния проводник от гнездото към Vin Arduino, а отрицателния проводник към GND.

Стъпка 5 Подгответе средата за програмиране.
Първо трябва да изтеглите и инсталирате Arduino IDE от официалния уебсайт

И също така добавете към двете библиотеки, необходими за скицата. OneWire - необходим за комуникация със сензори ds18b20:

U8glib - използва се за показване на информация на екрана:

Изтегляне на библиотеки. След това разопаковаме архивите и преместваме съдържанието на архивите в папката "библиотеки", намираща се в папката с инсталираната Arduino IDE. Можете също да добавяте библиотеки чрез Arduino IDE. За да направите това, без да разопаковате архивите, стартирайте Arduino IDE, изберете Sketch - Connect Library от менюто. В горната част на падащия списък изберете елемента "Добавяне на Zip библиотека". Посочете местоположението на изтеглените архиви. След всички стъпки трябва да рестартирате Arduino IDE.

Стъпка 6 Редактиране на скицата.
Температурните сензори работят по протокола One Wire и имат уникален адрес за всяко устройство - 64-битов код. Не е препоръчително да добавяте команди за търсене на сензори в скицата. Няма нужда да зареждате Arduino всеки път, за да хълцат сензори. Следователно, първо, след като събрахме всичко заедно, попълваме скицата на Arduino, намираща се в менюто Файл - Примери - Далас Температура - OneWireSearch. След това стартираме Tools - Port Monitor. Arduino трябва да намери нашите сензори, да запише адреси и температурни показания. Тези адреси трябва да бъдат записани или просто копирани някъде. Сега отворете скицата Ard_Tic_Tak_WG12864B_2_x_Term_Serial и потърсете редовете:

Байт addr1=(0x28, 0xFF, 0x75, 0x4E, 0x87, 0x16, 0x5, 0x63);// адрес на вътрешен байт addr2=(0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x16, 0x5, 0x97); сензор

Заменяме адресите на сензорите, отговарящи на местоположението, с нашите адреси.
Нашият часовник не използва RTC модул (часовник за реално време), така че е необходимо да коригирате часовника. За удобство разкоментирайте реда (секунди ще се появят на екрана):

//u8g.setPrintPos(44, 50); u8g.print(sec); // Изходни секунди за контрол на правилността на хода

Инсталирай точното време, през монитора на порта. За да направите това, отворете монитора на порта, изчакайте първоначалните измервания на температурата да приключат и въведете текущата дата и час във формат "ден, месец, година, часове, минути, секунди". Без интервали, числата са разделени със запетаи или точки.

Ако часовникът бърза, променете стойността на по-голяма, препоръчвам да експериментирате със стъпка от 100 единици. Ако изостава, трябва да намали стойността в реда:

If (micros() - prevmicros >494000) ( // промяна на нещо друго, за да коригирате, че е 500000

Емпирично определяме числото, при което часовникът работи достатъчно точно. За да определите точността на хода, се нуждаете от изхода от секунди. След прецизно калибриране на числото, секундите могат да бъдат коментирани и по този начин да бъдат премахнати от екрана.
Качване на скицата.

Направи си сам метеорологична станция.

Беше вечер, нямаше какво да се прави след нова година. Както обикновено, през зимните новогодишни празници искам да заема главата и ръцете си с нещо полезно и креативно. По време на тези новогодишни празници реших да направя метеорологична станция със собствените си ръце. Започнах да се подготвям предварително, купих и сглобих всички компоненти преди Нова година и направих основното програмиране през празниците.

(Много снимки под изрезката!)

Първо, ще прегледам компонентите, няма да давам връзки, тъй като в eBay (в лична сметка) стоките са архивирани. Купих много компоненти спокойно от eBay. Опитах търга за първи път, винаги купувах „купете го сега“. Какво мога да кажа, ако не бързате да купувате, тогава някои компоненти могат да бъдат закупени по-евтино (понякога разликата е два пъти).

Сензор за налягане BMP085
Това е основният сензор. Когато го видях в eBay, разбрах, че искам да построя домашна метеорологична станция.
Сензорът пристигна в обикновен плик, облепен с малко мехурче отвътре.

Вътре в плика имаше визитната картичка на продавача и сензорът, опаковани в антистатична торбичка и увити в друг слой балонче

Антистатичната торбичка беше запечатана, така че влагата по време на полета да не застрашава сензора

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




Всичко би било наред, но маркировката на контактите се прилага в огледален образ.
Сензорът е свързан чрез I2C шина и се захранва от 3,3 V. Тоест за нормална работа са необходими 4 проводника (+, -, SDA, SCL)
Можете да разпитате сензора по 2 начина: или чрез библиотеката, или като използвате функциите директно в скицата.
Пример за програма:

#включи

#define BMP085_ADDRESS 0x77 // I2C адрес на BMP085

Const unsigned char OSS = 0; // Настройка за свръхсемплиране

// Стойности на калибриране
int ac1;
intac2;
intac3;
неподписан int ac4;
неподписан int ac5;
неподписан int ac6;
int b1;
intb2;
intmb;
int mc;
intmd;

ниска температура;
дълъг натиск;

Празна настройка()
{
Serial.begin(9600);
Wire.begin();
bmp085Калибриране();
}

Void loop()
{
температура = bmp085GetTemperature(bmp085ReadUT());
налягане = bmp085GetPressure(bmp085ReadUP());
Serial.print("Температура: ");
Serial.print(temperature/10.0, DEC);
Serial.println("C");
Serial.print("Налягане: ");
Serial.print(pressure/133.322, DEC);
Serial.println("mm Hg");
Serial.println();
забавяне (1000);
}

Void bmp085Calibration()
{
ac1 = bmp085ReadInt(0xAA);
ac2 = bmp085ReadInt(0xAC);
ac3 = bmp085ReadInt(0xAE);
ac4 = bmp085ReadInt(0xB0);
ac5 = bmp085ReadInt(0xB2);
ac6 = bmp085ReadInt(0xB4);
b1 = bmp085ReadInt(0xB6);
b2 = bmp085ReadInt(0xB8);
mb = bmp085ReadInt(0xBA);
mc = bmp085ReadInt(0xBC);
md = bmp085ReadInt(0xBE);
}

Кратко bmp085GetTemperature(unsigned int ut)
{
дълъг x1, x2;
x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
x2 = ((дълъг)mc<< 11)/(x1 + md);
b5 = x1 + x2;

Връщане ((b5 + 8)>>4);
}

Дълъг bmp085GetPressure (неподписан дълго)
{
дълго x1, x2, x3, b3, b6, p;
без знак дълго b4, b7;
b6 = b5 - 4000;
// Изчислете B3
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((long)ac1)*4 + x3)<>2;
// Изчислете B4
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (беззнаков дълъг)(x3 + 32768))>>15;
b7 = ((неподписан дълъг)(нагоре - b3) * (50000>>OSS));
ако (b7< 0x80000000)
p = (b7<<1)/b4;
друго
p = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
p += (x1 + x2 + 3791)>>4;
връщане p;
}

// Прочетете 1 байт от BMP085 на "адрес"
char bmp085Read (неподписан char адрес)
{
неподписани char данни;

wire.write(адрес);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
докато (! Wire.available ())
;
връщане Wire.read();
}

Int bmp085ReadInt (неподписан char адрес)
{
неподписан символ msb, lsb;
Wire.beginTransmission(BMP085_ADDRESS);
wire.write(адрес);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
докато (Wire.available()<2)
;
msb = Wire.read();
lsb = Wire.read();
връщане (int) msb<<8 | lsb;
}

// Прочетете некомпенсираната стойност на температурата
unsigned int bmp085ReadUT()
{
unsigned int ut;
// Запишете 0x2E в регистър 0xF4
// Това изисква отчитане на температурата
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();
// Изчакайте поне 4,5 ms
забавяне (5);
// Прочетете два байта от регистри 0xF6 и 0xF7
ut = bmp085ReadInt(0xF6);
връщане ут;
}

// Прочетете стойността на некомпенсираното налягане
неподписан дълъг bmp085ReadUP()
{
неподписан символ msb, lsb, xlsb;
unsigned long up = 0;
// Напишете 0x34+(OSS<<6) into register 0xF4
// Поискайте отчитане на налягането с настройка за свръхсемплиране
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();
// Изчакайте преобразуването, времето на забавяне зависи от OSS
забавяне (2 + (3<// Четене на регистър 0xF6 (MSB), 0xF7 (LSB) и 0xF8 (XLSB)
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF6);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 3);
// Изчакайте данните да станат налични
докато (Wire.available()< 3)
;
msb = Wire.read();
lsb = Wire.read();
xlsb = Wire.read();
up = (((unsigned long) msb<< 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
връщане нагоре;
}


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

Arduino Nano v3.0
Това е сърцето на цялата метеорологична станция. С прости думи, контролерът е в миниатюрен размер.
Купени
Няма да говоря подробно за контролера, тъй като това вече е направено преди мен:


Опаковката с lightake беше сглобяема, контролерът дойде в опаковка с USB кабел и Arduino в запечатана антистатична торбичка.

За да оцените размера, до Arduino поставете монета с номинална стойност 1 рубла.

Контролна платка отблизо



USB кабелът е добър, с феритен пръстен. Захранва се от Arduino чрез USB кабел. Средата за разработка може да бъде изтеглена (страница за изтегляне). Езикът е подобен на „C“, нямаше проблеми с овладяването му, тъй като програмирах много на него на работа.

LCD екран
На работа в кошчетата намерих съвместим LCD 1602 екран. Трябваше да се занимавам с връзката, тъй като не намерих лист с данни за нея. В резултат на това LCD спечели.

Но след кратка операция забелязах, че този екран не ми е достатъчен и няма да мога да покажа повече данни, тъй като има само 2 реда по 16 знака всеки. Първоначално изглежда, че тези параметри са достатъчни, но когато започнете да програмирате, разбирате, че можете да натъпчете максимум 3-4 параметъра. И ако направиш меню (мислех да направя меню на този екран), тогава остават 1-2 свободни места за параметри.
В резултат на това започнах да търся друг екран. Първоначално погледнах графичния екран от Nokia 3310 и дори участвах в търга на eBay, за да го купя, но не се получи (за което много се радвам), така че трябваше да се откажа от този екран. Сега разбирам, че би било твърде малко за моите цели, тъй като има с какво да се сравнява.
Докато преглеждах екраните на Arduino случайно, попаднах на графичния екран 12864 на контролера ST7920. Този екран има правилния размер и добра резолюция за моите нужди (128x64). Тоест можете спокойно да поставите 6-7 реда по 20 знака в нормално четим шрифт. Тъй като екранът е графичен, освен текст с различни шрифтове може да се поставят и графики. Накратко, точно това ми трябваше, всичко присъстваше в този екран, така че не издържах и поръчах.
Пратката пристигна бързо и беше опакована по стандартен начин: мехурче, вътре имаше още един слой мехурче и параван в антистатична торбичка:






За да оцените размера, до LCD дисплея поставете монета с номинална стойност 1 рубла.




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

- Pin 1 (GND) се свързва към общата шина
- Пин 2 (VCC) е свързан към захранващата шина +5V, а консумацията на ток е сравнително малка и дисплеят може да се захранва от вградения регулатор Arduino.
- Изводи 4, 5 и 6 са свързани към цифровите изходи на Arduino, образувайки SPI сериен интерфейс:
пин 4 - (RS) - съответства на линията CS (например 7)
щифт 5 - (RW) - съответства на линията MOSI (например 8)
щифт 6 - (E) - съответства на линията SCK (например 3)
Номерата на щифтовете на Arduino могат да бъдат всякакви, основното е да не забравяте да ги посочите правилно по-късно в текста на програмата, когато инициализирате дисплея.
- Пин 15 (PSB) е свързан към общата шина.
- Пинове 19 (A) и 20 (K) са захранване за подсветка (съответно +5V и GND). За да регулирате яркостта на подсветката, можете да използвате променлив резистор от 10 kΩ, свързан между захранващите шини и GND. Напрежението от неговия двигател се прилага към пин 19 на дисплея.
Според тази инструкция свързах всичко с изключение на подсветката. Използвах Arduino PWM като мощност на подсветката.
За програмно свързване на LCD към Arduino се използва библиотеката u8glib. Можете да изтеглите. Ако има проблеми с изтеглянето, тогава мога да кача библиотеката на narod.ru.
Самата библиотека не е сложна и ви позволява да показвате текст с различни шрифтове, да рисувате линия, да рисувате най-простите геометрични фигури (правоъгълник, кръг), да показвате вашите изображения, подготвени по специален начин. По принцип този инструмент е достатъчен за повечето задачи.
Ето резултата от проста програма:

Самата програма:

#include "U8glib.h"

U8GLIB_ST7920_128X64 u8g(3, 9, 8, U8G_PIN_NONE); // SPI E=3, RW=9, RS=8

// Подпрограма за определяне на свободната памет
int freeRam()(
extern int __heap_start, *__brkval;
intv;
return (int) &v - (__brkval == 0? (int) &__heap_start: (int) __brkval);
}

Настройка на празнота (void) (
u8g.setFont(u8g_font_6x10); // шрифт
u8g.setRot180(); // Обърнете екрана
analogWrite(6, 115); // Задаване на яркост на екрана (анод за задно осветяване на 6 пина)
}

Void цикъл (void) (
u8g.firstPage();
направи(

u8g.setPrintPos(1, 12); // позиция
u8g.print("Здравей!!!"); // текстов изход
u8g.drawBox(0,22,128,9); // Запълване на правоъгълника с бяло
u8g.setColorIndex(0); // бяло мастило, черен фон
u8g.setPrintPos(1, 30); // позиция
u8g.print("Дума..."); // текстов изход

U8g.setColorIndex(1); // бяло мастило, черен фон
u8g.setPrintPos(1, 50); // позиция
u8g.print("След стартиране ="); // текстов изход
u8g.setPrintPos(85, 50); // позиция
u8g.print(milis() / 1000); // изходен брой секунди след стартиране
u8g.setPrintPos(1, 64); // позиция
u8g.print(freeRam()); // изведе колко памет се използва
) докато (u8g.nextPage());

забавяне (200);
}

Часовник за реално време DS1307
Друг компонент за моята метеорологична станция. Този щит има часовник за реално време. Поръчах ги от eBay. Продавачът изпрати кърпичка за часовник в нереално голяма кутия


Вътре в кутията имаше два листа А4 с реклама и носна кърпичка за часовник, увити в целофан


Искам да отбележа, че таксата не надвишава размера на 2 рубли. монета, а кутията беше с размери 13х15х5см.
Платката беше опакована в антистатична торбичка

Шал отблизо



Трябваше да се занимавам с този модул. Първо, имаше трудности с връзката. И второ, на тази платка няма кварц. Ако знаех, че ще отделя толкова много време за модула, тогава най-вероятно щях да го сглобя сам, тъй като мрежата е пълна със схеми. Най-простата схема съдържа 4-5 компонента.
Относно връзката. Намерих библиотека, която казваше, че интерфейсът I2C може да бъде свързан не към обичайните аналогови входове на Arduino (A4 и A5), а към всякакви дискретни. Направи както е написано. Отначало нищо не работеше, след дълъг танц с тамбура часовникът се нави. Е, помислих си, това е, проблемите свършиха, но след като се опитах да свържа същия модул към друго Arduino, танците с тамбурата продължиха. Прекарах много време в търсене на решение на този проблем и почти навсякъде беше посочено или неправилно свързване, или липса на издърпващи резистори на щифтовете SCL и SDA. Вече исках да вляза в дъската с поялник, но в един форум случайно се натъкнах на код, в който се казва, че SCL и SDA трябва да бъдат свързани към стандартни I2C портове на Arduino. След стандартната връзка всичко веднага заработи.
Сега за кварца. Не знам какъв кварц слагат китайците, но часовниците с такъв кварц вървяха по 10-11 секунди на ден. Тази грешка е 5 минути на месец и 1 час на година. Нямате нужда от часовник като този. Трябваше да отида отново онлайн и да потърся как да поправя тази грешка. Първото решение, което се появи, казва, че трябва да заземите кварца. Направи го - нулев резултат. Открих някъде другаде, че трябва да намеря стара дънна платка и да разпоя кварцов часовник оттам. Готово - резултатът е. Сега часовникът бяга не с 10-11 секунди, а с 1,5 секунди на ден. Да кажем, че стана по-добре, но далеч от идеалното. Тъй като е по-неохотно да се занимавате с поялник, беше решено да настроите часовника програмно, тоест веднъж на ден, настройте часовника до желаната стойност. След 10 дни часовникът се отклони с не повече от секунда. Методът е добър, но само когато устройството за измерване на времето Arduino е свързано към захранване, в противен случай часовникът работи на батерия и все още бяга.
Малка тестова програма:

#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68 // SDA A4, SCL A5

Байт decToBcd(байт стойност)
{
връщане ((val/10*16) + (val%10));
}

Байт bcdToDec(байтова стойност)
{
връщане ((val/16*10) + (val%16));
}

Void setDateDs1307(байт секунда, // 0-59
байт минута, // 0-59
байт час) // 0-99
{

Wire.write(0);
Wire.write(decToBcd(втори));
Wire.write(decToBcd(минута));
Wire.write(decToBcd(час));
Wire.endTransmission();
}

Void getDateDs1307(байт *втори,
байт*минута,
байт*час)
{

Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 3);

*второ = bcdToDec(Wire.read());
*минута = bcdToDec(Wire.read());
*час = bcdToDec(Wire.read());
}

Празна настройка()
{
байт секунда, минута, час;
Wire.begin();
Serial.begin(9600);

Второ = 45;
минути = 5;
часа = 16;

SetDateDs1307(секунда, минута, час);
}

Void loop()
{
байт секунда, минута, час;

GetDateDs1307(&секунда, &минута, &час);
Serial.print(час, DEC);
сериен печат (":");
Serial.print(минута, DEC);
сериен печат (":");
Serial.println(второ, DEC);

забавяне (1000);
}


Библиотеката не се използва тук и функциите са съкратени за времето за четене и писане.

Сензор за температура и влажност DHT11
Няма много какво да се каже за този сензор. Дори не бих го използвала, ако нямах нужда от влага. За съжаление не го снимах, когато го получих, така че няма да има снимки. Снимки на сензора могат да се видят по-долу, където го свързах към Arduino. Свързването на сензора е лесно (+, цифров изход, -). Обикновено сензорите се правят с четири щифта. С този форм фактор третият контакт не е свързан с нищо.
За да се свържете с Arduino, можете да използвате библиотеката. Можете да изтеглите.
Малка тестова програма с извеждане на информация към LCD дисплей 1602:

// включва кода на библиотеката:
#включи
#включи

// Деклариране на обекти
dht11 Dht11;
LiquidCrystal lcd (12, 11, 6, 5, 4, 3);

#define DHT11PIN 7
int i;

Празна настройка()
{
lcd.begin(16, 2);
lcd.print("Състояние: ");
i=0;
}

Void loop()
{
int chk = DHT11.read(DHT11PIN);
lcd.setCursor(8, 0);
превключвател (chk)
{
случай 0: lcd.print("OK"); прекъсване;// lcd.setCursor(11, 0); lcd.print(milis()/2000); прекъсване;
случай -1: lcd.print(“Грешка в контролната сума”); мерр(); прекъсване;
случай -2: lcd.print("Грешка при изчакване"); мерр(); прекъсване;
по подразбиране: lcd.print("Неизвестна грешка"); мерр(); прекъсване;
}
забавяне (500);
lcd.setCursor(15, 0);
превключвател(i)
{
случай 0: lcd.print("^"); lcd.setCursor(15, 1); lcd.print(" "); прекъсване;
случай 1: lcd.print("v"); lcd.setCursor(15, 1); lcd.print(" "); прекъсване;
по подразбиране: lcd.setCursor(15, 1); lcd.print("E"); прекъсване;
}
i=i+1;
ако (i>1) i=0;
lcd.setCursor(0, 1);
lcd.print("H=");
lcd.setCursor(2, 1);
lcd.print((float)DHT11.humidity, 0);
lcd.setCursor(4, 1);
LCD печат ("%");
lcd.setCursor(8, 1);
lcd.print("T=");
lcd.setCursor(10, 1);
lcd.print((float)DHT11.temperature, 0);
lcd.setCursor(12, 1);
lcd.print("C");

Void mErr()
{
lcd.setCursor(2, 1);
lcd.print("**");
lcd.setCursor(10, 1);
lcd.print("**");
i=5;
}


Сензорът има недостатъци - данните от сензора идват само в цели числа, а обхватът е слаб.

Изглежда, че е писал за всички компоненти. Остава да съберем всичко в едно цяло.
Ами сега, за малко да забравя! За да сглобите устройството, ви е необходим калъф. Случаят е поръчан и в Ebay. Продавачът беше от Англия. Пратката дойде бързо, но не я снимах. Всички снимки на тялото са по-долу.

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



Всъщност синият цвят на подсветката е много по-ярък. Дори при минимална яркост (Bright=5) рамката е експонирана.

За да се сглоби всичко без кабели, беше решено да се направи мини дънна платка, а платката Arduino и щитовете бяха поставени върху конекторите. В този случай те могат лесно да бъдат отстранени бързо. Също така реших да закача LCD екрана и бутоните за управление на конекторите, само да запоя температурния сензор върху проводниците.
Ето как излезе шалът



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

Дънна платка с инсталирани щитове и Arduino платка.

Ето как изглежда пълното свързване с дънната платка


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

Основният проблем при поставянето в кутията е да изрежете равномерно жлеба за LCD екрана. Колкото и да се опитвах, все не се получаваше перфектно. Пропуските на някои места бяха малко повече от 1 мм. За да изглежда всичко спретнато, взех черен уплътнител за аквариума и запълних всички пукнатини, като в същото време прикрепих екрана към този конкретен уплътнител. След като уплътнителят изсъхна, отрязах излишното от външната страна. При ярка светлина уплътнителят се вижда, а при нормална светлина всичко се слива с корпуса.
Ето как изглежда корпусът отвътре с инсталиран LCD екран и дънна платка.

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

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

Ето как изглежда шалът с копчета:



Ето как изглежда таблото:


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

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


С бутонна връзка:

Затворете кутията и я включете. Всичко работи добре, бутоните работят както трябва.

В края публикувам кратко видео на устройството в различни режими:
http://www.youtube.com/watch?v=KsiVaUWkXNA&feature=youtu.be
За тези, които не виждат видеото тук, ето линк към

Време е да приключим с прегледа.
Ще напиша малко за програмата и след това кратки заключения. Когато написах програмата, не мислех, че много бързо ще се натъкна на лимит от 30720 байта.


Трябваше да оптимизирам кода. Преместих много части от код в подпрограми. Никога не бих си помислил, че командата switch ... case в компилиран вид заема повече място от няколко if ... else. Правилното деклариране на променливи също спестява място. Ако декларирате масив като дълъг, въпреки че е напълно възможно да се мине с байт, тогава преразходът на паметта достига 500 байта, в зависимост от размера на масива. Когато пишете програма, вие не мислите за нея и едва по-късно, когато анализирате програмата, разбирате, че сте направили някои неща грешно и започвате да оптимизирате кода. След като проблемите с размера на програмата бяха разрешени, се натъкнах на ограничение на RAM. Това се изразяваше във факта, че програмата започна да виси след зареждане. Трябваше да въведа подпрограма за изчисляване на свободната RAM памет. В резултат на това бях принуден да изоставя един алгоритъм за прогнозиране на времето, тъй като той трябва да показва икони на екрана. Самият алгоритъм работи, но изходът на иконите трябваше да бъде запазен. Все още имам идеи как да оптимизирам кода, но в близко бъдеще ще оставя устройството да работи така, както е, за да оценя производителността и да идентифицирам всички грешки.

Сега малко заключения
минуси
1) Цена. Оправданието за този минус е, че едно хоби никога не е евтино.

професионалисти
1) Голяма функционалност на устройството
2) Разширяването на функциите е ограничено само от използвания контролер и вашето собствено желание
3) Естетическо удоволствие от съзерцанието и морално удовлетворение от факта, че въпреки това сглобих и завърших това устройство

Смятам да купя +86 Добави към любими Рецензията ми хареса +137 +304

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

Нашата метеорологична станция ще се състои от две устройства: компактно автономно устройство, което измерва метеорологичните показатели, и ретранслаторно устройство, което получава тези индикатори и ги изпраща на „народен мониторинг“. Устройствата ще комуникират чрез безжичен комуникационен канал на честота 433 MHz. Автономната част ще се захранва от три АА батерии и ще може да работи с един комплект батерии до една година с период на запитване на сензора от 20 минути.

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

Какво изисква това?

За да направим самостоятелен предавател, имаме нужда от:

    x3 AA AA държач за батерии

За да направим повторител, имаме нужда от:

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

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

Как да го сглобя?

Сглобяване на самостоятелна част

Монтаж на повторител

Това завършва сглобяването на минимално функционалния повторител. Ако искате да инсталирате LED индикация и звукова аларма, моля следвайте стъпките по-долу.


Източник

Код на офлайн част

meteo_sensor.ino #include #включи #включи #включи // Изчакване между изпращанията (не повече от 65535)#define TIMEOUT 60000 // Брой опити за изпращане на пакет#define ОПИТИ 3 // Пин с информация за предавателя#define RF_PIN 5 // Щифтове на сензора за температура и влажност#define GND1_PIN 10 #define VCC1_PIN 11 #define GND2_PIN 7 #define VCC2_PIN 8 #define DATA_PIN 12 #define CLK_PIN 9 AmperkaLine rf(RF_PIN) ; SHT1x sht1x(CLK_PIN, DATA_PIN); void loop(void); // Функция за заспиване на дъската. На всеки TIMEOUT секунди // loop_func ще бъде извикан. TEENSY3_LP LP = TEENSY3_LP() ; sleep_block_t* LP_config; void sleep_mode(void) (LP_config = (sleep_block_t*) calloc (1,sizeof (sleep_block_t)) ; // Ще се събудим на таймер LP_config->modules=(LPTMR_WAKE) ; // Задайте времето за изчакване за таймера LP_config->lptmr_timeout=TIMEOUT; // След времето за изчакване ще бъде извикана функцията за цикъл LP_config->обратно повикване=цикъл; LP.Hibernate(LP_config) ; ) // Функция за разрешаване на периферни устройства void peripheral_start(void) ( // Включете линията за данни pinMode(RF_PIN, ИЗХОД); // Включете захранването и заземяването на сензорите за температура и влажност pinMode(GND1_PIN, ИЗХОД); pinMode(GND2_PIN, ИЗХОД); pinMode(VCC1_PIN, ИЗХОД); pinMode(VCC2_PIN, ИЗХОД) ; digitalWrite(GND1_PIN, LOW) ; digitalWrite(GND2_PIN, LOW) ; digitalWrite(VCC1_PIN, HIGH) ; digitalWrite(VCC2_PIN, HIGH) ; // Включете светодиода, за да посочите предаване pinMode(LED_BUILTIN, OUTPUT) ; digitalWrite(LED_BUILTIN, HIGH) ; // Изберете вътрешното напрежение като референтно напрежение// източник (=1.2V) analogReference(INTERNAL) ; ) // Функция за изключване на периферно устройство void peripheral_stop(void) ( // Изключете линията за данни pinMode(RF_PIN, INPUT) ; // Изключете сензора за температура и влажност pinMode(GND1_PIN, INPUT) ; pinMode(GND2_PIN, INPUT) ; pinMode(VCC1_PIN, INPUT) ; pinMode(VCC2_PIN, INPUT) ; pinMode(18, INPUT_PULLUP); pinMode(19, INPUT_PULLUP); // Изключете светодиода digitalWrite(LED_BUILTIN, LOW) ; ) void настройка(void ) ( // Не инициализираме нищо, веднага заспивамеспящ режим() ; ) // Тази функция се изпълнява веднъж на всеки TIMEOUT секунди void loop(void) ( unsigned long msg; байт температура, влажност, напрежение; // Включване на периферни устройства peripheral_start() ; // Изчакайте сензорът за температура и влажност да се включизабавяне (30) ; // Получаване на информация от сензоритемпература = (байт) (sht1x.readTemperatureC () + 40 .) * 2; влажност = (байт) sht1x.readHumidity () ; напрежение = analogRead(A0) / 4; // Създаване на пакет от данните msg = 0; съобщение | = напрежение; съобщ<<= 8 ; msg | = humidity; msg <<= 8 ; msg | = temp; // Изпратете пакет няколко пътиза (int i = 0; i< ATTEMPTS; i++ ) rf.send (msg) ; // Изключете периферните устройства peripheral_stop() ; // След излизане от функцията, платката отново ще заспи }

Код на вътрешното табло

receiver.ino #include #включи #включи #включи байт mac = (0x90, 0xA7, 0xDA, 0x0F, 0xBC, 0x75); charserver = "narodmon.com" ; EthernetClient клиент; const int rfpin = 7; AmperkaLine rf(rfpin) ; void setup(void) (pinMode(rfpin, INPUT) ; pinMode(6, OUTPUT) ; Serial.begin (9600) ; Serial.println ("Started." ) ;) void loop(void) (static unsigned long pushtimeout = 0 ; статична плаваща температура, влажност, напрежение; неподписано дълго съобщение; int res; if ((res = rf.receive (& msg) ) == 0 ) (temp = ((float ) (msg& 0xFF ) ) / 2 . - 40 .; msg >>= 8; влажност = (float) (msg& 0xFF); msg >>= 8; напрежение = (float) (msg& 0xFF) / 256. * 1.2 * 10 * 1.1; digitalWrite(6, HIGH) ; Serial.print ("Температура: ") ; Serial.print (temp) ; Serial.print (", влажност: ") ; Serial.print (влажност) ; Serial.print (", напрежение: ") ; Serial.println ( напрежение); digitalWrite(6, LOW);) else Serial.println ("E"); if (millis() - pushtimeout > 60000 * 5) (pushtimeout = millis(); Serial.println ("Стартиране на Ethernet... " ) ; if (Ethernet.begin (mac) == 0 ) ( Serial.println ( „Неуспешно конфигуриране на Ethernet чрез DHCP“) ; докато (1 ) ( ) ) забавяне (1000 ) ; Serial.println("свързване..." ) ; if (client.connect (сървър, 8283) ) ( Serial.println ("свързан" ) ; client.println ( "#90-A7-DA-0F-BC-75#Сензор#55.751775#37.616856#0.0") ; client.print("#90A7DA0FBC7501#" ) ; client.print (temp, DEC); client.println("#In") ; client.print("#90A7DA0FBC7502#" ) ; client.print(влажност, DEC) ; client.println("#Влажност"); client.print("#90A7DA0FBC7503#"); client.print (напрежение, DEC) ; client.println("#Напрежение"); client.println("##"); ) else Serial.println("неуспешна връзка" ) ; ( unsigned long tm = millis() ; while (millis() - tm< 5000 ) { if (client.available () ) { char c = client.read () ; Serial.print (c) ; } } } client.stop () ; } }

Регистрация на метеорологична станция в "Народен мониторинг"

За да могат данните, предадени от нашето устройство, да бъдат правилно показани на публично наблюдение, трябва да направите следното:


Демонстрация на устройството

Какво друго може да се направи?

    Teensy разполага с часовник за реално време (RTC) на борда. За тяхното изпълнение само кварцът не е достатъчен. Можете да закупите кварц на 32,768 kHz във всеки магазин за радио елементи и да го запоите. След това можете да събудите Teensy с RTC аларма. Предимството е, че можете да събуждате устройството по-често през онези часове, когато са необходими по-точни показания. Например, в работно време събуждайте устройството на всеки 5 минути, а останалите - на всеки половин час.

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



Тъй като климатичните условия тук са доста променливи и температурата варира в диапазона 30-40 ° C, реших да направя домашна метеорологична станция.

Какви са функциите на домашната метеорологична станция?
Метеорологичната станция Arduino с дисплей е устройство, което събира данни за времето и условията на околната среда с помощта на различни сензори.

Обикновено това са следните сензори:

  • вятър
  • влажност
  • дъжд
  • температура
  • налягане
  • височини

Целта ми е да направя преносима настолна метеорологична станция със собствените си ръце.

Той трябва да може да дефинира следните параметри:

  • температура
  • влажност
  • налягане
  • височина

Стъпка 1: Купете правилните компоненти







  • DHT22, сензор за температура и влажност.
  • BMP180, датчик за налягане.
  • Спойка
  • Едноредов конектор 40 изхода

От оборудването ще ви трябва:

  • поялник
  • клещи за подложки за нос
  • жици

Стъпка 2: DHT22 сензор за температура и влажност







За измерване на температурата се използват различни сензори. DHT22, DHT11, SHT1x са популярни

Ще обясня как се различават един от друг и защо използвах DHT22.

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

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

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

Нека да разгледаме плюсовете и минусите на трите модела сензори.

DHT11

Плюсове: не изисква запояване, най-евтиният от трите модела, бърз стабилен сигнал, обхват над 20 м, силни смущения.
Минуси: Библиотека! Няма опции за разделителна способност, грешка при измерване на температура +/- 2°С, грешка при измерване на нивото на относителна влажност +/- 5%, неподходящ диапазон на измерваните температури (0-50°С).
Приложения: градинарство, селско стопанство.

DHT22

Плюсове: не изисква запояване, ниска цена, плавни криви, малки грешки при измерване, голям диапазон на измерване, обхват над 20 m, силни смущения.
Минуси: чувствителността може да бъде по-висока, бавно проследяване на температурните промени, необходима е библиотека.
Приложения: екологични изследвания.

SHT1x

Плюсове: не е необходимо запояване, плавни криви, малки грешки при измерване, бърза реакция, ниска консумация на енергия, автоматичен режим на заспиване, висока стабилност и последователност на данните.
Минуси: два цифрови интерфейса, грешка при измерване на нивото на влажност, диапазонът на измерваните температури е 0-50°C, необходима е библиотека.
Приложения: работа в тежки среди и при дългосрочни инсталации. И трите сензора са сравнително евтини.

Съединение

  • Vcc - 5V или 3.3V
  • Gnd - с Gnd
  • Данни - към втория щифт на Arduino

Стъпка 3: Сензор за налягане BMP180



BMP180 е барометричен сензор за атмосферно налягане с I2C интерфейс.
Сензорите за барометрично налягане измерват абсолютната стойност на околния въздух. Този показател зависи от конкретните метеорологични условия и от надморската височина.

Модулът BMP180 имаше регулатор 3.3V 662k ohm, който аз по моя собствена глупост случайно гръмнах. Трябваше да направя мощен удар директно към чипа.

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

Схема на свързване на сензора и I2C шина с Arduino (nano или uno)

  • SDA-A4
  • SCL-A5
  • VCC - 3.3V
  • GND-GND

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

Атмосферното налягане във всяка точка не е постоянно. Сложното взаимодействие между въртенето на Земята и наклона на земната ос води до много области с високо и ниско налягане, което от своя страна води до ежедневни метеорологични модели. Като наблюдавате промяната в налягането, можете да направите краткосрочна прогноза за времето.

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

Атмосферното налягане също се променя с надморската височина. Абсолютното налягане в базовия лагер на Еверест (5400 m над морското равнище) е по-ниско от абсолютното налягане в Делхи (216 m над морското равнище).

Тъй като показанията за абсолютно налягане варират на всяко място, ние ще говорим за относително налягане или налягане на морското равнище.

Измерване на височина

Средното налягане на морското равнище е 1013,25 GPa (или милибари). Ако се издигнете над атмосферата, тази стойност ще падне до нула. Кривата на това падане е доста разбираема, така че можете сами да изчислите надморската височина, като използвате следното уравнение: alti=44330*

Ако вземете налягането на морското равнище от 1013,25 GPa като p0, решението на уравнението е вашата текуща надморска височина.

Предпазни мерки

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

Пазете от топлина. За измерване на налягането са необходими точни показания на температурата. Опитайте се да предпазите сензора от температурни колебания и не го оставяйте близо до източници на високи температури.

Пазете от влага. Сензорът BMP180 е чувствителен към нивата на влага, опитайте се да предотвратите евентуално проникване на вода върху сензора.

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

Стъпка 4: Сглобяване на устройството







Инсталиране на едноредови конектори за Arduino Nano. По принцип ги нарязахме по размер и ги шлайфахме малко, така че да изглеждат така, както са били. След това ги запояваме. След това инсталираме едноредови конектори за сензора DHT22.

Инсталирайте резистор от 10 kΩ от изхода за данни към земята (Gnd). Запояваме всичко.
След това по същия начин инсталираме едноредов конектор за сензора BMP180, правим захранването 3.3V. Свързваме всичко с I2C шината.

И накрая, свързваме LCD дисплея към същата I2C шина като сензора BMP180.
(Планирам по-късно да свържа RTC модул (часовник за реално време) към четвъртия конектор, така че устройството също да показва часа).

Стъпка 5: Кодиране




Изтегляне на библиотеки

За да инсталирате библиотеки на Arduino, следвайте връзката

#включи
#include #include #include "DHT.h" #include

SFE_BMP180 налягане;

#define ALTITUDE 20.56 #define I2C_ADDR 0x27 //<<- Add your address here. #define Rs_pin 0 #define Rw_pin 1 #define En_pin 2 #define BACKLIGHT_PIN 3 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7

#define DHTPIN 2 // към какъв цифров щифт сме свързани

// Разкоментирайте какъвто и тип да използвате! //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 DHT dht(DHTPIN, DHTTYPE); LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin, Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);float t1,t2;

void setup() ( Serial.begin(9600); lcd.begin(16,2); //<<-- our LCD is a 20x4, change for your LCD if needed // LCD Backlight ON lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home on LCD lcd.print("Weather Station"); delay(5000); dht.begin(); pressure.begin(); } void loop() { char status; double T,P,p0,a; status = pressure.startTemperature(); if (status != 0) { delay(status);

status = pressure.getTemperature(T); if (статус != 0) ( Serial.print("1"); lcd.clear(); lcd.setCursor(0,0); lcd.print("Баро температура: "); lcd.setCursor(0,1 ); lcd.print(T,2); lcd.print(" deg C "); t1=T; забавяне (3000);

статус = натиск.startPressure(3); if (status != 0) ( // Изчакайте измерването да завърши: delay(status);

статус = pressure.getPressure(P,T); if (статус != 0) (lcd.clear(); lcd.setCursor(0,0); lcd.print("абсолютно налягане: "); lcd.setCursor(0,1); lcd.print(P,2 ); lcd.print(" mb "); забавяне (3000);

p0 = pressure.sealevel(P,надморска височина); // ние сме на 1655 метра (Боулдър, Колорадо)

a = налягане.надморска височина(P,p0); lcd.clear(); lcd.setCursor(0,0); lcd.print("Надморска височина: "); lcd.setCursor(0,1); lcd.print(a,0); lcd.print("метри"); забавяне (3000); ) ) ) float h = dht.readHumidity(); // Прочетете температурата като Целзий (по подразбиране) float t = dht.readTemperature(); t2=t; lcd.clear(); lcd.setCursor(0,0); // отидете в началото на 2-ри ред lcd.print("Влажност: "); lcd.setCursor(0,1);lcd.print(h); lcd.print("%"); забавяне (3000); lcd.clear(); lcd.setCursor(0,0); // отидете в началото на 2-ри ред LCD print("DHT Tempurature: "); lcd.setCursor(0,1); LCD печат (t); lcd.print("degC"); забавяне (3000); lcd.clear(); lcd.setCursor(0,0); // отидете в началото на 2-ри ред lcd.print("Средна температура: "); lcd.setCursor(0,1); lcd.print((t1+t2)/2); lcd.print("degC"); забавяне (3000); )

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

Дял