Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 36

Gymnázium, Alejová 1, 04010 Košice

STREDOŠKOLSKÁ ODBORNÁ ČINNOSŤ

č. odboru: 11. – Informatika


č. odboru 12. – Elektrotechnika, hardware, mechatronika

IoT Meteorologická stanica

2023 Abigail Beblavá


Košice Septima A
1. Čestné vyhlásenie

Čestne vyhlasujeme, že sme prácu vypracovali samostatne a s použitím uvedených zdrojov.

2
2. Poďakovanie

Ďakujeme Dušanovi Beblavému za pomoc pri konštrukcii a za konzultácie. Naša vďaka


taktiež patrí všetkým autorom zdrojov, z ktorých sme čerpali informácie.

3. Obsah

1. Čestné vyhlásenie..............................................................................................................................................
2. Poďakovanie.....................................................................................................................................................
3. Obsah................................................................................................................................................................
4. Úvod..................................................................................................................................................................
5. Problematika a prehľad literatúry.....................................................................................................................
3
6. Ciele práce.........................................................................................................................................................
7. Materiál a metodika..........................................................................................................................................
7.1. Hardware........................................................................................................................................................
7.1.1. ESP32....................................................................................................................................................
7.1.2. AHT20/BMP280...................................................................................................................................
7.1.3. Water Sensor.........................................................................................................................................
7.1.4. Rýchlosť vetra.......................................................................................................................................
7.1.5. Spájkovanie...........................................................................................................................................
7.2. Software.........................................................................................................................................................
7.2.1. Úvod......................................................................................................................................................
7.2.2. Cyklus...................................................................................................................................................
7.2.2.1 Inicializácia senzorov a premenných............................................................................................
7.2.2.2 Pripojenie na sieť – WifiClient.....................................................................................................
7.2.2.3. Čítanie dát zo senzorov................................................................................................................
7.2.2.4. Dátové úložisko – ThingSpeak....................................................................................................
7.2.2.5. Spánok – Deep sleep....................................................................................................................
7.3. Konštrukcia....................................................................................................................................................
7.3.1. Časti konštrukcie...................................................................................................................................
7.3.1.1 Spodná časť...................................................................................................................................
7.3.1.2. Držiak senzorov...........................................................................................................................
7.3.1.3. Kryt..............................................................................................................................................
7.3.1.4. Rotačná vrtuľa..............................................................................................................................
7.4. Merania..........................................................................................................................................................
7.4.1. Namerané dáta.......................................................................................................................................
7.4.2. Spotreba................................................................................................................................................
8. Výsledky práce a diskusia.................................................................................................................................
9. Záver práce a zhrnutie.......................................................................................................................................
10. Zoznam použitej literatúry..............................................................................................................................
11. Prílohy.............................................................................................................................................................

4
4. Úvod

O informatiku sme mali záujem už od skorého veku. Naša záľuba v tejto oblasti vychádzala z
presvedčenia, že ide o fascinujúce a dynamické pole. Bol to jeden z dôvodov, prečo sme sa
rozhodli spracovať túto tému. Zároveň nám aj dala úvod do elektrotechniky, v ktorom sa
vieme ďalej rozvíjať a rozširovať naše vedomosti. Síce popri konštrukcii alebo programovaní
sme narazili na niekoľko prekážok, na koniec nám však vždy slúžili ako príležitosť zistiť toho
viac a vylepšiť sa v tomto obore.
Fenomén IoT sa v posledných rokoch rozšíril na všetky oblasti nášho života. Internet vecí
(ang. Internet of Things) je momentalne prítomný v každej inteligentnej domacnosti. Preto
naša meteostanica používa tento koncept. Zároveň nám je umožnené bližšie skúmať túto
sféru.
Naša stanica je schopná merať meteorologické údaje a zapisovať ich na externé úložisko, kde
sú prístupné verejnosti. V tejto práci sme rozobrali jej fungovanie, vrátane hardvérového
vybavenia, druhov senzorov, softvérového vybavenia a zdrojového kódu. V práci je taktiež
popísaná konštrukcia stanice a schéma spájkovania senzorov s čipom.
Celkovo náš projekt nielen preukázal našu vášeň pre informatiku a elektrotechniku, ale tiež
ukázal možnosti v oblasti konkrétnych technologických aplikácií. Veríme, že naša práca
môže slúžiť ako inšpirácia pre ďalších nadšencov v tomto odvetví a prispieť k ďalšiemu
vývoju a rozvoju technológií v odbore meteorológie.

5
5. Problematika a prehľad literatúry

Meteorologická stanica je jeden z projektov, ktoré majú veľké zázemie na internete. Všetky
zdroje, ktoré sme použili, vychádzajú buď z našich poznatkov, alebo z overených stránok na
internete, zaoberajúcich sa touto problematikou. Každá z nich je uvedená v Zozname použitej
literatúry.
Veľa zdrojov je v anglickom jazyku, takže sme boli nútení prekladať väčšinu. Z tohto dôvodu
sa v práci vyskytujú anglické pojmy a skratky, ktoré sú síce laicky preložené do slovenčiny,
no v ďalšom kontexte sú použité ich anglické verzie z dôvodu korektnosti, keďže formálny a
oficiálny preklad na ne neexistuje.
Všetky komplikované myšlienky, skratky alebo princípy sú zároveň zjednodušené pre ľudí,
ktorí sa s touto témou oboznamujú po prvýkrát.

6
6. Ciele práce

Cieľom našej práce je vytvoriť funkčnú meteorologickú stanicu, ktorá bude schopná merania
meteorologických parametrov a ktorá bude schopná samostatne exportovať namerané dáta
tak, aby boli čitateľné a zrozumiteľné aj pre neodborníkov.
Jeden z čiastkových cieľov je zároveň aj autonómne napájanie a dizajn celej konštrukcie tak,
aby nebola závislá na externom zdroji energie (zásuvka, generátor), ale aby bola ideálne
energeticky samostatná (použitie batérie a solárnych panelov)

7
7. Materiál a metodika

7.1. Hardware

7.1.1. ESP32
Za riadenie celého modelu, logiku, posielanie dát a šetrenie energie je zodpovedný čip
ESP32, ktorý je súčasťou vývojovej dosky ESP32 WROOM Development Kit. Dôvodov
zvolenia tohoto čipu bolo niekoľko; jeden z hlavných bola však možnosť pripojiť sa na Wi-Fi
sieť a pracovať online – teda posielať na úložisko dáta namerané počas jednotlivých cyklov.
Zároveň však nemôžeme zabúdať aj na schopnosť uviesť procesor do takzvaného deep sleep,
teda módu, kedy sa výrazne zníži spotreba energie, keďže hlavný procesor je neaktívny a teda
celý čip riadi druhotný, menej výkonný procesor – tzv. ULP (Ultra low power) koprocesor.
Stanica funguje v periodických cykloch zberu údajov + posielania dát + spánku.
Čip je naprogramovaný v jazyku Arduino, ktorý je štandardne používaný pre programovanie
čipov na podobných vývojových doskách.
Čip ESP32 je nasledovníkom staršieho modelu zo série ESP a to ESP8266. Líši sa od neho
len modernejšími vstupmi, procesorom naviac, kompatibilitou s Bluetooth systémom novšej
generácie a jedným vstavaným senzorom naviac. Okrem týchto vlastností sa nijak výrazne
ne-odlišuje od jeho predchodcu.
Špecifikácie, počet jadier, pamäť RAM, úložisko a ostatné parametre uvádzame v tabuľke
v prílohe (Príloha 1.).
ESP32 WROOM Development Kit, rovnako ako iné vývojové dosky, funguje na princípe
kontaktov, ktoré prenášajú signál a zastávajú úlohu vstupu, teda prenosu dát do procesora,
alebo výstupu, teda prenosu dát z procesora. ESP32 má dokopy 30 kontaktov, no nie všetky
sú plne programovateľné. Niektoré slúžia na špecifické úlohy alebo ako napájanie pre
samotnú vývojovú dosku (viac v časti 1.4. Spájkovanie).
Všetky druhy kontaktov sú uvedené v kategórii Vonkajšie pripojenia v prílohe 1.
Rozmiestnenie všetkých kontaktov a ich mená sú zároveň uvedené v prílohe 2.
Dosku je možné napájať dvoma spôsobmi: cez kontakt 3V3 (respektíve kontakt VIN)
a kontakt GND, alebo cez micro USB port, pomocou ktorého sa zároveň čip programuje.
Keďže je doska už naprogramovaná, na napájanie používame kontakty, na ktoré je pripojený
lítiový akumulátor.
Kontakty ESP je možné softvérovo nastaviť na niektorú z funkcii vstup – výstup
analogového signálu, vstup – výstup digitálneho signálu alebo komunikáciu cez
8
špecializované zbernice. V našej meteorologickej stanici sme použili analogové vstupy,
digitálne vstupy a I2C zbernicu pre pripojenie dvoch senzorov.
ESP32 zároveň disponuje aj dvoma tlačidlami: RESET a BOOT, ktoré však majú osobitné
funkcie a nie sú programovateľné;

● RESET slúži na reštartovanie dosky;

● BOOT, ktorý nemusí vždy byť na doske, ale slúži na uvedenie procesora do režimu,

kedy je pripravený prijímať kód.


Na doske sú taktiež umiestnené dve vstavané LED diódy;

● LED červenej farby, ktorá signalizuje napájanie procesora;

● LED modrej farby, ktorá je programovateľná.

Vo finálnej verzii našej meteorologickej stanice však nie sú využité, z dôvodu ich
umiestnenia na doske. Z dôvodu vodotesnosti a ochrany dosky (ako najdôležitejšej časti celej
stanice) pred vonkajšími prejavmi počasia, ktoré má stanica zaznamenávať, je ESP32 uložený
v tele stanice tak, aby bol vhodne chránený pred prachom, vodou alebo vlhkosťou. Tento fakt
implikuje zbytočnosť implementovania akéhokoľvek optického prejavu alebo inej interakcie
vstavaného na dosku.
V počiatočných verziách prototypu (predtým ako boli všetky komponenty pospájané) sa však
(spolu s inými metódami) používala modrá LED na signalizovanie režimov, do ktorých doska
vstupovala (viac o pripojení a stavoch v časti 2.4 Wificlient). Vo finálnom prototype nie je
využitá.

7.1.2. AHT20/BMP280
Ku ESP32 je pripojená doska s dvoma senzormi – čipmi AHT20 a BMP280. Sú zodpovedné
za meranie teploty, vlhkosti vzduchu a atmosférického tlaku. Z dôvodu ich spoločného
umiestnenia na jednej doske sú ku ESP32 pripojené cez spoločnú zbernicu (viac v kapitole
Konštrukcia). Senzor AHT20 je zodpovedný za meranie vlhkosti vzduchu a BMP280 za
atmosférický tlak.
Oba senzory sú schopné merania teploty, preto je v exportovaných dátach použitá priemerná
teplota vypočítaná z oboch.

9
7.1.3. Water Sensor
Tento senzor je ako jediný umiestnený externe – vytŕča zo stanice. Funguje na základe
medených kontaktov, ktoré menia svoj odpor podľa hĺbky ponorenia senzoru do vody,
respektíve podľa množstva vody na senzore. Tento odpor ESP32 prevedie na bezrozmerné
číslo od 0 do 1023.

7.1.4. Rýchlosť vetra


Na meranie rýchlosti vetra sú používané dva komponenty – veterná vrtuľa a jazýčkový
kontakt, umiestnený pod ňou. Točiaca sa veterná vrtuľa má na sebe pripevnený neodymový
magnet, ktorým každou otočkou spojí jazýčkový kontakt. Tieto impulzy sú počítané a
následne prevedené na im zodpovedajúcu rýchlosť vetra (viac v časti Software).

7.1.5. Spájkovanie
Ku ESP32 sú pripojené štyri externé komponenty:

● Senzor AHT20/BMP280

● Water sensor

● Jazýčkový kontakt

● Nabíjací modul na batériu

Ich schéma zapojenia je nasledovná:

10
7.2. Software

7.2.1. Úvod
Čip sme programovali v jazyku C/C++ Arduino programming language, no zároveň dokáže
byť programovaný aj množstve iných alternatív, ako sú:

● Expressif IDF

● MicroPython

● JavaScript

● LUA

Každý z nich má trochu inú syntax, no kvôli prehľadnosti, vôli rozšíriť naše obzory
a rýchlosti C/C++ sme si zvolili tento jazyk.
Na to, aby sme vedeli programovať ESP32, potrebujeme IDE – Integrated development
environment – v preklade integrované vývojové prostredie. Tento program je nástrojom,
ktorý prekladá zdrojový kód do strojového kódu a nahrává ho do procesora, zároveň
umožňuje komunikáciu medzi počítačom a doskou a debugging (metóda odstraňovania chýb
založená na princípe zastavenia programu vo vopred určenom stave). Na tento účel
používame PlatformIO, ktoré je rozšírením mnohoúčelového IDE Visual Studio Code (VS
Code). Použitie VS Code dodáva väčšiu kontrolu nad zdrojovým kódom. Síce je Visual
Studio Code nástroj, ktorý nebol vyvíjaný s takýmto účelom, modul PlatformIO ho rozširuje
o všetky potrebné úlohy ako je nahrávanie kódu do procesora alebo jeho samotný preklad.
Niekoľko ukážok (snímok obrazovky) z tohoto IDE nájdeme v prílohe č. 3.
Štruktúra Arduino programu má dve základné funkcie – funkciu setup, ktorá sa spustí vždy
keď sa procesor spustí a funkciu loop, ktorá beží hneď na to, v nekonečnom cykle. Príkazy,
ktoré sú v ktorejkoľvek z funkcií sú už výberom programátora. Z dôvodu opakovaného cyklu
zaspávania a budenia sa z deep sleep-u používame iba funkciu setup, keďže sa do druhej
funkcie beh programu nikdy nedostane (viac v časti Deep sleep)

7.2.2. Cyklus
Funkcia stanice je založená na opakovaní sledu akcií, vždy ohraničených prechodom do
režimu deep sleep. Pozostáva z:

11
1. Inicializácie senzorov, trvanie: < 100 ms
2. Pripojenia sa na sieť, trvanie: ~ 5 000 ms (v závislosti od rýchlosti siete)
3. Čítanie dát zo senzorov trvanie: 10 s
4. Odoslanie dát na úložisko, trvanie: ~ 500 ms
5. Spánok – deep sleep, trvanie: ~ 9 min, 15 s
Celková dĺžka cyklu bola nastavená prispôsobením poslednej fázy na 10 min.

7.2.2.1 Inicializácia senzorov a premenných


Jednou z prvých častí, ktoré uskutočňujeme v kóde je inicializovanie senzorov a deklarácie
premenných. Je to príprava na ich použitie. Na ich používanie potrebujeme tiež špecifické
knižnice, ktoré však už boli načítané na začiatku.
//Oznamenie AHT20 senzora
AHT20 aht20;

//Oznamenie BMP280 senzora


Adafruit_BMP280 bmp280;

Vytvorenie objektov AHT20 a BMP280

Následne vytvoríme jednotlivé premenné, ktoré budú použité na ukladanie načítaných


hodnôt. Všetky sú typu float – číslo reprezentované plávajúcou desatinnou čiarkou. Okrem
premenných si v kóde definujeme konštanty ktoré sú použité či už pri neskorších výpočtoch
alebo ku komunikácii.
//AHT20 setup
float AHTtemp;
float AHThumidity;

//BMP280 setup
float BMPpressure;
float BMPtemp;

//Master temperature setup


float avgTemp;

//Water Senzor setup


int AnalogWaterSensorPin = 39;
float waterSensorValue;

//wind speed setup


float windspeed;

12
float avgTimePerCycle = 0;
float floatTime;
unsigned long beginTime;
unsigned long endTime = 0;
int cycles = 0;
unsigned long currentTime;
float cycleToMeters = 1;
const int MIN_CYCLETIME = 200;
const int MAX_CYCLETIME = 4000;
const int MIN_WIND = 3;
const int MAX_WIND = 16;

7.2.2.2 Pripojenie na sieť – WifiClient


V ďalšej časti, ktorá má podiel na posielaní dát je využitie knižnice WiFi a WiFiManager,
ktoré sú použité na pripojenie sa na sieť a na schopnosť prenosu. ESP32 sa po zapnutí prepne
do režimu Prístupového bodu, kedy je možné pripojiť sa naň a konfigurovať jeho pripojenie
na internet. V programe je zároveň definovaný vzhľad stránky a možnosti konfigurácie.
Alternatívne, ak nejde o prvé zapnutie, ale o opätovný pokus o pripojenie sa, čip si zapamätá
názov siete, na ktorú sa v minulosti pripojil, spolu s heslom, ak je sieť zabezpečená a heslo sa
medzitým nezmenilo. Celý postup pripojenia sa je v samostatnej funkcii wifiConnect(), ktorú
voláme v rámci funkcie setup().
void wifiConnect(){
Serial.println("Checking the Wifi...");
wm.setConnectTimeout(15);
wm.autoConnect("Station");
}

Funkcia sa skladá nastavenia Connect Timeout, počet sekúnd počas ktorých sa ESP32 snaží
pripojiť na určenú sieť, po ňom nasleduje samotné pripojenie sa na sieť, v ktorom je zahrnutá
aj alternatívna možnosť vytvorenia Prístupového bodu. Parameter tohoto príkazu určuje
názov stanice, ak by malo prísť ku neschopnosti autonómne sa pripojiť na sieť.

7.2.2.3. Čítanie dát zo senzorov


Vyčítanie dát zo senzorov sa nachádza v samostatnej funkcii sensorRead(). V prípade
senzorov AHT20, BMP280 a vodného senzora je čítanie jednoduché, rýchlosť vetra je
počítaná s pomocou zaznamenaných hodnôt funkcie windInterrupt().

13
Teplota
Keďže sú oba senzory AHT20 a BMP280 schopné merania teploty, pre najpresnejší výsledok
je použitá priemerná hodnota, vypočítaná z načítaných hodnôt oboch senzorov. Teplota je
poskytnutá v stupňoch Celzia.
//AHT20
AHTtemp = aht20.getTemperature();

//BMP280
BMPtemp = bmp280.readTemperature();

//calc of avg temperature


avgTemp = (AHTtemp + BMPtemp)/2;

Vlhkosť vzduchu
Vlhkosť vzduchu je poskytovaná senzorom AHT20.
AHThumidity = aht20.getHumidity();

Dažďový senzor
Dažďový senzor odosiela dáta analógovo, preto je na jej čítanie použitý iný príkaz. Okrem
tejto charakteristiky sa však nelíši od čítania dát z ostatných senzorov.
//Water sensor
waterSensorValue = analogRead(AnalogWaterSensorPin);

Atmosférický tlak
Atmosférický tlak je meraný senzorom BMP280. Zároveň je v programe premenený na bary,
keďže ju senzor poskytuje vo forme Pascalov.
BMPpressure = bmp280.readPressure();
//convert to bar/100
BMPpressure = BMPpressure / 1000 ;//1 Pa = 0.00001 bar

14
Rýchlosť vetra
Na vypočítanie rýchlosti vetra je vytvorená samostatná funkcia calcWindSpeed(), volaná v
rámci funkcie sensorRead(). Na priradenie hodnôt sa používa funkcia map().
void calcWindSpeed(){
floatTime = endTime - beginTime;
if (cycles > 0){
avgTimePerCycle = floatTime / cycles;

if (avgTimePerCycle > MAX_CYCLETIME){


windspeed = MAX_WIND;
}
else if(avgTimePerCycle < MIN_CYCLETIME){
windspeed = MIN_WIND;
}
else{
windspeed = map(avgTimePerCycle, MIN_CYCLETIME,
MAX_CYCLETIME,MAX_WIND, MIN_WIND);
}
}
else{
windspeed = 0;
}
}

Táto funkcia vypočíta priemerný čas medzi dvoma otáčkami, ktorý je následne priradený k
zodpovedajúcej rýchlosti medzi dvoma manuálne nameranými krajnými hodnotami.
Alternatívne, pri extrémnych prípadoch hodnôt mimo priraďovacieho rozmedzia je ku
vypočítanému času priradená najväčšia hodnota z rozmedzia.

Funkcia windInterrupt() zastaví beh programu, aby zvýšila počet nameraných otáčok vždy,
keď sa jazýčkový kontakt spojí.
//interrupt for cycle counting for wind
void IRAM_ATTR windInterrupt(){
currentTime = millis();
if (currentTime - endTime > 50){if (cycles == 0){
beginTime = millis();
}
cycles ++;
endTime = millis();
Serial.println(cycles);
}
}

15
attachInterrupt(WINDPIN, windInterrupt, FALLING);

V časti setup() je vytvorené prepojenie medzi schopnosťou prerušiť hlavný beh programu a
funkciou windInterrupt().

Na meranie rýchlosti, resp. otáčok je vymedzený čas 10 sekúnd v rámci funkcie


sensorRead().
//wind speed calculation
Serial.println("Recording wind cycles...");
delay(10000);
Serial.print("Number of cycles recorded: ");
Serial.println(cycles);
//printIsCidloConnected();
calcWindSpeed();

7.2.2.4. Dátové úložisko – ThingSpeak


Ďalšou časťou kódu, ktorý je uskutočnený pred samotným meraním je inicializácia
a pripojenie sa na server ThingSpeak, ktorý vizualizuje namerané a prijaté dáta a robí ich
prístupné verejnosti. Na prácu s týmto serverom je použitá rovnomenná knižnica, ktorá však
na svoje fungovanie potrebuje pripojenie k sieti. Tento príkaz, spolu s ostatnými je použitý
v samostatnej funkcii, ktorá sa potom v časti setup() zavolá, aby prepojila ESP32 a server
ThingSpeak.
void thingspeakSetup(){
Serial.println("Initializing wificlient...");
ThingSpeak.begin(client);
Serial.println("Setting fields...");
ThingSpeak.setField(1, AHThumidity);
ThingSpeak.setField(2, BMPpressure);
ThingSpeak.setField(3, waterSensorValue);
ThingSpeak.setField(4, avgTemp);
ThingSpeak.setField(5, windspeed);
Serial.println("Fields set!");
}

Funkcia thingspeakSetup() je použitá neskôr v časti setup(), aby bol kód prehľadnejší.

Vo funkcii zároveň priradzujeme jednotlivé polia (patriace úložisku ThingSpeak,) ku


premenným, ktoré boli deklarované a používajú sa na uchovanie nameraných dát. V praxi
toto prepojenie znamená, že keď bude mať ESP32 všetky hodnoty namerané, jedným
16
príkazom sa pošlú na server ThingSpeak a tam budú následne zakreslené do grafu (Príloha č.
4). Tento príkaz je však použitý v inej časti kódu, pretože v momente kedy zavoláme túto
funkciu, posielané dáta ešte nebudú zmerané.

7.2.2.5. Spánok – Deep sleep


Režim deep sleep je kľúčový pri šetrení energie, keďže zabezpečuje úplnú nečinnosť
hlavného procesora. Do tohto režimu sa ESP32 prepne vždy, keď odošle dáta na ThingSpeak,
keďže nechať ho v aktívnom režime v tejto časti cyklu je zbytočné. Počas tejto fázy je
aktívny iba ULP (Ultra Low Power – ultra nízkoenergetický) koprocesor, ktorý je
zodpovedný za odpočítavanie času do zapnutia ESP32, aby sa začal ďalší cyklus. V programe
je príprava časovača zobudenia zabezpečená jedným riadkom kódu.
//setup timera
esp_sleep_enable_timer_wakeup(SLEEPY_TIME_SECONDS * CONVERT_TO_SECONDS);
Serial.println("Sleep timer setup complete.");

Samotný prechod do režimu spánku je realizovaný príkazom na konci cyklu.


Serial.println("Going to sleep now...");
//sleeping
esp_deep_sleep_start();

17
7.3. Konštrukcia

7.3.1. Časti konštrukcie


Konštrukcia sa skladá zo štyroch dielov, vytvorených pomocou 3D tlače. Ich návrhy sú v
prílohe č. 6. Materiál, ktorý sme použili bol plast, konkrétne PETG filament. Návrhy a
súbory, podľa ktorých sa diely tlačili nie sú naše, ale prevzaté z uvedených zdrojov
(konkrétne zdroj 4.).

7.3.1.1 Spodná časť


Spodná časť, (ang. base) slúži ako ochrana pre ESP32 a akumulátor. Zároveň je zospodu
predpripravená na pripevnenie.

7.3.1.2. Držiak senzorov


Držiak senzorov (ang. sensor holder) slúži ako opora pre senzor AHT20 a BMP280. Zároveň
je na ňom externe umiestnený Water Sensor. Držiak má zároveň otvor pre vodiče,
prechádzajúce do spodnej časti a napájajúce sa na ESP32.

7.3.1.3. Kryt
Kryt (ang. sensor housing) má špecifickú štruktúru, ktorá ho robí odolným voči vetru a
dažďu, no zároveň umožňuje robiť aj merania. Táto časť zároveň obsahuje jazýčkový
kontakt.

18
7.3.1.4. Rotačná vrtuľa
Rotačná vrtuľa (ang. anemometer) je jediná pohyblivá časť konštrukcie. Na spodnej časti je
pripevnený neodymový magnet, ktorý spína jazýčkový kontakt, umiestnený v kryte. Jej
schopnosť rotovať s minimálnym trecím odporom je zabezpečená ložiskom, umiestneným v
jej osi otáčania. Ložisko je spojené s krytom cez skrutku, na ktorú je vrtuľa nasadená.

19
7.4. Merania

7.4.1. Namerané dáta


Na overenie funkčnosti našej stanice sme sa rozhodli porovnať ju s inými dátami. Namerané
hodnoty sme porovnávali s dátami dostupnými na internete, meranými v našej lokalite.
(Zdroj, použitých dát na porovnanie je zdroj 5.)

Namerané dáta:
Dátum 6.12.2023 7.12.2023 8.12.2023 9.12.2023 10.12.2023 11.12.2023 12.12.2023 13.12.2023
Maximálna teplota -1.4 0.7 1.6 1.4 1.6 1.1 0.0 4.0
Minimálna teplota -3.9 2.6 -4.0 -3.5 -1.1 -4.0 -2.0 0.0
Vlhkosť vzduchu 82.2 93.2 89.9 89.3 91.2 94.9 95.7 94.9
Rýchlosť vetra 14.2 11.7 12.8 10.9 12.7 24.0 18.6 15.6
Atmosférický tlak 1016.6 1019.2 1022.7 1020.8 1013.3 1015.0 1011.3 1005.0

Dáta zo zdroja:
Dátum 6.12.2023 7.12.2023 8.12.2023 9.12.2023 10.12.2023 11.12.2023 12.12.2023 13.12.2023
Maximálna teplota 1.6 0.7 -0.4 0.4 0.6 1.1 1.0 4.0
Minimálna teplota -3.9 -0.4 -4.0 -1.5 -0.1 -1.0 0.0 1.0
Vlhkosť vzduchu 85.2 94.2 89.9 92.3 94.2 97.9 97.7 96.9
Rýchlosť vetra 13.2 13.7 12.8 10.9 15.7 22.0 16.6 16.6
Atmosférický tlak 1015.6 1018.2 1021.7 1020.8 1015.3 1013.0 1010.3 1003.0

7.4.2. Spotreba
Spotreba je v dôsledku perodického opakovania sa cyklu premenlivá. Na grafe nižšie vidíme
jej premeny (miliAmpér v závislosti od času). Spotreba cyklu sa vždy skladá spočiatku z
významného nárastu na prúd približne 125 mA (1), kedy sa ESP32 zapína a pripája na sieť.
Nasleduje fáza poklesu na približne 60 mA (2), kedy prebieha samotné meranie a následne
znovu pozorujeme nárast na približne 70 mA (3). Ten je spôsobený posielaním dát na
úložisko Thingspeak. Nakoniec spotreba klesne na 11 mA (4), kedy čip prejde do režimu
deep sleep a po určitom čase sa cyklus opakuje.
20
Takýmto spôsobom dokáže stanica vydržať 15 dní merania bez toho, aby musela byť
dobíjaná.
.

Poznámka: Pri meraní spotreby sme nastavili čas, kedy má byť ESP32 neaktívne, na kratší,
za účelom efektívnejšieho merania spotreby jedného cyklu. Pôvodný čas je nastavený na
desať minút medzi meraniami, tu sme pre praktickosť použili 5 sekúnd.

21
8. Výsledky práce a diskusia

Výsledkom našej práce je hotová konštrukcia funkčnej meteorologickej stanice, ktorá je


schopná merania teploty, vlhkosti, rýchlosti vetra a miery dažďa. Tieto výsledky po pripojení
sa na internet následne prepošle na úložisko ThingSpeak, ktorý sa postará o ich zobrazenie
a čitateľnosť pre širokú verejnosť formou grafov. Všetky príklady grafov sú uvedené
v prílohe č. 4.
Nielen že sa nám podarilo zostrojiť stanicu podľa predpokladov, no zároveň sme pomocou
využitia rôznych zdrojov vytvorili program a konštrukciu, ktorá využíva rozličné senzory a
meria viac dát ako jednotlivé príklady, uvedené v čerpaných zdrojoch.
Takýmto spôsobom sme vytvorili menšiu, menej výkonnú, no veľmi ľahko rozšíriteľnú
verziu meteorologickej stanice. Je plne automatizovaná, čo ju robí extrémne jednoduchou na
údržbu. Zároveň kvôli svojej niekoľkonásobne menšej konštrukcii dokáže byť umiestnená
takmer kdekoľvek, čo umožňuje vytvoriť hustú sieť takýchto staníc. Je cenovo a materiálovo
nenáročná, takže akonáhle príde k nutnosti vymeniť, odstrániť alebo pridať akúkoľvek jej
súčasť, nepredstavuje to finančný ani logistický problém. Súčasne je pripravená na inštaláciu
solárneho panelu s cieľom rozšíriť jej energetickú kapacitu a predĺžiť dobu prevádzky.

22
9. Záver práce a zhrnutie

Úspešne sme vytvorili stanicu, ktorá je schopná samostatnej činnosti, a zároveň energeticky
závislá len od jednej nabíjateľnej batérie. Má pomerne vysokú výdrž, dosiahnutú
pravidelným spánkom procesora, čo znižuje jej spotrebu. Zároveň posiela všetky svoje dáta
na verejné úložisko, kde sú čitateľné a prístupné každému.
Dalo by sa teda povedať, že sme splnili všetky predom dané ciele, ktoré sme očakávali od
našej práce. Zároveň sme získali veľmi veľa poznatkov, ktoré sme schopní použiť
v budúcnosti a vytvorili modernú alternatívu ku dnešnému spôsobu merania počasia na
lokálnom území.
Meteorológia je veda, ktorá možno na prvý pohľad vyzerá dokončene a bez potreby
modernizácie, no súčasný technologický pokrok nám ukazuje, že vždy je priestor kde sa
zlepšovať a vždy je možnosť zlepšiť a zefektívniť svoje spôsoby merania.

23
10. Zoznam použitej literatúry

1. Getting Started with the ESP32 Development Board randomnerdtutorials.com/getting-


started-with-esp32/#esp32-programming-environments

2. Arduino Water Sensor


https://arduinogetstarted.com/tutorials/arduino-water-sensor

3. Outdoor 3D Printed Wireless IoT Weather Station


https://www.instructables.com/Outdoor-3D-Printed-Wireless-IoT-Weather-Station/

4. Súbory na stiahnutie pre 3D tlač


https://www.the-diy-life.com/diy-3d-printed-iot-weather-station-using-an-esp32/

5. Weather Data Services


https://www.visualcrossing.com/weather/weather-data-services#

24
11. Prílohy

Príloha 1.

Špecifikácia vlastností vývojovej dosky ESP32

Počet jadier 2 (dvojjadrový)

Wi-Fi 2.4 GHz do 150 Mbitov/s

Bluetooth BLE (Bluetooth Low Energy) a legacy Bluetooth

Architektúra 32 bitov

Frekvencia
Do 240 MHz
časovača

RAM 512 KB

Kontakty 30

Capacitive touch, ADC (analog to digital converter),


DAC (digital to analog converter), I2C (Inter-Integrated
Circuit), UART (universal asynchronous
Vonkajšie receiver/transmitter), CAN 2.0 (Controller Area
pripojenia Network), SPI (Serial Peripheral Interface), I2S
(Integrated Inter-IC Sound), RMII (Reduced Media-
Independent Interface), PWM (pulse width modulation)
a viac.

Vstavané
Tlačidlá RESET a BOOT
tlačítka

Vstavaná modrá LED, automaticky pripojená na kontakt


Vstavané LED
GPIO2; vstavaná červená LED ktorá je ukazovateľom
svetlá
napájania.

25
Príloha 2.

Rozloženie
kontaktov na
vývojovej doske

26
Príloha 3.

Ukážka IDE Visual Studio Code a modulu PlatformIO

27
Príloha 4.

Ukážka grafov na webovej stránke úložiska ThingSpeak

28
Príloha 5.

Schéma zapojenia jednotlivých súčiastok

29
Príloha 6.

Náhľady jednotlivých častí konštrukcie

1. Spodná časť a držiak senzorov

2. Kryt a rotačná vrtuľa


3.

30
Príloha 7.
Zdrojový kód použitý na programovanie stanice
#include <Arduino.h>
#include <AHT20.h> //AHT20 senzor
#include <Wire.h> //kablikova komunikacia
#include <WiFi.h> //default wifi pripojenie
#include <WiFiManager.h> //wifimanager library
#include <Adafruit_BMP280.h> //BMP280 sensor library
#include "ThingSpeak.h" //thingspeak library

//setup wind pinu (used later in row 187)


const int WINDPIN = 13;

//Thingspeak API+channel
const char * tsAPIkey = "JY2GJEID5PQSM7JX";
long tschannelnum = 2302447;

//WiFi parametre + klient


WiFiClient client;
const char* WIFI_SSID = "";
const char* WIFI_PASSWORD = "";

//dlzka spinkania
const float SLEEPY_TIME_SECONDS = 5;
const int CONVERT_TO_SECONDS = 1000000;

//Oznamenie AHT20 senzora


AHT20 aht20;

//Oznamenie BMP280 senzora


Adafruit_BMP280 bmp280;

//AHT20 setup
float AHTtemp;
float AHThumidity;

//BMP280 setup
float BMPpressure;
float BMPtemp;

//Master temperature setup


float avgTemp;

//Water Senzor setup


int AnalogWaterSensorPin = 39;
float waterSensorValue;

//wind speed setup


float windspeed;

31
float avgTimePerCycle = 0;
float floatTime;
unsigned long beginTime;
unsigned long endTime = 0;
int cycles = 0;
unsigned long currentTime;
float cycleToMeters = 1;
const int MIN_CYCLETIME = 200;
const int MAX_CYCLETIME = 4000;
const int MIN_WIND = 3;
const int MAX_WIND = 16;

WiFiManager wm; // global wm instance


WiFiManagerParameter custom_field; // global param ( for non blocking w params )

String getParam(String name){


//read parameter from server, for customhmtl input
String value;
if(wm.server->hasArg(name)) {
value = wm.server->arg(name);
}
return value;
}

void saveParamCallback(){
Serial.println("[CALLBACK] saveParamCallback fired");
Serial.println("PARAM customfieldid = " + getParam("customfieldid"));
}
//should be called before reading, for setting up the communication between the ESP and the
sensors
void sensorSetup(){
//AHT20
Serial.println("Booting up AHT20 communication...");
Wire.begin();

if (aht20.begin() == false){
Serial.println("AHT20 not detected. Please check wiring. Freezing.");
while (1);}
Serial.println("AHT20 acknowledged.");
//BMP280
if (!bmp280.begin()) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring or try a different
address! Freezing."));
while (1);
}
Serial.println("BMP280 acknowledged.");
}

void thingspeakSetup(){
Serial.println("Initializing wificlient...");
ThingSpeak.begin(client);

32
Serial.println("Setting fields...");
ThingSpeak.setField(1, AHThumidity);
ThingSpeak.setField(2, BMPpressure);
ThingSpeak.setField(3, waterSensorValue);
ThingSpeak.setField(4, avgTemp);
ThingSpeak.setField(5, windspeed);
Serial.println("Fields set!");
}

void calcWindSpeed(){
floatTime = endTime - beginTime;
if (cycles > 0){
avgTimePerCycle = floatTime / cycles;

if (avgTimePerCycle > MAX_CYCLETIME){


windspeed = MAX_WIND;
}
else if(avgTimePerCycle < MIN_CYCLETIME){
windspeed = MIN_WIND;
}
else{
windspeed = map(avgTimePerCycle, MIN_CYCLETIME, MAX_CYCLETIME, MAX_WIND, MIN_WIND);
}
}
else{
windspeed = 0;
}
}

void printIsCidloConnected(){
pinMode(WINDPIN, INPUT_PULLUP);
if (digitalRead(WINDPIN) == HIGH){
Serial.println("Wind pin is high");
}
else {Serial.println("Wind pin is low");
}
}

//sensor reading function


//Reads the values from sensors and writes them into corresponding variables
void sensorRead(){
//AHT20
AHTtemp = aht20.getTemperature();
AHThumidity = aht20.getHumidity();

//BMP280
BMPtemp = bmp280.readTemperature();
BMPpressure = bmp280.readPressure();

33
//convert to bar/100
BMPpressure = BMPpressure / 1000 ;//1 Pa = 0.00001 bar

//Water sensor
waterSensorValue = analogRead(AnalogWaterSensorPin);

//calc of avg temperature


avgTemp = (AHTtemp + BMPtemp)/2;

//wind speed calculation


Serial.println("Recording wind cycles...");
delay(10000);
Serial.print("Number of cycles recorded: ");
Serial.println(cycles);
//printIsCidloConnected();
calcWindSpeed();
}

void valuesWrite(){
ThingSpeak.writeFields(tschannelnum, tsAPIkey);

Serial.println("Values written!");
}

void wifiConnect(){
Serial.println("Checking the Wifi...");
wm.setConnectTimeout(15);
wm.autoConnect("Station");
}

//interrupt for cycle counting for wind


void IRAM_ATTR windInterrupt(){
currentTime = millis();
if (currentTime - endTime > 50){
if (cycles == 0){ //handling for the first revolution time
beginTime = millis();
}
cycles ++;
endTime = millis();
Serial.println(cycles);
}
}

void setup(){
Serial.begin(115200);
Serial.println();
Serial.println("Starting up...");

34
attachInterrupt(WINDPIN, windInterrupt, FALLING);

// wm.resetSettings(); // wipe settings

// add a custom input field


int customFieldLength = 40;
// test custom html(radio)
const char* custom_radio_str = "<br/><label for='customfieldid'>Custom Field
Label</label><input type='radio' name='customfieldid' value='1' checked> One<br><input
type='radio' name='customfieldid' value='2'> Two<br><input type='radio' name='customfieldid'
value='3'> Three";
new (&custom_field) WiFiManagerParameter(custom_radio_str); // custom html input
wm.addParameter(&custom_field);
wm.setSaveParamsCallback(saveParamCallback);

// custom menu via array or vector


//
// menu tokens, "wifi","wifinoscan","info","param","close","sep","erase","restart","exit"
(sep is seperator) (if param is in menu, params will not show up in wifi page!)
// const char* menu[] = {"wifi","info","param","sep","restart","exit"};
// wm.setMenu(menu,6);
std::vector<const char *> menu = {"wifi","info","param","sep","restart","exit"};
wm.setMenu(menu);

// set dark theme


wm.setClass("invert");

//setup timera
esp_sleep_enable_timer_wakeup(SLEEPY_TIME_SECONDS * CONVERT_TO_SECONDS);
Serial.println("Sleep timer setup complete.");

wifiConnect();
sensorSetup();
sensorRead();

thingspeakSetup();
valuesWrite();

Serial.println("Going to sleep now...");


//sleeping
esp_deep_sleep_start();
}
void loop(){
}

35
Príloha 7.
Zostavená stanica

36

You might also like