Meteostanice s hodinami a s ukazatelem měsíčních fází

Nastavení a komunikace přes sériovou linku

Základní nastavení zařízení se provádí přes USB sériový port v libovolném sériovém terminálu pomocí jednoduchých textových příkazů.

Jedná se o nastavení datumu a času, nastavení korekcí čidel, stažení všech naměřených hodnot, nastavení funkce LED, nebo stažení aktuálních hodnot, které jsou zobrazené na displeji.

Příkaz začíná vždycky znakem "#"  a pokračuje dalším znakem, který určuje funkci. Některé funkce pak vyžadují ještě další číslo jako parametr (například při nastavení korekcí), nebo řetězec čísel (například při nastavení času).
Neodesílá se žádné ukončení řádky. Je nutné celý příkaz odeslat najednou (během 0,1 sekundy).

Komunikační parametry sériové linky jsou nastavené napevno:  "38400,n,8,1".



Přehledný seznam příkazů pro sériovou komunikaci

Detailní popis jednotlivých příkazů je pod tabulkou.
Příkaz Parametr   Popis
#? - Výpis systémových informací (korekce čidel, rekordy teplot).
## - Výpis aktuálních hodnot v CSV formátu.
#T yyyymmddhhnnssW Nastavení datumu, času a dne v týdnu. Příklad: #T201809261645003 = 26.9.2018 16:45:00 Středa
#P 0 až 255 Korekce tlakoměru ( +0 až +25500Pa ). Příklad: #P24 =+2400Pa
#O 0 až 255 Korekce venkovní teploty  (-10°C až + 15,5°C). Příklad: #O103 = +0,3°C
#I 0 až 255 Korekce vnitřní teploty  (-10°C až + 15,5°C). Příklad: #I94 = -0,6°C
#V 0 až 255 Korekce vlhkoměru  (-100% až + 155%). Příklad: #V2 = +2%RH
#A 0 až 255 Nastavení "Aging offset" registru v RTC obvodu DS3231. Příklad: #A7 = +0,7PPM
#x - Výpis 40 5-minutových záznamů všech hodnot.
#X - Výpis 150 hodinových průměrů všech hodnot.
#M - Mazání rekordních teplot.
#m - Zhasnutí všech LED (potvrzení rekordů, smazání paměti pro modrou LED).
#F 0 až 31 Volba funkcí LED. Příklad: #F1 = zapnout signalizaci teplotních rekordů, modrou LED trvale vypnout.
#U -500 až 1000 Přepínací úroveň v desetinách °C pro modrou LED (-50.0°C až +100°C). Příklad: #U278 = 27,8°C
#R - Smazání všech naměřených hodnot z paměti (smazání všech grafů).



Výpis systémových informací

Informace o aktuálně nastavených korekcích a další systémové informace se zobrazí při zadání příkazu "#?".

#?
Casova zona      :  2
Korekce tepl. IN :  100
Korekce tlaku    :  0
Korekce vlhkosti :  100
Korekce tepl. OUT:  100
Funkce LED       :  0b00000001
Prepinaci uroven :  100.00'C
Stari Mesice [d] :  27.92
Aktualni teplota    OUT :23.75'C
Maximalni teplota:  23.85'C ( 8. 9.  9:34)
Minimalni teplota:  23.75'C ( 8. 9. 10:00)
Reset rekordu    :   8. 9.  9:32

Informace o korekcích a dalších parametrech systému

Jako "Aktualni teplota" se zobrazuje ta, na které se hlídá překročení rekordů.
Tato teplota se vybírá propojkou na plošném spoji s označením "T" (na nové verzi pl. spoje je označena "I/O").
Pokud je "T" spojené na GND, zaznamenávají se rekordy vnitřní teploty.
Pokud je "T" rozpojené, zaznamenávají se rekordy venkovní teploty.

Zároveň je zvolená teplota použita pro ovládání modré LED.

Rekordy se při přepnutí automaticky nemažou. Je možné je ale smazat ručně přes menu, nebo příkazem "#M" přes sériovou linku.
V tom případě se rekordy nastaví na nesmyslné údaje (minimum = 199.9°C a maximum -49.9°C), které jsou ale při první příležitosti přepsány aktuálními teplotami.

První 3 minuty po zapnutí napájení (po resetu) se naměřená hodnota jako rekord nezaznamenává. Je to kvůli stabilizaci čidel.
Během této doby se na řádce s aktuální teplotou zobrazuje jen "---".

 


Nastavení času

Nastavení času se provádí odesláním příkazu "#T", za kterým následuje řetězec 15 čísel s významem YYYYMMDDhhnnssW.
(4 znaky pro rok, po dvou znacích měsíc, den, hodiny, minuty a sekundy. Poslední číslo je den v týdnu Po=1 ....Ne=7).
Před nastavením je nutné přepnout přepínač SEČ / SELČ do správné polohy. Čas se pak zadává v místním časovém pásmu.

#T201807112147103
Rok     :           2018
Mesic   :           7
Den     :           11
Hodiny  :           21
Minuty  :           47
Sekundy :           10
Den v tydnu:        St
Po zadání příkazu se zobrazí rozložené položky s popisy.

Při změně mezi SEČ a SELČ pak stačí jen přepnout přepínač a čas se automaticky o hodinu upraví.
Jedinou podmínkou je, aby toto přepnutí bylo učiněno v době, kdy přičtení, nebo odečtení hodiny nezpůsobí přechod mezi dny.
Takže podzimní přechod ze SELČ na SEČ by neměl být prováděn v době mezi půlnocí a jednou hodinou ráno.
A jarní přechod ze SEČ na SELČ by neměl být prováděn mezi 23. hodinou a půlnocí.
Pokud by k přepnutí došlo v těchto "nedovolených" intervalech, hodina se automaticky neposune a čas se pak bude muset nastavit přes 
sériový port.

Přepnutí ze SELČ na SEČ
s automatickým posunem hodin
 
Nastavení korekcí čidel

Každou naměřenou hodnotu je možné před zobrazením o něco posunout. Tuto funkci jsem zavedl pro zlepšení přesnosti.
Posunutí je ale jen o konstantní hodnotu (u teplot a vlhkosti je možné konstantu přičítat i odečítat, u tlaku se jen přičítá)

 Pro korekci zobrazení naměřených hodnot se používají příkazy:
  "#P" pro korekci tlaku
  "#O" pro korekci venkovní teploty (OUT)
  "#I" pro korekci vnitřní teploty (IN)
  "#V" pro korekci vlhkoměru

Korekce tlaku se provádí příkazem "#P", za kterým následuje číslo v rozsahu 0 až 255.
V tomto případě se pouze přidává hodnota ve stovkách Pascalů (hPa) k naměřené hodnotě.

Od začátku jsem ale počítal s tím, že se nebude zobrazovat nějaká přesná hodnota tlaku.
Šlo mi hlavně o informaci o tlakovém trendu (zvyšování / snižování / setrvalý stav), který by byl vidět v grafech.
Proto se ani nesnažím o žádný přepočet tlaku na hladinu moře.

Příklad:
  Při zadání  "#P74" se bude zobrazovat hodnota tlaku o 7,4kPa (= 74hPa = 7400Pa)  vyšší, než je naměřená.
  Maximální hodnota, kterou je možné přidat k naměřené hodnotě je tedy +25,5kPa

#P15
Casova zona      :  2
Korekce tepl. IN :  100
Korekce tlaku    :  15
Korekce vlhkosti :  100
Korekce tepl. OUT:  100
Funkce LED       :  0b00000001
Prepinaci uroven :  100.00'C
Stari Mesice [d] :  27.92
Aktualni teplota    OUT :23.75'C
Maximalni teplota:  23.85'C ( 8. 9.  9:34)
Minimalni teplota:  23.75'C ( 8. 9. 10:00)
Reset rekordu    :   8. 9.  9:32
Korekce tlaku o +1500Pa

 

Pro korekci venkovní teploty se použije příkaz "#O", za kterým následuje číslo v intervalu 0 až 255.
Číslo 100 znamená nulovou korekci (co se změří, to se zobrazí).
Každé jedno číslo rozdílu od čísla 100 znamená posun mezi naměřenou a zobrazenou hodnotou o 0,1°C.
Příklady:
  Při zadání "#O114" se bude zobrazovat hodnota o 1,4°C vyšší, než je naměřená.
  Při zadání "#O96" se bude zobrazovat hodnota o 0,4°C nižší, než je naměřená.
Maximálně je tedy možné zobrazovat číslo o 10°C nižší, nebo o 15,5°C vyšší, než je naměřená hodnota.

#O105
Casova zona      :  2
Korekce tepl. IN :  100
Korekce tlaku    :  15
Korekce vlhkosti :  100
Korekce tepl. OUT:  105
Funkce LED       :  0b00000001
Prepinaci uroven :  100.00'C
Stari Mesice [d] :  27.92
Aktualni teplota    OUT :23.75'C
Maximalni teplota:  23.85'C ( 8. 9.  9:34)
Minimalni teplota:  23.75'C ( 8. 9. 10:00)
Reset rekordu    :   8. 9.  9:32
Korekce venkovní teploty o +0,5°C

 

 


Dalším typem korekce čidel  je korekce vnitřní teploty. Ta se provádí příkazem "#I", za kterým následuje číslo 0 až 255.
Tady je přepočet stejný, jako u korekce venkovní teploty (číslo 100 je bez korekce a maximální korekce je -10°C pro číslo 0, nebo +15,5°C pro číslo 255).

#I92
Casova zona      :  2
Korekce tepl. IN :  92
Korekce tlaku    :  15
Korekce vlhkosti :  100
Korekce tepl. OUT:  105
Funkce LED       :  0b00000001
Prepinaci uroven :  100.00'C
Stari Mesice [d] :  27.92
Aktualni teplota    OUT :23.75'C
Maximalni teplota:  23.85'C ( 8. 9.  9:34)
Minimalni teplota:  23.75'C ( 8. 9. 10:00)
Reset rekordu    :   8. 9.  9:32
Korekce zobrazení vnitřní teploty o -0,8°C


Poslední korekcí je korekce vlhkosti. Pro ni se použije příkaz "#V", následovaný číslem 0 až 255.
Číslo 100 znamená "bez korekce" a každé jedno číslo rozdílu od čísla 100 znamená odchylku o +/- 1% vlhkosti.
Příklady:
  Při zadání "#V105" se bude zobrazovat hodnota vlhkosti zvýšená o 5% než je naměřená hodnota
          (samotné čidlo změří vlhkost 47%, ale zobrazí se 52%).

  Při zadání "#V98" se bude zobrazovat hodnota vlhkosti snížená o 2% než je naměřená hodnota
          (samotné čidlo změří vlhkost 58%, ale zobrazí se 56%).

#V103
Casova zona      :  2
Korekce tepl. IN :  92
Korekce tlaku    :  15
Korekce vlhkosti :  103
Korekce tepl. OUT:  105
Funkce LED       :  0b00000001
Prepinaci uroven :  100.00'C
Stari Mesice [d] :  27.92
Aktualni teplota    OUT :23.75'C
Maximalni teplota:  23.85'C ( 8. 9.  9:34)
Minimalni teplota:  23.75'C ( 8. 9. 10:00)
Reset rekordu    :   8. 9.  9:32
Korekce vlhkosti o +3%


Doladění přesnosti RTC obvodu

Použitý RTC obvod DS3231 je velice přesný.
Podle katalogového listu je při použití v běžných teplotách (0°C až 40°C) maximální odchylka +/-2ppm. 
To znamená maximální odchylku za rok:
  365 [dní] * 24 [hodin] * 60 [minut] * 60 [sekund] * 0.000 002 [ppm] = 63 sekund za rok.

Z toho jsem usoudil, že nebude nutné do programu zavádět ruční nastavování času přes menu. Při výměně baterie v RTC se jednou za několik let nastaví základní čas přes USB a pak už budou stačit občasné úpravy +/- několik sekund přes menu.

Při volbě položky menu "Brzdit 00 sek." se aktuální hodnota sekund nastaví na 0. Všechny ostatní časové údaje zůstávají stejné (čas se tedy posune o něco zpátky).
Při volbě položky v menu "Zrychlit 59 sek." se aktuální hodnota sekund nastaví na 59. I tady zůstávají ostatní údaje beze změny (čas se tak posune o něco dopředu).
   
Frekvenci krystalu v RTC obvodu je možné ještě doladit pomocí registru "Aging Offset" (viz katalogový list obvodu DS3231).
Hodnotu tohoto registru je možné upravovat přes sériovou linku příkazem "#A", za kterým následuje číslo v rozsahu 0 až 255.  

Takže například odesláním sekvence znaků "#A127" se frekvence krystalu zrychlí na maximum, nebo odesláním "#A255" se frekvence sníží na minimum. Změna o jedno číslo zrychluje nebo zpomaluje krystal o 0,1ppm.
    Defaultní hodnota je "#A0".

#A5
5
Zvýšení frekvence krystalu o 0,5ppm.


Export naměřených hodnot  

V programu jsou zavedené ještě exportní funkce, které jsou přístupné přes sériový terminál.

Po zadání příkazu "#x" (malé x) dojde k exportu 40 posledních hodnot zaznamenaných s intervalem 5 minut.

Výpis ze sériového terminálu pak vypadá nějak takto:
#x
0;1060;35665;739;760;27;
1;1065;35664;738;760;27;
2;1070;35661;737;760;27;
3;1075;35653;739;761;27;
.
.
.       (tady data pokračují)
.

38;1375;35991;741;754;42;
39;1380;35994;741;759;40;

Podobně pak příkaz "#X" (velké X) slouží k přenosu posledních 150 hodinových průměrů záznamů.
#X
0;65535;65535;65535;65535;
1;65535;65535;65535;65535;
.
.
.       (tady data pokračují)
.

147;5757;35665;737;756;27;
148;5758;35659;739;761;27;
149;5759;35674;737;761;26;

Jednotlivé sloupce dat jsou odděleny středníkem.

První číslo je pořadové číslo vzorku.
              0 až 39 pro 5-minutové záznamy a
              0 až 149 pro hodinové záznamy.

Druhé číslo udává časovou značku při ukládání vzorku do paměti
              u 5-minutových záznamů je to počet minut od půlnoci aktuálního dne (0 až 1435)
              u hodinových záznamů je to počet hodin od půlnoci 1.ledna aktuálního roku (0 až 8783)

Třetí číslo je hodnota tlaku v Pascalech, od které jo odečtena konstanta 60000
                   To je z toho důvodu, aby se hodnota tlaku vešla do velikosti proměnné "unsigned int" (to je 0 až 65535)
                   Předpokládám, že tlak bude vždycky v rozsahu 60000 Pa až 125535 Pa  

Čtvrté číslo je teplota z čidla DS18B20 v desetinách °C zvětšená o 500 (například číslo 425 znamená -7,5°C)

Páté číslo je vnitřní teplota z čidla vlhkosti v desetinách °C zvětšená o 500 (například číslo 737 znamená 23,7°C)

Poslední číslo je vlhkost v %

Všechny hodnoty se ukládají včetně nastavených korekcí (viz výše).

Pokud se vrací číslo 65535, znamená to, že se do této paměťové pozice ještě žádné hodnoty neuložily.

 

 

Aktuální hodnoty (hodnoty na displeji) je možné do sériové linky vyžádat příkazem "##".

Data se odešlou jako jedna řádka textu s jednotlivými položkami oddělenými středníkem. Tento formát je pak jednoduché zpracovat nadřazeným systémem jako běžný CSV formát.

##
 8. 9.2018; 9:34:59;738;756;44;36151;0b01000000;15;40176

Formát vrácených dat je následující:

Prvních 10 znaků je datum ve formátu "DD.MM.YYYY" (úvodní nuly dní a měsíců jsou nahrazeny mezerami)

Dále následuje oddělovač ";". Tímto oddělovačem se oddělují i ostatní položky.

Dalších 8 znaků je čas ("HH:NN:SS"). Tady je nahrazena mezerou je případná úvodní nula u hodin. Minuty a sekundy úvodní nulu obsahují.

Po dalším oddělovači následuje venkovní teplota v desetinách °C zvětšená o 500 (příklad: číslo 738 = 23,8°C). 
Hodnota je v rozsahu "unsigned int" (0 až 65535). 

Další číslo udává vnitřní teplotu. I tato teplota je v desetinách °C a je posunuta o +500  (příklad: číslo 756 = 25,6°C). 
I tato hodnota je v rozsahu "unsigned int" (0 až 65535). 

Pak následuje vlhkost v % (příklad 44 = 44%). 
Velikost proměnné je v tomto případě Byte (0 až 255).
Pozor na správně nastavenou korekci vlhkosti. Teoreticky se může stát, že při špatně nastavené korekci bude vlhkost záporná. I v tom případě ale bude výstupem pouze 1 bajt, ale číslo může "podlézt" nulu na hodnotu 255 a níže.

Další hodnota je změřený tlak v Pascalech zmenšený o 60000. To snížení je kvůli snazšímu přenosu pro další zpracování jako dvojbajtová hodnota ("unsigned int") (příklad: 36151 = 95,151kPa). 
Tlak se nepřepočítává na hladinu moře - bere se absolutní tlak a přičítá se k němu případná korekce, která byla zadaná příkazem "#P".

Dále následuje binární kód, který zobrazuje následující stavové informace: 

bit 7 Vždycky "0"  
 
bit 6 Ze kterého čidla teploty se hlídají rekordy '1'=venkovní teplota
'0'=vnitřní teplota
bit 5 Vždycky "0"  
 
bit 4 Vždycky "0"  
 
bit 3 Vždycky "0"  
 
bit 2 Svítí modrá LED? '1'=modrá LED svítí
'0'=modrá LED je zhasnutá
bit 1 Je zaznamenaný kladný rekord?
(Když je povolená funkce LED, svítí červená?)
'1'=rekord je zaznamenaný (červená svítí)
'0'=rekord od vynulování ještě nenastal
bit 0 Je zaznamenaný záporný rekord?
(Když je povolená funkce LED, svítí zelená?)
'1'=rekord je zaznamenaný (zelená svítí)
'0'=rekord od vynulování ještě nenastal
Binární hodnota se přenáší jako textový řetězec o délce 10 znaků ("0b0x000xxx")


Předposlední číslo udává aktuální ikonu stavu Měsíce, která se zobrazuje na displeji. Velikost proměnné je Byte (hodnoty 0 až 15)
Existuje 16 různých ikon pro všechny fáze Měsíce (0= nov; 4=první čtvrť; 8=úplněk; 12=poslední čtvrť; 15=skoro další nov)

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15



Poslední číslo je stáří Měsíce v minutách od posledního novu.  Hodnota je velikosti "unsigned int" (0 až 65535). 

Celá sekvence končí Windowsovským koncem řádky (CR+LF).

 

Tato funkce byla plánovaná pro přenos dat na nadřazený systém. Tam se musí jednotlivé položky ještě zpracovat do čitelného tvaru.
Přenos je možný buď do PC přes USB, nebo je na plošném spoji připravený prostor pro nějaký bezdrátový přenos (Bluetooth).


Mazání všech záznamů z paměti

Všechna naměřená data je možné z paměti smazat příkazem "#R".

To se může hodit v případě přesunu meteostanice do výrazně jiné nadmořské výšky, nebo po delší době nečinnosti, které by způsobilo špatné zobrazení grafů.
Například by původní hodnoty byly v porovnání s novými tak malé, že by se všechny zobrazovaly jen jako jedna čárka (minimum).
Nové hodnoty by naopak byly v porovnání se starými hodnotami tak velké, že by se zobrazovaly jako plné obdélníky (maximum). Tento stav by trval tak dlouho, než by se všech 40 původních hodnot nepřepsalo novými a tím se automatický rozsah výšky sloupců neupravil.


Ukázka grafu tlaku při přenosu stanice do výrazně nižší nadmořské výšky.

#R
OK



LED


Meteostanice obsahuje 3 LED (červená, zelená a modrá), jejichž funkci je možné pomocí dvou příkazů zvolit.
Funkce těchto LED je možné nastavit pomocí příkazů "#F" a "#U".

Červená a zelená LED jsou připraveny k signalizaci překročení rekordních venkovních nebo vnitřních teplot (červená signalizuje překročení maxima, zelená signalizuje pokles pod minimum). Tuto funkci je možné buď zapnout, nebo vypnout.

Modrou LED je možné nastavit, aby se rozsvěcela, nebo zhasínala při překročení, nebo poklesu venkovní teploty přes určitou úroveň.
Také je možné jí nastavit paměťovou funkci. Poslední funkcí modré LED může být hlídání rozdílu vnitřní a venkovní teploty.

Volba funkcí LED se provádí příkazem "#F", za kterým následuje číslo v rozsahu 0 až 31 (desítkově).

Bitový rozklad tohoto čísla určuje funkci:

Bity v čísle
za znakem "F"
desítkově Popis funkce Týká se LED
xxxxxxx0 0 funkce upozorňování na teplotní rekordy vypnutá červená + zelená
xxxxxxx1 1 funkce upozorňování na teplotní rekordy zapnutá červená + zelená
xxx0xx0x 0 paměť překročení nebo poklesu přes nastavenou úroveň vypnutá modrá
xxx0xx1x 2 paměť překročení nebo poklesu přes nastavenou úroveň zapnutá modrá
xxx000xx 0 modrá LED trvale vypnutá modrá
xxx001xx 4 hlídání poklesu teploty pod nastavenou úroveň zapnuté modrá
xxx010xx 8 hlídání překročení teploty přes nastavenou úroveň zapnuté modrá
xxx011xx 12 hlídání překročení a zároveň poklesu zapnuté (viz poznámka níže) modrá
xxx10xxx 16 zhasnutí LED, když je venkovní teplota o 1°C vyšší, než vnitřní. modrá
xxx11xxx 24 rozsvícení LED, když je venkovní teplota o 1°C vyšší, než vnitřní. modrá

Při funkcích pro porovnávání venkovní a vnitřní teploty (16 a 24) se LED vrací do základního stavu v okamžiku, když je venkovní teplota o 1°C nižší, než vnitřní.
Tyto funkce byly zamýšlené pro automatické otevírání a zavírání oken v létě.
Když je venku moc teplo, okna se zavřou. Když se venku ochladí, okna se otevřou a začne se větrat.

Funkce 12 (hlídání překročení a zároveň poklesu) je v podstatě nepoužitelná, ale v programu bylo z důvodů velikosti kódu lepší ji zachovat. Při této funkci je LED zhasnutá jen v případě, že je měřená teplota přesně shodná s nastavenou úrovní. Vzhledem k průměrování měřených hodnot je ale takovýto stav nepravděpodobný. Proto bude LED svítit trvale.

Úroveň teploty pro funkce, které hlídají překročení nebo pokles přes tuto hodnotu, se nastavuje příkazem "#U", za kterým následuje číslo.
Číslo je teplota v desetinách °C (může být i záporná).

Příklad:  Příkaz "#U238" znamená nastavení přepínací úrovně na 23,8°C

#U238
Casova zona      :  2
Korekce tepl. IN :  92
Korekce tlaku    :  15
Korekce vlhkosti :  103
Korekce tepl. OUT:  105
Funkce LED       :  0b00000001
Prepinaci uroven :  23.80'C
Stari Mesice [d] :  27.92
Aktualni teplota    OUT :23.75'C
Maximalni teplota:  23.85'C ( 8. 9.  9:34)
Minimalni teplota:  23.75'C ( 8. 9. 10:00)
Reset rekordu    :   8. 9.  9:32
Funkce LED se kvůli lepšímu přehledu zobrazuje v binární formě.

Když je paměťová funkce vypnutá, modrá LED zhasne, když se teplota vrátí zpátky pod nastavenou mez (nebo se vrátí zpátky přes nastavenou mez).

Když je paměťová funkce zapnutá, modrá LED svítí trvale, i když podmínka pro rozsvícení už pominula. LED se v tom případě dá zhasnout ručně - vstupem do menu pomocí rotačního ovladače.

Všechny LED je možné dálkově zhasnout příkazem "#m". Je to stejné, jako by se pomocí rotátoru vstoupilo do menu a nechaly se zobrazit minima a maxima teplot.


Příklad nastavení funkce LED:
upozorňování na teplotní rekordy zapnuté 1
hlídání překročení meze zapnuté 8
paměťová funkce zapnutá 2
SOUČET F11


Jiný příklad:
upozorňování na teplotní rekordy vypnuté 0
hlídání poklesu pod nastavenou mez zapnuté 4
paměťová funkce vypnutá 0
SOUČET F4

Další příklad:
upozorňování na teplotní rekordy zapnuté 1
Rozsvícení LED, když je venku o 1°C víc, než uvnitř 24
SOUČET F25


úvodní strana webu AstroMiK.org

poslední úprava stránky 22.9.2018