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

Ve čtvrtém díle našeho seriálu o STM32duino se konečně podíváme na slibovanou I2C sběrnici.

Ukážeme si výchozí I2C sběrnici a také připojení SDA,SCL na jiné GPIO.

Upozornění. I2C na STM32 (G071) bylo testováno 12.6.2023 s dalšími senzory jako SHT40 (adafruit knihovna), BMP180 (Adafruit knihovna), SCD41 (Sensirion knihovna) a OLED s SSD1306 (Adafruit knihovna).

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.

Velmi důležitým dokumentem bude opět tento soubor popisující zapojení Nucleo vývojových desek.
http://www.st.com/content/ccc/resource/technical/document/user_manual/98/2e/fa/4b/e0/82/43/b7/DM00105823.pdf/files/DM00105823.pdf/jcr:content/translations/en.DM00105823.pdf

Knihovna pro ovládání čidla Si7021 je tato:
https://github.com/LowPowerLab/SI7021

Zapojení I2C pro vaší Nucleo vývojovou desku s STM32 najdete níže.

Je to výřez ze soubotu PeripheralPins.cpp.

Základní zapojení je následující. SDA je připojeno na PB9 (D14), SCL na PB8 (D15). Alternativní zapojení je pak SCL-PB6 (D10) a SDA-PB7.

I2C1 sběrnice na výchozích pinech:
Celý kód naleznete zde.
#include

#include

SI7021 sensor;

// the setup function runs once when you press reset or power the board

void setup()

{

sensor.begin(); // initialization of Si7021 sensor

Serial.begin(9600); // initialization of Serial (STLink), 9600 Bd

// wait for serial

while (!Serial) {

delay(100);

}

Serial.println(„Test of Si7021“);

if (!sensor.begin())

{

Serial.println(„Si7021 sensor wasn’t found“);

while (true);

}

}

// the loop function runs over and over again forever

void loop()

{

// send data through onboard USB-UART converter (STLink)

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 na alternativních pinech:
Celý kód naleznete zde.

Důležitou změnou jsou funkce Wire.setSCL(PB6) a Wire.setSDA(PB7) definující změnu zapojení.

#include

#include

SI7021 sensor;

// the setup function runs once when you press reset or power the board

void setup()

{

Wire.setSCL(PB6); // alternative pinout of I2C1_SCL – PB6 (Morpho con) instead of PB8 (D15)

Wire.setSDA(PB7); // alternative pinout of I2C1_SDA – PB7 (D10) instead of PB9 (D14)

sensor.begin(); // initialization of Si7021 sensor

Serial.begin(9600); // initialization of Serial (STLink), 9600 Bd

// wait for serial

while (!Serial)

{

delay(100);

}

Serial.println(„Test of Si7021 and STM32duino“);

if (!sensor.begin())

{

Serial.println(„Si7021 sensor wasn’t found“);

while (true);

}

}

// the loop function runs over and over again forever

void loop()

{

// send data through onboard USB-UART converter (STLink)

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);

}

I2C2 sběrnice a výchozích pinech
Celý kód naleznete zde.

Stejně jako při použití alternativního zapojení I2C1 sběrnice, důležité jsou funkce setSDA a setSCL.

Správnou volbou GPIO se automaticky nastaví jiná I2C sběrnice.

V tomto případě SCL-PB10 (D6) a SDA-PB3 (D3). Automaticky se tedy vybere I2C2 jako hlavní I2C sběrnice.

#include

#include

SI7021 sensor;

// the setup function runs once when you press reset or power the board

void setup()

{

Wire.setSCL(PB_6); // alternative pinout of I2C1_SCL – PB6 (Morpho con) instead of PB8 (D15)

Wire.setSDA(PB_7); // alternative pinout of I2C1_SDA – PB7 (D10) instead of PB9 (D14)

sensor.begin(); // initialization of Si7021 sensor

Serial.begin(9600); // initialization of Serial (STLink), 9600 Bd

// wait for serial

while (!Serial)

{

delay(100);

}

Serial.println(„Test of Si7021 and STM32duino“);

if (!sensor.begin())

{

Serial.println(„Si7021 sensor wasn’t found“);

while (true);

}

}

// the loop function runs over and over again forever

void loop()

{

// send data through onboard USB-UART converter (STLink)

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);

}

Pro I2C sběrnice číslo 3 pak platí podobné jako u předchozích příkladech.

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 hastagem #STM32duino.

Sdílejte článek:

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.

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

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

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