Przedstawiam projekt prostego barometru-higrometru na USB. O ile budowa domowej sieci pomiaru temperatury (wykorzystując np. DS18B20 czy LM75) nie jest zbyt skomplikowana, ani kosztowna, to pomiar ciśnienia atmosferycznego i wilgotności wymaga więcej wysiłku. Główny problem z fabrycznymi rozwiązaniami jest taki, że albo są to w pełni profesjonalne urządzenia do sieci pomiarowych (cena od 400zł wzwyż), albo są zintegrowane z chińskimi stacjami pogodowymi, które ciężko połączyć z własnym systemem i RRDtool. barometer_hygrometer_pcb1

I present a simple USB barometer-hygormeter project. Home temperature measurement systems are easy to build (eg. using DS18B20 or LM75), but measuring pressure or humidity is more challenging. The main problem with ready solutions is that they are either fully professional for industrial use (pricey!) or are built into cheap Chinese weather stations, which are hard to interface with RRDtool. barometer_hygrometer_pcb1

Na rynku dostępne są różne rodzaje czujników do wbudowania. Odpuściłem sobie na wstępie te z wyjściami analogowymi, gdyż cięzko je skalibrować (brak łatwego wzorca ciśnienia i wilgotności) i z „dziwnymi” interfejsami cyfrowymi (DHT11). Ciekawe wydały mi się czujniki HopeRF (dostępne np. w Seguro) ciśnienia HP03SA i wilgotności TH02. Oba są fabrycznie skalibrowane i rozmawiają standardowym interfejsem I2C.

Barometr HP03SA potrafi mierzyć ciśnienie w zakresie 300-1100hPa (nadaje się też jako wysokościomierz barometryczny, np. do balonu). W module znajduje się właściwy sensor, czujnik temperatury (potrzebny do kompensacji), ADC i EEPROM z współczynnikami kalibracji.

Higrometr TH02 składa się z jednego scalaka z otworem w środku obudowy, z którego wystaje goła kość. Pomiar wilgotności odbywa się poprzez pomiar pojemności, więc trzeba uważać na wszelkie zabrudzenia, które mogłyby wpaść do środka układu (szczególnie odpryski przy lutowaniu) i fałszować pomiar. Czujnik ma wbudowany grzejnik, który umożliwia „strzepywanie” nadmiaru wilgotności i termometr (również do kompensacji).

Schemat całego urządzenia jest wręcz trywialny: mikrokontroler, stabilizator 3,3V, jeden przycisk do uruchamiania bootloadera, kwarc, kilka rezystorów, złącze USB i właściwe czujniki.
Czujnik ciśnienia dodatkowo ma linię RESET i wejście zegara (ok. 32kHz) – obie sterowane przez mikrokontroler.
sch

Całość mieści się na małej jednostronnej płytce drukowanej. Wszystkie elementy są montowane powierzchniowo i zajmują tylko jedną stronę płytki. Złącze do programowania można wylutować po zaprogramowaniu bootloadera.
pcb

Tak wyglądają zmontowane urządzenia. Tylko jeden z nich ma na razie zainstalowane sensory. Śruby służą za nogi tak, żeby wszystkie elementy były do góry nogami i żeby czujnik wilgotności nie zbierał kurzu. Kwarce oczywiście SMD 😀
barometer_hygrometer_pcbs
barometer_hygrometer_pcb1
Barometr-higrometr komunikuje się z komputerem przez stos V-USB. Pomiary i obliczenia są wykonywane co kilka sekund, czujnik reaguje bardzo szybko na parę wodną z oddechu i zmianę ciśnienia po wsadzeniu do foliowego worka i ściśnięciu. Wszystkie obliczenia wykonuje mikrokontroler. Czujnik ciśnienia ma mały EEPROM na pokładzie, gdzie znajdują się dane z kalibracji, które trzeba uwzględnić w obliczeniach. Czujnik wilgotności ma stałe współczynniki linearyzacji podane przez producenta w datasheecie. Wykonanie wszystkich obliczeń na 8-bitowym mikrokontrolerze zakrawa na stosowaną masakrę stałoprzecinkową piłą mechaniczną 😉 Obliczenia zmiennoprzecinkowe nie zmieściłyby się do flasha ATmegi. Do obsługi ze strony komputera służy prosty program hidtool (praktycznie identyczny jak do watchdoga i przełącznika anten).
Prostą obróbkę robi skrypt shellowy. Występuje drobny problem ze stabilnością układu – nieraz po prostu losowo zwisa. Watchdog ratuje sytuację i układ działa dalej. Nie udało mi się ustalić który dokładnie fragment kodu za to odpowiada, ale wszystko wskazuje na funkcję usbPoll() V-USB. Problem nie jest uciążliwy, gdyż w praktyce odczyt odbywa się rzadziej niż raz na minutę i trzeba mieć szczęście, żeby trafić w moment, gdy akurat się zawiesi, a watchdog nie zdąży zresetować.

Tak wygląda tydzień pomiarów u mnie w domu. Wilgotność wygląda na szaloną, gdyż czujnik jest bardzo blisko kuchni. Ciśnienie pokrywa się z prognozami www.meteo.pl, ale jest przesunięte w pionie. Wynika to prawdopodobnie z mojej wysokości nad poziomem morza i czwartego piętra.
graph-example

Release 1.0 schemat, pcb, firmware, software

Artur SP2AGX

There are many sensors commonly available. I left out those with analog outputs (hard to calibrate, hard to figure out a reference pressure or humidity source) and those with not common communication interfaces (like DHT11). The best ones I could find were manfactured by HopeRF – pressure sensor HP03SA and humidity sensor TH02. Both are factory calibrated and feature a standard I2C interface

The HP03SA barometer can measure pressure between 300-1100hPa (it can also act as an altimeter, eg. for an amateur balloon). Inside the module there is the pressure transducer, temperature transducer (temperature is required for compensation), ADC and EEPROM containing factory calibration coefficients

The TH02 hygrometer is a single IC with a hole in the middle. Bare die is visible. Humidity is measured based on sensor capacitance, so it is important to minimise dirt accumulation on the chip die (especially during soldering), because each piece of dust can change the measured capacitance and give a false humidity reading. The hygrometer has a built-in heater to get rid of excess humidity (useful in very humid environments) and a thermometer (also needed for compensation).

The schematic is trival: ATmega8 MCU, 3,3V LDO power supply, a single button for bootloader execution, quartz, some resistors, USB connector and the sensors themselves.
Pressure sensor has two extra lines: RESET and ADC clock (requires about 32kHz) – both are controlled by the MCU.
sch

Everything fits on a small single-layer PCB. All elements are mounted on one side. ISP goldpins can be removed after flashing the bootloader.
pcb

Here are the assembled PCBs. Only one board has sensors installed. Screws are used as legs to make the element side face down so the hygrometer will not accumulate dust. Quartz are of course SMD 😀
barometer_hygrometer_pcbs
barometer_hygrometer_pcb1
Communication is provided by V-USB. All calculations are performed on-board by the MCU. The sensor very quickly reacts to exhaled air. To crudely test preassure measurement I built a simple „backpipe” from a plastic bag – it worked. To calculate pressure you have to first take factory coefficients from the built-in EEPROM. The hygrometer has fixed linearisation coefficients so no other EEPROM is necessary. The software is very simple, just a single binary – hidtool (almost the same as for watchdog and antenna switch). There is a simple shell wrapper to parse hex numbers into decimal. I stumbled upon a problem with stability, sometimes the MCU just hangs (and is then reset by watchdog). I could not exactly find the offending piece of code, but the most probable is usbPoll() from V-USB. I did not bother with further debugging, the problem is not so severe as normally a reading is taken less then once a minute so one would need very bad luck to do that in the precise moment the device hangs and is not yet reset by the watchdog.

That is a week of readings taken inside my home. Humidity looks totally bonkers because the sensor is very close to the kitchen. Pressure very closely follows a local weather forecast www.meteo.pl, however it is offset somehow (smaller than in a forecast). That is probably caused by my local ground elevation above sea level and building height (fourth floor).
graph-example

Release 1.0 schematic, pcb, firmware, software

Artur SP2AGX

Kategorie: SP2AGX DIY

0 komentarzy

Dodaj komentarz