Chcę odebrać zrób to sam przyrząd do pomiaru ciśnienia atmosferycznego i temperatury. Czujnik temperatury musi być odległy i szczelny, ponieważ musi mierzyć temperaturę w pewnej odległości od urządzenia. Chciałbym mieć takie przenośne urządzenie o zakresie roboczym od -30 ° C do 50 ° C. Wymaga to jednak, aby wszystkie komponenty mogły pracować w tym zakresie temperatur. Elementy, które mogą pracować w rozszerzonym zakresie temperatur, są droższe i trudniej je kupić.
Aby spełnić moje marzenie w rzeczywistości, pomoże mi tablica, którą opisałem w artykule „Tablica GY-BMP280-3.3 do pomiaru ciśnienia barometrycznego i temperatury».
Z praktyki wiadomo, że podczas montażu i konfiguracji elektroniczny produkty przed jego wytworzeniem, musisz sprawdzić przydatność wszystkich materiałów i komponentów każdego z nich osobno. W przeciwnym razie możesz się później pomylić, w wyniku czego produkt elektroniczny nie będzie działał i bardzo trudno będzie znaleźć przyczynę usterki.
Zaczynajmy.
Pierwszy etap. Zainstaluj bezpłatną powłokę oprogramowania na swoim komputerze Arduino IDE do pisania programów (szkiców), kompilowania ich, a następnie zapisywania do mikrokontrolera Mega328P zainstalowanego na płycie. Polecam pobrać wersję powłoki ARDUINO 1.6.5. Dlaczego Początkowo projekt ARDUINO był jeden, teraz programiści rozproszyli i nadal rozwijają system ARDUINO, ale każdy na swój sposób, z niewielkimi niuansami. Użyłem wersji ARDUINO 1.6.5. Powinien zostać zainstalowany i przetestowany pod kątem współpracy z płytą Arduino Uno na najprostszych przykładach.
Drugi etap. Sprawdzamy tablicę GY-BMP280-3.3 do pomiaru ciśnienia barometrycznego i temperatury. Bierzemy 4 przewody, łączymy je GY-BMP280-3.3 i Arduino Uno, jak pokazano na zdjęciu i schemacie. Krzywe cienkie wielokolorowe linie są przewodnikami.
Zacznijmy sprawdzać płytę GY-BMP280-3.3. Aby to zrobić, musisz zainstalować bibliotekę w Arduino IDE, napisaną przez programistów pracujących na stronie. Z reguły po zainstalowaniu biblioteki w Arduino IDE pojawiają się przykłady (próbki) kodu. Nieznacznie zmieniając przykładowy kod, możemy skompilować go w dane zrozumiałe dla mikrokontrolera, a następnie wysłać do pamięci mikrokontrolera. Możesz znaleźć przykład (próbkę), zwracając uwagę na dwa poniższe zdjęcia ekranowe.
Po zapisaniu danych do mikrokontrolera płyty Arduino Uno natychmiast uruchamia program (kod) i przesyła dane kablem USB do komputera, do którego podłączona jest tablica Arduino Uno.I możemy zobaczyć wynik pomiaru karty GY-BMP280-3.3 w oknie Arduino IDE, zwanym „monitorem portu szeregowego”.
Widzimy wyniki pomiarów na płycie GY-BMP280-3.3 w standardowym programie Windows Hyper Terminal, po zamknięciu powłoki Arduino Uno i skonfigurowaniu sesji w programie Hyper Terminal. Oznacza to, że możemy uzyskać wyniki płyty GY-BMP280-3.3, podłączając Arduino Uno do dowolnego komputera za pomocą kabla USB, na którym jest zainstalowany sterownik karty Arduino Uno. Istnieje kilka bibliotek do pracy z GY-BMP280-3.3. Wszystko działało dla mnie z biblioteką. Plik pobrany z tej strony będzie wyglądał następująco: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Należy zmienić nazwę na: iarduino_Pressure_BMP.zip. Teraz musimy zainstalować bibliotekę iarduino_Pressure_BMP w powłoce Arduino IDE.
Uruchom Arduino IDE, przejdź do menu Szkic / Dołącz bibliotekę / Dodaj bibliotekę ZIP ... a następnie wybierz plik iarduino_Pressure_BMP.zip i kliknij przycisk Otwórz. Musisz także zainstalować biblioteki:,. Po zainstalowaniu bibliotek ponownie uruchamiamy powłokę Arduino IDE, to znaczy zamykamy ją i uruchamiamy ponownie. Następnie wybierz menu Plik / Próbki / iarduino Pressure BMP (czujniki ciśnienia) / przykład.
Kod widzimy w oknie.
Kod będzie musiał zostać nieco zmodyfikowany.
W piątym wierszu usuń dwa ukośniki „//” i dodaj (0x76) lub (0x77) w jedenastym wierszu. (0x76) to adres płytki barometru. Okazało się, że moja płyta GY-BMP280-3.3 podłączona do magistrali I2C ma ten sam adres (0x76). Jak znaleźć numer urządzenia podłączonego do magistrali I2C? Odpowiedź na to pytanie uzyskasz, czytając cały artykuł.
Naprawiliśmy więc kod w oknie, teraz zaczynamy sprawdzać i kompilować kod w menu Szkic / Sprawdź / Kompiluj. Jeśli weryfikacja i kompilacja kodu zakończy się powodzeniem, wówczas w menu Szkic / Załaduj rozpoczynamy nagrywanie programu w Arduino Uno.
Jeśli pobieranie się powiedzie, to otwierając monitor portu szeregowego w menu: Narzędzia / Monitor portu szeregowego, zobaczymy dane wysłane przez kartę GY-BMP280-3.3.
Na poniższym zrzucie ekranu wynik płyty GY-BMP280-3.3 działającej na komputerze, na którym powłoka Arduino IDE nie jest zainstalowana. Dane są odbierane przez program PuTTY.
W tym samym czasie sfotografowano laboratoryjny barometr aneroidowy, który umieszczono obok płyty GY-BMP280-3.3. Porównując odczyty przyrządu, możesz samodzielnie wyciągnąć wnioski dotyczące dokładności karty GY-BMP280-3.3. Barometr aneroidowy certyfikowany przez państwowe laboratorium.
Trzeci etap. Sprawdzanie wyświetlacza LCD za pomocą modułu interfejsu I2C. Znajdziemy wyświetlacz LDC z modułem interfejsu, który łączy się za pośrednictwem magistrali I2C z Arduino UNO.
Sprawdzamy jego działanie na przykładach z powłoki Arduino IDE. Ale wcześniej ustalamy adres modułu interfejsu. Mój moduł interfejsu ma adres 0x3F. Wstawiłem ten adres do linii szkicu: LiquidCrystal_I2C lcd (0x3F, 16,2);
Ustaliłem ten adres za pomocą szkicu „skaner adresów urządzeń I2C” opisanego w.
Uruchomiłem powłokę Arduino IDE, z artykułu skopiowałem kod programu i wkleiłem jego okno Arduino IDE.
Rozpocząłem kompilację, a następnie napisałem kod na płycie Arduino UNO, do której zostały podłączone płyta GY-BMP280-3.3 i wyświetlacz LDC z modułem interfejsu I2C. Następnie w monitorze portu szeregowego otrzymałem następujący wynik. Mój moduł interfejsu ma adres 0x3F.
Czwarty etap. Sprawdzanie czujnika temperatury DS18b20. Łączymy to w następujący sposób.
Biblioteka OneWire Arduino do pracy z czujnikiem temperatury DS18b20 jest już zainstalowana.
Otwórz próbkę DS18x20_Temperature, skompiluj, załaduj, obserwuj wynik pomiaru na monitorze portu szeregowego. Jeśli wszystko działa, przejdź do następnego kroku.
Piąty etap. Zgromadzenie dom stacje pogodowe na GY-BMP280-3.3 i Ds18b20.
Montujemy urządzenie zgodnie ze schematem:
Otrzymałem kod urządzenia, łącząc wszystkie przykłady w jeden i ustawiając wyjście na ekranie wyświetlacza LDC. Oto co mam:
// Niezomowanie na implementację oprogramowania magistrali I2C: //
// #define pin_SW_SDA 3 // Przypisz dowolny pin Arduino do pracy jako linia SDA magistrali oprogramowania I2C.
// #define pin_SW_SCL 9 // Przypisz dowolny pin Arduino do działania jako linia SCL do magistrali oprogramowania I2C.
// Niezomentowanie zgodności z większością płyt: //
#include
#include // Biblioteka iarduino będzie korzystać z metod i funkcji biblioteki Wire.
#include // Biblioteka do pracy LDC typu 1602 na magistrali I2C
//
#include // Połącz bibliotekę iarduino_Pressure_BMP, aby pracować z BMP180 lub BMP280.
czujnik iarduino_Pressure_BMP (0x76); // Zadeklaruj obiekt czujnika do pracy z czujnikiem ciśnienia za pomocą funkcji i metod biblioteki iarduino_Pressure_BMP.
LiquidCrystal_I2C lcd (0x3F, 16,2);
OneWire ds (10);
void setup () {
lcd.init ();
lcd.backlight ();
Serial.begin (9600); // Rozpocznij przesyłanie danych do monitora portu szeregowego przy prędkości 9600 bodów.
opóźnienie (1000); // Czekamy na zakończenie stanów nieustalonych przy zasilaniu
sensor.begin (73); // Rozpocznij pracę z czujnikiem. Obecna wysokość zostanie przyjęta jako 73 m. - wysokość miasta Buzuluk nad poziomem morza
} //
void loop () {
// Odczyt danych i wyświetlenie: temperatura w ° C, ciśnienie w mm. rt., zmiana wysokości w stosunku do określonej w funkcji rozpoczęcia (domyślnie 0 metrów).
lcd.setCursor (0,0); // zdefiniuj punkt wyjściowy „P =” na LDC
lcd.print („P =”);
druk lcd (sensor.pressure / 1000.3); // podziel wartość P wydaną przez BMP280 przez 1000 i ustaw wynik 3 miejsc po przecinku
lcd.setCursor (12.0); // zdefiniuj punkt wyjściowy „kPa” na LDC
lcd.print („kPa”);
lcd.setCursor (0,1);
lcd.print („T =”);
druk lcd (czujnik.temperatura, 1); // ustaw wyjście 1 miejsca po przecinku
lcd.setCursor (6.1);
// lcd.print („C”);
// lcd.setCursor (9,1);
// lcd.print („H =”);
// lcd.print (sensor.altitude, 1);
if (sensor.read (1)) {Serial.println ((String) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tMM.PT.CT, \ t T = „+ sensor.temperature +” * C, \ t \ t B = "+ sensor.altitude +" M. ");}
else {Serial.println („HET OTBETA OT CEHCOPA”);}
// Odczyt danych i wyświetlenie: temperatura w ° C i ciśnienie w Pa, ciśnienie w mm. rt., zmiana wysokości w stosunku do określonej w funkcji rozpoczęcia (domyślnie 0 metrów).
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”);}
bajt i;
bajt obecny = 0;
bajt type_s;
dane bajtowe [12];
bajt addr [8];
float Celsjusza, Fahrenheita;
if (! ds.search (addr)) {
Serial.println („Nigdy więcej adresów.”);
Serial.println ();
ds.reset_search ();
opóźnienie (250);
powrót
}
Serial.print („ROM =”);
dla (i = 0; i <8; i ++) {
Serial.write ('');
Serial.print (addr [i], HEX);
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
Serial.println („CRC jest nieprawidłowy!”);
powrót
}
Serial.println ();
// pierwszy bajt ROM wskazuje, który układ
przełącznik (addr [0]) {
przypadek 0x10:
Serial.println („Chip = DS18S20”); // lub stary DS1820
type_s = 1;
przerwa;
przypadek 0x28:
Serial.println („Chip = DS18B20”);
typ_s = 0;
przerwa;
przypadek 0x22:
Serial.println („Chip = DS1822”);
typ_s = 0;
przerwa;
domyślnie:
Serial.println („Urządzenie nie jest urządzeniem z rodziny DS18x20.”);
powrót
}
ds.reset ();
ds.select (addr);
ds.write (0x44, 1); // rozpocznij konwersję z włączoną mocą pasożyta na końcu
opóźnienie (1000); // może 750 ms wystarczy, może nie
// możemy zrobić tutaj ds.depower (), ale reset zajmie się tym.
present = ds.reset ();
ds.select (addr);
ds.write (0xBE); // Przeczytaj Brudnopis
Serial.print („Data =”);
Numer seryjny (obecny, HEX);
Serial.print („”);
dla (i = 0; i <9; i ++) {// potrzebujemy 9 bajtów
data [i] = ds.read ();
Serial.print (data [i], HEX);
Serial.print („”);
}
Serial.print („CRC =”);
Serial.print (OneWire :: crc8 (data, 8), HEX);
Serial.println ();
// Konwertuj dane na rzeczywistą temperaturę
// ponieważ wynikiem jest 16-bitowa liczba całkowita ze znakiem, powinno
// być przechowywane na typ „int16_t”, który zawsze ma 16 bitów
// nawet po skompilowaniu na 32-bitowym procesorze.
int16_t raw = (data [1] <<<8) | dane [0];
if (type_s) {
raw = raw & lt; & lt; 3; // Domyślna rozdzielczość 9 bitów
if (data [7] == 0x10) {
// „liczba pozostań” daje pełną 12-bitową rozdzielczość
raw = (raw & amp; 0xFFF0) + 12 - dane [6];
}
} else {
bajt cfg = (dane [4] i 0x60);
// w niższej rozdzielczości niskie bity są niezdefiniowane, więc wyzerujmy je
if (cfg == 0x00) raw = raw & amp; ~ 7; // Rozdzielczość 9 bitów, 93,75 ms
w przeciwnym razie, jeśli (cfg == 0x20) raw = raw & amp; ~ 3; // 10 bitów res, 187,5 ms
w przeciwnym razie, jeśli (cfg == 0x40) raw = raw & amp; ~ 1; // 11 bitów res, 375 ms
Domyślnie //// ma rozdzielczość 12 bitów i czas konwersji 750 ms
}
Celsjusz = (liczba zmiennoprzecinkowa) raw / 16.0;
Fahrenheit = Celsjusz * 1,8 + 32,0;
Serial.print („Temperatura =”);
Serial.print (Celsjusz);
Serial.print („Celsius”);
Serial.print (Fahrenheit);
Serial.println („Fahrenheit”);
lcd.setCursor (8.1); // zdefiniuj punkt wyjściowy „Tds =” na LDC
lcd.print ("Tds =");
lcd.print (Celsjusza, 1);
opóźnienie (3000);
}
Oto co mam:
Płyta GY-BMP280-3.3 wytwarza ciśnienie w paskalach, co nie jest zbyt wygodne. Nie mogłem rozwiązać problemu, jak tworzyć dane ciśnienia wyjściowego płyty GY-BMP280-3.3 w kilopaskalach. Rozwiązałem ten problem w linii wyjściowej wyświetlacza LDC.
druk lcd (sensor.pressure / 1000.3); // podziel wartość P wydaną przez BMP280 przez 1000 i ustaw wynik 3 miejsc po przecinku
Płyta GY-BMP280-3.3 zapewnia również wartości wysokości.
sensor.begin (73); // Rozpocznij pracę z czujnikiem. Obecna wysokość zostanie przyjęta jako 73 m. - wysokość miasta Buzuluk nad poziomem morza
Jeśli zrelaksujesz się na morzu i zmienisz „sensor.begin (73);” on „sensor.begin (0);” w kodzie, a następnie skompiluj i zapisz program w domowej stacji pogodowej na GY-BMP280-3.3 i Ds18b20, a następnie wygeneruj wysokość na wyświetlaczu LDC, otrzymasz również wysokościomierz.
// lcd.setCursor (9,1);
// lcd.print („H =”);
// lcd.print (sensor.altitude, 1); // Wydrukuj wartości wysokości w metrach z jednym miejscem po przecinku
Moc jest dostarczana do obwodu w mojej wersji za pomocą kabla USB. Możesz użyć niskonapięciowego przetwornika impulsów podwyższających napięcie 5 V / 600 mA, a stacja pogodowa stanie się przenośna. Ten rodzaj zasilania jest dobrze opisany w artykuł.
Udana kompilacja!