Skip to main content

5.1 Temperatura i vlaga

Cilj ovog primjera je izmjeriti temperaturu i vlagu prostorije pomoću SHTC3 senzora iz kita, i ispisati oboje u konzolu. 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 vlastiti brojevi pinova.
  • Zašto jedno mjerenje traži dva poziva funkcije, i što se dogodi ako preskočiš prvi.
  • Kako time.ticks_ms() 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 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 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 senzoru ne trebaju brojevi pinova

Senzor se stvara iz istog i2c objekta kao svaki drugi Qwiic modul u kitu:

i2c = I2C(0, scl=Pin(7), sda=Pin(6))
shtc_sensor = SHTC3(i2c)

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 idu na IO6 i IO7. Nisu uopće izvedene na headere.

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, LCD na 0x20, a ovaj na 0x70. Driver to već zna, i zato je ne predaješ.

ℹ️
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 projekt Pametna meteo stanica.

Dobavljanje drivera na pločicu

Ovom primjeru treba SHTC3.py iz lib foldera repozitorija primjera, kopiran u /lib folder pločice. Ako si prošao Postavljanje MicroPythona, već je tamo. Ako nije:

mpremote mip install github:SolderedElectronics/Soldered-NULA-Beginner-kit-MicroPython-project-examples/lib
⚠️
ImportError: no module named 'SHTC3' znači da driver nije na pločici, ili je sletio negdje drugdje osim u /lib. Spajanje i senzor nisu problem.

Jedno mjerenje, dva poziva funkcije

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

shtc_sensor.sample()
temperature = shtc_sensor.readTemperature()
humidity = shtc_sensor.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. readTemperature() i readHumidity() zatim samo pretvaraju brojeve koje je sample() već donio.

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

⚠️
Funkcija za temperaturu ovdje se zove readTemperature(). Arduino biblioteka za isti senzor imenuje je readTempC(), pa kod prekopiran iz skice pada s AttributeError: 'SHTC3' object has no attribute 'readTempC'. readHumidity() se u oba piše isto.
ℹ️
Č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.

begin() također se javlja natrag. Vraća True ako je senzor odgovorio i False ako nije, pa skripta provjerava rezultat i kaže što se dogodilo. Ta jedna linija kasnije te poštedi mnogo nagađanja, jer same vrijednosti ti to neće reći: senzor koji nikada nije nađen i dalje proizvodi urednu kolonu brojeva, a oni izgledaju kao brojevi, a ne kao greška.

sample() na isti način vraća True ili False, prijavljujući je li se mjerenje stvarno vratilo. Ovaj primjer to ne provjerava, jer bi za prvi primjer to bilo više zbrke nego što vrijedi, ali to je razlog zašto je neuspjelo mjerenje tiho a ne bučno, i vrijedi to znati ako budeš gradio na ovom kodu.


Mjerenje bez zaustavljanja

Skripta ne spava dvije sekunde između mjerenja. Koristi time.ticks_ms(), koji prijavljuje koliko dugo pločica radi, i novo mjerenje uzima samo kada je zapamćeni trenutak last_update UPDATE_MS u prošlosti:

now = time.ticks_ms()

if time.ticks_diff(now, last_update) >= UPDATE_MS:
last_update = now
# ...uzmi mjerenje...

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

⚠️
Primijeti time.ticks_diff(now, last_update) a ne now - last_update. Kako je objašnjeno u 2.2 Debounce tipke, brojač otkucaja prelije se natrag na mali broj, a direktno oduzimanje tada daje veliki negativan odgovor, nakon čega mjerenje nikada više ne dođe na red.

Kod

# I2C je ono što Qwiic konektor nosi, a SHTC3 je Qwiic modul.
from machine import I2C, Pin

# Soldered driver za SHTC3 senzor, koji se nalazi u lib folderu repozitorija primjera.
from SHTC3 import SHTC3
import time

# Ovdje postavljamo I2C vezu. Na NULA MINI, I2C koristi IO6 za liniju podataka (SDA) i IO7 za liniju
# takta (SCL), a to su točno pinovi na koje je Qwiic konektor spojen. Primijeti da nikada ne definiramo pin za
# sam senzor: svaki Qwiic modul dijeli ta ista dva pina.
i2c = I2C(0, scl=Pin(7), sda=Pin(6))

# Ovdje stvaramo naš objekt senzora, koji smo nazvali "shtc_sensor", i predajemo mu I2C vezu.
shtc_sensor = SHTC3(i2c)

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

# Ova varijabla pamti trenutak kada smo uzeli posljednje mjerenje.
last_update = 0

# begin() priprema senzor za upotrebu i pokreće komunikaciju. Također nam kaže je li senzor odgovorio:
# funkcija vraća True pri uspjehu i False pri neuspjehu.
# "not" ispred znači obrnuto, pa se ovo čita kao "ako se senzor nije pokrenuo".
if not shtc_sensor.begin():
print("SHTC3 initialization failed!")
else:
print("SHTC3 sensor ready!")

while True:

# time.ticks_ms() vraća broj milisekundi koje su prošle od uključivanja pločice. Koristimo ga umjesto
# običnog sleepa da pločica ostane slobodna za drugi posao između mjerenja.
# Taj brojač se na kraju prelije natrag na nulu, i zato uvijek koristimo time.ticks_diff() da izračunamo
# razliku između dva takva broja umjesto da ih sami oduzimamo.
now = time.ticks_ms()

# 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 time.ticks_diff(now, last_update) >= UPDATE_MS:
last_update = 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 prethodno mjerenje.
shtc_sensor.sample()

# readTemperature() vraća temperaturu iz posljednjeg mjerenja u stupnjevima Celzija, a
# readHumidity() vraća relativnu vlagu u postocima. Oboje su decimalni brojevi.
temperature = shtc_sensor.readTemperature()
humidity = shtc_sensor.readHumidity()

# Ovdje iz obje vrijednosti gradimo jednu čitljivu liniju. Vitičaste zagrade se ispunjavaju našim
# vrijednostima, a ":.2f" govori Pythonu da broj prikaže s dvije decimale.
print("Temperature: {:.2f} °C, Humidity: {:.2f} %".format(temperature, humidity))

# Vrlo kratka pauza ostavlja procesoru trenutak da obavi svoj posao u pozadini.
time.sleep_ms(10)

Što bi trebao vidjeti

Pritisni Run. SHTC3 sensor ready! pojavljuje se jednom, prije nego petlja počne, a onda vrijednost dolazi svake dvije sekunde. Ovo je početak stvarnog izvođenja:

SHTC3 sensor ready!
Temperature: 25.61 °C, Humidity: 45.82 %
Temperature: 25.61 °C, Humidity: 45.89 %
Temperature: 25.59 °C, Humidity: 45.87 %
Temperature: 25.61 °C, Humidity: 45.90 %
Temperature: 25.61 °C, Humidity: 45.94 %
Temperature: 25.54 °C, Humidity: 45.94 %
Temperature: 25.54 °C, Humidity: 45.99 %
Temperature: 25.53 °C, Humidity: 46.01 %

Obje vrijednosti ispisane su na dvije decimale. U ovom izvođenju prostorija je bila na oko 25.6 °C i 46 % relativne vlage, a uzastopne vrijednosti razlikuju se samo u posljednjoj decimali ili dvije. To malo kolebanje je senzor koji je iskren o svojoj vlastitoj točnosti, a ne greška. Tvoji će brojevi naravno biti onakvi kakva je tvoja prostorija.

ℹ️
Prva vrijednost pojavljuje se odmah, a ne dvije sekunde nakon poruke o pripremljenosti. last_update počinje na 0, a time.ticks_ms() broji od uključivanja pločice, pa je u prvom prolazu kroz petlju mjerenje već davno na redu i uzima se odmah. Svaka vrijednost nakon toga ispravno je razmaknuta: izmjereno na pločici, razmaci su bili 2001, 2000, 2000 i 2001 milisekundu.

Dahni na njega

To je test koji vrijedi napraviti, jer je to onaj koji dokazuje da se brojevi mjere a ne ponavljaju. Nježno dahni na senzor s nekoliko centimetara udaljenosti, pa ga ostavi na miru i nastavi gledati.

Tvoj dah je topao i gotovo zasićen vodenom parom, pa se obje kolone pomiču, ali se ne pomiču jednako. U snimljenom izvođenju vlaga je porasla s mirnih 46.9 % na 88.0 % u oko osam sekundi, i bila je natrag na 46.8 % otprilike dvadeset sekundi nakon toga. Temperatura je prešla mnogo manji put, s 25.2 °C na 27.9 °C, a onda joj je trebalo više od dvije minute da se vrati.

Na toj razlici vrijedi se zadržati trenutak. Vlažan zrak jednostavno se izmiješa s prostorijom i nestane. Toplina je otišla i u samu pločicu, a ne samo u zrak oko nje, a pločica je može otpustiti samo polako. To je isti učinak koji utori s obje strane senzora postoje da bi ograničili, samo što je ovaj put toplina došla na senzorsku stranu utora, pa je utori tamo drže, umjesto da je drže podalje.

⚠️
Ako vidiš SHTC3 initialization failed! umjesto SHTC3 sensor ready!, begin() nije mogao dobiti odgovor od senzora. Provjeri prvo scl=Pin(7), sda=Pin(6) u liniji I2C(): pogrešni ili zamijenjeni brojevi pinova najčešći su uzrok i izgledaju točno kao pokvaren senzor. Zatim provjeri je li Qwiic kabel do kraja utisnut na oba svoja kraja.
ℹ️
Primijeti da se skripta ne zaustavlja kada inicijalizacija ne uspije. Nastavlja u petlju, i budući da nijedno mjerenje nikada ne uspije, ispisuje Temperature: -45.00 °C, Humidity: 0.00 % iznova i iznova. To uopće nisu vrijednosti. To je ono što pretvorbeno računanje proizvede iz nula s kojima driver počinje. Zid od -45.00 °C je potpis senzora koji nikada nije nađen.

Cijeli primjer

Pogledaj cijeli kod primjera na linku ispod:

5.1_Reading_Temperature_and_Humidity.py

Primjer koji pokazuje kako izmjeriti temperaturu i vlagu pomoću Soldered SHTC3 senzora i ispisati vrijednosti u konzolu.