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
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.

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.

- 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:

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.

Ovdje je pločica senzora sama, izbliza:

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,VCCiGNDnose ista četiri signala kao Qwiic kabel, izvedena za onoga koji bi radije lemio žice nego utisnuo kabel. Ovdje ti ne trebaju. - Kontakti
JP1doJP4su 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.

Š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.
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š.
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.
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.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.
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.
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.
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.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.