Pengukuran Suhu, Tekanan, dan Ketinggian yang Akurat dengan BMP280 dan Arduino UNO
Komponen dan Perlengkapan
Arduino UNO
×
1
Adafruit BMP280
×
1
Adafruit OLED 128x32 i2c
×
1
Tentang Proyek Ini
Halo, dan selamat datang dalam tutorial ini di mana saya menggunakan BMP280 untuk mengukur suhu, tekanan, dan juga ketinggian, dengan bantuan papan Arduino UNO dan layar OLED. Berikut adalah beberapa parameter kunci BMP280 dari datasheet-nya:
Untuk proyek ini, kita akan menggunakan modul untuk mengukur semua hal ini baik dalam sistem metrik maupun imperial. Saya tidak yakin tentang satuan yang digunakan, tetapi Anda selalu dapat mengonversinya melalui kode, dan berikut adalah komponen yang akan kita gunakan:
Pengujian dan Pemecahan Masalah:
Setelah merangkai modul Anda, lebih baik untuk menguji kode dari contoh perpustakaan yang bernama “BMP280test”. Jika modul Anda tidak terdeteksi seperti dalam gambar di bawah ini:
Anda dapat menjalankan kode i²c scanner (tetapi lepaskan perangkat i²c lain seperti LCD atau OLED). Jika modul Anda tidak rusak atau tidak ada masalah solder, Anda akan melihat bahwa perangkat terdeteksi oleh scanner:
Catat alamat tersebut dan buka file C++ perpustakaan Anda. Perpustakaan biasanya terinstal di “Documents/Arduino/Libraries”:
Bukalah dengan editor yang tepat, saya menggunakan Dev C++.
Lalu pergi ke baris “41” dan ubah _i2caddr, ganti “a” dengan alamat yang Anda temukan di serial monitor:
Simpan semua dan tutup. Perpustakaan dimaksudkan untuk bekerja dengan modul yang memiliki alamat i²c 0x77, tetapi yang saya gunakan memiliki 0x76.
Jalankan kembali kode pengujian:
Gambar Hasil Pengujian:
Saya harap ini bermanfaat bagi Anda, dan jika Anda memiliki masalah, silakan tulis di komentar.
Kode
bmp280_Serial_metric.ino
bmp280_Serial_Imperial.ino
bmp280_OLED_m.ino
bmp280_OLED_US.ino
bmp280_Serial_metric.inoArduino
/* This code is to use with Adafruit BMP280 (Metric) * It measures both temperature and pressure and it displays them on the Serial monitor with the altitude * It's a modified version of the Adafruit example code * Refer to www.surtrtech.com or SurtrTech Youtube channel */ #include <Adafruit_BMP280.h> Adafruit_BMP280 bmp; // I2C Interface void setup() { Serial.begin(9600); Serial.println(F("BMP280 test")); if (!bmp.begin()) { Serial.println(F("Could not find a valid BMP280 sensor, check wiring!")); while (1); } /* Default settings from datasheet. */ bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */ Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */ Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */ Adafruit_BMP280::FILTER_X16, /* Filtering. */ Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */ } void loop() { Serial.print(F("Temperature = ")); Serial.print(bmp.readTemperature()); Serial.println(" *C"); Serial.print(F("Pressure = ")); Serial.print(bmp.readPressure()/100); //displaying the Pressure in hPa, you can change the unit Serial.println(" hPa"); Serial.print(F("Approx altitude = ")); Serial.print(bmp.readAltitude(1019.66)); //The "1019.66" is the pressure(hPa) at sea level in day in your region Serial.println(" m"); //If you don't know it, modify it until you get your current altitude Serial.println(); delay(2000); }
bmp280_Serial_Imperial.inoArduino
/* This code is to use with Adafruit BMP280 (Imperial) * It measures both temperature and pressure and it displays them on the Serial monitor with the altitude * It's a modified version of the Adafruit example code * Refer to www.surtrtech.com or SurtrTech Youtube channel */ #include <Adafruit_BMP280.h> Adafruit_BMP280 bmp; // I2C void setup() { Serial.begin(9600); Serial.println(F("BMP280 test")); if (!bmp.begin()) { Serial.println(F("Could not find a valid BMP280 sensor, check wiring!")); while (1); } /* Default settings from datasheet. */ bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */ Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */ Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */ Adafruit_BMP280::FILTER_X16, /* Filtering. */ Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */ } void loop() { float f = bmp.readTemperature()*9/5 + 32 ; //Conversion from C to F Serial.print(F("Temperature = ")); Serial.print(f); Serial.println(" *F"); float P = bmp.readPressure()/3386.39; //displaying the Pressure in inches of mercury, you can change the unit Serial.print(F("Pressure = ")); Serial.print(P); Serial.println(" inHg"); float A = bmp.readAltitude(1019.66)*3.28084; //The "1019.66" is the pressure(hPa) at sea level in day in your region Serial.print(F("Approx altitude = ")); //If you don't know it, modify it until you get your current altitude Serial.print(A); Serial.println(" ft"); Serial.println(); delay(2000); }
bmp280_OLED_m.inoArduino
/* This code is to use with Adafruit BMP280 and OLED screen (Metric) * It measures both temperature and pressure and it displays them on the OLED display with the altitude * It's a modified version of the Adafruit example code * Refer to www.surtrtech.com or SurtrTech Youtube channel */ #include <Adafruit_GFX.h> //Libraries for the OLED and BMP280 #include <Adafruit_SSD1306.h> #include <Adafruit_BMP280.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 32 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Declaring the display name (display) Adafruit_BMP280 bmp; void setup() { bmp.begin(); //Start the bmp display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Start the OLED display display.clearDisplay(); display.display(); display.setTextColor(WHITE); display.setTextSize(1); display.print("SurtrTech"); //Show the name, you can remove it or replace it display.setCursor(32,12); display.setTextSize(2); display.println("BMP280"); display.display(); delay(2000); } void loop() { display.clearDisplay(); float T = bmp.readTemperature(); //Read temperature in C float P = bmp.readPressure()/100; //Read Pressure in Pa and conversion to hPa float A = bmp.readAltitude(1019.66); //Calculating the Altitude, the "1019.66" is the pressure in (hPa) at sea level at day in your region //If you don't know it just modify it until you get the altitude of your place display.setCursor(0,0); //Oled display, just playing with text size and cursor to get the display you want display.setTextColor(WHITE); display.setTextSize(2); display.print("Temp"); display.setCursor(0,18); display.print(T,1); display.setCursor(50,17); display.setTextSize(1); display.print("C"); display.setTextSize(1); display.setCursor(65,0); display.print("Pres"); display.setCursor(65,10); display.print(P); display.setCursor(110,10); display.print("hPa"); display.setCursor(65,25); display.print("Alt"); display.setCursor(90,25); display.print(A,0); display.setCursor(110,25); display.print("m"); display.display(); delay(2000); }
bmp280_OLED_US.inoArduino
/* This code is to use with Adafruit BMP280 and OLED screen (Imperial) * It measures both temperature and pressure and it displays them on the OLED display with the altitude * It's a modified version of the Adafruit example code * Refer to www.surtrtech.com or SurtrTech Youtube channel */ #include <Adafruit_GFX.h> //Libraries for the OLED and BMP280 #include <Adafruit_SSD1306.h> #include <Adafruit_BMP280.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 32 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Declaring the display name (display) Adafruit_BMP280 bmp; void setup() { bmp.begin(); //Start the bmp display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Start the OLED display display.clearDisplay(); display.display(); display.setTextColor(WHITE); display.setTextSize(1); display.print("SurtrTech"); //Show the name, you can remove it or replace it display.setCursor(32,12); display.setTextSize(2); display.println("BMP280"); display.display(); delay(2000); } void loop() { display.clearDisplay(); float T = bmp.readTemperature()*9/5 + 32; //Read temperature in C and conversion to F float P = bmp.readPressure()/3386.39; //Read Pressure in Pa and conversion to inches of mercury float A = bmp.readAltitude(1019.66)*3.28084; //Calculating the Altitude, the "1019.66" is the pressure in(hPa) at sea level at day in your region //If you don't know it just modify it until you get the altitude of your place display.setCursor(0,0); //Oled display, just playing with text size and cursor to get the display you want display.setTextColor(WHITE); display.setTextSize(2); display.print("Temp"); display.setCursor(0,18); display.print(T,1); display.setCursor(50,17); display.setTextSize(1); display.print("F"); display.setTextSize(1); display.setCursor(65,0); display.print("Pres"); display.setCursor(65,10); display.print(P); display.setCursor(100,10); display.print("inHg"); display.setCursor(65,25); display.print("Alt"); display.setCursor(90,25); display.print(A,0); display.setCursor(110,25); display.print("ft"); display.display(); delay(2000); }
BMP280_Adafruit_library
Anda mungkin ingin mengubah hal-hal seperti dalam tutorialhttps://github.com/adafruit/Adafruit_BMP280_Library
Adafruit GFX library
https://github.com/adafruit/Adafruit-GFX-Library
Adafruit SSD1306
https://github.com/adafruit/Adafruit_SSD1306
Skematis
Kedua modul menggunakan antarmuka i²c, SDA/SCL dengan A4 dan A5, BMP280 dipancarkan oleh 5v sementara OLED menggunakan 3.3v.