Meteorologická stanice na Arduinu. Vnitřní meteostanice na Arduinu Obvody meteorologické stanice na Arduinu uno

Chtěl jsem mít vlastní meteostanici, která přenáší údaje ze senzorů do mapy sledování lidí (hledání na Googlu trvá 5 sekund). Ukázalo se, že to není tak těžké, jak se zdá. Zvažte, co bylo uděláno.

Pro tuto akci jsem si vzal Arduino Uno a k tomu Ethernet Shield w5100. To vše bylo objednáno z Číny na Aliexpress.

Objednal jsem tam i senzory: DHT22, DHT11, DS18B20, BMP280 (plánují se i senzory plynu, kouře ...)

Když jsem vykouřil fóra, Google, Yandex, našel jsem dobrou verzi náčrtu - https://student-proger.ru/2014/11/meteostanciya-2-1/

Na stejném místě v komentářích osoba zveřejnila dokončenou skicu se světelnými a plynovými senzory. Vzal jsem je jako základ.

V těch náčrtech nebyla podpora 280. snímače tlaku, mluvili jsme s autorem, nahradil 180 280. Vše fungovalo v pořádku (za to moc děkuji)

Níže je příklad konečného náčrtu, který jsem dostal.

Momentálně mám připojené senzory:
DHT22 - 1 ks.
DHT11 - 1 ks.
BMP280 - 1 ks.
DS18B20 - 2 ks.

POZORNOST! Před nahráním náčrtu nezapomeňte změnit MAC adresu zařízení, aby se nepřekrývala s ostatními (např. vezměte Mac adresu svého mobilního telefonu a změňte v ní poslední písmena / čísla, která nebudou " narušit“ vaši místní síť!

Přibližné schéma zapojení (obrázek převzatý na internetu z tohoto náčrtu):

Z technických důvodů sem nemohu umístit skicu. Dal jsem to do archivu. Odkaz na něj je výše.

Jak můžete vidět, existují údaje, fungují správně, například zveřejním několik snímků obrazovky z mých senzorů:

Ve volném čase a tentokrát jsem sepsal návod na výrobu malé meteostanice. Bude fungovat jako hodiny s datem a bude ukazovat teploty uvnitř i vně místnosti. Jako hlavní ovladač použijeme Arduino UNO, ale postačí jiná deska s Atmega328p na desce. Pro zobrazení používáme grafickou obrazovku WG12864B. Dále připojíme dvě teplotní čidla ds18b20. Jeden je uvnitř, druhý venku. Začněme.

V procesu výroby domácích produktů potřebujeme:

Arduino UNO (nebo jakákoli jiná deska kompatibilní s Arduino)
- Grafická obrazovka WG12864B
- teplotní čidlo ds18b20, 2 ks
- Napájení 6 - 12 V
- Rezistory 4,7 Kom 0,25 W, 2 ks.
- Rezistory 100 ohm 0,25 W
- Přihrádka na baterie pro 4 "malíčkové" baterie AAA
- Krabice od kazety konzoly SEGA
- Izolační páska
- Propojovací vodiče
- Obvodová deska
- Tlačítka
- Kancelářský nůž
-páječka
- Pájka, kalafuna
- Oboustranná páska

Krok 1 Připravte WG12864B3.
Ti, kteří dosud s obrazovkami nepracovali, mohou být vyděšeni velkým množstvím úprav zdánlivě stejných obrazovek. Trochu to vysvětlím. Většina obrazovek tohoto typu funguje na čipech ks0107/ks0108. Všechny obrazovky lze rozdělit do 4 typů:

Možnost A: HDM64GS12L-4, Crystalfontz CFAG12864B, Sparkfun LCD-00710CM, NKC Electronics LCD-0022, WinStar WG12864B-TML-T

Option B: HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ Displays AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-88, Topway LM12864LDW, Digitron SG12864J4, QY-12864F, TM12864J4, QY-12864F, TM12864F

Možnost C: Shenzhen Jinghua Displays Co Ltd. JM12864

Možnost D: Wintek- Cascades WD-G1906G, Wintek - GEN/WD-G1906G/KS0108B, Wintek/WD-G1906G/S6B0108A, TECDIS/Y19061/HD61202, Varitronix/MGLS19262/HD66

Vypadají skoro stejně. Připojovací kolíky jsou ale jiné. Vybral jsem si, a doporučuji vám, WG12864B3 V2.0, ale pokud byla obrazovka dodána v jiném nebo ji prostě nemáte po ruce, můžete to snadno zjistit pomocí tabulky:

Stručné specifikace:

Na internetu je mnoho různých schémat připojení a zdá se, že vše funguje. Jde o to, že existují nejen různé obrazovky, ale také dva způsoby, jak je připojit: sériové a paralelní. Při použití připojení přes sériový port potřebujeme pouze 3 výstupy mikrokontroléru. S paralelním minimem 13. Volba je v tomto případě nasnadě, Arduino stejně nemá mnoho závěrů. Pro paralelní zapojení je schéma zapojení následující:

Pro sériové připojení, které použijeme, je schéma následující:

WG12864B - Arduino UNO 1 (GND) - GND 2 (VCC) - +5V 4 (RS) - 10 5 (R/W) - 11 6 (E) - 13 15 (PSB) - GND 19 (BLA) - přes rezistor 100 Ohm - +5V 20 (BLK) - GND

Pro nastavení kontrastu musí být na obrazovce potenciometr. Existují obrazovky bez něj, ale toto je nyní vzácné:

Aby napětí 5 voltů náhodou nespálilo podsvícení diod, je potřeba 100 ohmový odpor.

Krok 2 Vytvoření případu.
Pro případ vezměte box z cartridge set-top boxu Sega. Pokud tuto krabici nenajdete po ruce, můžete použít jiné pouzdro. Hlavní je, aby se do něj vešla obrazovka a Arduino.

Odřízněte průhlednou fólii v horní části krabice, aby nezůstaly žádné kousky:

Poté pomocí kancelářského nože vyřízněte okno 37x69 pro obrazovku.

Na rubovou stranu podél okraje výřezu nalepíme oboustrannou pásku, nejlépe černou:

Z lepicí pásky odstraníme ochranný papír a nalepíme na něj naši obrazovku:

Zvenčí by to mělo vypadat takto:

Pod obrazovkou, také na oboustrannou pásku, namontujeme Arduino, přičemž jsme předtím vytvořili výřezy pro port USB a napájecí zásuvku:

Na obou stranách krabice musí být provedeny výřezy pro zásuvky Arduino, aby se mohla volně zavírat:

Krok 3 Teplotní senzory.
Použijeme digitální teplotní čidla DS18B20. Pomocí nich získáme větší přesnost měření, chybu ne větší než 0,5 °C, v širokém teplotním rozsahu -55 ... + 125 °C. Senzor je navíc digitální a veškeré výpočty provádí sám a Arduino jednoduše přijímá již hotové údaje. Při zapojování tohoto snímače nezapomeňte na pull-up rezistor 4,7KΩ mezi piny DQ a VDD. Existuje také několik možností připojení. S externím napájením, podle mého názoru nejlepší možností, jej použijeme:

S jakoukoli možností napájení jsou senzory zapojeny paralelně:

Čidlo vnitřní teploty umístíme na malou desku spolu se dvěma tlačítky, kterými nastavíme čas a datum hodin:

Společný vodič z obou tlačítek připojíme na GND, vodič z prvního tlačítka zapojíme do A0, z druhého do A1.
Opravíme to na oboustrannou pásku vedle Arduina:

Snímač, který má být umístěn mimo místnost, je lepší zvolit v kovovém, prachotěsném pouzdře:

Vypočítejte si drát požadované délky, abyste mohli senzor zavěsit za okno, hlavní je, že by neměl být delší než 5 metrů, pokud potřebujete delší délku, budete muset snížit hodnotu tahu- nahoru odpor.

Vodič z datové sběrnice DQ obou senzorů připojíme na pin 5 Arduina.
Vdd - +5 Arduino.
GND - GND Arduino.

Krok 4 Výživa.
Pro napájení můžete použít napájecí zdroj s napětím 6 až 12 voltů. Na konec napájecího drátu připájejte zástrčku, která pasuje do zásuvky Arduino:

Nebo můžete do pouzdra vložit bateriový prostor pro čtyři "AAA", "malíčkové" baterie. A připojte kladný vodič z pozice k Vin Arduino a záporný vodič k GND.

Krok 5 Připravte programovací prostředí.
Nejprve si musíte stáhnout a nainstalovat Arduino IDE z oficiálních stránek

A také přidat do dvou knihoven potřebných pro skicu. OneWire - nutné pro komunikaci se senzory ds18b20:

U8glib - slouží k zobrazení informací na obrazovce:

Stahování knihoven. Poté archivy rozbalíme a obsah archivů přesuneme do složky „libraries“, která se nachází ve složce s nainstalovaným Arduino IDE. Můžete také přidávat knihovny prostřednictvím Arduino IDE. Chcete-li to provést, bez rozbalení archivů spusťte Arduino IDE, z nabídky vyberte Sketch - Connect Library. Zcela nahoře v rozevíracím seznamu vyberte položku "Přidat knihovnu ZIP". Zadejte umístění stažených archivů. Po všech krocích musíte restartovat Arduino IDE.

Krok 6 Úprava náčrtu.
Teplotní senzory pracují pomocí protokolu One Wire a pro každé zařízení mají jedinečnou adresu – 64bitový kód. Není vhodné přidávat příkazy pro hledání senzorů ve skice. Není potřeba zatěžovat Arduino pokaždé, aby se škytly senzory. Proto nejprve, když jsme vše shromáždili, vyplníme náčrt Arduina, který se nachází v nabídce Soubor - Příklady - Teplota Dallas - OneWireSearch. Poté spustíme Tools - Port Monitor. Arduino by mělo najít naše senzory, napsat adresy a naměřené hodnoty teploty. Tyto adresy je třeba zapsat nebo jednoduše někam zkopírovat. Nyní otevřete skicu Ard_Tic_Tak_WG12864B_2_x_Term_Serial a vyhledejte řádky:

Byte addr1=(0x28, 0xFF, 0x75, 0x4E, 0x87, 0x16, 0x5, 0x63);// adresa interního bajtu addr2=(0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x50, 0x16, senzor);

Adresy čidel odpovídajících umístění nahrazujeme našimi adresami.
Naše hodiny nevyužívají modul RTC (hodiny reálného času), proto je nutné hodiny opravit. Pro usnadnění odkomentujte řádek (na obrazovce se objeví sekundy):

//u8g.setPrintPos(44, 50); u8g.print(s); // Výstup sekund pro kontrolu správnosti pohybu

Nastavte správný čas pomocí monitoru portu. Chcete-li to provést, otevřete monitor portu, počkejte na dokončení počátečních měření teploty a zadejte aktuální datum a čas ve formátu „den, měsíc, rok, hodiny, minuty, sekundy“. Žádné mezery, čísla jsou oddělena čárkami nebo tečkami.

Pokud hodiny spěchají, změňte hodnotu na větší, doporučuji experimentovat s krokem 100 jednotek. Pokud by zaostávání mělo snížit hodnotu v řádku:

If (micros() - prevmicros >494000) ( // změňte na něco jiného a upravte to bylo 500000

Empiricky určíme číslo, při kterém hodiny běží dostatečně přesně. K určení přesnosti pohybu potřebujete výstup v sekundách. Po přesné kalibraci čísla lze sekundy okomentovat a odstranit tak z obrazovky.
Nahrávání náčrtu.

Nějak jsem při procházce městem uviděl nový obchod s radioelektronikou, který se otevřel. Když jsem se do toho pustil, našel jsem velké množství štítů pro Arduino. Měl jsem doma Arduino Uno a Arduino Nano a hned mě napadlo pohrát si s vysílači signálu na dálku. Rozhodl jsem se koupit nejlevnější vysílač a přijímač na 433 MHz:

Vysílač signálu.


přijímač signálu.

Po zaznamenání nejjednoduššího náčrtu přenosu dat (příklad je převzat odtud) se ukázalo, že vysílací zařízení mohou být docela vhodná pro přenos jednoduchých dat, jako je teplota, vlhkost.

Vysílač má následující vlastnosti:
1. Model: MX-FS-03V
2. Akční rádius (závisí na přítomnosti blokujících předmětů): 20-200 metrů
3. Pracovní napětí: 3,5 -12V
4. Rozměry modulu: 19*19mm
5. Modulace signálu: AM
6. Výkon vysílače: 10mW
7. Frekvence: 433MHz
8. Požadovaná délka externí antény: 25 cm
9. Snadné připojení (pouze tři vodiče): DATA ; VCC; Země.

Vlastnosti přijímacího modulu:
1. Pracovní napětí: DC 5V
2. Proud: 4mA
3. Pracovní frekvence: 433,92MHz
4. Citlivost: - 105dB
5. Rozměry modulu: 30*14*7mm
6. Potřebná externí anténa: 32 cm.

V rozlehlosti internetu se uvádí, že dosah přenosu informací rychlostí 2Kb/s může dosáhnout až 150m. Sám jsem to nekontroloval, ale ve dvoupokojovém bytě to akceptuje všude.

Hardware domácí meteostanice

Po několika experimentech jsem se rozhodl připojit k Arduino Nano snímač teploty, vlhkosti a vysílač.


Teplotní senzor DS18D20 je připojen k arduinu následovně:

1) GND na mínus mikrokontroléru.
2) DQ přes pull-up rezistor k zemi a na pin D2 Arduina
3) Vdd až +5V.

Vysílací modul MX -FS - 03V je napájen 5V, datový výstup (ADATA) je připojen na pin D13.

K Arduinu Uno jsem připojil LCD displej a barometr BMP085.


schéma zapojení pro arduino un

Přijímač signálu je připojen na pin D10.

Modul BMP085 je digitální snímač atmosférického tlaku. Senzor umožňuje měřit teplotu, tlak a nadmořskou výšku. Rozhraní připojení: I2C. Napájecí napětí snímače 1,8-3,6V

Modul je připojen k Arduinu stejným způsobem jako ostatní I2C zařízení:

  • VCC - VCC (3,3 V);
  • GND-GND;
  • SCL - na analogový pin 5;
  • SDA - na analogový pin 4.
  • Velmi nízké náklady
  • Napájení a I/O 3-5V
  • Stanovení vlhkosti 20-80% s přesností 5%.
  • Stanovení teploty 0-50 stupňů. s přesností 2 %.
  • Frekvence dotazování ne více než 1 Hz (ne více než jednou za 1 sekundu)
  • Rozměry 15,5 mm x 12 mm x 5,5 mm
  • 4 kolíky s roztečí nohou 0,1".

DHT má 4 piny:

  1. Vcc (napájení 3-5V)
  2. Data out - Výstup dat
  3. Nepoužívá
  4. Všeobecné

Připojuje se k D8 Arduino.

Software domácí meteorologické stanice

Modul vysílače měří a vysílá teplotu každých 10 minut.

Níže je uveden program:

/* Verze skici 1.0 Odesílat teplotu každých 10 min. */ #include #include #include #define ONE_WIRE_BUS 2 //Kolík pro připojení senzoru Dallas OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors (&oneWire); DeviceAddress insideThermometer; void setup(void) ( //Serial.begin(9600); vw_set_ptt_inverted(true); // Vyžadováno pro DR3100 vw_setup(2000); // Nastavit přenosovou rychlost (bps) sensors.begin(); if (!sensors .getAddress (insideThermometer, 0)); printAddress(insideThermometer); sensors.setResolution(insideThermometer, 9); ) void printTemperature(DeviceAddress deviceAddress) ( float tempC = sensors.getTempC(deviceAddress); //Serial.print("Temp C : " ); //Serial.println(tempC); //Vytvoření dat pro odeslání int číslo = tempC; char symbol = "c"; //Symbolem služby pro určení, že se jedná o senzor String strMsg = "z "; strMsg + = symbol; strMsg += " "; strMsg += číslo; strMsg += " "; char msg; strMsg.toCharArray(msg, 255); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); / / Počkejte, až přenos dokončí zpoždění(200); ) void loop(void) ( for (int j=0; j<= 6; j++) { sensors.requestTemperatures(); printTemperature(insideThermometer); delay(600000); } } //Определение адреса void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16); //Serial.print("0"); //Serial.print(deviceAddress[i], HEX); } }

Přijímací zařízení přijímá data, měří tlak a teplotu v místnosti a přenáší je na displej.

#include #include LiquidCrystal lcd(12, 10, 5, 4, 3, 2); #include dht11 senzor; #define DHT11PIN 8 #include #include BMP085 dps = BMP085(); dlouhá Teplota = 0, Tlak = 0, Nadmořská výška = 0; void setup() ( Serial.begin(9600); vw_set_ptt_inverted(true); // Vyžadováno pro DR3100 vw_setup(2000); // Nastavit rychlost příjmu vw_rx_start(); // Spustit monitorování vzduchu lcd.begin(16, 2); Wire.begin(); delay(1000); dps.init(); //lcd.setCursor(14,0); //lcd.write(byte(0)); //lcd.home(); ) void loop() ( uint8_t buf; // Vyrovnávací paměť zpráv uint8_t buflen = VW_MAX_MESSAGE_LEN; // Délka vyrovnávací paměti if (vw_get_message(buf, &buflen)) // Pokud je zpráva přijata ( // Zahájit analýzu int i; // Pokud je zpráva není adresováno nám , exit if (buf != "z") ( return; ) char příkaz = buf; // Příkaz je na indexu 2 // Číselný parametr začíná na indexu 4 i = 4; int číslo = 0; // Vzhledem k tomu, že přenos probíhá znak po znaku, je třeba převést znakovou sadu na číslo while (buf[i] != " ") ( číslo *= 10; číslo += buf[i] - "0"; i++; ) dps.getPressure(&Pressure); dps.getAltitude (&Altitude); dps.getTemperature(&Temperature); //Serial.print(command); Serial.print(" "); Sériový tiskln(číslo); lcd.print("T="); lcd.setCursor(2,0); lcd tisk(číslo); lcd.setCursor(5,0); lcd.print("P="); lcd.print(Tlak/133,3); lcd.print("mmH"); lcd.setCursor(0,1); lcd.print("T="); lcd.print(Teplota*0,1); lcd.print("H="); lcd.print(senzor.vlhkosti); lcd.home(); //zpoždění(2000); int chk = sensor.read(DHT11PIN); switch (chk) ( case DHTLIB_OK: //Serial.println("OK"); break; case DHTLIB_ERROR_CHECKSUM: //Serial.println("Chyba kontrolního součtu"); break; case DHTLIB_ERROR_TIMEOUT: //Serial.println("Časový limit chyba"); break; výchozí: //Serial.println("Neznámá chyba"); break; ) ) )

P.S. V budoucnu plánuji přidat následující:
- snímač vlhkosti do vysílače, přepracovat algoritmus přenosu dat
- senzor pro měření rychlosti a směru větru.
- přidat další displej k přijímači.
- přeneste přijímač a vysílač do samostatného mikrokontroléru.

Níže je fotka toho, co se stalo:

Seznam rádiových prvků

Označení Typ Označení Množství PoznámkaSkóreMůj poznámkový blok
vysílací část.
Deska Arduino

Arduino Nano 3.0

1 Do poznámkového bloku
senzor teploty

DS18B20

1 Do poznámkového bloku
Rezistor

220 ohmů

1 Do poznámkového bloku
vysílací modulMX-FS-03V (433 MHz)1 Do poznámkového bloku
část pro příjem rádia.
Deska Arduino

Arduino Uno

1 Do poznámkového bloku
Trimrový odpor 1 Do poznámkového bloku
Rezistor


„Takže se shodneme hned: nebudete točit film pro Hollywood. Dokonce i v říši divů není schváleno více než pět procent všech scénářů a pouze jedno procento se pak dostane do výroby... Takže místo toho všeho si vytvoříte svůj vlastní Hollywood.
Ed Gaskel „Natáčení digitálního kina aneb Hollywood doma“

Úvodní slovo

Cože, další meteostanice Arduino?! Ano, ještě jeden a, něco mi říká, ne poslední na internetu věcí.


Stejně jako každý programátor musí napsat program „Hello World!“, tak každý arduinian musí mít zkušenosti se stavbou jednoduché nebo nepříliš meteostanice.
Je popsáno značné množství již vytvořených projektů meteostanic na internetu, čtenář si může vybrat k realizaci kterýkoli z nich. Upřímně řečeno, pečlivě jsem prostudoval asi tucet podobných projektů a spoustu příbuzných. Nedá se tedy říci, že jsem vše tvořil od nuly, samozřejmě jsem „stál na ramenou obrů“.


Hned musím říci, že mé plány nezahrnovaly použití služeb třetích stran pro ukládání a zobrazování dat. Chtěl jsem osobně pocítit a pochopit, jak to všechno funguje zevnitř od začátku do konce, od A do Z.


Takže pro ty, kteří chtějí rychle něco z ničeho vynýtovat, tato série článků s největší pravděpodobností není vhodná. Jednodušší je jít a koupit si hotovou sadu s návodem k sestavení. Profesionálové z mikroelektroniky tu nemají absolutně co dělat, možná si na začátku cesty povzdechli a vzpomněli si na sebe.
Ale pro ty, kteří chtějí opravdu rozumět, myslím, že se jim to bude líbit. Snad se materiál bude hodit jako učební pomůcka.



Tento projekt byl realizován již v roce 2016, ale doufám, že je stále aktuální.

Sada technologií

Budeme studovat jednoduché i složité věci a pracovat s nimi:

  • čidla teploty a vlhkosti typu DHT22, DHT11
  • snímač barometrického tlaku typ BMP180
  • WiFi modul ESP8266
  • rádiový modul typu nRF24 2,4 GHz
  • rodina Arduino Pro Mini, Arduino Mega
  • solární panely a baterie
  • programovací jazyk C/C++
  • PHP programovací jazyk
  • Systém pro správu databází MySQL
  • programovací jazyk Java a framework Android (vytvoření aplikace pro Adnroid pro zobrazení údajů o počasí na chytrém telefonu).

Některá vyjmenovaná témata nestojí ani za hůl a některá se dají studovat roky. Složitých věcí se proto dotkneme pouze v části přímo související s tímto projektem, abyste pochopili, jak to celé funguje.


Ale začneme úplně od začátkuže jo. Totiž z popisu a návrhu budoucího zařízení "na papíře" aby nakonec každá cihla ležela na svém místě.

prototypování

Jak nám správně říká Wikipedie, prototypování je rychlý návrh implementace fungujícího systému. Což, ano, nebude fungovat zcela neefektivně a s nějakými chybami, ale dá představu, zda by se řemeslo mělo rozvinout do průmyslového vzoru. Proces vytváření prototypu by neměl být dlouhý. Po fázi prototypování následuje analýza systému a jeho zdokonalování.


Ale to je v odvětví, kde jsou pracovníci zaměstnáni na plný úvazek.


Každý, kdo po večerech nýtuje svá pet-projektová řemesla pro „internet věcí“, by si měl být vědom toho, že vytváří prototyp, polotovar. Do úrovně běžného průmyslového produktu má velmi daleko. Proto neměli byste našim amatérským řemeslům svěřovat žádné kritické oblasti podpory života a doufám, že nás nezklamou.


Průmyslový produkt je postaven na bázi průmyslových prvků a poté prochází mnoha dalšími fázemi, včetně ladění, testování a údržby, než se stane bestsellerem.


Takže místo vší té nudy si vytvoříme vlastní hračku, ale ne jednoduchou. S prvky technické kreativity, počátky programování a znalostí (v procesu tvorby) mnoha dalších souvisejících věcí.


Inženýři elektroniky to samozřejmě budou mít ve fázi programování těžké a programátoři se budou muset zapotit nad obvody, ale autor se pokusí vše uvést co nejpřístupněji a jasně popsat, proč byla určitá řešení použita.

Požadavky

Obvykle se tento krok přeskakuje. Rozhodnout se něco takového udělat právě teď a pak se ukáží drobné detaily, které celý projekt staví do slepé uličky nebo ho dokonce činí neúnosným. Všechny naše Wishlisty je potřeba zaznamenat, používám k tomu Google Drive, je dostupný z PC i z mobilního zařízení.


Naše meteorologická stanice by tedy měla:

  • měřit venkovní teplotu a vlhkost
  • měřit teplotu a vlhkost v domě
  • měřit atmosférický tlak
  • zobrazit zobrazené hodnoty na displeji
  • přenést data na server na internetu, kde budou data uložena v databázi a zobrazena na webové stránce nebo použita v mobilní aplikaci.

Snímače se používají nejjednodušší a nejlevnější. Například při pohledu dopředu řeknu, že DHT22 měří teplotu docela přesně, ale s vlhkostí je to trochu nepřesné. Ale znovu opakuji, je to jedno, protože máme před sebou prototyp a rozptyl 5% vlhkosti neovlivní nic důležitého v našem životě.


Architektura systému, hardware a software musí umožňovat další rozšiřitelnost systému o nové senzory a nové funkce.

Žehlička. Výběr komponentů

Toto je nejdůležitější část a už vůbec ne pájení nebo programování. Po definování požadavků na systém je nutné rozhodnout, pomocí čeho přesně budou implementovány.


Zde je jedna nuance. Pro výběr komponent je potřeba dobře znát jejich schopnosti, znát samotné technologie. To znamená, že zde musíte být daleko od začínajícího elektrotechnika a programátora. Tak co teď strávit pár let studiem celé řady možných zařízení?


Začarovaný kruh? Ale existují začarované kruhy, aby je bylo možné rozbít.


Je tam východ. Můžete prostě vzít a zopakovat něčí projekt. Prostudoval jsem již existující projekty meteostanic a doufám, že jsem udělal krok vpřed.


Tak. Architektura meteostanice je založena na Arduinu. Protože Arduino má malý práh vstupu a už jsem se s tím vypořádal. Pak je snazší si vybrat.


Okamžitě bylo jasné, že meteostanice bude obsahovat dálkové, venkovní čidlo a centrální modul.


Centrální, hlavní jednotka bude umístěna uvnitř. Je důležité to určit v počáteční fázi, od toho se odvíjejí tak důležité vlastnosti, jako je teplotní režim provozu a výkon.


Dálkové čidlo (nebo čidla) bude bez „mozků“, jeho úkolem je periodicky provádět měření a přenášet data do centrální domácí jednotky. Centrální jednotka přijímá data ze všech senzorů, zobrazuje je na obrazovce a odesílá na internet do databáze. No, tam už je to mnohem jednodušší, jakmile jsou data v databázi, můžete si s nimi dělat, co chcete, dokonce i kreslit grafy.


Pro komunikaci s okolním světem si internet jednoznačně zvolil WiFi modul ESP8266 téměř bez alternativy (pozn., možná se teď takové alternativy objevily). Ethernetové rozšiřující desky jsou k dispozici pro Arduino, ale vůbec jsem nechtěl být připoután ke kabelu.



Zajímavou otázkou bylo, jak zajistit komunikaci mezi venkovním senzorem (nebo senzory, vzpomínáte na požadavek na rozšiřitelnost systému?) a centrem. 433 MHz radiomajáky rozhodně nejsou vhodné (nejsou vhodné vůbec k ničemu).


Znovu použít ESP8266?


Nevýhody tohoto řešení:

    Vyžaduje stabilní WiFi mimo domov

    komunikační rozsah nebude velký

    utrpí spolehlivost, pokud selže internet, neuvidíme naše vzdálené senzory

    větší spotřebu energie.

    Spotřeba energie ESP8266:

    při přenosu 120-170 mA

    při příjmu 50-56 mA

    v režimu hlubokého spánku 10 µA (µA)

    vypnutý stav 5 µA (µA).

Nakonec byl pro propojení vzdálených senzorů s hlavní domácí jednotkou zvolen čip nRF24L01 + s 2,4 GHz vysílačem a přijímačem v jedné lahvičce s přídavnou externí anténou, aby jistě „prorazil“ zdi.



Spotřeba energie nRF24L01+ 2,4 GHz:

  • při příjmu 11 mA
  • při přenosu rychlostí 2Mbps - 13 mA
  • v pohotovostním režimu - 26 μA (μA)
  • vypnutý stav 900 nA (nA).

Jak ESP8266, tak nRF24L01+ mají vhodný rozsah provozních teplot: od -40 ℃ do +80 ℃.


Můžete si koupit nRF24L01+ za přibližně 1 $ nebo s externí anténou za 3 $. ESP8266-01 si můžete koupit za přibližně 4 $. Přečtěte si pozorně popis produktu! Jinak si kup jednu anténu.


Objevilo se jádro systému. Přejděme k samotným senzorům.


Na ulici, jak víte, může teplota dosáhnout záporných hodnot, takže senzor DHT11 není vhodný, ale DHT22 je tak akorát.



Specifikace DHT22 / AM2302:

  • Napájení 3,3V až 5V, doporučeno 5V
  • odběr maximálně 2,5mA, v době měření a přenosu dat
  • rozsah měření vlhkosti 0-100% s chybou 2-5%
  • rozsah měření teploty od -40 do +125°C s chybou ±0,5°C
  • požadavek na měření ne více než 0,5 Hz - jednou za 2 sekundy.

Uvnitř domu doufám nebudou žádné záporné teploty, takže můžete použít DHT11, zvlášť když už jsem ho měl.


Vlastnosti DHT11:

  • Napájení 3,3V až 5V
  • odběr maximálně 2,5 mA, v době měření a přenosu dat
  • rozsah měření vlhkosti 20-80% s chybou 5%
  • rozsah měření teploty od 0 do +50°C s chybou ±2°C
  • požadavek na měření ne více než 1 Hz - jednou za sekundu.

DHT22 si můžete koupit za přibližně 3 $. DHT11 stojí méně – 1 dolar, ale je také méně přesný.


Nyní zpět k Arduinu. Jakou desku vybrat?


Jednotlivé části systému jsem testoval na Arduino UNO. Tito. Připojil jsem modul ESP k uno a prostudoval jej, vypnul jej, poté připojil nRF24 atd. Pro finální implementaci okenního senzoru jsem zvolil Arduino Pro Mini jako nejbližší miniaturu k Uno.



Pokud jde o spotřebu energie, Arduino Pro Mini také vypadá dobře:

  • chybí převodník USB-TTL, který sám o sobě hodně „žere“,
  • LED je připojena přes odpor 10k.

Pro pokročilou úsporu energie bylo plánováno:

  • vyjměte LED - indikátor napájení na Arduino Pro Mini (litoval jsem, že jsem nepokazil desku)
  • nebo použijte „holou“ sestavu na mikroprocesoru Atmel ATmega328 (nepoužil)
  • použijte Low Power Library nebo JeeLib .

Z knihoven jsem si vybral Low Power Library, je jednoduchá a obsahuje jen to, co potřebujete.


Pro centrální jednotku, protože k ní bylo plánováno připojení mnoha periferií, byla vybrána deska Arduino Mega. Navíc je plně kompatibilní s UNO a má větší paměť. Při pohledu do budoucna řeknu, že tato volba byla plně oprávněná.


Arduino Mega si můžete koupit za zhruba 8 dolarů.

Výkon a spotřeba energie

Nyní o jídle a spotřebě energie.


Existují dva typy Arduino Pro Mini:

  • pro napájecí napětí 5V a frekvenci 16MHz
  • pro napájecí napětí 3,3V a frekvenci 8MHz.

Vzhledem k tomu, že rádiový modul nRF24L01+ vyžaduje pro napájení 3,3V a rychlost zde není důležitá, kupte si Arduino Pro Mini na 8MHz a 3,3V.


V tomto případě je rozsah napájecího napětí Arduino Pro Mini:

  • 3,35-12V pro 3,3V model
  • 5-12V pro 5V model.

Už jsem měl 5V Arduino Pro Mini, proto jsem ho použil. Arduino Pro Mini si můžete koupit za zhruba 4 dolary.


Napájení centrální jednotky bude ze sítě 220 V přes malý napájecí zdroj o výkonu 12V, 450mA, 5W. Něco takového za 5 dolarů. Nechybí ani samostatný výstup pro 5V.



A pokud to nestačí, můžete to dát silnější. Jinými slovy, šetřit energii pro centrální jednotku nedává moc smysl. U dálkového bezdrátového senzoru je ale nejdůležitější úspora energie. Ale nechci přijít ani o funkčnost.


Proto budou Arduino Pro Mini a rádiový modul nRF24 napájeny svazkem 4 Ni-Mh baterií.


A pamatuj maximální kapacita moderní baterie cca 2500-2700mAh, cokoliv víc je buď marketingový trik (Ansmann 2850) nebo podvrh (UltraFire 3500).


Li-Ion baterie nepoužívám z několika důvodů:

  • velmi drahý
  • když okolní teplota klesne pod 0°C, výkon lithium-iontové baterie se sníží na 40-50%
  • ty, které jsou levné, jsou vyrobeny bez ochrany a nejsou bezpečné (při zkratu nebo vybití mohou explodovat a hořet, viz hromada videí na YouTube)
  • stárnou, i když se nepoužívají (to však lze říci o všech chemických prvcích), po 2 letech ztrácí Li-Ion baterie cca 20 % své kapacity.

U prototypu si lze celkem vystačit s kvalitními Ni-MH AA nebo AAA bateriemi. Navíc nepotřebujeme velké proudy. Jedinou nevýhodou Ni-MH baterií je jejich dlouhá doba nabíjení.

Obecné schéma meteostanice

Pojďme si to shrnout. Zde je obecný diagram, jak to celé funguje.



Pokračování příště.

Pokračujeme ve vývoji naší meteostanice.

Než přejdu k aktualizaci, chci si to trochu ujasnit.

Jeden z našich kolegů mi napsal, proč byl zaveden hlídací časovač?

Časovač hlídacího psa se nastavuje pro případ nouze. Jak ukazuje praxe, ENC28J60 nevytáhne více než (pokud paměť neselže) 4 simultánní připojení. Vezmeme-li v úvahu, kolik servisních připojení neustále dochází k udržování samotné sítě, a právě zbylý provoz vytvořený nejrůznějšími domácími hračkami (například moderní televizory skenují dostupné hostitele v síti a jejich porty se otevírají), návrh jednoduše přejde do strnulosti. . ENC28J60 neumí samostatně pracovat se síťovými protokoly a vše je implementováno v knihovnách. Možná jsou to jen oni.
Zkontroloval jsem všechny dostupné knihovny a různé moduly (najednou manželství), ale dlouho se mi nedařilo dosáhnout stabilní práce. Maximální doba byla asi 3-4 týdny.
Právě kvůli tomu se tam „pes“ točí a v takovém případě zatáhne za ovladač. Poté problém zmizel.
Nepopírám také, že v mé domácí síti existují určité nuance nebo problémy. Ale jelikož byl problém u mě, může na to přijít jiný člověk. Zatím jsem našel jen toto řešení.
Pokud vím, čipy Wiznet (W5100 a vyšší) toto nemají, nebo to jen špatně hledali.

Pojďme k aktualizaci

Nejdůležitější je, že se vzdalujeme čipu ENC28J60 a jít do W5100. Snažil jsem se implementovat vše na starém čipu, ale kvůli velmi velkým knihovnám není dostatek paměti mikrokontroléru ENC28J60. Při použití nového čipu standard knihovny od vývojáře a všech provedených změn zůstává ještě více 20% volné paměti mikrokontroléru ATMega328. A to jsou nové buchty!

Tato verze (říkejme jí druhá) přidává možnost bezdrátově přenášet hodnoty ze senzorů pomocí frekvence 433 MHz. Samotné moduly jsem převzal od Číňanů, značení XY-MK-5V. Chci poznamenat, že kvalita přenosu není zdaleka dokonalá. Může dojít ke ztrátě signálu, šumu, není možnost současného přenosu atd. atd. Ale jejich cena (méně než 1 $ za sadu) kompenzuje tyto nedostatky. Prozradím vám tajemství, že právě tyto (nejlevnější) moduly jsou v mnoha značkových meteostanicích pro domácí použití. Páni, nečekané?

Začněme základní stanicí

Stěhujeme se do Arduino UNO a Ethernetový štít(první verze) na základě čipu W5100. Tohle je sendvič a nemá smysl to popisovat. Popíšu pouze dodatečně zapojené kontakty na moduly XY-MK-5V.

Vysílací modul využívá energii 5V, GND(kde pak bez matky) a D2 pin na ovladači. Upravit kontakt D2 (DATA) můžete použít funkci vw_set_tx_pin z knihovny vw.

Na rozdíl od předchozí skici tato používá dvě další knihovny:

#zahrnout #zahrnout

Samotná skica

Skrytý text

#zahrnout #zahrnout #zahrnout #zahrnout #zahrnout #zahrnout #zahrnout #zahrnout #define DHTTYPE DHT22 #define DHTPIN 5 DHT dht(DHTPIN, DHTTYPE); byte mac = (0x54, 0x34, 0x31, 0x31, 0x31, 0x31); charserver = "narodmon.ru"; int port = 8283; IPAdresa ip(192,168,0,201); klient EthernetClient; BMP085 dps = BMP085(); dlouhá Teplota = 0, Tlak = 0; float H, dP, dPt; bool interval = true; EasyTransferVirtualWireET; struct SEND_DATA_STRUCTURE( ID bajtu; // ID zařízení int Teplota; // Teplotní plovák Tlak; // Tlakový plovák Vlhkost; // Plovák vlhkosti rosný bod; // Bod rosy/mrazy ); vysílání SEND_DATA_STRUCTURE; void setup() ( // Inicializace časovače Watchdog wdt_disable(); delay(8000); wdt_enable(WDTO_8S); // Inicializace konzoly Serial.begin(9600); // Inicializace DHT senzoru dht.begin(); // Inicializace modul 433 MHz ET.begin(details(broadcast)); vw_set_ptt_inverted(true); vw_set_tx_pin(2); vw_setup(2000); // Spusťte síť, pokud jsme nečekali na data z DHCP serveru, tak // sami si přiřadíme adresu if (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip); // Inicializace 1-Wire Wire.begin(); delay(200); // Inicializace BMP180 s nastavením výšky // dps.init (MODE_STANDARD, 3200, true); // Inicializace BMP180 dps.init(); Serial.println(Ethernet.localIP()); // Odešlete první data ihned po zapnutí zařízení send_info(true) ); ) // funkce rosného bodu NOAA / / reference (1) : http://wahiduddin.net/calc/density_algorithms.htm // reference (2) : http://www.colorado.edu/geography/weather_station/Geog_site /about.htm dvojitý rosný bod (dvojitá Celsia, dvojnásobná vlhkost) ( // (1) Tlak nasycených par = ESGG(T) dvojnásobný POMĚR = 373,15 / (273,15 + Celsia); dvojitá RHS = -7,90298 * (POMĚR - 1); RHS += 5,02808 * log10 (POMĚR); RHS += -1,3816e-7 * (pow(10, (11,344 * (1 - 1/POMĚR))) - 1); RHS += 8,1328e-3 * (pow(10, (-3,49149 * (POMĚR - 1))) - 1); RHS+= logio(1013,246); // faktor -3 slouží k nastavení jednotek - Tlak páry SVP * vlhkost double VP = pow(10, RHS - 3) * vlhkost; // (2) DEWPOINT = F(Tlak páry) double T = log(VP/0,61078); // temp var return (241,88 * T) / (17,558 - T); ) void send_info(bool eth) ( bool fail = true; while(fail) ( // Pokus o načtení dat ze senzoru vlhkosti DHT, dokud nedostaneme // výsledek. V 90 % případů vše funguje dobře, ale potřebujeme 100 % if((H = dht.readHumidity()) >= 0) ( // Získání vlhkosti a teploty ze senzoru BMP180 dps.getPressure(&Pressure); dps.getTemperature(&Temperature); // Výpočet rosného bodu, pokud teplota je venku nad 0 stupňů Celsia // a očekávejte výsledek nad 0, jinak výstup 0. To je nutné //, aby v zimním období nebylo zavádějící. // dP = Teplota>0?((dPt=rosný bod(teplota*0,1, H))<0?0:dPt):0; dP = dewPoint(Temperature*0.1, H); // Отправляем данные в эфир 433 мГц broadcast.ID = 1; broadcast.Temperature = floor(Temperature*0.1); broadcast.Pressure = floor(Pressure/133.3*10)/10; broadcast.Humidity = floor(H*10)/10; broadcast.dewPoint = floor(dP*10)/10; ET.sendData(); delay(250); if(eth) { // Подключаемся к серверу "Народный мониторинг" if(client.connect(server, port)) { // Начинаем передачу данных // адрес_устройства_в_проекте, имя_устройства, GPS широта, GPS долгота client.print(F("#fe-31-31-0e-5a-3b#Arduino Uno#71.344699#27.200014\n")); // Температура client.print(F("#T0#")); client.print(Temperature*0.1); client.print(F("#Температура\n")); // Давление client.print("#P1#"); client.print(Pressure/133.3); client.print(F("#Давление\n")); // Влажность client.print("#H1#"); client.print(H); client.print(F("#Влажность\n")); // Точка росы\инея client.print("#T1#"); client.print(dP); client.print((dP <= 0)? F("#Точка инея\n"):F("#Точка росы\n")); //client.print(F("#Точка росы\n")); // Отправляем конец телеграммы client.print("##"); // Даем время отработать Ethernet модулю и разрываем соединение delay(250); client.stop(); } } // Останавливаем цикл, если передача завершена fail = !fail; break; } delay(250); } } void loop() { // Каждые 4 секунды сбрасываем сторожевой таймер микроконтроллера // Каждые 6 минут отправляем данные на "Народный мониторинг" // Каждые 30 секунд отсылаем данные в эфир 433 if(!(millis()%1000)) wdt_reset(); if(!(millis()%360000)) send_info(true); if(!(millis()%30000)) send_info(false); }

K samotným modulům je nutné přidat anténu. Pro 433 MHz stačí normální měděný drát 17 cm. Bez antény můžete na běžný provoz zapomenout.

Přejdeme k nejdůležitější části této aktualizace – místní bezdrátové stanici

K jeho realizaci (na koleně) jsem použil analog Arduino NANO(na základně ATMega328) a TFT zobrazení na čipu ST7735S s povolením 128x160

Skrytý text



Pinout displej -> ovladač

============================== LED | 3,3V SCK | SCK(13) SDA | MOSI(11) A0 | DC(9) RESET | RST(8)CS | CS (10) GND | GND VCC | 5V =============================

Přijímací modul se připojuje stejným způsobem jako vysílač DATA připnout D7.

Pár fotek jak to vypadá:

Skrytý text

Náčrt přijímače

Skrytý text

#zahrnout #zahrnout #zahrnout #zahrnout int x, y; int w = 128, h = 160; intsize; // 433 EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( ID bajtu; // ID zařízení int Teplota; // Teplotní plovák Tlak; // Tlakový plovák Vlhkost; // Plovák vlhkosti rosný bod; // Bod rosy/mrazy ); vysílání SEND_DATA_STRUCTURE; int Log_Temperature = -1; float Log_Pressure = -1; float Log_Humidity = -1; float Log_dewPoint = -1; // TFT #define cs 10 #define dc 9 #define rst 8 char Teplota, Tlak, Vlhkost, Rosny Bod; Stringinfo; TFT TFTscreen = TFT(cs, dc, rst); void setup()( Serial.begin(9600); // Inicializace 433MHz modulu ET.begin(detaily(vysílání)); vw_set_ptt_inverted(true); vw_set_rx_pin(7); vw_setup(2000); vw_rx_start(); // Inicializace a počáteční nastavení zobrazení TFTscreen.begin(); TFTscreen.setRotation(2); TFTscreen.background(0, 0, 0); // Kreslení statických prvků // 1. Navštivte nás TFTscreen.stroke(255, 255, 255); TFTscreen .setTextSize(1); TFTscreen.text(" ", 10, 10); // 2. Popis odečtů ze senzorů TFTscreen.text("mmHg", w/2+5, 80); TFTscreen.text ("% ", w/2+5, 100); TFTscreen.text("C", w/2+5, 120); broadcast.Temperature = 0; broadcast.Pressure = 0; broadcast.Vlhkost = 0; vysílání .rosný bod = 0; TFTPrint(); ) void loop()( if(ET.receiveData())( if(broadcast.ID == 1) TFTPrint(); /* Serial.println(broadcast.Temperature); Serial. println(broadcast .Pressure); Serial.println(broadcast.Vlhkost); Serial.println(broadcast.dewPoint); Serial.println(); */ ) ) void changes (int size, int x , int y, bool nahoru, bool clear = false) ( if(clear) TFTscreen.stroke(0, 0, 0); else ( změny (velikost, x, y, !up, true); TFTscreen.stroke((nahoru)?0:255, 0, (nahoru)?255:0); ) if((velikost%2) == 0 )velikost++; while(velikost > 0) ( TFTscreen.line(x, y, x+(velikost--), y); ++x, (nahoru)?--y:++y, --velikost; ) /* while( velikost > 0) ( TFTscreen.line(x, y, (nahoru)?x+velikost-1:x, (nahoru)?y:y+velikost-1); ++x, ++y, --velikost; ) */ ) int x_center(int w, int délka, int velikost) ( návratová podlaha ((w-délka*(velikost*5)+velikost*2)/2); ) int x_alignment_right(int w, int délka, int velikost) ( návratová hranice(š-délka*(velikost*5)+velikost*2); ) void TFTPrint() ( velikost = 3; // ================== =================================================== =============== // Zobrazení teplot // ============================= ==================================================== == if(broadcast.Temperature != Log_Temperature) ( TFTscreen.setTextSize(size); // Přepsání zastaralých dat String info = String(Log_Temperature); info.concat(" C"); if(Log_Temperature > 0) info = " +"+info; info.toCharArray(Teplota, info.délka()+1); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Teplota, x_center(š, info.délka()+1, velikost ), 35); // Výstup nových hodnot i info = Řetězec(vysílání. teplota); info.concat("C"); if(broadcast.Temperature > 0) info = "+"+info; info.toCharArray(Teplota, info.délka()+1); // Změna barvy hodnoty teploty v závislosti na samotné teplotě int r, g = 0, b; if(broadcast.Temperature > 0) ( r = mapa(broadcast.Temperature, 0, 40, 255, 150); // Red b = map(broadcast.Temperature, 0, 40, 30, 0); // Change Hue pro vizuálnější překročení nuly ) else ( r = mapa(vysílání.Temperature, -40, 0, 0, 30); // Změňte odstín pro vizuálnější překročení nuly b = mapa(vysílání.Temperature, -40, 0, 150 , 255); // Modrá ) TFTscreen.stroke(b, g, r); // POZOR: pozice barev jsou v knihovně obrácené, místo RGB používá BGR! TFTscreen.text(Teplota, x_center(š, info.délka()+1, velikost), 35); ) velikost = 1; // ================================================= =================================== // Zobrazení hodnot tlaku // ======== = =================================================== ======================= if(broadcast.Pressure != Log_Pressure) ( TFTscreen.setTextSize(size); // Přepsat informace o zastaralých datech = String(Log_Pressure ); info.toCharArray(Tlak, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Tlak, x_alignment_right(w/2-5, info.length(), size), 80 ); // Výstup nových hodnot info = String(broadcast.Pressure); info.toCharArray(Pressure, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(Pressure, x_alignment_right(w/) 2-5, info.length(), size), 80); changes(10, 106, 85, (broadcast.Pressure > Log_Pressure)?true:false); ) else ( changes(10, 106, 85, true, true); changes(10, 106, 85, false, true); ) // =============================== ================================================= = / / Odečet výstupní vlhkosti // =================== =================================================== ============= if(broadcast.Humidity != Log_Humidity) ( TFTscreen.setTextSize(size); // Přepíše zastaralá data info = String(Log_Humidity); info.toCharArray(Vlhkost, info.délka()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Vlhkost, x_zarovnání_vpravo(š/2-5, info.délka(), velikost), 100); // Výstup nových hodnot info = String(broadcast.Humidity); info.toCharArray(Vlhkost, info.délka()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(Vlhkost, x_zarovnání_vpravo(š/2-5, info.délka(), velikost), 100); changes(10, 106, 105, (vysílání.Vlhkost > Log_Vlhkost)?true:false); ) else ( changes(10, 106, 105, true, true); changes(10, 106, 105, false, true); ) // ================== =================================================== ============= // Zobrazit rosný bod\mráz // ============================ ==================================================== === if(broadcast.dewPoint ! = Log_dewPoint) ( TFTscreen.setTextSize(size); // Přepsat informace o zastaralých datech = String(Log_dewPoint); info.toCharArray(dewPoint, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text (dewPoint, x_alignment_right(w/2-5, info.length(), size), 120); // Zobrazení nových hodnot info = String(broadcast.dewPoint); info.toCharArray(dewPoint, info.length()); TFTscreen.stroke(255, 255, 255);TFTscreen.text(dewPoint, x_alignment_right(w/2-5, info.length(), size), 120);changes(10, 106, 125, (broadcast.dewPoint > Log_dewPoint)?true:false); ) else ( changes(10, 106, 125, true, true); changes(10, 106, 125, false, true); ) // Aktualizace hodnot v protokolech na později porovnání Log_Temperature = broadcast.Temperature; Log_Pressure = broadcast.Pressure; Log_Humidity = vysílání.Vlhkost; log_dewPoint = broadcast.dewPoint; )

Údaje jsou zobrazeny poměrně kompaktně, ale jak ukazuje praxe (a rady mých soudruhů) - "chuť a barva, ani manželka není přítel." Vyslechl jsem si spoustu rad a návrhů, které si ale odporují. Tak si to udělejte podle svého.

Zdálo se mi, že design je ta část projektu, která zabere většinu času!

Skrytý text

Část dat je vyrobena pro zobrazení některých prvků návrhu.

Artefakty na displeji jsou prach a další nečistoty nahromaděné za dlouhou dobu, kdy byl displej v ... někde tam ... no, už si nevzpomínám, kde jsem to vzal! Nech mě na pokoji!

Skica má polohovací funkce. Jsou docela primitivní, ale umožňují dosáhnout určitých efektů.

  1. x_center
  2. x_alignment_right

První vycentruje text a druhý jej zarovná na pravou stranu zadané oblasti. Všechny výpočty se provádějí vzhledem k velikosti daného textu na základě výrazu 1 velikost = 1PX x 1PX segment písma.

Na displeji se také zobrazují prvky odpovídající zvýšení nebo snížení jedné nebo druhé naměřené hodnoty. Jsou zobrazeny jako trojúhelníky. Ale v kódu funkce Změny existuje alternativní zobrazení ve formě trojúhelníků otočených o 45 stupňů. Pokud se hodnota zvýší, je prvek červený, jinak je modrý.

Mimochodem, barva a odstín hlavní teploty se mění v závislosti na samotné teplotě. Docela kontroverzní rozhodnutí, ale dle mého názoru vizuálně pohodlné. Chvíli jsem s tím bojoval a uvědomil jsem si, že hodnoty ve funkci mrtvice, objekt zobrazení TFT, jsou uvedeny v nesprávném pořadí. BGR místo RGB. Toto je chyba vývojáře, dobře, nebo něčemu nerozumím.

PS: Všechno je docela zajímavé, ale podle mě by to zasloužilo další rozvoj. Což za chvíli uděláme.



Podíl