Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Accurate temperatuur-, druk- en hoogtemeting met BMP280 en Arduino UNO

Onderdelen en benodigdheden

Arduino UNO × 1
Adafruit BMP280 × 1
Adafruit OLED 128x32 I2C × 1

Over dit project

Welkom bij deze tutorial waarin we de BMP280-sensor gebruiken om temperatuur, luchtdruk en hoogte te meten met behulp van een Arduino UNO en een OLED-display. Hier zijn de belangrijkste specificaties van de BMP280 volgens de datasheet:

Accurate temperatuur-, druk- en hoogtemeting met BMP280 en Arduino UNO

In dit project meten we alle parameters in zowel het metrieke als het imperiale stelsel. De eenheden kunnen in de code worden aangepast. Hieronder volgen de gebruikte componenten:

Accurate temperatuur-, druk- en hoogtemeting met BMP280 en Arduino UNO

Testen en probleemoplossing

Na het aansluiten van de module is het raadzaam de voorbeeldcode uit de bibliotheek ("BMP280test") te testen. Als de module niet wordt herkend (zoals in de onderstaande afbeelding):

Accurate temperatuur-, druk- en hoogtemeting met BMP280 en Arduino UNO

Voer dan de I²C-scanner code uit (los eventuele andere I²C-apparaten zoals LCD of OLED los). Als de module niet defect is en geen soldeerproblemen heeft, zal de scanner het apparaat detecteren:

Accurate temperatuur-, druk- en hoogtemeting met BMP280 en Arduino UNO

Noteer het adres (in dit voorbeeld 0x76) en open het C++-bestand van de bibliotheek (meestal in Documenten/Arduino/Libraries). Gebruik een geschikte editor (bijv. Dev-C++).

Accurate temperatuur-, druk- en hoogtemeting met BMP280 en Arduino UNO
Accurate temperatuur-, druk- en hoogtemeting met BMP280 en Arduino UNO

Ga naar regel 41 en wijzig het I²C-adres (_i2caddr) naar het adres dat je in de seriële monitor vond (vervang de "a" door het juiste adres):

Accurate temperatuur-, druk- en hoogtemeting met BMP280 en Arduino UNO

Sla op en sluit de editor. De bibliotheek is standaard bedoeld voor modules met adres 0x77, maar de gebruikte module heeft adres 0x76. Nu zou de testcode moeten werken:

Accurate temperatuur-, druk- en hoogtemeting met BMP280 en Arduino UNO

Testafbeeldingen

Accurate temperatuur-, druk- en hoogtemeting met BMP280 en Arduino UNO
Accurate temperatuur-, druk- en hoogtemeting met BMP280 en Arduino UNO

Ik hoop dat het voor jou ook werkt. Laat een reactie achter als je problemen ondervindt.

Code

Er zijn vier codebestanden beschikbaar voor verschillende configuraties:

  • bmp280_Serial_metric.ino – Metrische weergave op seriële monitor
  • bmp280_Serial_Imperial.ino – Imperiale weergave op seriële monitor
  • bmp280_OLED_m.ino – Metrische weergave op OLED
  • bmp280_OLED_US.ino – Imperiale weergave op OLED

bmp280_Serial_metric.ino

/* Deze code is voor gebruik met Adafruit BMP280 (Metrisch)
 * Meet temperatuur en druk en toont ze op de seriële monitor met hoogte
 * Gewijzigde versie van de Adafruit-voorbeeldcode
 * Zie www.surtrtech.com of SurtrTech YouTube-kanaal */
#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("Geen geldige BMP280-sensor gevonden, check bedrading!"));
    while (1);
  }
  /* Standaardinstellingen uit datasheet. */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Bedrijfsmodus */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temperatuur oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Druk oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering */
                  Adafruit_BMP280::STANDBY_MS_500); /* Wachttijd */
}

void loop() {
  Serial.print(F("Temperatuur = "));
  Serial.print(bmp.readTemperature());
  Serial.println(" *C");
  Serial.print(F("Druk = "));
  Serial.print(bmp.readPressure()/100); // Druk in hPa
  Serial.println(" hPa");
  Serial.print(F("Benaderende hoogte = "));
  Serial.print(bmp.readAltitude(1019.66)); // 1019.66 hPa = luchtdruk op zeeniveau in jouw regio
  Serial.println(" m");
  Serial.println();
  delay(2000);
}

bmp280_Serial_Imperial.ino

/* Deze code is voor gebruik met Adafruit BMP280 (Imperiaal)
 * Meet temperatuur en druk en toont ze op de seriële monitor met hoogte
 * Gewijzigde versie van de Adafruit-voorbeeldcode
 * Zie www.surtrtech.com of SurtrTech YouTube-kanaal */
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C

void setup() {
  Serial.begin(9600);
  Serial.println(F("BMP280 test"));
  if (!bmp.begin()) {
    Serial.println(F("Geen geldige BMP280-sensor gevonden, check bedrading!"));
    while (1);
  }
  /* Standaardinstellingen uit datasheet. */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
                  Adafruit_BMP280::SAMPLING_X2,
                  Adafruit_BMP280::SAMPLING_X16,
                  Adafruit_BMP280::FILTER_X16,
                  Adafruit_BMP280::STANDBY_MS_500);
}

void loop() {
  float f = bmp.readTemperature()*9/5 + 32; // Conversie van C naar F
  Serial.print(F("Temperatuur = "));
  Serial.print(f);
  Serial.println(" *F");
  float P = bmp.readPressure()/3386.39; // Druk in inches mercury
  Serial.print(F("Druk = "));
  Serial.print(P);
  Serial.println(" inHg");
  float A = bmp.readAltitude(1019.66)*3.28084; // Hoogte in voet
  Serial.print(F("Benaderende hoogte = "));
  Serial.print(A);
  Serial.println(" ft");
  Serial.println();
  delay(2000);
}

bmp280_OLED_m.ino (Metrisch)

/* Deze code is voor gebruik met Adafruit BMP280 en OLED-scherm (Metrisch)
 * Meet temperatuur en druk en toont ze op het OLED-display met hoogte
 * Gewijzigde versie van de Adafruit-voorbeeldcode
 * Zie www.surtrtech.com of SurtrTech YouTube-kanaal */
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BMP280 bmp;

void setup() {
  bmp.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.display();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.print("SurtrTech");
  display.setCursor(32,12);
  display.setTextSize(2);
  display.println("BMP280");
  display.display();
  delay(2000);
}

void loop() {
  display.clearDisplay();
  float T = bmp.readTemperature(); // Temperatuur in °C
  float P = bmp.readPressure()/100; // Druk in hPa
  float A = bmp.readAltitude(1019.66); // Hoogte in meters

  display.setCursor(0,0);
  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("Druk");
  display.setCursor(65,10);
  display.print(P);
  display.setCursor(110,10);
  display.print("hPa");
  display.setCursor(65,25);
  display.print("Hoogte");
  display.setCursor(90,25);
  display.print(A,0);
  display.setCursor(110,25);
  display.print("m");
  display.display();
  delay(2000);
}

bmp280_OLED_US.ino (Imperiaal)

/* Deze code is voor gebruik met Adafruit BMP280 en OLED-scherm (Imperiaal)
 * Meet temperatuur en druk en toont ze op het OLED-display met hoogte
 * Gewijzigde versie van de Adafruit-voorbeeldcode
 * Zie www.surtrtech.com of SurtrTech YouTube-kanaal */
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BMP280 bmp;

void setup() {
  bmp.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.display();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.print("SurtrTech");
  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; // Temperatuur in °F
  float P = bmp.readPressure()/3386.39; // Druk in inHg
  float A = bmp.readAltitude(1019.66)*3.28084; // Hoogte in voet

  display.setCursor(0,0);
  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("Druk");
  display.setCursor(65,10);
  display.print(P);
  display.setCursor(100,10);
  display.print("inHg");
  display.setCursor(65,25);
  display.print("Hoogte");
  display.setCursor(90,25);
  display.print(A,0);
  display.setCursor(110,25);
  display.print("ft");
  display.display();
  delay(2000);
}

Nuttige bibliotheken

Schema

Beide modules gebruiken de I²C-interface (SDA/SCL op A4 en A5). De BMP280 wordt gevoed met 5V, de OLED met 3,3V.

Accurate temperatuur-, druk- en hoogtemeting met BMP280 en Arduino UNO

Productieproces

  1. Geïntegreerde QR, RFID en Temperatuurverificatie Toegangscontrolesysteem
  2. Meerdere DS18B20 1-Wire Sensoren Aan Een Raspberry Pi Koppelen Voor Nauwkeurige Temperatuurmonitoring
  3. Een externe temperatuursensor bouwen met Raspberry Pi en Python – Stap-voor-stap handleiding
  4. Naadloze temperatuur- en vochtigheidsbewaking op Raspberry Pi met EzTemp
  5. DIY thuisbrouw temperatuurcontrole: Monitoren & regelen met Arduino
  6. Raspberry Pi BMP085: Accurate temperatuur- en drukmetingen via I2C
  7. Precieze thermocouple-metingen en logging voor lab- en wetenschappelijke experimenten
  8. Een Multi-sensor Temperatuur- & Lichtmonitoringssysteem Bouwen met Raspberry Pi & DS18B20
  9. Precisie druk- en luchtstroommeting met analoge sensor en Arduino
  10. Arduino temperatuur- en vochtigheidslogger met DHT11 en Ethernet Shield
  11. Nauwkeurige Frequentie- en Duty Cycle-meting met Arduino UNO