Skip to main content

5.1 Čitanje temperature i vlage

Cilj ovog primjera je izmjeriti temperaturu i vlagu prostorije pomoću SHTC3 senzora iz kita, i ispisati oboje u Serial Monitor. Jedan čip veličine zrna riže mjeri oboje odjednom, dovoljno točno da ćeš vidjeti kako se brojevi pomiču kada dahneš na njega.

Ovo je drugi Qwiic modul u kitu, nakon ultrazvučnog senzora u sekciji 3. To znači da je spajanje ponovno jedan kabel, i ponovno se nema što pogriješiti.

U ovoj dokumentaciji naučit ćeš:

  • Kako jedan senzor mjeri i temperaturu i relativnu vlagu.
  • Postotak čega je relativna vlaga, i zašto je to važno.
  • Kako spojiti drugu vrstu Qwiic modula, i zašto mu ne trebaju brojevi pinova.
  • Zašto jedno mjerenje traži dva poziva funkcije, i što se dogodi ako preskočiš prvi.
  • Kako millis() odmjerava mjerenja a da nikada ne zamrzne pločicu.

Potreban hardver:

  • 1x Soldered NULA MINI pločica
  • 1x Breadboard
  • 1x Soldered SHTC3 senzor temperature i vlage
  • 1x Qwiic kabel
  • 1x USB-C kabel
ℹ️
Nema otpornika ni jumper žica. Kao ultrazvučni senzor u 3.1, ovo je Qwiic modul, pa jedan kabel nosi napajanje i podatke zajedno i ulazi samo na jedan način. Ako si upravo završio 3.1, sklop je identičan osim po tome koji modul visi na kraju kabela.

Spajanje komponenti

Četiri koraka, a samo je jedan od njih spajanje.

1. Umetni NULA MINI pločicu na breadboard

Utisni pločicu u jedan kraj breadboarda tako da njezina dva reda pinova sjednu s obje strane središnjeg kanala. Na fotografijama zauzima redove 25 do 30.

NULA MINI pločica postavljena na breadboard
Korak 1: pločica postavljena na breadboard
ℹ️
Kao u 3.1, breadboard ovdje ne radi nikakav električni posao. Na pinove pločice ne spaja se uopće ništa. On drži pločicu ravno i stabilno da u nju možeš utisnuti kabel a da ona ne odjuri preko stola.

2. Utisni Qwiic kabel u pločicu

NULA MINI ima jedan Qwiic konektor, na rubu pločice između tipki USER i RST, označen s qwiic na silkscreenu. Utisni kabel dok ne klikne.

Qwiic kabel utisnut u NULA MINI pločicu, s drugim krajem još slobodnim
Korak 2: kabel u Qwiic konektoru pločice, drugi kraj još slobodan
⚠️
Ne pomiješaj ga s manjim konektorom s dva kontakta na suprotnom rubu, označenim s - i +. To je konektor za bateriju, i Qwiic kabel u njega ne ulazi.

Ako želiš vidjeti točno o kojem se konektoru radi na goloj pločici, ovdje je istaknut:

NULA MINI pločica s istaknutim Qwiic konektorom
Qwiic konektor na NULA MINI, istaknut plavim

3. Utisni drugi kraj u senzor

Senzor je mala ljubičasta pločica sa silkscreenom SHTC3 BREAKOUT. Ima dva Qwiic konektora, po jedan na svakom kraju, s riječju qwiic ispisanom uz oba. Spojeni su međusobno, pa utisni slobodni kraj kabela u bilo koji od njih. Rezervni je tu da možeš dalje nalančati još jedan modul.

Qwiic kabel ide s NULA MINI pločice na SHTC3 senzor
Korak 3: kabel spaja pločicu sa senzorom. To je cijeli krug

Ovdje je pločica senzora sama, izbliza:

Krupni plan SHTC3 breakout pločice s vidljivim senzorom, dva qwiic konektora i kontaktima SCL, SDA, VCC i GND
SHTC3 breakout: dva qwiic konektora, četiri kontakta za lemljenje, i sam senzor u sredini

Na ovoj pločici vrijedi primijetiti:

  • Sam senzor je sitna crna komponenta u sredini. I termometar i ikona vlage na silkscreenu pokazuju na nju, jer stvarno mjeri oboje.
  • Sjedi na uskom jezičcu tiskane pločice s utorima izrezanima s obje njegove strane. Ti utori su namjerni: otežavaju toplini s ostatka pločice da putuje duž bakra i dođe do senzora, koji bi inače prijavljivao temperaturu same pločice, a ne prostorije.
  • Četiri kontakta označena s SCL, SDA, VCC i GND nose ista četiri signala kao Qwiic kabel, izvedena za onoga koji bi radije lemio žice nego utisnuo kabel. Ovdje ti ne trebaju.
  • Kontakti JP1 do JP4 su tvorničke postavke. Ostavi ih kako su došli.

4. Spoji USB-C kabel

Utisni USB-C kabel u pločicu i u računalo. Ljubičasto PWR svjetlo uz tipku RST se upali, a i senzor je napojen, uzimajući što mu treba preko Qwiic kabela.

Gotov sklop: NULA MINI na breadboardu sa spojenim USB-C i SHTC3 senzorom na Qwiic kabelu
Korak 4: gotov sklop, napojen
ℹ️
Možda ćeš primijetiti da je USB kabel na fotografiji koraka 2 već spojen a u koraku 3 ga ponovno nema. Stvarno nije važno kada ga spojiš. Qwiic module je sigurno utiskivati i izvlačiti u bilo kojem trenutku, napojene ili ne.

Što senzor stvarno mjeri

Temperatura je jednostavnija polovica, prijavljena u stupnjevima Celzija.

Relativna vlaga je polovica koja ljude zavara. Prijavljuje se kao postotak, ali nije postotak volumena zraka ni njegove težine. To je postotak najveće količine vodene pare koju bi zrak mogao držati na svojoj trenutnoj temperaturi, pa 47 % znači da zrak nosi nešto manje od pola onoga što trenutno može.

Zamka je u tome da se sam kapacitet pomiče. Topao zrak drži daleko više vodene pare od hladnog. Zato ako zagriješ prostoriju a da ne dodaš ni odstraniš ni kap vode, relativna vlaga pada: ista para sada je manji dio većeg maksimuma. Zato zagrijana prostorija zimi djeluje suho, i zato su ta dva broja daleko korisnija zajedno nego ijedan sam.

ℹ️
Najbrži način da vidiš senzor kako reagira je da nježno dahneš na njega s nekoliko centimetara udaljenosti. Tvoj dah je topao i gotovo zasićen, pa vrijednost vlage strmo poraste u sekundu ili dvije, a onda se kroz sljedećih pola minute vrati dolje kako se taj zrak izmiješa s prostorijom.

Zašto nema brojeva pinova

Kao i kod ultrazvučnog senzora, objekt senzora stvara se praznih ruku:

SHTC3 shtcSensor;

Razlog je onaj objašnjen u 3.1 Mjerenje udaljenosti: Qwiic kabel je fiksni svežnjić od četiri vodiča: 3.3 V, masa i dvije signalne linije I2C sabirnice. Na NULA MINI te dvije signalne linije trajno su spojene na IO6 i IO7. Nisu uopće izvedene na headere. Nema se što birati, pa se biblioteci nema što reći.

Ono što se od modula do modula razlikuje je adresa na koju odgovara, jer I2C dopušta da nekoliko modula dijeli jedan par žica. Ultrazvučni senzor odgovara na 0x30. Ovaj odgovara na 0x70. Biblioteka to već zna, i zato ni begin() ne prima argumente.

ℹ️
Budući da im se adrese razlikuju, ovaj senzor i LCD iz sekcije 4 mogu sjediti na istim dvjema žicama u isto vrijeme a da se međusobno ne smetaju. Točno to radi primjer 7.1 Pametna meteo stanica.

Instalacija biblioteke

Ovom primjeru treba SHTC3 Soldered Library. Ako si prošao Postavljanje Arduino okruženja, već je imaš. Ako nisi, otvori Tools → Manage Libraries, potraži SHTC3 i instaliraj onu koju objavljuje Soldered Electronics.

⚠️
Ako IDE prijavi fatal error: SHTC3-SOLDERED.h: No such file or directory, biblioteka nije instalirana. Instaliraj je i prevedi ponovno. Spajanje i pločica nisu problem.

Jedno mjerenje, dva poziva funkcije

Skupljanje mjerenja je posao u dva koraka, a redoslijed je važan:

shtcSensor.sample();
float temperature = shtcSensor.readTempC();
float humidity = shtcSensor.readHumidity();

sample() je jedini od ta tri koji uopće razgovara sa senzorom. Ona budi čip, traži od njega da izmjeri, skuplja sirove brojeve i vraća čip na spavanje. readTempC() i readHumidity() zatim samo pretvaraju brojeve koje je sample() već donio.

To ima posljedicu koju vrijedi zapamtiti. Ako pozoveš readTempC() bez prethodnog poziva sample(), ne dobiješ ni grešku ni upozorenje. Dobiješ prethodno mjerenje ponovno, što izgleda točno kao senzor koji se zamrznuo.

ℹ️
Čip gotovo cijelo vrijeme provodi spavajući, budeći se samo za nekoliko milisekundi koliko svako mjerenje traje. To je dio toga kako senzor ove veličine uopće točno mjeri temperaturu zraka. Čip koji bi ostao budan grijao bi sam sebe i prijavljivao vlastitu toplinu.

Mjerenje bez zaustavljanja

Skica ne koristi delay() da čeka dvije sekunde između vrijednosti. Koristi millis(), koji prijavljuje koliko dugo pločica radi, i novo mjerenje uzima samo kada je zapamćeni trenutak lastUpdate UPDATE_MS u prošlosti:

unsigned long now = millis();

if (now - lastUpdate >= UPDATE_MS) {
lastUpdate = now;
// ...uzmi mjerenje...
}

delay(2000) bio bi kraći zapis, ali zaustavlja pločicu mrtvu na dvije sekunde odjednom. Napisano ovako, pločica juri po loop() tisućama puta u sekundi i samo povremeno nađe da je mjerenje na redu, što je između toga ostavlja slobodnom da radi druge stvari. Onog trenutka kada skica ima dva posla, čitanje senzora i praćenje tipke, ovo je uzorak koji dopušta da se oboje dogodi.

ℹ️
millis() broji gore u unsigned long i, nakon otprilike 50 dana neprekidnog rada, prelije se natrag na nulu. Oduzimanje now - lastUpdate napisano je onako kako je napisano jer ostaje ispravno i kroz to prelijevanje.

Kod

/**
**************************************************
*
* @file 5.1_Reading_Temperature_and_Humidity.ino
* @brief Primjer koji pokazuje kako izmjeriti temperaturu i vlagu pomoću Soldered SHTC3 senzora.
* Senzor s pločicom komunicira preko easyC-a, pa treba samo jedan kabel i nikakvi pinovi se ne moraju
* definirati. Izmjerene vrijednosti ispisuju se u Serial Monitor.
* Za detalje, shemu spajanja i više, pogledaj dokumentaciju primjera na: <link placeholder>
* @author Soldered
***************************************************
*/

/*
Uključivanje biblioteke daje nam pristup gotovim funkcijama koje teški posao rade za nas. Ovdje uključujemo
Soldered biblioteku za SHTC3 senzor. Ako Arduino IDE prijavi da ovu datoteku ne može naći, instaliraj biblioteku
kroz Sketch -> Include Library -> Manage Libraries i potraži "Soldered SHTC3".
*/
#include "SHTC3-SOLDERED.h"

/*
Ovdje stvaramo naš objekt senzora, koji smo nazvali "shtcSensor". Objekt je naš način razgovora sa senzorom: svaku
funkciju koju na njemu pozovemo, pozivamo preko ovog imena. Primijeti da ovaj put ne predajemo nikakve brojeve pinova. SHTC3
koristi easyC, a to je Soldered ime za I2C vezu preko jednog kabela, a I2C uvijek koristi ista dva
pina na pločici (IO6 i IO7 na NULA pločici), pa biblioteka već zna gdje naći senzor.
*/
SHTC3 shtcSensor;

/*
Ova varijabla definira koliko vremena prođe između dva mjerenja, u milisekundama. 2000 milisekundi su dvije
sekunde. Slobodno eksperimentiraj s ovom vrijednošću.
*/
const unsigned long UPDATE_MS = 2000;

/*
Ova varijabla pamti trenutak kada smo uzeli posljednje mjerenje. Uspoređujemo je s trenutnim vremenom da znamo
kada je sljedeće mjerenje na redu. Mora biti unsigned long jer brojevi koje nam sat daje postaju veliki.
*/
unsigned long lastUpdate = 0;

void setup() {

/*
Serial.begin() uspostavlja serijsku komunikaciju između tvoje pločice i tvog računala preko USB kabela. Ovdje ga
koristimo da bismo u Serial Monitoru mogli prikazati vrijednosti temperature i vlage.
*/
Serial.begin(115200);

/*
begin() priprema senzor za upotrebu i pokreće I2C komunikaciju. Također nam kaže je li senzor odgovorio:
funkcija vraća true pri uspjehu i false pri neuspjehu. Provjeravamo rezultat i ispisujemo poruku u svakom slučaju, pa
ako se kasnije ništa ne pojavi znamo je li problem u kabelu ili u kodu.
"!" ispred poziva znači "ne", pa se ova if izjava čita kao "ako se senzor nije pokrenuo".
*/
if (!shtcSensor.begin()) {
Serial.println("SHTC3 initialization failed!");
} else {
Serial.println("SHTC3 sensor ready!");
}
}

void loop() {

/*
millis() je funkcija koja vraća broj milisekundi koje su prošle od kada je pločica počela izvršavati trenutni
program. Koristimo ga umjesto delay() da pločica ostane slobodna za drugi posao između mjerenja, što
postaje važno onog trenutka kada tvoj program ima više od jednog posla. Taj broj će se preliti (vratiti na nulu) nakon
približno 50 dana.
*/
unsigned long now = millis();

/*
Ovdje provjeravamo koliko je vremena prošlo od posljednjeg mjerenja. Novu vrijednost uzimamo samo kada prođe
UPDATE_MS milisekundi, i odmah pamtimo trenutno vrijeme kao novu početnu točku.
*/
if (now - lastUpdate >= UPDATE_MS) {
lastUpdate = now;

/*
sample() govori senzoru da obavi svježe mjerenje i spremi rezultat u sebe. Moramo ga pozvati
prije čitanja vrijednosti, inače bismo stalno dobivali rezultat prethodnog mjerenja.
*/
shtcSensor.sample();

/*
readTempC() vraća temperaturu iz posljednjeg mjerenja u stupnjevima Celzija, a readHumidity() vraća
relativnu vlagu u postocima. Oboje su decimalni brojevi, i zato ih spremamo u float varijable.
*/
float temperature = shtcSensor.readTempC();
float humidity = shtcSensor.readHumidity();

/*
Serial.print() ispisuje podatke bez prelaska u novi red, dok Serial.println() ispisuje podatke i onda
preskače u novi red. Njihovim kombiniranjem gradimo jednu čitljivu liniju iz nekoliko dijelova. Broj 2 nakon
vrijednosti govori funkciji koliko decimalnih mjesta da prikaže.
*/
Serial.print("Temperature: ");
Serial.print(temperature, 2);
Serial.print(" °C, Humidity: ");
Serial.print(humidity, 2);
Serial.println(" %");
}
}

Što bi trebao vidjeti

Prenesi skicu, pa otvori Serial Monitor i postavi ga na 115200 bauda.

Prva linija koja se pojavi je SHTC3 sensor ready!, ispisana jednom iz setup(). Nakon toga nova linija dolazi svake dvije sekunde:

Serial Monitor na 115200 bauda prikazuje temperaturu oko 24.7 stupnjeva Celzija i vlagu oko 47 posto
Vrijednosti dolaze svake dvije sekunde. Početna linija je već otišla iznad vrha

Obje vrijednosti ispisane su na dvije decimale. Na ovom screenshotu prostorija je na oko 24.7 °C i 47 % relativne vlage, a uzastopne vrijednosti razlikuju se samo u posljednjoj decimali ili dvije: 24.70, pa 24.73, pa 24.68. To malo kolebanje je senzor koji je iskren o svojoj vlastitoj točnosti, a ne greška.

Sada nježno dahni na senzor i gledaj kolonu vlage. Trebala bi jako porasti, dobro iznad 60 %, a onda se kroz sljedećih pola minute smjestiti natrag. Ako se to dogodi, senzor stvarno mjeri zrak a ne ponavlja spremljeni broj.

⚠️
Ako umjesto toga vidiš SHTC3 initialization failed!, begin() nije mogao dobiti odgovor od senzora. Postoje dva vjerojatna uzroka, u ovom redoslijedu. Prvo, Qwiic kabel nije do kraja utisnut na jednom od svoja dva kraja. Drugo, i mnogo lakše za promašiti: u IDE-u je odabrana pogrešna pločica. Svaka Soldered biblioteka svoje I2C pinove uzima od pločice koju si odabrao, pa odabir bilo čega osim Soldered NULA Mini ESP32C6 šalje I2C promet na pogrešne pinove. I dalje se prevodi i dalje se prenosi, a senzor i dalje nikada ne odgovori.
ℹ️
Ako se ništa uopće ne pojavi, provjeri prije svega baud rate. Na bilo kojoj postavci osim 115200 Serial Monitor ispisuje nečitljive simbole ili ostaje prazan.

Cijeli primjer

Pogledaj cijeli kod primjera na linku ispod:

5.1_Reading_Temperature_and_Humidity.ino

Primjer koji pokazuje kako izmjeriti temperaturu i vlagu pomoću Soldered SHTC3 senzora i prikazati vrijednosti u Serial Monitoru.