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
- SCD41 — Sensirion 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.








Žádné sociální komentáře k dispozici.