» Elektronika » Arduino »Domowa stacja pogodowa na GY-BMP280-3.3 i Ds18b20

Domowa stacja pogodowa na GY-BMP280-3.3 i Ds18b20


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.
Domowa stacja pogodowa na GY-BMP280-3.3 i Ds18b20

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!
5
8.8
6.3

Dodaj komentarz

    • uśmiechnij sięuśmiecha sięxaxaoknie wiemyahoonea
      szefiezadrapaniegłupiectaktak-takagresywnysekret
      przepraszamtańczyćdance2dance3przebaczeniepomocnapoje
      przestańprzyjacieledobrzegoodgoodgwizdaćomdlećjęzyk
      palićklaskanierakdeklarowaćdrwiącydon-t_mentionpobierz
      ciepłożałujęśmiech 1mdaspotkaniemoskingnegatywne
      niepopcornukaraćczytaćprzestraszyćstraszyszukaj
      drwinadziękujętoto_clueumnikostryzgadzam się
      źlepszczołablack_eyeblum3rumienić sięchwalić sięnuda
      ocenzurowaneuprzejmośćsekret2grozićzwycięstwoyusun_bespectacled
      shokrespektlolprevedwitamykrutoyya_za
      ya_dobryipomocnikne_huliganne_othodifludzakazzamknij

Radzimy przeczytać:

Podaj go do smartfona ...