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

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



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