Meteorologická stanica na Arduine. Interiérová meteostanica na Arduino Obvody meteorologickej stanice na Arduino uno

Chcel som mať vlastnú meteostanicu, ktorá prenáša údaje zo senzorov na mapu monitorovania ľudí (hľadanie na Google trvá 5 sekúnd). Ukázalo sa, že to nie je také ťažké, ako sa zdá. Zvážte, čo sa urobilo.

Na túto akciu som si zobral Arduino Uno a k tomu Ethernet Shield w5100. Toto všetko bolo objednané z Číny na Aliexpress.

Objednal som si tam aj senzory: DHT22, DHT11, DS18B20, BMP280 (v pláne sú aj senzory plynu, dymu ...)

Po vyfajčení fór, Google, Yandex som našiel dobrú verziu náčrtu - https://student-proger.ru/2014/11/meteostanciya-2-1/

Na tom istom mieste v komentároch osoba zverejnila hotový náčrt so svetelnými a plynovými senzormi. Bral som ich ako základ.

V tých náčrtoch nebola podpora pre 280. snímač tlaku, rozprávali sme sa s autorom, nahradil 180 za 280. Všetko fungovalo v poriadku (za to veľmi pekne ďakujem)

Nižšie je uvedený príklad konečného náčrtu, ktorý som dostal.

Momentálne mám pripojené senzory:
DHT22 - 1 ks.
DHT11 - 1 ks.
BMP280 - 1 ks.
DS18B20 - 2 ks.

POZOR! Pred nahraním náčrtu nezabudnite zmeniť MAC adresu zariadenia, aby sa neprekrývala s ostatnými (napríklad zoberte Mac adresu svojho mobilného telefónu a zmeňte v nej posledné písmená / čísla, ktoré nebudú " rušiť“ vašu lokálnu sieť!

Približná schéma zapojenia (obrázok prevzatý na internete z tohto náčrtu):

Z technických dôvodov sem nemôžem umiestniť náčrt. Dal som to do archívu. Odkaz naň je vyššie.

Ako vidíte, existujú hodnoty, fungujú správne, napríklad uverejním niekoľko snímok obrazovky z mojich senzorov:

Vo voľnom čase a tentoraz som napísal návod na výrobu malej meteostanice. Bude fungovať ako hodiny s dátumom a bude ukazovať teploty v miestnosti aj mimo nej. Ako hlavný ovládač použijeme Arduino UNO, ale postačí aj iná doska s Atmega328p. Na zobrazenie používame grafickú obrazovku WG12864B. Pripojíme aj dva snímače teploty ds18b20. Jeden je v interiéri, druhý je vonku. Začnime.

V procese výroby domácich výrobkov potrebujeme:

Arduino UNO (alebo iná doska kompatibilná s Arduino)
- Grafická obrazovka WG12864B
- snímač teploty ds18b20, 2 ks
- Napájanie 6 - 12 V
- Rezistory 4,7 Kom 0,25 W, 2 ks.
- Rezistory 100 ohm 0,25 W
- Priestor na batérie pre 4 "malíčkové" batérie typu AAA
- Krabička z kazety konzoly SEGA
- Izolačná páska
- Spojovacie vodiče
- Obvodová doska
- Gombíky
- Kancelársky nôž
- spájkovačka
- Spájka, kolofónia
- Obojstranná lepiaca páska

Krok 1 Pripravte WG12864B3.
Tí, ktorí doteraz s obrazovkami nepracovali, môžu byť vystrašení veľkým počtom úprav na prvý pohľad rovnakých obrazoviek. Trochu to vysvetlím. Väčšina obrazoviek tohto typu funguje na čipoch ks0107/ks0108. Všetky obrazovky možno rozdeliť do 4 typov:

Možnosť 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žnosť C: Shenzhen Jinghua Displays Co Ltd. JM12864

Možnosť D: Wintek- Cascades WD-G1906G, Wintek - GEN/WD-G1906G/KS0108B, Wintek/WD-G1906G/S6B0108A, TECDIS/Y19061/HD61202, Varitronix/MGLS19202/HD

Vyzerajú takmer rovnako. Ale spojovacie kolíky sú iné. Vybral som si, a odporúčam vám, WG12864B3 V2.0, ale ak vám prišla iná obrazovka, alebo ju jednoducho nemáte po ruke, môžete to ľahko zistiť pomocou tabuľky:

Stručné špecifikácie:

Na internete je veľa rôznych schém pripojenia a zdá sa, že všetko funguje. Ide o to, že existujú nielen rôzne obrazovky, ale aj dva spôsoby ich pripojenia: sériové a paralelné. Pri použití pripojenia cez sériový port potrebujeme len 3 výstupy mikrokontroléra. Pri paralelnom minime 13. Voľba je v tomto prípade zrejmá, Arduino aj tak veľa záverov nemá. Pre paralelné pripojenie je schéma zapojenia nasledovná:

Pre sériové pripojenie, ktoré použijeme, je schéma nasledovná:

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

Na nastavenie kontrastu musí byť na obrazovke potenciometer. Existujú obrazovky bez toho, ale teraz je to zriedkavé:

Aby napätie 5 voltov náhodou nespálilo podsvietenie diód, je potrebný 100 ohmový odpor.

Krok 2 Vytvorenie prípadu.
Pre prípad vezmite box z kazety set-top boxu Sega. Ak túto krabicu nenájdete po ruke, môžete použiť iné puzdro. Hlavná vec je, že sa do nej zmestí obrazovka a Arduino.

Odrežte priehľadnú fóliu na vrchu škatule tak, aby nezostali žiadne kúsky:

Potom pomocou kancelárskeho noža vyrežte okno 37x69 pre obrazovku.

Na rubovú stranu pozdĺž okraja výrezu nalepíme obojstrannú pásku, najlepšie čiernu:

Odstránime ochranný papier z lepiacej pásky a prilepíme naň našu obrazovku:

Z vonkajšej strany by to malo vyzerať takto:

Pod obrazovku, tiež na obojstrannú pásku, namontujeme Arduino, pričom sme predtým urobili výrezy pre port USB a napájaciu zásuvku:

Na oboch stranách krabice musia byť vytvorené výrezy pre zásuvky Arduino, aby sa dala voľne zatvárať:

Krok 3 Teplotné senzory.
Použijeme digitálne snímače teploty DS18B20. Pomocou nich získame väčšiu presnosť merania, chybu nie väčšiu ako 0,5 °C, v širokom rozsahu teplôt -55 ... + 125 °C. Senzor je navyše digitálny a všetky výpočty vykonáva sám a Arduino jednoducho dostáva hotové údaje. Pri pripájaní tohto snímača nezabudnite na pull-up rezistor 4,7KΩ medzi pinmi DQ a VDD. Možné sú aj viaceré možnosti pripojenia. S externým napájaním, podľa môjho názoru najlepšou možnosťou, ho použijeme:

Pri akejkoľvek možnosti napájania sú senzory zapojené paralelne:

Snímač vnútornej teploty umiestnime na malú dosku spolu s dvoma tlačidlami, ktoré použijeme na nastavenie času a dátumu hodín:

Spoločný vodič z oboch tlačidiel pripojíme na GND, vodič z prvého tlačidla zapojíme do A0, z druhého do A1.
Upevníme ho na obojstrannú pásku vedľa Arduina:

Snímač, ktorý má byť umiestnený mimo miestnosti, je lepšie zvoliť v kovovom, prachotesnom kryte:

Vypočítajte si drôt potrebnej dĺžky, aby ste senzor mohli zavesiť mimo okna, hlavná vec je, že by nemal mať viac ako 5 metrov, ak potrebujete väčšiu dĺžku, budete musieť znížiť hodnotu ťahu- up odpor.

Vodič z dátovej zbernice DQ oboch senzorov pripojíme na pin 5 Arduina.
Vdd - +5 Arduino.
GND - GND Arduino.

Krok 4 Výživa.
Na napájanie môžete použiť napájací zdroj s napätím 6 až 12 voltov. Na koniec napájacieho drôtu prispájkujte zástrčku, ktorá sa hodí k napájacej zásuvke Arduino:

Alebo môžete do puzdra vložiť priehradku na štyri batérie typu „AAA“, „malíček“. A pripojte kladný vodič zo šachty k Vin Arduino a záporný vodič k GND.

Krok 5 Pripravte programovacie prostredie.
Najprv si musíte stiahnuť a nainštalovať Arduino IDE z oficiálnej stránky

A tiež pridať do dvoch knižníc potrebných pre náčrt. OneWire - potrebné pre komunikáciu so senzormi ds18b20:

U8glib - slúži na zobrazenie informácií na obrazovke:

Sťahovanie knižníc. Potom archívy rozbalíme a obsah archívov presunieme do priečinka „libraries“, ktorý sa nachádza v priečinku s nainštalovaným Arduino IDE. Knižnice môžete pridať aj cez Arduino IDE. Ak to chcete urobiť, bez rozbaľovania archívov spustite Arduino IDE, z ponuky vyberte Sketch - Connect Library. Úplne hore v rozbaľovacom zozname vyberte položku "Pridať. Zip Library". Zadajte umiestnenie stiahnutých archívov. Po všetkých krokoch musíte reštartovať Arduino IDE.

Krok 6 Úprava náčrtu.
Teplotné senzory pracujú pomocou protokolu One Wire a majú jedinečnú adresu pre každé zariadenie – 64-bitový kód. Nie je vhodné pridávať príkazy na vyhľadávanie senzorov v náčrte. Nie je potrebné zakaždým zaťažovať Arduino, aby sa zasekli senzory. Preto najprv, keď sme všetko zhromaždili, vyplníme náčrt Arduina, ktorý sa nachádza v ponuke Súbor - Príklady - Teplota Dallas - OneWireSearch. Potom spustíme Tools - Port Monitor. Arduino by malo nájsť naše senzory, zapísať adresy a hodnoty teploty. Tieto adresy si treba zapísať alebo jednoducho niekam skopírovať. Teraz otvorte náčrt Ard_Tic_Tak_WG12864B_2_x_Term_Serial a vyhľadajte riadky:

Adr bajtu1=(0x28, 0xFF, 0x75, 0x4E, 0x87, 0x16, 0x5, 0x63);// adresa interného bajtu adr2=(0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x50, 0x16, senzor);

Adresy snímačov zodpovedajúcich umiestneniu nahrádzame našimi adresami.
Naše hodiny nevyužívajú modul RTC (hodiny reálneho času), preto je potrebné hodiny opraviť. Pre pohodlie odkomentujte riadok (na obrazovke sa zobrazia sekundy):

//u8g.setPrintPos(44, 50); u8g.print(s); // Výstup sekúnd na kontrolu správnosti pohybu

Nastavte správny čas pomocou monitora portu. Ak to chcete urobiť, otvorte monitor portu, počkajte na dokončenie počiatočných meraní teploty a zadajte aktuálny dátum a čas vo formáte „deň, mesiac, rok, hodiny, minúty, sekundy“. Bez medzier, čísla sú oddelené čiarkami alebo bodkami.

Ak sa hodiny ponáhľajú, zmeňte hodnotu na väčšiu, odporúčam experimentovať s krokom 100 jednotiek. Ak by zaostávanie malo znížiť hodnotu v riadku:

If (micros() - prevmicros >494000) ( // zmeňte na niečo iné a upravte to bolo 500000

Empiricky určíme číslo, pri ktorom hodiny bežia dostatočne presne. Na určenie presnosti pohybu potrebujete výstup v sekundách. Po presnej kalibrácii čísla môžu byť sekundy komentované a tým odstránené z obrazovky.
Nahrávanie náčrtu.

Nejako som pri prechádzke mestom uvidel nový obchod s rádiovou elektronikou, ktorý sa otvoril. Keď som sa do toho pustil, našiel som veľké množstvo štítov pre Arduino. Mal som doma Arduino Uno a Arduino Nano a hneď ma napadlo pohrať sa s vysielačmi signálu na diaľku. Rozhodol som sa kúpiť najlacnejší vysielač a prijímač na 433 MHz:

Vysielač signálu.


prijímač signálu.

Po zaznamenaní najjednoduchšieho náčrtu prenosu údajov (príklad je prevzatý odtiaľto) sa ukázalo, že vysielacie zariadenia môžu byť celkom vhodné na prenos jednoduchých údajov, ako je teplota, vlhkosť.

Vysielač má nasledujúce vlastnosti:
1. Model: MX-FS-03V
2. Akčný rádius (závisí od prítomnosti blokujúcich predmetov): 20-200 metrov
3. Pracovné napätie: 3,5 -12V
4. Rozmery modulu: 19*19mm
5. Modulácia signálu: AM
6. Výkon vysielača: 10mW
7. Frekvencia: 433MHz
8. Požadovaná dĺžka externej antény: 25cm
9. Jednoduché pripojenie (iba tri vodiče): DATA ; VCC; Zem.

Vlastnosti prijímacieho modulu:
1. Pracovné napätie: DC 5V
2. Prúd: 4mA
3. Pracovná frekvencia: 433,92MHz
4. Citlivosť: - 105dB
5. Rozmery modulu: 30*14*7mm
6. Potrebná externá anténa: 32 cm.

V rozľahlosti internetu sa hovorí, že dosah prenosu informácií rýchlosťou 2Kb/s môže dosiahnuť až 150m. Sám som to nekontroloval, ale v dvojizbovom byte to akceptuje všade.

Hardvér domácej meteorologickej stanice

Po niekoľkých experimentoch som sa rozhodol pripojiť k Arduino Nano snímač teploty, vlhkosti a vysielač.


Teplotný senzor DS18D20 je pripojený k arduinu nasledovne:

1) GND na mínus mikrokontroléra.
2) DQ cez pull-up odpor na zem a na D2 pin Arduina
3) Vdd až +5V.

Vysielací modul MX -FS - 03V je napájaný 5V, dátový výstup (ADATA) je pripojený na pin D13.

K Arduino Uno som pripojil LCD displej a barometer BMP085.


schéma zapojenia pre arduino uno

Prijímač signálu je pripojený na pin D10.

Modul BMP085 je digitálny snímač atmosférického tlaku. Senzor umožňuje merať teplotu, tlak a nadmorskú výšku. Rozhranie pripojenia: I2C. Napájacie napätie snímača 1,8-3,6V

Modul je pripojený k Arduinu rovnakým spôsobom ako ostatné I2C zariadenia:

  • VCC - VCC (3,3 V);
  • GND-GND;
  • SCL - na analógový kolík 5;
  • SDA - na analógový pin 4.
  • Veľmi nízke náklady
  • Napájanie a I/O 3-5V
  • Stanovenie vlhkosti 20-80% s presnosťou 5%.
  • Stanovenie teploty 0-50 stupňov. s presnosťou 2 %.
  • Frekvencia dotazovania nie viac ako 1 Hz (nie viac ako raz za 1 sekundu)
  • Rozmery 15,5 mm x 12 mm x 5,5 mm
  • 4 kolíky s rozstupom nôh 0,1".

DHT má 4 kolíky:

  1. Vcc (3-5V napájanie)
  2. Dáta von - Dátový výstup
  3. Nepoužité
  4. generál

Pripája sa k D8 Arduino.

Softvér domácej meteorologickej stanice

Modul vysielača meria a vysiela teplotu každých 10 minút.

Nižšie je uvedený program:

/* Verzia náčrtu 1.0 Posielať teplotu každých 10 min. */ #include #include #include #define ONE_WIRE_BUS 2 //Kolík na pripojenie snímača Dallas OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors (&oneWire); DeviceAddress vo vnútri teplomera; void setup(void) ( //Serial.begin(9600); vw_set_ptt_inverted(true); // Vyžaduje sa pre DR3100 vw_setup(2000); // Nastavenie prenosovej rýchlosti (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); //Vytvorenie údajov na odoslanie int číslo = tempC; symbol char = "c"; //Symbol služby na určenie, že ide o snímač 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čkajte, kým prenos dokončí oneskorenie(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); } }

Prijímacie zariadenie prijíma dáta, meria tlak a teplotu v miestnosti a prenáša ich na displej.

#include #include LiquidCrystal lcd(12, 10, 5, 4, 3, 2); #include dht11 senzor; #define DHT11PIN 8 #include #include BMP085 dps = BMP085(); dlhá Teplota = 0, Tlak = 0, Nadmorská výška = 0; void setup() ( Serial.begin(9600); vw_set_ptt_inverted(true); // Vyžaduje sa pre DR3100 vw_setup(2000); // Nastaví rýchlosť príjmu vw_rx_start(); // Spustí monitorovanie 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ávacia pamäť správy uint8_t buflen = VW_MAX_MESSAGE_LEN; // Dĺžka vyrovnávacej pamäte if (vw_get_message(buf, &buflen)) // Ak je správa prijatá ( // Začať analyzovať int i; // Ak je správa nie je adresované nám , ukončite if (buf != "z") ( return; ) char príkaz = buf; // Príkaz je na indexe 2 // Numerický parameter začína na indexe 4 i = 4; int číslo = 0; // Keďže prenos prebieha znak po znaku , potom musíte previesť znakovú sadu na číslo while (buf[i] != " ") ( číslo *= 10; číslo += buf[i] - "0"; i++; ) dps.getPressure(&Tlak); dps.getAltitude (&Výška); dps.getTemperature(&Temperature); //Serial.print(command); Serial.print(" "); Sériová tlačln(číslo); lcd.print("T="); lcd.setCursor(2,0); lcd print(cislo); 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(); //oneskorenie(2000); int chk = sensor.read(DHT11PIN); switch (chk) ( case DHTLIB_OK: //Serial.println("OK"); break; case DHTLIB_ERROR_CHECKSUM: //Serial.println("Chyba kontrolneho suctu"); break; case DHTLIB_ERROR_TIMEOUT: //Serial.println("Time out chyba"); break; predvolené: //Serial.println("Neznáma chyba"); break; ) ) )

P.S. V budúcnosti plánujem pridať nasledovné:
- snímač vlhkosti do vysielača, prepracovať algoritmus prenosu dát
- senzor na meranie rýchlosti a smeru vetra.
- pridať ďalší displej k prijímaču.
- preniesť prijímač a vysielač do samostatného mikrokontroléra.

Nižšie je fotografia toho, čo sa stalo:

Zoznam rádiových prvkov

Označenie Typ Denominácia Množstvo PoznámkaObchodMôj poznámkový blok
vysielacia časť.
Arduino doska

Arduino Nano 3.0

1 Do poznámkového bloku
teplotný senzor

DS18B20

1 Do poznámkového bloku
Rezistor

220 ohmov

1 Do poznámkového bloku
modul vysielačaMX-FS-03V (433 MHz)1 Do poznámkového bloku
časť pre príjem rádia.
Arduino doska

Arduino Uno

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


„Takže, poďme sa hneď dohodnúť: nebudete robiť film pre Hollywood. Dokonca aj v krajine zázrakov nie je schválených viac ako päť percent všetkých scenárov a len jedno percento sa potom dostane do výroby... Takže namiesto toho všetkého si vytvoríte svoj vlastný Hollywood.
Ed Gaskel „Natáčanie digitálneho kina alebo Hollywood doma“

Predslov

Čo, ďalšia meteorologická stanica Arduino?! Áno, ešte jeden a, niečo mi hovorí, nie posledný v Internete vecí.


Tak, ako sa od každého programátora vyžaduje, aby napísal program „Hello World!“, tak aj každý arduinian musí mať skúsenosti so stavaním jednoduchej alebo nie veľmi meteorologickej stanice.
Je popísaných značné množstvo už vytvorených projektov meteostaníc na internete, čitateľ si môže vybrať na realizáciu ktorýkoľvek z nich. Úprimne povedané, pozorne som si preštudoval asi tucet podobných projektov a kopu príbuzných. Nedá sa teda povedať, že som všetko tvoril od nuly, samozrejme som „stál na pleciach obrov“.


Hneď musím povedať, že moje plány nezahŕňali používanie služieb tretích strán na ukladanie a zobrazovanie údajov. Chcel som osobne cítiť a pochopiť, ako to všetko funguje zvnútra od začiatku do konca, od A po Z.


Takže pre tých, ktorí chcú rýchlo z ničoho nič vynitovať, táto séria článkov s najväčšou pravdepodobnosťou nie je vhodná. Jednoduchšie je ísť si kúpiť hotovú súpravu s návodom na montáž. Profesionáli z mikroelektroniky tu nemajú absolútne čo robiť, možno si na začiatku cesty povzdychnú a spamätajú sa.
Ale pre tých, ktorí to chcú naozaj pochopiť, myslím, že sa im to bude páčiť. Možno bude materiál užitočný ako učebná pomôcka.



Tento projekt bol realizovaný už v roku 2016, ale dúfam, že je stále aktuálny.

Sada technológií

Budeme študovať a pracovať s jednoduchými a zložitými vecami:

  • snímače teploty a vlhkosti typu DHT22, DHT11
  • snímač barometrického tlaku typu BMP180
  • WiFi modul ESP8266
  • rádiový modul typu nRF24 2,4 GHz
  • rodina Arduino Pro Mini, Arduino Mega
  • solárne panely a batérie
  • programovací jazyk C/C++
  • PHP programovací jazyk
  • Systém správy databázy MySQL
  • programovací jazyk Java a framework Android (vytvorenie aplikácie pre Adnroid na zobrazenie údajov o počasí na smartfóne).

Niektoré z uvedených tém nestoja za to a niektoré sa dajú študovať roky. Zložitých vecí sa preto dotkneme len v časti priamo súvisiacej s týmto projektom, aby ste pochopili, ako to celé funguje.


ale začneme od úplného začiatku Správny. Totiž z popisu a dizajnu budúceho zariadenia "na papieri" aby nakoniec každá tehla ležala na svojom mieste.

prototypovanie

Ako nám Wikipedia správne hovorí, prototypovanie je rýchly návrh implementácie fungujúceho systému. Čo, áno, nebude fungovať úplne neefektívne a s nejakými chybami, ale dá predstavu o tom, či by sa remeslo malo rozvinúť do priemyselného dizajnu. Proces vytvárania prototypu by nemal byť dlhý. Po fáze prototypovania nasleduje analýza systému a jeho zdokonaľovanie.


Ale to je v odvetví, kde sú pracovníci zamestnaní na plný úväzok.


Každý, kto po večeroch nituje svoje pet-projektové remeslá pre „internet vecí“, by si mal uvedomiť, že vytvára prototyp, polotovar. Má veľmi ďaleko od úrovne bežného priemyselného produktu. Preto našim amatérskym remeslám by ste nemali zverovať žiadne kritické oblasti podpory života a dúfam, že nás nesklamú.


Priemyselný produkt je postavený na báze priemyselných prvkov a potom prechádza mnohými ďalšími fázami vrátane ladenia, testovania a údržby, kým sa stane bestsellerom.


Takže namiesto všetkej tejto nudy si vytvoríme vlastnú hračku, no nie jednoduchú. S prvkami technickej kreativity, začiatkami programovania a poznaním (v procese tvorby) mnohých ďalších súvisiacich vecí.


Samozrejme, elektronickí inžinieri to budú mať vo fáze programovania ťažké a programátori sa budú musieť zapotiť nad obvodmi, ale autor sa pokúsi uviesť všetko čo najprístupnejšie a jasne popísať, prečo boli použité určité riešenia.

Požiadavky

Zvyčajne sa tento krok preskočí. Rozhodnúť sa niečo také urobiť práve teraz a potom sa ukážu malé detaily, ktoré celý projekt dostanú do slepej uličky alebo ho dokonca urobia neznesiteľným. Všetky naše Wishlisty je potrebné zaznamenať, používam na to Google Drive, je dostupný z PC aj z mobilného zariadenia.


Naša meteorologická stanica by teda mala:

  • meranie vonkajšej teploty a vlhkosti
  • merať teplotu a vlhkosť v dome
  • merať atmosférický tlak
  • zobraziť zobrazené hodnoty na displeji
  • preniesť dáta na server na internete, kde budú dáta uložené v databáze a zobrazené na webovej stránke, alebo použité v mobilnej aplikácii.

Snímače sa používajú najjednoduchšie a najlacnejšie. Napríklad pri pohľade dopredu poviem, že DHT22 meria teplotu celkom presne, ale s vlhkosťou je to trochu nepresné. Ale opäť opakujem, je to jedno, pretože máme pred sebou prototyp a rozptyl 5% vlhkosti nič dôležité v našom živote neovplyvní.


Architektúra systému, hardvér a softvér musia umožniť ďalšie rozšírenie systému o nové senzory a nové možnosti.

Železo. Výber komponentov

Toto je najdôležitejšia časť a už vôbec nie spájkovanie alebo programovanie. Po zadefinovaní požiadaviek na systém je potrebné rozhodnúť, pomocou čoho presne budú implementované.


Tu je jedna nuansa. Na výber komponentov musíte dobre poznať ich možnosti, musíte poznať samotné technológie. To znamená, že tu musíte byť ďaleko od začínajúceho elektronického inžiniera a programátora. Tak čo teraz stráviť pár rokov štúdiom celej škály možných zariadení?


Začarovaný kruh? Ale existujú začarované kruhy, aby sme ich prelomili.


Je tam východ. Môžete len vziať a zopakovať niečí projekt. Preštudoval som si už existujúce projekty meteostaníc a dúfam, že som urobil krok vpred.


Takže. Architektúra meteostanice vychádza z Arduina. Pretože Arduino má malý prah vstupu a už som sa s tým zaoberal. Potom je výber jednoduchšie.


Okamžite bolo jasné, že meteostanica bude obsahovať diaľkový, mimookenný senzor a centrálny modul.


Centrálna, hlavná jednotka bude umiestnená v interiéri. Je dôležité určiť to v počiatočnej fáze, z toho sú také dôležité charakteristiky, ako je teplotný režim prevádzky a energetický „tanec“.


Diaľkový senzor (alebo senzory) bude bez „mozgov“, jeho úlohou je periodicky vykonávať merania a prenášať dáta do centrálnej domácej jednotky. Centrálna jednotka prijíma dáta zo všetkých senzorov, zobrazuje ich na obrazovke a odosiela na internet do databázy. No, tam je to už oveľa jednoduchšie, akonáhle sú údaje v databáze, môžete s nimi robiť, čo chcete, dokonca aj kresliť grafy.


Pre komunikáciu s okolitým svetom si internet jednoznačne zvolil WiFi modul ESP8266 takmer bez alternatívy (pozn. teraz sa možno objavili aj takéto alternatívy). Ethernetové rozširujúce dosky sú k dispozícii pre Arduino, ale vôbec som nechcel byť viazaný káblom.



Zaujímavou otázkou bolo, ako zabezpečiť komunikáciu medzi vonkajším senzorom (alebo senzormi, pamätáte na požiadavku na rozšíriteľnosť systému?) a centrom. 433 MHz rádiomajáky určite nie sú vhodné (nie sú vhodné vôbec na nič).


Znovu použiť ESP8266?


Nevýhody tohto riešenia:

    Vyžaduje stabilné WiFi mimo domova

    rozsah komunikácie nebude veľký

    utrpí spoľahlivosť, ak zlyhá internet, neuvidíme naše vzdialené senzory

    väčšia spotreba energie.

    Spotreba energie ESP8266:

    pri prenose 120-170 mA

    pri príjme 50-56 mA

    v režime hlbokého spánku 10 µA (µA)

    vypnutý stav 5 µA (µA).

Na prepojenie diaľkových senzorov s hlavnou domácou jednotkou bol nakoniec zvolený čip nRF24L01 + s 2,4 GHz vysielačom a prijímačom v jednej fľaši s dodatočnou externou anténou, aby určite „prerazil“ steny.



Spotreba energie nRF24L01+ 2,4 GHz:

  • pri príjme 11 mA
  • pri prenose rýchlosťou 2Mbps - 13 mA
  • v pohotovostnom režime I - 26 μA (μA)
  • vypnutý stav 900 nA (nA).

ESP8266 aj nRF24L01+ majú vhodný rozsah prevádzkových teplôt: od -40 ℃ do +80 ℃.


nRF24L01+ si môžete kúpiť za približne 1 dolár alebo s externou anténou za 3 doláre. ESP8266-01 si môžete kúpiť za približne 4 doláre. Pozorne si prečítajte popis produktu! V opačnom prípade si kúpte jednu anténu.


Objavilo sa jadro systému. Prejdime k samotným senzorom.


Ako viete, na ulici môže teplota dosiahnuť záporné hodnoty, takže snímač DHT11 nie je vhodný, ale DHT22 je v poriadku.



Špecifikácie DHT22 / AM2302:

  • Napájanie 3,3V až 5V, odporúča sa 5V
  • odber maximálne 2,5mA, v čase merania a prenosu dát
  • rozsah merania vlhkosti 0-100% s chybou 2-5%
  • rozsah merania teploty od -40 do +125°C s chybou ±0,5°C
  • požiadavka na meranie nie viac ako 0,5 Hz - raz za 2 sekundy.

Vo vnútri domu dúfam nebudú žiadne mínusové teploty, takže môžete použiť DHT11, najmä keď som ho už mal.


Vlastnosti DHT11:

  • Napájanie 3,3V až 5V
  • odber maximálne 2,5 mA, v čase merania a prenosu dát
  • rozsah merania vlhkosti 20-80% s chybou 5%
  • rozsah merania teploty od 0 do +50°C s chybou ±2°C
  • požiadavka na meranie nie viac ako 1 Hz - raz za sekundu.

DHT22 si môžete kúpiť za približne 3 doláre. DHT11 stojí menej – 1 dolár, ale je tiež menej presný.


Teraz späť k Arduinu. Akú dosku si vybrať?


Jednotlivé časti systému som testoval na Arduino UNO. Tie. Pripojil som modul ESP k uno a preštudoval som ho, vypol som ho, potom som pripojil nRF24 atď. Pre finálnu implementáciu okenného senzora som zvolil Arduino Pro Mini ako najbližšiu miniatúru k Uno.



Pokiaľ ide o spotrebu energie, Arduino Pro Mini tiež vyzerá dobre:

  • chýba prevodník USB-TTL, ktorý sám o sebe veľa „žerie“,
  • LED je pripojená cez 10k odpor.

Pre pokročilú úsporu energie bolo plánované:

  • odstráňte LED - indikátor napájania na Arduino Pro Mini (ľutoval som, že som nepokazil dosku)
  • alebo použite „holú“ zostavu na mikroprocesore Atmel ATmega328 (nepoužil ju)
  • použite Low Power Library alebo JeeLib .

Z knižníc som si vybral Low Power Library, je jednoduchá a obsahuje len to, čo potrebujete.


Pre centrálnu jednotku, keďže sa k nej plánovalo pripojiť množstvo periférií, bola zvolená doska Arduino Mega. Navyše je plne kompatibilný s UNO a má väčšiu pamäť. Pri pohľade do budúcnosti poviem, že táto voľba bola plne opodstatnená.


Arduino Mega si môžete kúpiť za približne 8 dolárov.

Výkon a spotreba energie

Teraz o jedle a spotrebe energie.


Existujú dva typy Arduino Pro Mini:

  • pre napájacie napätie 5V a frekvenciu 16MHz
  • pre napájacie napätie 3,3V a frekvenciu 8MHz.

Keďže rádiový modul nRF24L01+ vyžaduje na napájanie 3,3 V a rýchlosť tu nie je dôležitá, kúpte si Arduino Pro Mini na 8 MHz a 3,3 V.


V tomto prípade je rozsah napájacieho napätia Arduino Pro Mini:

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

Už som mal 5V Arduino Pro Mini, a preto som ho použil. Arduino Pro Mini si môžete kúpiť za približne 4 doláre.


Napájanie centrálnej jednotky bude zo siete 220 V cez malý napájací zdroj s výkonom 12V, 450mA, 5W. Niečo takéto za 5 dolárov. K dispozícii je aj samostatný výstup pre 5V.



A ak to nestačí, môžete to dať silnejšie. Inými slovami, šetrenie energie pre centrálnu jednotku nemá veľký zmysel. Pri diaľkovom bezdrôtovom senzore je však najdôležitejšia úspora energie. Ale nechcem prísť ani o funkčnosť.


Preto bude Arduino Pro Mini a rádiový modul nRF24 napájaný zväzkom 4 Ni-Mh batérií.


A pamätajte maximálna kapacita modernej batérie okolo 2500-2700mAh, čokoľvek viac je buď marketingový trik (Ansmann 2850) alebo hoax (UltraFire 3500).


Li-Ion batérie nepoužívam z niekoľkých dôvodov:

  • veľmi drahý
  • keď teplota okolia klesne pod 0°C, výkon lítium-iónovej batérie sa zníži na 40-50%
  • tie, ktoré sú lacné, sú vyrobené bez ochrany a nie sú bezpečné (počas skratu alebo vybitia môžu explodovať a zhorieť, pozrite si veľa videí na YouTube)
  • starnú, aj keď sa nepoužívajú (to sa však dá povedať o všetkých chemických prvkoch), po 2 rokoch stráca Li-Ion batéria asi 20 % svojej kapacity.

Pre prototyp je celkom možné vystačiť si s kvalitnými Ni-MH AA alebo AAA batériami. Navyše nepotrebujeme veľké prúdy. Jedinou nevýhodou Ni-MH batérií je ich dlhá doba nabíjania.

Všeobecná schéma meteorologickej stanice

Poďme si to zhrnúť. Tu je všeobecný diagram, ako to všetko funguje.



Pokračovanie nabudúce.

Pokračujeme vo vývoji našej meteorologickej stanice.

Predtým, ako prejdem k aktualizácii, chcem to trochu objasniť.

Jeden z našich kolegov mi napísal otázku, prečo bol zavedený strážny časovač?

Časovač strážneho psa sa nastavuje v prípade núdze. Ako ukazuje prax, ENC28J60 nevytiahne viac ako (ak pamäť nezlyhá) 4 súčasné pripojenia. Ak vezmeme do úvahy, koľko servisných pripojení sa neustále vyskytuje na udržanie samotnej siete a len ľavá prevádzka vytvorená najrôznejšími domácimi hračkami (napríklad moderné televízory skenujú dostupných hostiteľov v sieti a ich porty sa otvárajú), dizajn jednoducho ide do strnulosti. . ENC28J60 nevie samostatne pracovať so sieťovými protokolmi a všetko je implementované v knižniciach. Možno sú to len oni.
Skontroloval som všetky dostupné knižnice a rôzne moduly (náhle manželstvo), ale dlho sa mi nepodarilo dosiahnuť stabilnú prácu. Maximálne obdobie bolo asi 3-4 týždne.
Preto sa tam „pes“ točí a v takom prípade potiahne ovládač. Potom problém zmizol.
Nepopieram ani to, že v mojej domácej sieti existujú určité nuansy alebo problémy. Ale keďže bol problém u mňa, môže na to prísť iný človek. Zatiaľ som našiel len toto riešenie.
Pokiaľ viem, čipy Wiznet (W5100 a vyššie) toto nemajú, alebo to len zle hľadali.

Prejdime k aktualizácii

Najdôležitejšie je, že sa vzďaľujeme od čipu ENC28J60 a prejdite na W5100. Snažil som sa implementovať všetko na starom čipe, ale nie je dostatok pamäte mikrokontroléra kvôli veľmi veľkým knižniciam pre ENC28J60. Pri použití nového čipu štandardne knižnice od vývojára a všetkých vykonaných zmien zostáva ešte viac 20% voľná pamäť mikrokontroléra ATMega328. A toto sú nové buchty!

Táto verzia (nazvime ju druhá) pridáva možnosť bezdrôtového prenosu údajov zo senzorov pomocou frekvencie 433 MHz. Samotné moduly som prevzal od Číňanov, značenie XY-MK-5V. Chcem poznamenať, že kvalita prenosu je ďaleko od dokonalosti. Môže dôjsť k strate signálu, šumu, nie k možnosti súčasného prenosu atď., atď. Ale ich cena (menej ako 1 dolár za sadu) kompenzuje tieto nedostatky. Prezradím vám tajomstvo, že práve tieto (najlacnejšie) moduly sú v mnohých značkových meteostaniciach na domáce použitie. Wow, nečakané?

Začnime základňovou stanicou

Sťahujeme sa do Arduino UNO A Ethernetový štít(prvá verzia) na základe čipu W5100. Toto je sendvič a nemá zmysel ho popisovať. Popíšem len dodatočne zapojené kontakty na moduly XY-MK-5V.

Vysielací modul využíva energiu 5V, GND(kde vtedy bez matky) a D2 pin na ovládači. Upraviť kontakt D2 (ÚDAJE) môžete použiť funkciu vw_set_tx_pin z knižnice vw.

Na rozdiel od predchádzajúceho náčrtu tento používa dve ďalšie knižnice:

#include #include

Samotný náčrt

Skrytý text

#include #include #include #include #include #include #include #include #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(); dlho Teplota = 0, Tlak = 0; plavák H, dP, dPt; bool interval = true; EasyTransferVirtualWireET; struct SEND_DATA_STRUCTURE( ID bajtu; // ID zariadenia int Teplota; // Teplotný plavák Tlak; // Tlakový plavák Vlhkosť; // Rosný bod plováku vlhkosti; // Bod rosy/mrazy ); vysielanie SEND_DATA_STRUCTURE; void setup() ( // Inicializácia časovača Watchdog wdt_disable(); delay(8000); wdt_enable(WDTO_8S); // Inicializácia konzoly Serial.begin(9600); // Inicializácia DHT senzora dht.begin(); // Inicializácia modul 433 MHz ET.begin(details(broadcast)); vw_set_ptt_inverted(true); vw_set_tx_pin(2); vw_setup(2000); // Spustite sieť, ak sme nečakali na dáta z DHCP servera, tak // sami si pridelíme adresu, ak (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip); // Inicializácia 1-Wire Wire.begin(); delay(200); // Inicializácia BMP180 s nastavením výšky // dps.init (MODE_STANDARD, 3200, true); // Inicializácia BMP180 dps.init(); Serial.println(Ethernet.localIP()); // Odoslanie prvých údajov ihneď po zapnutí zariadenia send_info(true) ); ) // funkcia rosného bodu NOAA / / referencia (1) : http://wahiduddin.net/calc/density_algorithms.htm // referencia (2) : http://www.colorado.edu/geography/weather_station/Geog_site /about.htm dvojitý rosný bod (dvojitý pomer Celzia, dvojnásobná vlhkosť) ( // (1) Tlak nasýtených pár = ESGG(T) dvojnásobný POMER = 373,15 / (273,15 + Celzia); dvojitá RHS = -7,90298 * (POMER - 1); RHS + = 5,02808 * log10 (POMER); RHS += -1,3816e-7 * (pow(10, (11,344 * (1 - 1/POMER))) - 1); RHS += 8,1328e-3 * (pow(10, (-3,49149 * (POMER - 1))) - 1); RHS+= log10(1013,246); // faktor -3 slúži na nastavenie jednotiek - Tlak pár SVP * vlhkosť dvojnásobná VP = pow(10, RHS - 3) * vlhkosť; // (2) ROSNÝ BOD = F(tlak pár) 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čítanie údajov zo senzora vlhkosti DHT, kým nedostaneme // výsledok. V 90 % prípadov všetko funguje dobre, ale potrebujeme 100 % if((H = dht.readHumidity()) >= 0) ( // Získanie vlhkosti a teploty zo snímača BMP180 dps.getPressure(&Pressure); dps.getTemperature(&Temperature); // Výpočet rosného bodu, ak teplota je vonku nad 0 stupňov Celzia // a očakávajte výsledok nad 0, inak výstup 0. Je to potrebné //, aby v zimnom období nebolo zavádzajúce. // 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 modulom je potrebné pridať anténu. Pre 433 MHz stačí obyčajný medený drôt 17 cm. Bez antény môžete zabudnúť na bežnú prevádzku.

Prejdime k najdôležitejšej časti tejto aktualizácie – k lokálnej bezdrôtovej stanici

Na jeho implementáciu (na kolene) som použil analóg Arduino NANO(na základni ATMega328) A TFT zobrazenie na čipe ST7735S s dovolením 128 x 160

Skrytý text



Pinout displej -> ovládač

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

Prijímací modul sa pripája rovnakým spôsobom ako vysielač, ibaže ÚDAJE pripnúť D7.

Par fotiek ako to vyzera:

Skrytý text

Náčrt prijímača

Skrytý text

#include #include #include #include int x, y; int w = 128, h = 160; intsize; // 433 EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( ID bajtu; // ID zariadenia int Teplota; // Teplotný plavák Tlak; // Tlakový plavák Vlhkosť; // Rosný bod plováku vlhkosti; // Bod rosy/mrazy ); vysielanie 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, vlhkosť, rosný bod; Stringinfo; TFT TFTscreen = TFT(cs, dc, rst); void setup()( Serial.begin(9600); // Inicializácia 433MHz modulu ET.begin(podrobnosti(vysielanie)); vw_set_ptt_inverted(true); vw_set_rx_pin(7); vw_setup(2000); vw_rx_start(); // Inicializácia a inicializácia úvodné nastavenie zobrazenia TFTscreen.begin(); TFTscreen.setRotation(2); TFTscreen.background(0, 0, 0); // Kreslenie statických prvkov // 1. Navštívte nás TFTscreen.stroke(255, 255, 255); TFTscreen .setTextSize(1); TFTscreen.text(" ", 10, 10); // 2. Popis hodnôt zo senzorov TFTscreen.text("mmHg", w/2+5, 80); TFTscreen.text ("% ", w/2+5, 100); TFTscreen.text("C", w/2+5, 120); vysielanie.Teplota = 0; vysielanie.Tlak = 0; vysielanie.Vlhkosť = 0; vysielanie .rosný bod = 0; TFTPrint(); ) void loop()( if(ET.receiveData())( if(broadcast.ID == 1) TFTPrint(); /* Serial.println(broadcast.Temperature); Serial. println(broadcast .Pressure); Serial.println(vysielanie.Vlhkosť); Serial.println(vysielanie.rosný bod); Serial.println(); */ ) ) void changes (int size, int x , int y, bool up, bool clear = false) ( if(clear) TFTscreen.stroke(0, 0, 0); else ( changes(size, x, y, !up, true); TFTscreen.stroke((hore)?0:255, 0, (hore)?255:0); ) if((size%2) == 0 )veľkosť++; while(size > 0) ( TFTscreen.line(x, y, x+(size--), y); ++x, (up)?--y:++y, --size; ) /* while( veľkosť > 0) ( TFTscreen.line(x, y, (hore)?x+veľkosť-1:x, (hore)?y:y+veľkosť-1); ++x, ++y, --veľkosť; ) */ ) int x_center (int w, int dlzka, int velkost) ( vratna dolna ((w-dlzka*(velkost*5)+velkost*2)/2); ) int x_alignment_right(int w, int dlzka, int veľkosť) ( návratová hranica(š-dĺžka*(veľkosť*5)+veľkosť*2); ) void TFTPrint() (veľkosť = 3; // ================== =================================================== ============== // Zobrazenie teploty // ============================= ==================================================== == if(broadcast.Temperature != Log_Temperature) ( TFTscreen.setTextSize(size); // Prepísanie zastaraných údajov String info = String(Log_Temperature); info.concat(" C"); if(Log_Temperature > 0) info = " +"+info; info.toCharArray(Teplota, info.dĺžka()+1); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Teplota, x_center(š, info.dĺžka()+1, veľkosť ), 35); // Výstup nových hodnôt i info = Reťazec(vysielanie. teplota); info.concat("C"); if(vysielanie.Teplota > 0) info = "+"+info; info.toCharArray(Teplota, info.dĺžka()+1); // Zmena farby hodnoty teploty v závislosti od samotnej teploty 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 pre vizuálnejšie prekročenie nuly ) else ( r = mapa(vysielanie.Teplota, -40, 0, 0, 30); // Zmena odtieňa pre vizuálnejšie prekročenie nuly b = mapa(vysielanie.Temperature, -40, 0, 150 , 255); // Modrá ) TFTscreen.stroke(b, g, r); // POZOR: farebné pozície sú v knižnici obrátené, miesto RGB používa BGR! TFTscreen.text(Teplota, x_center(š, info.dĺžka()+1, veľkosť), 35); ) veľkosť = 1; // ================================================= =================================== // Zobrazenie hodnôt tlaku // ======== = =================================================== ======================= if(broadcast.Pressure != Log_Pressure) ( TFTscreen.setTextSize(size); // Prepísať informácie o zastaraných údajoch = String(Log_Pressure ); info.toCharArray(Tlak, info.dĺžka()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Tlak, x_alignment_right(w/2-5, info.length(), size), 80 ); // Výstup nových hodnôt info = String(vysielanie.Tlak); info.toCharArray(Tlak, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(Tlak, x_alignment_right(w/) 2-5, info.length(), size), 80); changes(10, 106, 85, (vysielanie.Pressure > Log_Pressure)?true:false); ) else ( changes(10, 106, 85, true, pravda); zmeny(10, 106, 85, nepravda, pravda); ) // ============================ ================================================= = / / Hodnoty výstupnej vlhkosti // =================== =================================================== ============= if(vysielanie.Humidity != Log_Humidity) ( TFTscreen.setTextSize(size); // Prepíše zastarané údaje info = String(Log_Humidity); info.toCharArray(Vlhkosť, info.dĺžka()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Vlhkosť, x_zarovnanie_vpravo(š/2-5, info.dĺžka(), veľkosť), 100); // Výstup nových hodnôt info = String(broadcast.Humidity); info.toCharArray(Vlhkosť, info.dĺžka()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(Vlhkosť, x_zarovnanie_vpravo(š/2-5, info.dĺžka(), veľkosť), 100); changes(10, 106, 105, (vysielanie.Vlhkosť > Log_Vlhkosť)?true:false); ) else ( zmeny (10, 106, 105, pravda, pravda); zmeny (10, 106, 105, nepravda, pravda); ) // ================== =================================================== ============= // Zobraziť rosný bod\mráz // ============================ ==================================================== === if(broadcast.dewPoint ! = Log_dewPoint) ( TFTscreen.setTextSize(size); // Prepísať informácie o zastaraných údajoch = String(Log_dewPoint); info.toCharArray(dewPoint, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text (rosný bod, x_alignment_right(w/2-5, info.length(), size), 120); // Zobrazenie nových hodnôt info = String(broadcast.dewPoint); info.toCharArray(dewPoint, info.length()); TFTscreen.stroke(255, 255, 255);TFTscreen.text(rosný bod, 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); ) // Aktualizácia hodnôt v protokoloch na neskôr porovnanie Log_Temperature = broadcast.Temperature; Log_Pressure = vysielanie.Tlak; Log_Humidity = vysielanie.Humidity; log_dewPoint = broadcast.dewPoint; )

Hodnoty sú zobrazené pomerne kompaktne, ale ako ukazuje prax (a rady mojich súdruhov) - "chuť a farba, dokonca ani manželka nie je priateľ." Vypočul som si kopu rád a návrhov, ktoré si však odporujú. Tak si to urob podľa svojho vkusu.

Zdalo sa mi, že dizajn je tá časť projektu, ktorá zaberá väčšinu času!

Skrytý text

Časť údajov je vyrobená na zobrazenie niektorých prvkov dizajnu.

Artefakty na displeji sú prach a iné nečistoty nahromadené počas dlhej doby, v ktorej bol displej ... niekde tam ... no, už si nepamätám, odkiaľ som to vzal! Nechajte ma na pokoji!

Náčrt má funkcie polohovania. Sú dosť primitívne, ale umožňujú vám dosiahnuť určité efekty.

  1. x_center
  2. x_alignment_right

Prvý vycentruje text a druhý ho zarovná na pravú stranu zadanej zóny. Všetky výpočty sa robia vzhľadom na veľkosť daného textu na základe výrazu 1 veľkosť = 1PX x 1PX segment písma.

Na displeji sa tiež zobrazujú prvky zodpovedajúce zvýšeniu alebo zníženiu jednej alebo druhej načítanej hodnoty. Sú zobrazené ako trojuholníky. Ale v kóde funkcie zmeny k dispozícii je alternatívne zobrazenie vo forme trojuholníkov otočených o 45 stupňov. Ak hodnota stúpa, prvok je červený, inak je modrý.

Mimochodom, farba a odtieň hlavnej teploty sa mení v závislosti od samotnej teploty. Dosť kontroverzné rozhodnutie, no podľa mňa vizuálne pohodlné. Chvíľu som s tým bojoval a uvedomil som si, že hodnoty vo funkcii mŕtvica, objekt zobrazenia TFT, sú uvedené v nesprávnom poradí. BGR miesto RGB. Toto je chyba vývojára, alebo niečomu nerozumiem.

PS: Všetko je celkom zaujímavé, ale podľa mňa by si to zaslúžilo ďalší rozvoj. Čo o chvíľu urobíme.



zdieľam