Domácí meteostanice na Arduinu a odesílání dat do "People's Monitoring". Bezdrátová meteostanice Schéma jednoduché domácí meteostanice využívající Arduino nano

Domácí meteostanice na Arduinu a odesílání dat do "People's Monitoring". Bezdrátová meteostanice Schéma jednoduché domácí meteostanice využívající Arduino nano

Stejně jako většina pracujících lidí vám sledování vlastních projektů zabírá jediný volný čas, který vám zbývá. Proto jsem dlouho nic nevytvářel a měl jsem chuť něco udělat. Kupodivu se tato příležitost objevila na univerzitě. Za oknem je září, čtvrtý ročník a nadcházející práce v kurzu o designu okruhů. Bylo nám řečeno, že výuku lze provádět ve dvou variantách: papír a hardware.

Po dobu 5 let probíhala papírová práce na naší univerzitě podle principu „vezmi staré a dej je dohromady“. Tento přístup mi nevyhovoval svou rutinností, proto jsem rovnou zvolil výuku v hardwaru. Mikrokontrolér Arduino byl navržen jako srdce kurzu kvůli jeho snadnému učení. Po určení typu kurzu zbývala ještě jedna otázka: co přesně by se mělo dělat. Protože jsem neměl žádné zkušenosti s programováním mikrokontrolérů, okamžitě jsem otevřel Google a začal studovat existující projekty. Projektů je mnoho, některé jsou docela jednoduché, některé důmyslné (třeba 3D skener), ale drtivá většina neměla praktické uplatnění. A chtěl jsem jen něco, co by neleželo na poličce a nesbíralo prach. Po půlhodinové exkurzi do světa Arduina mě téma domácích meteostanic zaujalo a projekty se mi nezdály příliš náročné na realizaci (což hlavně nováčka zaujalo).

Takto bylo vybráno téma pro ročníkovou práci a postupem času se zdálo, že nejsou žádné problémy.

Výběr komponent

Když jsem procházel různé projekty, uvědomil jsem si, že mi bude stačit Nano nebo dokonce Pro Mini, ale přesto jsem si vybral Arduino Uno v naději, že se mi bude líbit programování pro Arduino a v budoucnu zrealizuji nějaké další projekty. Pájku jsem nikdy předtím v ruce nedržel, a tak jsem se pro snadnější vývoj rozhodl zakoupit také Sensor Shield v4.

Více informací

Deska umožňuje rychlé připojení senzorů, modulů, servomotorů, sériových a I2C rozhraní a také zobrazuje všechny porty ovladače ve formátu Duemilanova/Uno (lze připojit i k řadě mega, ale s omezeními a z toho plynoucími důsledky) . Podporuje další štíty na sobě.


Jako zdroje meteorologických dat jsem zvolil následující senzory:


Rozhodl jsem se pro senzory. Co ale dělat s daty přicházejícími ze senzorů? Rozhodl jsem se to zobrazit. Chtěl jsem barevný obrázek, tak jsem monochromatická řešení hned zavrhl. Po několika minutách hledání byl vybrán 1,8palcový TFT displej ST7735.

Více informací

Vzhledem k tomu, že displej používá pro komunikaci 4-drátový protokol SPI a má vlastní vyrovnávací paměť snímků s adresovatelnou pixely, lze jej použít s jakýmkoliv druhem mikrokontroléru. Displej s úhlopříčkou 1,8 palce má 128 x 160 barevných pixelů. K dispozici je také slot pro kartu microSD, takže můžete snadno načítat plnobarevné bitmapové obrázky ze souborového systému karet microSD FAT16/FAT32.

Vlastnosti:

  • Úhlopříčka displeje – 1,8 palce, rozlišení 128x160 bodů, 18bitové barvy (262 144 barev)
  • Řadič s vestavěným pixelovým adresováním vyrovnávací paměti video paměti
  • Vestavěný microSD slot - využívá více než 2 digitální linky
  • Kompatibilní s 3,3 a 5V
  • Rozměry: 34 mm x 56 mm x 6,5 m


Programování řadiče Arduino

Poté, co jsme se rozhodli pro komponenty pro meteorologickou stanici, začneme programovat ovladač. Arduino IDE bylo použito k flashování firmwaru Arduina. Také použité knihovny od Adafruit.

Než přejdeme ke skice, podívejme se na funkčnost:

  • Údaje ze senzorů se odečítají každých 10 sekund a na obrazovce se aktualizují pouze ty indikátory, které se změnily ve srovnání s předchozím měřením
  • Implementován přenos dat přes COM port

Skica

#zahrnout // knihovna pro komunikaci s I2C zařízeními #include // Základní knihovna pro všechny senzory #include // knihovna pro BMP180 #include // Základní grafická knihovna #include // Knihovna specifická pro hardware #include // knihovna pro komunikaci se zařízeními SPI #include "dht.h" // knihovna pro DHT #define DHT22_PIN 2 // připojení datového pinu DHT22 ke 2 digitálnímu pinu #define TFT_CS 10 // připojení CS pinu TFT k 10 digitálnímu pinu #define TFT_RST 9 // připojte RST pin TFT k 9 digitálnímu pinu // toto můžete také připojit k resetu Arduina // v takovém případě nastavte tento #define pin na 0! #define TFT_DC 8 // připojení DC pinu TFT k 8 digitálnímu pinu Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); //inicializovat TFT #define TFT_SCLK 13 // připojit pin SCLK TFT k 13 digitálnímu pinu #define TFT_MOSI 11 // připojit pin MOSI TFT k 11 digitálnímu pinu dht DHT; Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); //inicializovat BMP180 int bmpFlag = 0; struct ( uint32_t total; uint32_t ok; uint32_t crc_error; uint32_t time_out; uint32_t connect; uint32_t ack_l; uint32_t ack_h; uint32_t neznámo; ) stat = ( 0,0,0,0,0,0); // struktura pro stav dht void setup(void) ( Serial.begin(9600); Serial.println("Meteo Test"); Serial.println(""); if(!bmp.begin()) // kontrola připojení for BMP180 ( Serial.print("Jejda, nebyl zjištěn žádný BMP180... Zkontrolujte kabeláž nebo I2C ADDR!"); bmpFlag = 1; ) tft.initR(INITR_BLACKTAB // Inicializujte TFT a vyplňte černou barvou tft.fillScreen); ; (ST7735_BLACK); tft.setRotation(tft.getRotation() + 1); tft.setTextSize(1.5); , starýTlak = 0, starýDHTHvlhkost = 0, starýDHTTteplota; = 0 || !event.pressure) // aktualizace dat ( tft.fillRect(0, 30, 160, 6, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED); printValue("ERROR BMP INITIALIZATION", 0 , "", true ) else ( if(event.pressure != oldPressure) ( tft.fillRect(0, 30, 160, 7, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED) ; printValue ("Pressure", event.pressure, " hPa", true); (0, 38); tft.setTextColor(ST7735_WHITE); (0, 46); printValue("Výška", nadmořská výška, " m", true wasUpdate = true ) ) if(DHT.vlhkost != oldDHTHumidity) ( tft.fillRect(0,); 54, 160, 7, ST7735_BLACK);

Je čas sestavit tělo

Hlavní podmínkou kurzu byl funkční prototyp v prezentovatelné podobě. Musel jsem si proto koupit pouzdro a vyzbrojen pilníkem meteostanici do pouzdra jakýmkoliv způsobem zasunout.

Pouzdro bylo zakoupeno v místním obchodě s radioelektronikou.

Rám

(Pouzdro na fotce je trochu jiné. Víko mám průhledné)



Poté byly pomocí pilníku vytvořeny otvory pro výstup senzorů a napájení. Rozhodl jsem se přesunout senzory ven, protože při testování systému bez pouzdra jsem si všiml, že se zadní strana obrazovky velmi zahřála, což by ovlivnilo teplotu uvnitř pouzdra.

Pouzdro s otvory pro senzory a napájení



Vzhledem k tomu, že jsem musel připájet nožičky na 2 snímače a na jednom z nich jsem spálil dráhu, rozhodl jsem se nepokoušet osud a dráty k snímačům nepřipájet (procvičím na něčem jiném), a aby bylo spojení abych byl víceméně spolehlivý, rozhodl jsem se převinout elektrickou pásku.

Systém před „nacpáním“ do krytu



Vzhledem k tomu, že pouzdro je mnohem větší než Arduino (menší nebylo), musel jsem vymyslet podpěru, aby se deska uvnitř pouzdra nehýbala. Z pěny byla také vyříznuta postava a v ní byl obdélník pro obrazovku, aby se skryly vnitřky pouzdra. Neměl jsem po ruce super lepidlo, takže jsem musel použít oboustrannou pásku.

Zázrak-yuda ryba-velryba



Zašroubujte víko, připojte napájení a počkejte.

Dokončena meteostanice v budově



Po zobrazení výsledků na obrazovce zjistíme nepříjemnou chybu v měření vlhkosti: DHT22 pilně produkuje údaj 99,90 % (1,00 % je extrémně vzácné). Začněme zjišťovat, v čem je problém. První věc, kterou uděláme, je podívat se na výstup hodnot na COM port. Je to příjemné. Po několika doplnění, rozebrání a opětovném složení pouzdra přichází na mysl hledat odpověď na Googlu. Ruský Google podle očekávání nic užitečného neřekl. OK. Začínáme hledat v angličtině a na jednom z fór narazíme na kluky s podobným problémem. První čtyři stránky diskuze nedávají nic užitečného, ​​ale na páté stránce najdeme odpověď na naši otázku:
Senzory vlhkosti mohou být snadno ovlivněny nesprávnými plyny nebo velmi dlouhým vystavením vysoké vlhkosti IIRC. V datasheetu je postup, jak senzor „resetovat“, můžete to zkusit.

Zbývala jen otázka, kdy a jak se mi podařilo poškodit DHT22. Blížil se ale čas absolvování kurzu a tak jsem řešení tohoto problému nechal na později.

Doslov

Kurz proběhl úspěšně. Meteorologická stanice byla odložena na neurčito, dokud nebudou všechny hlušiny na univerzitě uzavřeny. K meteostanici jsme se však museli vrátit dříve, než jsem si myslel. Tak se stalo, že jsem v půlce listopadu změnil pracoviště a v novém týmu jsem potkal lidi, kteří se zajímají o platformu Arduino a podobně. Proto můj zájem o tuto platformu, aniž bych měl čas vychladnout, opět vzplál. Vyndal jsem svou meteostanici, připojil ji k počítači a vzpomněl jsem si, že jsem implementoval přenos dat z Arduina přes COM port. A pak mě napadlo napsat program, který přijímá data přes COM port z Arduina a přenáší tato data do veřejného monitorování, ale to je úplně jiný příběh.

Také bych chtěl mít bezdrátové senzory a ještě implementovat meteostanici na Arduino Pro Mini. Objednal jsem si proto 4 Arduino Pro Mini se zdrojem 3,3V, 4 rádiové moduly nRF24L01+ a nějaké další senzory, o kterých se také pokusím příště. Mezitím čekám na balík, plánuje se implementace připojení hodin reálného času, aby bylo možné ukládat čas aktualizace dat a samotná data na microSD kartu, pokud nebude připojení k klienta přes COM port.

Můžete pomoci a převést nějaké prostředky na rozvoj webu



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

Než přejdeme k aktualizaci, chci to trochu objasnit.

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

Hlídací časovač je na místě pro případ nouze. Jak ukazuje praxe, ENC28J60 nezvládá více než (pokud nedojde k selhání paměti) 4 simultánní připojení. Vezmeme-li v úvahu, kolik servisních připojení neustále dochází k udržení provozu samotné sítě, a jednoduše zbylý provoz vytvořený nejrůznějšími hračkami pro domácnost (například moderní televizory skenují dostupné hostitele v síti a jejich otevřené porty), návrh jednoduše jde 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 vadné), ale dlouho se mi nedařilo dosáhnout stabilního provozu. Maximální doba byla asi 3-4 týdny.
Proto se tam „pes“ točí a když se něco stane, zatáhne za ovladač. Po tomto problém zmizel.
Nepopírám také, že v mé domácí síti mohou být určité nuance nebo problémy. Ale protože jsem měl problém, může ho mít i jiný člověk. Zatím jsem našel pouze toto řešení.
Pokud vím, čipy od Wiznetu (W5100 a vyšší) to nemají, nebo prostě nevypadaly dost dobře.

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 není dostatek paměti mikrokontroléru kvůli velmi velkým knihovnám pro ENC28J60. Při použití nového čipu standard knihovny od vývojáře a všech provedených změn zbývá ještě více 20% volnou paměť mikrokontroléru ATMega328. A to jsou nové buchty!

V této verzi (říkejme jí druhá) možnost bezdrátově přenášet údaje ze senzorů pomocí frekvence 433 MHz. Samotné moduly jsem převzal od Číňanů, značení XY-MK-5V. Rád bych poznamenal, že kvalita přenosu má k dokonalosti daleko. Možná ztráta signálu, šum, nemožnost současného vysílání atd. atd. Ale jejich cena (méně než 1 $ za sadu) tyto nedostatky kompenzuje. Prozradím vám tajemství, že tyto (nejlevnější) moduly se nacházejí 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 bychom byli 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); char server = "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; 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; 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 433 MHz modulu ET.begin(detaily(vysílání) vw_set_ptt_inverted(true) if (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip); 1-Wire Wire.begin( // Inicializace BMP180 s nastavením výšky // dps.init (MODE_STANDARD, 3200, true // Inicializace BMP180 dps.init()); // Odešlete první data ihned po zapnutí zařízení send_info(true) // funkce dewPoint NOAA / / reference (1) : http://wahiduddin.net/calc/density_algorithms.htm // reference (2) : http: //www.colorado.edu/geography/weather_station/Geog_site/about.htm double dewPoint(double celsius , double vlhkost) ( // (1) saturační tlak par = ESGG(T) double RATIO = 373,15 / (273,15 + celsius) ; To je nutné //, aby v zimním období nebylo zavádějící.<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 třeba přidat anténu. Pro 433 MHz Stačí obyčejný dlouhý měděný drát 17 cm. Bez antény můžete na běžný provoz zapomenout.

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

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

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č, pouze 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; velikost int; // 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; Teplota); info.concat("C"); = Log_dewPoint) ( TFTscreen.setTextSize(size); // Přepsat zastaralá data info = 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 // Výstup nových hodnot info = String(broadcast.dewPoint.toCharArray(dewPoint, info.length()); TFTscreen.stroke(255, 255, 255, TFTscreen.text(rosný bod, x_zarovnání_vpravo(w/2-5, info.length(), velikost), 120 změn(10, 106, 125, (vysílání.rosný bod >); Log_dewPoint)?true:false ) else ( changes(10, 106, 125, true, true); changes(10, 106, 125, false, true); ) // Aktualizace hodnot v protokolech pro další porovnání naměřených hodnot Log_Temperature = broadcast.Temperature;

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

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

Skrytý text

Některá data jsou vyrobena tak, aby odrážela některé prvky návrhu.

Artefakty na displeji jsou prach a jiné nečistoty, které se nahromadily za tu dlouhou dobu, co byl displej v... někde tam,... no, tam, 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é zóny. 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.

Displej také zobrazuje prvky odpovídající zvýšení nebo snížení konkrétní hodnoty naměřené hodnoty. Jsou zobrazeny ve formě trojúhelníků. Ale v kódu funkce Změny K dispozici je alternativní zobrazení v podobě trojúhelníků otočených o 45 stupňů. Pokud se hodnoty zvýší, prvek je červený, v opačném případě modrý.

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

PS: Všechno je docela zajímavé, ale podle mě by to zasloužilo další rozvoj. To je to, co po nějaké době uděláme.

V tomto článku si povíme, jak sestavit plnohodnotnou meteostanici, která přenáší data o počasí do známé služby „sledování lidí“.

Naše meteostanice se bude skládat ze dvou zařízení: kompaktního autonomního zařízení, které měří indikátory počasí, a opakovacího zařízení, které tyto indikátory přijímá a odesílá je „veřejnému monitorování“. Zařízení budou komunikovat prostřednictvím bezdrátového komunikačního kanálu na frekvenci 433 MHz. Autonomní část bude napájena třemi AA bateriemi a vydrží na jednu sadu baterií až rok s periodou dotazování senzoru 20 minut.

Tato konstrukce umožňuje vyhnout se vrtání do zdí pro položení vodičů z ulice, kde je třeba provést měření, do místnosti, kde je třeba použít výsledky těchto měření.

co to vyžaduje?

K výrobě autonomního vysílače budeme potřebovat:

    Držák baterií AA x3 AA

K výrobě opakovače budeme potřebovat:

Je také vhodné nainstalovat dvě LED pro indikaci procesů:

Pro zvukovou indikaci slabé baterie autonomní části je vhodné použít piezo bzučák:

Jak to sbírat?

Montáž autonomní části

Sestava opakovače

Tím je montáž minimálně funkčního opakovače dokončena. Pokud chcete nainstalovat indikaci LED a zvukový alarm, postupujte podle níže uvedených kroků.


Zdroj

Kód autonomní části

meteo_sensor.ino #include #zahrnout #zahrnout #zahrnout // Časový limit mezi odesláními (ne více než 65535)#define TIMEOUT 60000 // Počet pokusů o odeslání balíku#define POKUSY 3 // Informační pin vysílače#define RF_PIN 5 // Piny snímače teploty a vlhkosti#define GND1_PIN 10 #define VCC1_PIN 11 #define GND2_PIN 7 #define VCC2_PIN 8 #define DATA_PIN 12 #define CLK_PIN 9 AmperkaLine rf(RF_PIN) ; SHT1x sht1x(CLK_PIN, DATA_PIN) ; void loop(void) ;// Funkce pro uspání desky. Každých TIMEOUT sekund // bude volána funkce loop_func. TEENSY3_LP LP = TEENSY3_LP() ; sleep_block_t* LP_config; void sleep_mode(void) (LP_config = (blok_uspanku_t*) calloc (1,velikost (blok_uspanku_t)) ; // Probudíme se podle časovače LP_config->modules = (LPTMR_WAKE) ; // Nastavení časového limitu pro časovač LP_config->lptmr_timeout = TIMEOUT; // Po vypršení časového limitu bude zavolána funkce loop LP_config->zpětné volání = smyčka; LP.Hibernate(LP_config) ;) // Funkce povolení periferií void periferní_start(void) ( // Zapněte datovou linku pinMode(RF_PIN, OUTPUT) ; // Zapněte napájení a uzemnění snímačů teploty a vlhkosti pinMode(GND1_PIN, OUTPUT) ; pinMode(GND2_PIN, OUTPUT) ; pinMode(VCC1_PIN, OUTPUT) ; pinMode(VCC2_PIN, OUTPUT) ; pinMode(GND1_PIN, INPUT) ; pinMode(GND2_PIN, INPUT) ; pinMode(VCC1_PIN, INPUT) ; pinMode(VCC2_PIN, INPUT) ; pinMode(18 , INPUT_PULLUP) ; pinMode(19 , INPUT_PULLUP) ;// Vypněte LED digitalWrite(LED_BUILTIN, LOW) ;) void setup(void) ( // Nic neinicializujeme, hned jdeme spát režim spánku() ; ) // Tato funkce se provádí jednou za TIMEOUT sekund void loop(void) ( unsigned long msg; byte temp, vlhkost, voltage; // Zapněte periferní zařízení periferni_start() ;<<= 8 ; msg | = humidity; msg <<= 8 ; msg | = temp; // Počkejte, až se zapne snímač teploty a vlhkosti zpoždění(30) ;< ATTEMPTS; i++ ) rf.send (msg) ; // Příjem vstupních dat ze senzorů temp = (byte) (sht1x.readTemperatureC() + 40 .) * 2 ; vlhkost = (byte) sht1x.readHumidity () ; }

napětí = analogRead(A0) / 4 ;

// Sestavení balíčku z dat #zahrnout #zahrnout #zahrnout msg = 0; zpráva | = napětí; msg // Odešlete balík několikrát);< 5000 ) { if (client.available () ) { char c = client.read () ; Serial.print (c) ; } } } client.stop () ; } }

client.print("#90A7DA0FBC7501#" ) ;

klient.tisk(temp, DEC) ;


client.println("#In");

client.print("#90A7DA0FBC7502#" ) ;

    klient.tisk(vlhkost, DEC) ;

client.println("#Vlhkost");
client.print("#90A7DA0FBC7503#" ) ;



klient.tisk(napeti, DEC) ;

client.println("#Napětí" ) ;
client.println("##");

) else Serial.println ("spojení selhalo" ) ;

  • ( unsigned long tm = millis() ; while (millis() - tm
  • Registrace meteostanice v „People's Monitoring“
  • Aby se data přenášená naším zařízením správně zobrazovala na veřejném monitorování, musíte provést následující:
  • Ukázka činnosti zařízení
  • co ještě můžeš dělat?
  • Teensy má přímo na palubě hodiny reálného času (RTC). K jejich funkčnosti chybí pouze křemen. Můžete si koupit 32,768 KHz quartz v každém obchodě s radioelektronikou a připájet jej. Poté můžete Teensy probudit pomocí budíku RTC. Výhodou je, že zařízení můžete probouzet častěji v těch hodinách, kdy jsou potřeba přesnější údaje. Například během pracovní doby probuďte zařízení každých 5 minut a ve zbytku - každou půl hodinu.

Nedávno můj kolega uspořádal malou vědeckou výstavu.

Můj učitel mě požádal, abych studentům na vysoké škole představil projekt elektroniky. Měl jsem dva dny na to, abych vymyslel něco zajímavého a docela jednoduchého.

  • Vzhledem k tomu, že povětrnostní podmínky jsou zde poměrně proměnlivé a teplota se pohybuje v rozmezí 30-40°C, rozhodl jsem se vyrobit domácí meteostanici.
  • Jaké jsou funkce domácí meteostanice?
  • Meteostanice Arduino s displejem je zařízení, které shromažďuje data o počasí a podmínkách prostředí pomocí různých senzorů.
  • Obvykle se jedná o následující senzory:

vítr







  • vlhkost vzduchu
  • déšť
  • teplota
  • tlak

výšky

  • Mým cílem je vyrobit přenosnou stolní meteostanici vlastníma rukama.
  • Měl by být schopen určit následující parametry:
  • teplota

vlhkost vzduchu







tlak

výška

Snímač AM2302 používá digitální signál. Tento senzor pracuje na unikátním kódovacím systému a technologii senzorů, takže jeho data jsou spolehlivá. Jeho senzorový prvek je připojen k 8bitovému jednočipovému počítači.

Každý snímač tohoto modelu je teplotně kompenzován a přesně kalibrován, kalibrační koeficient je umístěn v jednorázové programovatelné paměti (OTP paměť). Při čtení naměřených hodnot snímač vyvolá koeficient z paměti.

Díky malým rozměrům, nízké spotřebě energie, dlouhé přenosové vzdálenosti (100 m) je AM2302 vhodný téměř pro všechny aplikace a 4 výstupy v jedné řadě velmi zjednodušují instalaci.

Podívejme se na výhody a nevýhody tří modelů snímačů.

DHT11

Plusy: nevyžaduje pájení, nejlevnější ze tří modelů, rychlý stabilní signál, dosah přes 20 m, silné rušení.
Proti: Knihovna! Nejsou možnosti rozlišení, chyba měření teploty je +/- 2°C, chyba měření relativní vlhkosti +/- 5%, nedostatečný rozsah měřených teplot (0-50°C).
Oblasti použití: zahradnictví, zemědělství.

DHT22

Klady: nevyžaduje pájení, nízká cena, vyhlazené křivky, malé chyby měření, velký rozsah měření, dosah větší než 20 m, silné rušení.
Nevýhody: citlivost by mohla být vyšší, pomalé sledování teplotních změn, vyžaduje knihovnu.
Oblasti použití: environmentální studie.

SHT1x

Plusy: není potřeba pájení, hladké křivky, nízké chyby měření, rychlá odezva, nízká spotřeba, automatický režim spánku, vysoká stabilita a konzistence dat.
Nevýhody: dvě digitální rozhraní, chyba měření úrovně vlhkosti, rozsah měřených teplot 0-50°C, nutná knihovna.
Oblasti použití: provoz v náročných prostředích a v dlouhodobých instalacích. Všechny tři senzory jsou relativně levné.

Sloučenina

  • Vcc – 5V nebo 3,3V
  • Gnd - s Gnd
  • Data – na druhý pin Arduina

Krok 3: Tlakový senzor BMP180



BMP180 – barometrický senzor atmosférického tlaku s rozhraním I2C.
Senzory barometrického tlaku měří absolutní hodnotu okolního vzduchu. Tento indikátor závisí na konkrétních povětrnostních podmínkách a nadmořské výšce.

Modul BMP180 měl stabilizátor 3,3V 662kOhm, který jsem z vlastní hlouposti omylem odpálil. Musel jsem vést napájení přímo na čip.

Kvůli chybějícímu stabilizátoru jsem omezený ve výběru zdroje - napětí nad 3,3V zničí snímač.
Jiné modely nemusí mít stabilizátor, nezapomeňte zkontrolovat jeho přítomnost.

Schéma zapojení senzoru a I2C sběrnice s Arduino (nano nebo uno)

  • SDA-A4
  • SCL - A5
  • VCC - 3,3V
  • GND - GND

Pojďme si říci něco o tlaku a jeho vztahu k teplotě a nadmořské výšce.

Atmosférický tlak v žádném bodě není konstantní. Složitá interakce mezi zemskou rotací a sklonem zemské osy vede ke vzniku mnoha oblastí vysokého a nízkého tlaku, což zase vede ke každodenním změnám povětrnostních podmínek. Pozorováním změn tlaku můžete provádět krátkodobé předpovědi počasí.

Například pokles tlaku obvykle znamená deštivé počasí nebo přiblížení bouřky (přibližování se k oblasti nízkého tlaku, cyklóna). Rostoucí tlak obvykle znamená suché, jasné počasí (nad vámi prochází oblast vysokého tlaku, tlaková výše).

Atmosférický tlak se také mění s nadmořskou výškou. Absolutní tlak v základním táboře Everest (5400 m nad mořem) je nižší než absolutní tlak v Dillí (216 m nad mořem).

Vzhledem k tomu, že hodnoty absolutního tlaku se v každém místě liší, budeme odkazovat na relativní tlak nebo tlak na hladině moře.

Měření výšky

Průměrný tlak na hladině moře je 1013,25 GPa (nebo milibarů). Pokud se dostanete nad atmosféru, tato hodnota klesne na nulu. Křivka tohoto pádu je zcela jasná, takže si výšku nad hladinou moře můžete spočítat sami pomocí následující rovnice: alti=44330*

Pokud vezmete tlak na hladině moře 1013,25 GPa jako p0, řešením rovnice je vaše aktuální nadmořská výška.

Preventivní opatření

Pamatujte, že senzor BMP180 potřebuje přístup k okolní atmosféře, aby mohl číst tlak vzduchu, neumisťujte senzor do uzavřeného pouzdra. Bude stačit malý větrací otvor. Nenechávejte ji však příliš otevřenou – vítr zmást naměřené hodnoty tlaku a nadmořské výšky. Zvažte ochranu proti větru.

Chraňte před teplem. Měření tlaku vyžaduje přesné měření teploty. Snažte se chránit snímač před změnami teploty a nenechávejte jej v blízkosti zdrojů vysokých teplot.

Chraňte před vlhkostí. Senzor BMP180 je citlivý na úroveň vlhkosti, snažte se zabránit případnému vniknutí vody do senzoru.

Nezaslepujte snímač. Nečekaná byla citlivost silikonu ve snímači na světlo, které se k němu mohlo dostat otvorem v krytu čipu. Pro co nejpřesnější měření se snažte chránit snímač před okolním světlem.

Krok 4: Sestavení zařízení







Instalace jednořadých konektorů pro Arduino Nano. V podstatě jsme je nastříhali na míru a trochu obrousili, aby vypadaly tak, jak byly. Poté je zapájíme. Následně instalujeme jednořadé konektory pro snímač DHT22.

Instalujeme 10kOhm rezistor z datového výstupu na zem (Gnd). Vše zapájíme.
Pak nainstalujeme jednořadý konektor pro snímač BMP180 úplně stejným způsobem, napájení je 3,3V. Vše připojíme na I2C sběrnici.

Nakonec připojíme LCD displej ke stejné sběrnici I2C jako snímač BMP180.
(Na čtvrtý konektor plánuji později připojit modul RTC (hodiny reálného času), aby zařízení ukazovalo i čas).

Krok 5: Kódování




Stáhněte si knihovny

Chcete-li nainstalovat knihovny na Arduino, klikněte na odkaz

#zahrnout
#include #include #include "DHT.h" #include

tlak SFE_BMP180;

#define ALTITUDE 20,56 #define I2C_ADDR 0x27 //<<- Add your address here. #define Rs_pin 0 #define Rw_pin 1 #define En_pin 2 #define BACKLIGHT_PIN 3 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7

#define DHTPIN 2 // ke kterému digitálnímu pinu jsme připojeni

// Odkomentujte jakýkoli typ, který používáte! //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 DHT dht(DHTPIN, DHTTYPE); LiquidCrystal_I2C lcd(I2Cpin,ADRw Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin t1,t2);

void setup() ( Serial.begin(9600); lcd.begin(16,2); //<<-- our LCD is a 20x4, change for your LCD if needed // LCD Backlight ON lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home on LCD lcd.print("Weather Station"); delay(5000); dht.begin(); pressure.begin(); } void loop() { char status; double T,P,p0,a; status = pressure.startTemperature(); if (status != 0) { delay(status);

status = pressure.getTemperature(T);

if (stav != 0) ( Serial.print("1"); lcd.clear(); lcd.setCursor(0,0); lcd.print("Baro Temperature: "); lcd.setCursor(0,1 lcd.print(T,2);

stav = tlak.startPressure(3);

if (stav != 0) ( // Čekání na dokončení měření: delay(status);

a = tlak.nadska(P,p0);

lcd.clear();

lcd.setCursor(0,0);



lcd.print("Nadmorska vyska: ");

  • lcd.setCursor(0,1);
  • lcd.print(a,0);

lcd.print("metry");

  • zpoždění(3000);
  • ) ) ) ) float h = dht.readHumidity();
  • // Přečte teplotu jako Celsia (výchozí) float t = dht.readTemperature();

t2=t;


lcd.clear();


lcd.setCursor(0,0); // přejděte na začátek 2. řádku lcd.print("Vlhkost: ");

lcd.setCursor(0,1);lcd.print(h);

lcd.print(" %");


zpoždění(3000);

  • lcd.clear();
  • lcd.setCursor(0,0); // přejděte na začátek 2. řádku lcd.print("DHT Tempurature: ");

lcd.setCursor(0,1);


lcd.print(t);

  • lcd.print(" stupeň C ");
  • zpoždění(3000);

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


Centrální jednotka bude napájena ze sítě 220 V přes malý napájecí zdroj poskytující výkon 12 V, 450 mA, 5 W. Takhle za 5 dolarů. K dispozici je také samostatný 5V pin.



A pokud to nestačí, můžete nainstalovat něco výkonnějšího. 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 také bych nechtěl přijít o funkčnost.


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


A pamatuj maximální kapacita moderní baterie přibližně 2500-2700mAh, cokoliv navíc je buď marketingový trik (Ansmann 2850) nebo podvod (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é, se vyrábějí bez ochrany a jsou nebezpečné (při zkratu nebo vybití mohou explodovat a shořet, viz hromada videí na YouTube)
  • stárnou, i když se nepoužívají (to se však dá ří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 meteorologické stanice

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



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

Štítky: Přidat štítky

pohledy