Искам да събера направете го сами инструмент, който ще измерва атмосферното налягане и температурата. Температурният сензор трябва да бъде отдалечен и стегнат, тъй като трябва да измерва температурата на определено разстояние от устройството. Бих искал да има такова преносимо устройство с работен диапазон от -30 ° C до 50 ° C. Но това изисква всички компоненти да могат да работят в този температурен диапазон. Компонентите, които могат да работят в разширен температурен диапазон, са по-скъпи и е по-трудно да ги купите.
За да осъществя мечтата си в реалността, ще ми бъде помогнат съветът, който описах в статията „GY-BMP280-3.3 платка за измерване на барометрично налягане и температура».
От практиката е известно, че по време на монтажа и конфигурирането електронен продукти преди производството му, трябва да проверите годността на всички материали и компоненти на всеки отделно. В противен случай можете да се объркате по-късно и в резултат на това електронният продукт няма да работи и ще бъде много трудно да се намери причината за неизправността.
Да започнем.
Първи етап, Инсталирайте безплатен софтуерен корпус на вашия компютър Arduino IDE за писане на програми (скици), компилирането им и след това записването им в микроконтролера Mega328P, инсталиран на платката. Препоръчвам ви да изтеглите версията на черупката на ARDUINO 1.6.5. Защо? Първоначално проектът ARDUINO беше един, сега разработчиците са се разпръснали и продължават да разработват системата ARDUINO, но всяка по свой начин, с малки нюанси. Използвах версия ARDUINO 1.6.5. Той трябва да бъде инсталиран и тестван за сътрудничество с дъската Arduino Uno, като се използват най-простите примери.
Втори етап, Проверяваме платката GY-BMP280-3.3 за измерване на барометрично налягане и температура. Взимаме 4 проводника, свързваме ги GY-BMP280-3.3 и Arduino Uno, както е показано на снимката и диаграмата. Кривите тънки многоцветни линии са проводници.
Нека започнем да проверяваме платката GY-BMP280-3.3. За да направите това, трябва да инсталирате библиотеката в Arduino IDE, написана от програмисти, работещи на сайта. По правило след инсталиране на библиотеката в Arduino IDE се появяват примери (образци) на код. Като променим леко примерния код, можем да го компилираме в разбираеми за микроконтролера данни и след това да го изпратим в паметта на микроконтролера. Можете да намерите пример (пример), като обърнете внимание на двете снимки на екрана по-долу.
След като запише данни в микроконтролера на платката Arduino Uno, той веднага започва да изпълнява програмата (код) и изпраща данните чрез USB кабел до компютъра, към който е свързана платката Arduino Uno.И можем да видим резултата от измерването на платката GY-BMP280-3.3 в прозореца на Arduino IDE, наречен „монитор на сериен порт“.
Можем да видим резултата от измерванията на платката GY-BMP280-3.3 в стандартната програма за хипер терминал на Windows, след като затворите обвивката Arduino Uno и настроите сесия в програмата Hyper Terminal. Тоест, можем да получим резултатите от платката GY-BMP280-3.3, като свържем Arduino Uno към всеки компютър с USB кабел, на който е инсталиран драйверът за дъската Arduino Uno. Има няколко библиотеки за работа с GY-BMP280-3.3. Всичко работеше за мен с библиотеката. Файлът, който изтегляте от този сайт, ще изглежда така: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Необходимо е да се преименува на: iarduino_Pressure_BMP.zip. Сега трябва да инсталираме библиотеката iarduino_Pressure_BMP в черупката на Arduino IDE.
Стартирайте Arduino IDE, отидете на менюто Sketch / Включване на библиотеки / Add.ZIP Library ... след това изберете iarduino_Pressure_BMP.zip файла и щракнете върху бутона Open. Също така трябва да инсталирате библиотеките:,. След като инсталираме библиотеките, рестартираме обвивката на Arduino IDE, тоест я затваряме и я стартираме отново. След това изберете менюто Файл / Проби / iarduino налягане BMP (сензори за налягане) / пример.
Виждаме кода в прозореца.
Кодът ще трябва да бъде леко променен.
В петия ред премахнете две наклонени черти „//“ и добавете (0x76) или (0x77) в единадесетия ред. (0x76) е адресът на дъската на барометъра. Моята платка GY-BMP280-3.3, свързана към шината I2C, се оказа, че има същия адрес (0x76). Как да разбера номера на устройството, свързано към I2C шината? Ще получите отговора на този въпрос, като прочетете цялата статия.
И така, ние поправихме кода в прозореца, сега започваме да проверяваме и компилираме кода в менюто Sketch / Check / Compile. Ако проверката и компилирането на кода е успешна, тогава в менюто Sketch / Load започваме записването на програмата в Arduino Uno.
Ако изтеглянето е успешно, тогава отваряйки монитора на серийния порт в менюто: Инструменти / Монитор на сериен порт, ще видим данните, изпратени от платката GY-BMP280-3.3.
На следващия скрийншот резултатът на платката GY-BMP280-3.3 работи на компютър, на който не е инсталирана обвивката на Arduino IDE. Данните се получават от програмата PuTTY.
В същото време е сниман лабораторен анероиден барометър, който се намира до платката GY-BMP280-3.3. Сравнявайки показанията на инструмента, вие сами можете да направите заключения относно точността на платката GY-BMP280-3.3. Анероиден барометър, сертифициран от държавна лаборатория.
Трети етап, Проверка на LCD дисплея с интерфейсния модул I2C. Намираме LDC дисплей с интерфейсен модул, който се свързва чрез I2C шината към Arduino UNO.
Ние проверяваме неговата работа, като използваме примери от Arduino IDE черупката. Но преди това определяме адреса на интерфейсния модул. Моят интерфейсен модул има адрес 0x3F. Вмъкнах този адрес в линията на скицата: LiquidCrystal_I2C lcd (0x3F, 16.2);
Определих този адрес, използвайки скицата „Скенер за адрес на устройството I2C“, описана в.
Стартирах черупката на Arduino IDE, от статията копирах програмния код и залепих прозореца му на Arduino IDE.
Започнах компилацията, след това записах кода в дъската на Arduino UNO, към която бяха свързани платката GY-BMP280-3.3 и LDC дисплеят с интерфейсния модул I2C. Тогава в монитора на серийния порт получих следния резултат. Моят интерфейсен модул има адрес 0x3F.
Четвърти етап, Проверка на температурния сензор DS18b20. Свързваме го по следния начин.
Библиотеката на OneWire Arduino за работа със сензора за температура DS18b20 вече е инсталирана.
Отворете пробата DS18x20_Temperature, компилирайте, заредете, гледайте резултата от измерванията в монитора на серийния порт. Ако всичко работи, преминете към следващата стъпка.
Пети етап, монтаж у дома метеорологични станции на GY-BMP280-3.3 и Ds18b20.
Сглобяваме устройството по схемата:
Получих кода за устройството, като комбинирах всички примери в едно и настроих изхода на екрана на LDC дисплея. Ето какво имам:
// Комментарий за софтуерна реализация на шината I2C: //
// #define pin_SW_SDA 3 // Задайте всеки Arduino щифт да работи като линия на SDA на софтуерната шина I2C.
// #define pin_SW_SCL 9 // Задайте всеки пин на Arduino да работи като SCL линия на софтуерната шина I2C.
// Некомментиране за съвместимост с повечето платки: //
#include
#include // Библиотеката iarduino ще използва методите и функциите на библиотеката Wire.
#include // Библиотека за работа на LDC тип 1602 на шината I2C
//
#include // Свържете библиотеката iarduino_Pressure_BMP за работа с BMP180 или BMP280.
iarduino_Pressure_BMP сензор (0x76); // Декларирайте сензорен обект за работа със сензор за налягане, като използвате функциите и методите на библиотеката iarduino_Pressure_BMP.
LiquidCrystal_I2C lcd (0x3F, 16.2);
OneWire ds (10);
настройка за невалидност () {
lcd.init ();
lcd.backlight ();
Serial.begin (9600); // Инициирайте прехвърляне на данни към монитора на серийния порт при 9600 бод.
забавяне (1000); // Чакаме завършването на преходните процеси при прилагане на мощност
sensor.begin (73); // Започнете работа със сензора. Сегашната надморска височина ще бъде приета като 73 м. - височината на град Бузулук над морското равнище
} //
void loop () {
// Прочетете данните и дисплея: температура в ° С, налягане в мм. rt., промяна на височината спрямо указаната във функцията за стартиране (по подразбиране 0 метра).
lcd.setCursor (0,0); // дефинирайте изходната точка "P =" на LDC
lcd.print ("P =");
lcd.печат (сензор. налягане / 1000.3); // разделете стойността на P, издадена от BMP280, на 1000 и задайте изхода на 3 десетични знака
lcd.setCursor (12.0); // дефинирайте изходната точка "kPa" на LDC
lcd.print ("kPa");
lcd.setCursor (0,1);
lcd.print ("T =");
lcd.принт (сензор.температура, 1); // задайте изхода на 1 десетичен знак
lcd.setCursor (6.1);
// lcd.print ("C");
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.принт (сензорна височина, 1);
if (sensor.read (1)) {Serial.println ((String) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tMM.PT.CT, \ t T = "+ сензор.температура +" * C, \ t \ t B = "+ сензор. височина +" М. ");}
else {Serial.println ("HET OTBETA OT CEHCOPA");}
// Прочетете данните и дисплея: температура в ° C и налягане в Pa, налягане в мм. rt., промяна на височината спрямо указаната във функцията за стартиране (по подразбиране 0 метра).
if (sensor.read (2)) {Serial.println ((String) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tPa, \ t \ t T =" + sensor.temperature + "* C, \ t \ t B =" + sensor.altitude + "M.");}
else {Serial.println ("HET OTBETA OT CEHCOPA");}
байт i;
присъствие на байт = 0;
тип байт_s;
данни за байтове [12];
байтова добавка [8];
плаващ Целзий, Фаренхайт;
ако (! ds.search (addr)) {
Serial.println ("Няма повече адреси.");
Serial.println ();
ds.reset_search ();
забавяне (250);
се върне;
}
Serial.print ("ROM =");
за (i = 0; i <8; i ++) {
Serial.write ('');
Сериен печат (addr [i], HEX);
}
ако (OneWire :: crc8 (addr, 7)! = addr [7]) {
Serial.println ("CRC не е валиден!");
се върне;
}
Serial.println ();
// първият байт ROM показва кой чип
превключвател (addr [0]) {
случай 0x10:
Serial.println ("Чип = DS18S20"); // или стар DS1820
type_s = 1;
прекъсване;
случай 0x28:
Serial.println ("Чип = DS18B20");
type_s = 0;
прекъсване;
случай 0x22:
Serial.println ("Чип = DS1822");
type_s = 0;
прекъсване;
По подразбиране:
Serial.println ("Устройството не е устройство от семейството DS18x20.");
се върне;
}
ds.reset ();
ds.select (addr);
ds.write (0x44, 1); // стартиране на преобразуването, с включено паразитно захранване в края
забавяне (1000); // може би 750ms е достатъчно, може би не
// тук може да направим ds.depower (), но нулирането ще се погрижи за това.
настояще = ds.reset ();
ds.select (addr);
ds.write (0xBE); // Прочетете Scratchpad
Serial.print ("Данни =");
Сериен печат (наличен, HEX);
Serial.print ("");
за (i = 0; i <9; i ++) {// имаме нужда от 9 байта
данни [i] = ds.read ();
Serial.print (данни [i], HEX);
Serial.print ("");
}
Serial.print ("CRC =");
Serial.print (OneWire :: crc8 (данни, 8), HEX);
Serial.println ();
// Преобразуване на данните в действителна температура
// тъй като резултатът е 16-битово подписано цяло число, би трябвало
// да се съхранява до тип "int16_t", който винаги е 16 бита
// дори когато е компилиран на 32 битов процесор.
int16_t raw = (данни [1] <8) | данни [0];
ако (type_s) {
суров = суров & lt; & lt; 3; // 9 битова резолюция по подразбиране
ако (данни [7] == 0x10) {
// "броя остава" дава пълна 12-битова резолюция
raw = (raw & 0xFFF0) + 12 - данни [6];
}
} else {
байт cfg = (данни [4] & 0x60);
// при по-ниска резолюция ниските битове са неопределени, така че нека ги нулираме
ако (cfg == 0x00) raw = raw & amp; ~ 7; // 9 битова резолюция, 93.75 ms
иначе ако (cfg == 0x20) raw = raw & amp; ~ 3; // 10 битова резолюция, 187,5 ms
иначе ако (cfg == 0x40) raw = raw & amp; ~ 1; // 11 битова резолюция, 375 ms
//// по подразбиране е 12-битова разделителна способност, 750 ms време за преобразуване
}
celsius = (float) суров / 16.0;
fahrenheit = celsius * 1,8 + 32,0;
Serial.print ("Температура =");
Сериен печат (celsius);
Serial.print ("Целзий");
Сериен печат (фаренхайт);
Serial.println ("Фаренхайт");
lcd.setCursor (8.1); // дефинирайте изходната точка "Tds =" на LDC
lcd.print ("Tds =");
lcd.принт (celsius, 1);
забавяне (3000);
}
Ето какво имам:
Платката GY-BMP280-3.3 издава налягане в паскали, което не е много удобно. Не можах да реша проблема как да направя данните за изходното налягане на платката GY-BMP280-3.3 в килопаскали. Реших този проблем в изходната линия на LDC дисплея.
lcd.печат (сензор. налягане / 1000.3); // разделете стойността на P, издадена от BMP280, на 1000 и задайте изхода на 3 десетични знака
Платката GY-BMP280-3.3 също осигурява стойности на надморската височина.
sensor.begin (73); // Започнете работа със сензора. Сегашната надморска височина ще бъде приета като 73 м. - височината на град Бузулук над морското равнище
Ако се отпуснете в морето и промените „sensor.begin (73);“ на "sensor.begin (0);" в кода и след това компилирайте и запишете програмата в метеорологичната станция у дома на GY-BMP280-3.3 и Ds18b20 и направете изход на височина към LDC дисплея, ще получите и висотомер.
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.принт (сензорна височина, 1); // Отпечатайте стойностите на височината в метри с една десетична запетая
Захранването се доставя към веригата в моята версия чрез USB кабел. Можете да използвате 5V / 600 mA импулсен преобразувател за ниско напрежение и вашата метеорологична станция ще стане преносима. Този тип захранване е добре описан в статия.
Успешна компилация!