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:
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 |
OLED displej
OLED displej pozostáva z organickej diódy emitujúce svetlo (OLED alebo Organic LED), známe tiež ako organická EL (organická elektroluminiscenčné). Jedná sa o diódu, v ktorej je emisný elektroluminiscenč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:
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:
- Adafruit_BMP280.h pre modul BMP280
- Adafruit_SSD1306.h pre OLED displej
- Fonts / FreeSerif9pt7b.h - pre zmenšenie fontu
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(); }