SHT30 je poměrně přesné čidlo, které měří teplotu a relativní vlhkost. Je zkalibrované přímo z výroby a komunikuje pomocí sběrnice I2C. Dá se koupit třeba v Laskakitu (cena je příjemná 94 Kč).

Specifikace

  • Napájení: 2,4-5,5V

  • Rozlišení: 16bit

  • Rozsah měření teploty: -40-125°C

  • Rozlišení měření teploty: 0,1°C

  • Přesnost měření teploty: 0,3°C

  • Rozsah měření vlhkosti: 0-100% RH

  • Rozlišení měření vlhkosti: 0,1% RH

  • Přesnost měření vlhkosti: +3% RH

  • Rozměry: 17x12mm

  • I2C adresa: 0x44

Projekt používá universální knihovnu pico-sensor-lib, kterou napsal pan Timo Kokkonen a která funguje s následujícími čidly (všechny na I2C sběrnici):

  • ADT7410

  • AHT1x

  • AHT2x

  • AM2320

  • AS621x

  • BMP180

  • BMP280

  • DPS310

  • HDC302x

  • HTS221

  • HTU31D

  • LPSxx

  • MCP9808

  • MPL115A2

  • MPL3115A2

  • MS5611

  • MS8607

  • PCT2075

  • SHT3x

  • SHT4x

  • SHTC3

  • SI7021

  • SPA06

  • SPL07

  • STT22H

  • TC74

  • TMP102

  • TMP11x

Čidlo teploty a relativní vlhkosti SHT30

SHT3X DIS

Použití knihovny pico-sensor_lib

V adresáři projektu vytvořte podadresář libs a naklonujte knihovnu z Githubu

---
$ mkdir libs
$ cd libs
$ git clone https://github.com/tjko/pico-sensor-lib
---

Přidejte ji do CMakeLists.txt takto:

# Include pico-sensor-lib library.
add_subdirectory(libs/pico-sensor-lib)

target_link_libraries(myprogram PRIVATE
  ...
  pico_sensor_lib
  )

V céčku je je použití velmi jednoduché:

#include "pico_sensor_lib.h"

// nastavte I2C sběrnici

// Inicializujte čidlo
void *ctx = NULL;
int res = i2c_init_sensor(get_i2c_sensor_type("SHT30"), i2cbus, 0x44, &ctx);
if (res) {
   // nepodařilo se nastavit čidlo...
}


// měření
int delay = i2c_start_measurement(ctx);
if (delay < 0) {
  // čidlo se pokazilo, nechce měřit
}
sleep_ms(delay);

float temp, pressure, humidity;
int res = i2c_read_measurement(ctx, &temp, &pressure, &humidity);
if (res) {
  // nemohu přečíst naměřené hodnoty...
}

Zdrojové kódy

Zobrazení hodnot teploty a relativní vlhkosti je provádí na OLED displeji SSD1306 (připojen na i2c0 piny SDA — GPIO4 a SCL — GPIO5). Používám knihovnu ssd1306_utf8. Popis instalace a použití.

Čidlo SHT30 je zapojeno na i2c1, piny SCL — GPIO15 a SDA — GPIO14. Bylo by jistě možné zapojit čidlo na i2c0, ale nezkoušel jsem to.

CMakeLists.txt
cmake_minimum_required(VERSION 3.13)
include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)

project(teplota_sht30 C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

pico_sdk_init()
include($ENV{LIB_SSD1306_UTF8_PATH}/pico_lib_ssd1306_utf8_import.cmake)

add_subdirectory(libs/pico-sensor-lib)


add_executable(teplota_sht30
    teplota_sht30.c
)

target_include_directories(teplota_sht30 PRIVATE
    ${CMAKE_CURRENT_LIST_DIR}
    ${ssd1306_utf8_SOURCE_DIR}/src
)

target_link_libraries(teplota_sht30
    pico_stdlib
    hardware_i2c
    ssd1306_utf8
    pico_sensor_lib
    )
pico_enable_stdio_usb(teplota_sht30 1)
pico_enable_stdio_uart(teplota_sht30 0)

pico_add_extra_outputs(teplota_sht30)
teplota_sht30.c
/* teplota_sht30.c
 * Měření teploty a relativní vlhkosti čidlem SHT30 
 * a zobrazení na OLED displeji ssd1306
 * 
 * (c) Jirka Chráska 2026, <jirka@lixis.cz>
 * BSD 3 clause licence.
 */

#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include "ssd1306.h"
#include "font.h"
#include "pico_sensor_lib.h"
#include <stdio.h>
#include <string.h>

// pro OLED displej SSD1306
#define DISPLAY_WIDTH   128			// šířka displeje
#define DISPLAY_HEIGHT  32			// výška displeje
#define I2C_ADDRESS     0x3C		// i2c adresa
#define I2C_FREQ        1000000		// rychlost i2c sběrnice
#define SDA_PIN         4			// datový pin
#define SDC_PIN         5			// hodinový pin
#define I2C             i2c0		// i2c hardware

// struktura pro OLED displej včetně framebufferu
static ssd1306_t disp;

extern bitmapFONT font_spleen_6x12;

// čidlo SHT30
#define SHT30_I2C   i2c1
#define SHT30_ADDR  0x44
#define SHT30_SDA   14
#define SHT30_SCL   15

// nastavení I2C sběrnice
void setup_i2c(void)
{
    // displej na sběrnici i2c0 
    i2c_init(I2C, I2C_FREQ);
    gpio_set_function(SDA_PIN, GPIO_FUNC_I2C);
    gpio_set_function(SDC_PIN, GPIO_FUNC_I2C);
    gpio_pull_up(SDA_PIN);
    gpio_pull_up(SDC_PIN);
    // pauza 200ms je nutná kvůli displeji. Pokud není, displej se někdy nerozsvítí
    // pauza 100ms je málo
    sleep_ms(200);
    // čidlo SHT30 je na druhé sběrnici i2c1
    i2c_init(SHT30_I2C, I2C_FREQ);
    gpio_set_function(SHT30_SDA, GPIO_FUNC_I2C);
    gpio_set_function(SHT30_SCL, GPIO_FUNC_I2C);
    gpio_pull_up(SHT30_SDA);
    gpio_pull_up(SHT30_SCL);
    sleep_ms(200);
}

void zapnuti_displeje( void )
{
    ssd1306_init(&disp, DISPLAY_WIDTH, DISPLAY_HEIGHT, I2C_ADDRESS, I2C); // inicializace
    ssd1306_poweron(&disp); // zapnutí displeje
    ssd1306_clear(&disp);   // vymazání displeje
    ssd1306_contrast(&disp,0x10);
    ssd1306_draw_utf8_string(&disp, 0,  0, &font_spleen_6x12, "Teplota a rel. vlkost");
    ssd1306_draw_utf8_string(&disp, 0, 16, &font_spleen_6x12, "čidlo SHT30");
    ssd1306_show(&disp); // zobrazíme na displeji
}


int main()
{
char buf[128];
    stdio_init_all();
    sleep_ms(1500);
    printf("\n\nMěření teploty a relativní vlhkosti čidlem SHT30\n");
    //getchar();
    memset(buf,0,sizeof(buf));
	// nastavení displeje SSD1306
    setup_i2c();
    zapnuti_displeje();
    
    
	// Initialize sensor
    void *ctx = NULL;
    int res = i2c_init_sensor(get_i2c_sensor_type("SHT30"), SHT30_I2C, SHT30_ADDR, &ctx);
    if (res) {
        // nemohu nastavit čidlo...
        printf("Nemohu inicializovat sensor SHT30\n");
        ssd1306_draw_utf8_string(&disp, 0, 0, &font_spleen_6x12, "Nemohu nastavit SHT30");
        return -1;
    }
    
    int delay;
    float temp, pressure, humidity;

    while(1) {
        delay = i2c_start_measurement(ctx);
        // printf("Prodleva měření %d ms\n",delay);
        sleep_ms(delay+10);
        int res = i2c_read_measurement(ctx, &temp, &pressure, &humidity);
        memset(buf,0,sizeof(buf));
	    if (res) { // -1 je chcíplé čidlo, -2 je chyba CRC
            // failed to read measurements...
            printf("Nemohu přečíst naměřené hodnoty %d.\n", res);
            sprintf(buf,"Chyba čidla: %s.", res==-1?"neměří":"CRC");
            ssd1306_clear(&disp);   // vymazání displeje
            ssd1306_draw_utf8_string(&disp, 0, 0, &font_spleen_6x12, buf);
            ssd1306_show(&disp);
        } else {
            sprintf(buf,"Teplota: %5.1f °C", temp);
            printf("Teplota %5.1f °C, relativní vlkost %5.1f %%\r",temp,humidity);
            ssd1306_clear(&disp);   // vymazání displeje
            ssd1306_draw_utf8_string(&disp, 0, 0, &font_spleen_6x12, buf);
            sprintf(buf,"Rel. vlkost: %5.1f %%", humidity); 
            ssd1306_draw_utf8_string(&disp, 0, 16, &font_spleen_6x12, buf);
            ssd1306_show(&disp);
        }
        sleep_ms(1000);
    }

    ssd1306_poweroff(&disp);
    // ukončení práce s displejem (uvolnění paměti framebufferu)
    ssd1306_deinit(&disp);
}

Konstrukce

Měření teploty a rel. vlhkosti čidlem SHT30 (tlačítko vpravo mezi RUN a GND slouží k pohodlnému restartu Pico)

IMG 20260925 040123

Zapojení SHT30 k Picu (SCL na GP15, SDA na GP14, i2c1)

IMG 20260925 040250

Na destičce je v popisu napájecího napětí chyba, správně je napájecí napětí od 2.4V do 5.5V

IMG 20260925 040322

Zdroje a odkazy

pico-sensor-lib C knihovna pro obsluhu čidel pro RPi Pico, Timo Kokkonen