STM32duino IV. — Čteme teplotu a vlhkost z Si7021 (I2C sběrnice)

Ve čtvrtém díle našeho seriálu o STM32duino se podíváme na I2C sběrnici. Ukážeme si výchozí I2C sběrnici a také připojení SDA a SCL na jiné GPIO.

Všechny díly seriálu o STM32duino:
STM32duino I. — Jak začít s STM32 jako Arduino
STM32duino II. — Ovládáme GPIO
STM32duino III. — Komunikujeme pomocí Serial (USART)
STM32duino IV. — Čteme teplotu a vlhkost z Si7021 (I2C sběrnice)

Mikrokontroléry STM32 mohou obsahovat více I2C sběrnic. Které piny jsou přiřazeny ke které I2C instanci najdete v souboru PeripheralPins.c — pro STM32F411 ho můžete prohlédnout přímo na GitHubu.

Knihovna pro ovládání čidla Si7021: LowPowerLab SI7021 na GitHubu.

Zapojení I2C pinů na Nucleo-64

Zapojení I2C pro vaší Nucleo vývojovou desku najdete v souboru PeripheralPins.c:

Základní zapojení I2C1: SDA — PB9 (D14), SCL — PB8 (D15). Alternativní zapojení: SCL — PB6 (D10), SDA — PB7.

STM32duino mapuje piny na I2C instance automaticky podle tabulky v PeripheralPins.c — jakmile zavoláte Wire.setSCL(PB10), knihovna sama zjistí, že PB10 patří I2C2, a použije ji. Není potřeba I2C instanci specifikovat ručně.

Poznámka pro BluePill/BlackPill: I2C1 je na pinu PB6 (SCL) / PB7 (SDA), ne na PB8/PB9 jako u Nuclea. Vždy ověřte pinout své konkrétní desky.


I2C1 sběrnice — výchozí piny (PB9 / PB8)

Celý kód naleznete na GitHubu.

#include <Wire.h>
#include <SI7021.h>

SI7021 sensor;

void setup() {
  sensor.begin();
  Serial.begin(9600);

  while (!Serial) {
    delay(100);
  }

  Serial.println("Test of Si7021");

  if (!sensor.begin()) {
    Serial.println("Si7021 sensor wasn't found");
    while (true);
  }
}

void loop() {
  Serial.print("Temperature: ");
  Serial.print(String(sensor.getCelsiusHundredths() / 100.0, 2));  // 2450 = 24.50 °C
  Serial.println(" °C");

  Serial.print("Humidity: ");
  Serial.print(sensor.getHumidityPercent());
  Serial.println(" %");

  delay(1000);
}

I2C1 sběrnice — alternativní piny (PB7 / PB6)

Důležitou změnou jsou funkce Wire.setSCL(PB6) a Wire.setSDA(PB7) definující změnu zapojení. Musí být volány před sensor.begin().

Celý kód naleznete na GitHubu.

#include <Wire.h>
#include <SI7021.h>

SI7021 sensor;

void setup() {
  Wire.setSCL(PB6);  // alternativní SCL: PB6 (Morpho) místo PB8 (D15)
  Wire.setSDA(PB7);  // alternativní SDA: PB7 místo PB9 (D14)

  sensor.begin();
  Serial.begin(9600);

  while (!Serial) {
    delay(100);
  }

  Serial.println("Test of Si7021 and STM32duino");

  if (!sensor.begin()) {
    Serial.println("Si7021 sensor wasn't found");
    while (true);
  }
}

void loop() {
  Serial.print("Temperature: ");
  Serial.print(String(sensor.getCelsiusHundredths() / 100.0, 2));
  Serial.println(" °C");

  Serial.print("Humidity: ");
  Serial.print(sensor.getHumidityPercent());
  Serial.println(" %");

  delay(1000);
}

I2C2 sběrnice — výchozí piny (PB3 / PB10)

Pro I2C2 nastavíte piny SCL — PB10 (D6) a SDA — PB3 (D3). STM32duino automaticky vybere I2C2 jako aktivní I2C sběrnici na základě těchto pinů.

Celý kód naleznete na GitHubu.

#include <Wire.h>
#include <SI7021.h>

SI7021 sensor;

void setup() {
  Wire.setSCL(PB10);  // I2C2_SCL — PB10 (D6)
  Wire.setSDA(PB3);   // I2C2_SDA — PB3 (D3)

  sensor.begin();
  Serial.begin(9600);

  while (!Serial) {
    delay(100);
  }

  Serial.println("Test of Si7021 and STM32duino");

  if (!sensor.begin()) {
    Serial.println("Si7021 sensor wasn't found");
    while (true);
  }
}

void loop() {
  Serial.print("Temperature: ");
  Serial.print(String(sensor.getCelsiusHundredths() / 100.0, 2));
  Serial.println(" °C");

  Serial.print("Humidity: ");
  Serial.print(sensor.getHumidityPercent());
  Serial.println(" %");

  delay(1000);
}

I2C3 sběrnice

Pro I2C3 sběrnice platí stejný postup jako u I2C2 — voláním Wire.setSCL() a Wire.setSDA() s piny příslušími I2C3 (viz pinout výše nebo PeripheralPins.c) STM32duino automaticky vybere I2C3.


Kompatibilita s dalšími senzory

Stejný přístup (volání Wire.setSCL() / Wire.setSDA() před inicializací senzoru) funguje i s jinými I2C senzory. Testováno na STM32 G071 s těmito senzory a knihovnami:

  • SHT40 — Adafruit knihovna
  • BMP180 — Adafruit knihovna
  • SCD41Sensirion knihovna
  • OLED SSD1306 — Adafruit knihovna

A to je v tomto díle o STM32duino vše. Pokud se vám díl líbil, budu rád, když jej budete sdílet s hashtagem #STM32duino.

Sdílejte článek:
Ukaž světu,
že jsi Maker!
Koupit tričko
Kafe pro Chiptrona
Dodej energii dalšímu článku

Související články

Ve třetím díle si ukážeme použití snad nejpopulárnější sběrnice – USART, v Arduino světě je nazývána jako Serial.

Ve druhém díle o STM32duino si ukážeme práci s digitálními vstupy a výstupy.

Arduino je velmi populární platforma s rozsáhlou komunitní podporou.

Tenhle článek vznikl jako přehled čidel, která se na chiptron.cz objevují nejčastěji – v návodech, meteostanicích, projektech kvality vzduchu i DIY bastlení. Pro každé čidlo najdete klíčové parametry, knihovny pro Arduino / ESP32, případně odkaz na ESPHome nebo Home Assistant integraci, tipy,…

Další článek o hrátkách s ESP32, použití development boardu SunDuino ESP32 a teplotní/vlhkostního čidla Si7021 (HTU21).

Trendy