Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

BMP280 a OLED displej pre Arduino

V minulej lekcii, Arduino a práca s tlačidlami , sme sa naučili pracovať s tlačidlom.

Dnes si zostavíme a oživíme Arduino merač teploty a tlaku s OLED displejom. Výsledok bude nasledujúce:

Arduino BMP280 a OLED displej - Arduino

BMP280

Je potrebné rozlišovať medzi modulom a senzorom. Modul väčšinou predstavuje dosku plošných spojov (angl. PCB), na ktorej je integrovaný senzor s príslušnou elektronikou (odpory, kondenzátory, deličmi napätie a pod.).

Modul BMP280 pozostáva zo senzora BMP280 od firmy Bosch a pasívnych súčiastok (rezistory, kondenzátor). Umožňuje meranie teploty a tlaku a jedná sa o MEMS (skr. Micro-Electro-Mechanical Systems), teda mechanické konštrukcie veľmi malých rozmerov (pod 1 mm). Samotný senzor má rozmery 2,5 mm x 2 mm x 0,95 mm. Výrobca udáva rozsahy a presnosť merania nasledovne:

Absolútna presnosť tlaku ~ ± 1 hPa
Relatívna presnosť tlaku ± 0.12 hPa
Absolútna presnosť teploty ~ ± 1 ° C
rozsah 300 ... 1100 hPa, -40 ... 85 ° C
Zdroj: https://www.bosch-sensortec.com/...mp280-1.html

OLED displej

OLED displej pozostáva z organickej diódy emitujúce svetlo (OLED alebo Organic LED), známe tiež ako organická EL (organická elektroluminis­cenčné). Jedná sa o diódu, v ktorej je emisný elektroluminis­cenčných vrstvou film organické zlúčeniny, ktorý vyžaruje svetlo v reakcii na elektrický prúd.

Súčiastky

Budeme potrebovať:

  • Arduino Nano a USB kábel na nahranie kódu
  • modul BMP280
  • OLED displej 0x96
  • Breadboard (skúšobná nepájivé pole)
  • Dupont káble

Zapojenia obvodu

Ukážme si ako všetko zapojíme:

Zapojenie OLED displeja a senzoru BMP280 do Arduino - Arduino

Senzor BMP280 prepojíme s Arduino pomocou 4 dupont káblov. 2 slúži na napájanie (VCC → 3v3 a GND → GND) a ďalšie 2 káble na I2C komunikáciu (SCL → A5 a SDA → A4). Senzor pracuje s presnosťou 100 Pa a 1 ° C. OLED displej komunikuje prostredníctvom I2C protokolu a stačí ho teda s Arduino prepojiť rovnako ako senzor.

Kód

Knižnice

Pre kompiláciu kódu budeme potrebovať tieto knižnice, ktoré je nutné rozbaliť v priečinku pre knižnice:

Samotný kód

Na začiatku vypíšeme knižnice, ktoré budeme nutne potrebovať. Bez nich sa kód nezkompiluje:

#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSerif9pt7b.h>
#include <Adafruit_BMP280.h>

Ďalej zadáme Aj 2 C adresu senzora BMP280. Pozor, stretol som sa so senzormi, ktoré mali inú adresu, ako bolo deklarované výrobcom. Išlo o čínskej napodobeniny. V takom prípade je nutné zistiť ich adresu. Použijeme aj príkaz na reštart displeja po stlačení resetovacieho tlačidla:

#define OLED_ADDR   0x3C
Adafruit_SSD1306 display(-1);

Premenné

Nadefinujeme premenné temp a pressure pre teplotu a tlak a inicializujeme senzor z knižnice:

// BMP280
float temp;
float pressure;
Adafruit_BMP280 bmp; // I2C

Ďalej si vytvoríme premennú pre grafické zobrazenie stupňa u jednotky ° C:

// symbol
// degree for Celsius
const unsigned char degree [] PROGMEM =
{
 0xe,0x11,0x11,0x11,0xe,0x0,0x0,0x0
};

Užitočné príkazy

Teraz si ukážme niekoľko užitočných príkazov.

Displej vyčistíme takto:

display.clearDisplay();

Takto nastavíme kurzor na pozíciu x, y:

display.setCursor(1, 12);

Zobrazíme reťazec (príp. Premennú) na displeji:

display.print("Neco");
display.print(nazov_premennej);

Predchádzajúce príkazy len nastaví to, čo chceme zobraziť. Aby to displej naozaj zobrazil, musí sa za objednávok zapísať:

display.display();

Funkcie

Ktorej vieme ako vypisovať na displej, poďme si pripraviť funkcie nášho programu.

Na začiatku spustení sa zobrazí na displeji informácia o presnosti senzora. Na to slúži funkcia display_info():

void display_values()
{
  //display.drawPixel(120, 50, WHITE);
  display.clearDisplay();
  display.setCursor(1, 12);
  display.print("BMP280");
  display.setCursor(1, 38);
  display.print(temp);
  display.drawBitmap(50, 26,  degree, 8,5 , WHITE);
  display.setCursor(58, 38);
  display.print("C");
  display.setCursor(1, 57);
  display.print(pressure);
  display.setCursor(85, 57);
  display.print("Pa");
  display.display();
}

Pre zobrazenie nameraných údajov slúži funkcia void display_values():

void display_values()
{
  // display.drawPixel(120, 50, WHITE);
  display.clearDisplay();
  display.setCursor(1, 12);
  display.print("BMP280");
  display.setCursor(1, 38);
  display.print(temp);
  display.drawBitmap(50, 26,  degree, 8,5 , WHITE);
  display.setCursor(58, 38);
  display.print("C");
  display.setCursor(1, 57);
  display.print(pressure);
  display.setCursor(85, 57);
  display.print("Pa");
  display.display();
}

Funkciu setup() pridáme na účel inicializácia komunikácie so senzorom a displejom. Zároveň v nej nastavíme vlastnosti textu (veľkosť a font):

void setup()
{
   bme.begin();

  // setup for oled display
  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setFont(&FreeSerif9pt7b);
  display.setCursor(1, 12);
  display_info();
  delay(1500);
}

Teraz pridáme funkciu loop(). V nej program zmeria a uloží namerané hodnoty teploty a tlaku do príslušných premenných. Zároveň zavolá funkciu display_values():

void loop()
{
  temp = bme.readTemperature();
  pressure = bme.readPressure();
  display_values();
}

Celý kód

Celý kód pre skopírovanie a vyskúšanie nájdete nižšie:

#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSerif9pt7b.h>
#include <Adafruit_BMP280.h>

// OLED display
#define OLED_ADDR   0x3C
Adafruit_SSD1306 display(-1);  // - 1 for restart display with restart button on arduino board

// BMP280
float temp;
float pressure;
Adafruit_BMP280 bmp; // I2C

// symbol
// degree for Celsius
const unsigned char degree [] PROGMEM =
{
  0xe,0x11,0x11,0x11,0xe,0x0,0x0,0x0
};

void setup()
{
   bme.begin();

  // setup for oled display
  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setFont(&FreeSerif9pt7b);
  display.setCursor(1, 12);
  display_info();
  delay(1500);
}

void loop()
{
 temp= bme.readTemperature();
 pressure = bme.readPressure();
 display_values();
}

void display_info()
{
  //display.drawPixel(120, 50, WHITE);
  display.clearDisplay();
  display.setCursor(1, 11);
  display.print("Accuracy");
  display.setCursor(1, 38);
  display.print("1 ");
  display.drawBitmap(20, 26,  degree, 8,5 , WHITE);
  display.setCursor(28, 38);
  display.print("C");
  display.setCursor(1, 57);
  display.print("100");
  display.setCursor(50, 57);
  display.print("Pa");
  display.display();
}

void display_values()
{
  //display.drawPixel(120, 50, WHITE);
  display.clearDisplay();
  display.setCursor(1, 12);
  display.print("BMP280");
  display.setCursor(1, 38);
  display.print(temp);
  display.drawBitmap(50, 26,  degree, 8,5 , WHITE);
  display.setCursor(58, 38);
  display.print("C");
  display.setCursor(1, 57);
  display.print(pressure);
  display.setCursor(85, 57);
  display.print("Pa");
  display.display();
}

 

Predchádzajúci článok
Arduino a práca s tlačidlami
Všetky články v sekcii
Arduino
Článok pre vás napísal michal
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor sa venuje vzdelávaniu a má rad novinky vo vzdelávani.
Aktivity