Domácí meteostanice na Arduinu a odesílání dat do "People's Monitoring". Meteorologická stanice na NodeMcu. Veřejné monitorování Příjem dat odeslaných z „Port Monitor“ do Arduina

Jedná se o společný projekt. Odkazy na kanály, webové stránky a archiv autorů budou na konci popisu. Vzniká blokový řídicí systém pro větrnou a solární elektrárnu. Máme dvě letní chaty s alternativním zásobováním energií. V jedné oblasti je externí elektřina, ve druhé zcela chybí. Místa se nacházejí v různých regionech Ruska. Na prvním místě je domácí větrný generátor o výkonu 1 kW, 6 stacionárních solárních panelů, každý 100 W, zapojených do série, dva kusy na 24 V, a 6 podomácku vyrobených panelů, také zapojených na 24 V, instalovaných na solární sledovač. Na druhém místě jsou 4 pevně instalované panely po 100 W a 2 domácí panely po 60 W, také připojené k 24V systému. Projekt umožní připojení 12V i 24V systémů bez mechanických změn. Systém se skládá z pěti nezávislých bloků. Komunikace mezi jednotkami probíhá rádiovým kanálem přes moduly NRF24L01 (s externí anténou).

  1. Modul "Řídící jednotka" na základě ARDUINO MEGA2560— shromažďuje všechny informace a zobrazuje je na LCD displeji IIC/I2C 2004 4H20, ovládat bloky, zařízení a zadávat různá nastavení pomocí maticová klávesnice 4x4. Teplota, vlhkost, tlak (snímač tlaku bmp180), datum, čas (hodiny DS3231). Veškeré informace o nastavení se zadávají prostřednictvím nabídky a ukládají se do EEPROM. Po nastavení všech nezbytných korekčních faktorů v režimu ladění jsou tato data odeslána rádiovým kanálem do jeho bloků, což umožňuje doladit všechna data. (Blok se dále vyvíjí).
  2. Modul "Wattmetrový blok" na základě ARDUINO NANO spolu s pohonnou jednotkou - měří a vypočítává příchozí a odchozí proudy a napětí pomocí měřicí lišty s nainstalovanými proudovými senzory ACS712 30A a ACS754SCU 100A, ADS1015 12bitový ADC, odporové děliče napětí. Navíc reguluje napětí generované větrným generátorem nastaveným v parametrech pomocí balastní zátěže, ohřívá vodu s ochranou proti varu na základě utěsněného senzoru DS18B20. Vypne střídač, když jsou baterie vybité pod % nastavenou v parametrech. Obsahuje chladicí systém pro třífázový diodový můstek (Sensor DS18B20).
  3. Modul "Blok větrného generátoru" na základě ARDUINO NANO— Skládá se ze dvou bloků:
  • „Jednotka větrného generátoru“ přímo měří a přenáší: otáčky generátoru (Hallovo čidlo), teplotu vinutí generátoru, teplotu a vlhkost prostoru generátoru ( DS18B20 a DHT22), určení dne a noci ( fotoodpory). Poloha ocasu větrné turbíny. A také z bezpečnostních důvodů třípaprskový LED maják (stožár větrného generátoru vysoký 17 m).
  • "Anemometer block" - měření rychlosti větru (Hallův senzor), ukazatel směru větru (Hallovy senzory, digitální expandér portů IIC I2C MCP23017).

4. Modul „WEB server“ založený na ARDUINO MEGA 2560 a internetový štít W5100 Ethernet— zobrazuje všechny informace o elektrárně na webu pro možnost vzdáleného sledování odečtů.

5. Modul „Solar Tracker“ - kontrola polohy solárních panelů na slunci a v čase, pokud žádné nejsou, ovládání pomocí IR dálkového ovladače, automatický návrat trackeru po setmění do polohy na východ. Nastavení trackeru do polohy „ochrana proti větru“ v případě, že rychlost větru překročí nastavenou hodnotu. Ovládání pohonu trackeru. Jednotka skutečně funguje již rok. Zatím není v archivu, protože... Je implementován do obecného blokového diagramu.

Projekt začal používat monitor NEXTION (úžasná věc, určitě ho někde využijeme), ale pak jsme od toho upustili, kvůli velkým zpožděním kvůli objemu přenášených informací a rozhodnutí udělat systém modulární.

Všechny ARDUINO NANO jsou také flashovány přes WiFi pomocí ESP8266-01. Jedná se o aktualizaci firmwaru v případě opravy náčrtu bez odstranění bloků z jejich instalačních míst. S MEGA2560 je stále problém, známe důvod, ale zatím ho neumíme vyřešit. Ale to je jiný příběh.

Skici ve formátu FLProg, desky plošných spojů ve formátu Sprint-Layout v pravidelně aktualizovaném

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 právě opustil provoz vytvořený všemi druhy domácích hraček (např. moderní televizory, skenování dostupných hostitelů v síti a jejich otevřených portů) se design jednoduše zhroutí. ENC28J60 nemůže pracovat samostatně síťových protokolů 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.
Také nepopírám, že je to možné v mém domácí síť existují 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 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 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 přenášet hodnoty ze senzorů přes bezdrátová komunikace 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 najdete v mnoha značkových meteostanicích 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 modulu 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, potom // si sami 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 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) Saturation Vapor Pressure = ESGG(T) double RATIO = 373,15 / (273,15 + celsius); 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) ( // Snažíme se číst data 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 snímače 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čí 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; 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; Informace o řetězcích; TFT TFTscreen = TFT(cs, dc, rst); void setup())( Serial.begin(9600); // Inicializace modulu 433 MHz 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. Přijďte nás navštívit TFTscreen.stroke(255, 255 , 255); TFTscreen.setTextSize(1); TFTscreen.text(" ", 10, 10); // 2. Popis údajů 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 ; broadcast .dewPoint = 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 up, 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(vysílání. Teplota != 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(Temperature, info.length()+1); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Teplota, x_center(w, info.length()+1, size), 35); / / Zobrazit informace o nových hodnotách = String(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); // Červené b = mapa(broadcast.Temperature, 0, 40, 30, 0); // Změňte odstín pro vizuálnější přechod přes nulu ) else ( r = map(broadcast.Temperature, -40, 0, 0, 30); // Změňte odstín pro vizuálnější přechod přes nulu b = map(broadcast.Temperature, - 40, 0, 150, 255); // Modrá ) TFTscreen.stroke(b, g, r); // POZOR: barevné pozice v knihovně jsou pomíchané, místo RGB používá BGR! TFTscreen.text(Teplota, x_center(š, info.délka()+1, velikost), 35); ) velikost = 1; // ================================================== ==== ===================================== // Odečet výstupního tlaku // === ====== ============================================== ========= ======================= if(broadcast.Pressure != Log_Pressure) ( TFTscreen.setTextSize(size); / / Přepsat zastaralá data info = 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, pravda, pravda); změny(10, 106, 85, nepravda, pravda); ) // ======================= ======== ============================================ =========== = // Odečty 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); // Zobrazení 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); ) // ================== ==================================================== === ============== // Výstup hodnot rosného bodu/bodu mrazu // ====================== ===================================================== if(broadcast.dewPoint ! = 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); 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 pro další porovnání naměřených hodnot 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 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á zabírá 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í ve vztahu k rozměrům daný text, 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 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, 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.

Hezký den, čtenáři a ti, kteří sem právě přišli. Jsem odběratelem kanálu YouTube AlexGyver a podívejte se na video o „Monitorování hardwaru PC“,

Rozhodla jsem se tento domácí produkt zopakovat, protože... Přišlo mi to docela zajímavé a vždy jsem chtěl zobrazovat stav systému hardwarovým způsobem, na další obrazovce a ne na monitoru počítače. Vytvořit z počítače vánoční strom Nechtěl jsem, a tak jsem se rozhodl neinstalovat podsvícení RGB a také jsem se rozhodl odmítnout domácí reobass, protože moje matka Gigabyte dokonale ví, jak ovládat rychlost ventilátoru bez jakýchkoliv prostředníků pomocí BOIS.

Vybral jsem a objednal nejlevnější komponenty, které autor nabízí:

  1. ATmega 328 https://goo.gl/DkWhmU
  2. Propojovací vodiče https://goo.gl/NHmQqs
  3. Obrazovka pro 4 řádky 20 znaků https://goo.gl/4MAowg

To vše jsem objednal u jednoho prodejce, aby to dorazilo pohromadě, v jednom balíku. A malý life hack: pokud vše vložíte do košíku od jednoho prodejce, který má poštovné, a poté zaplatíte jednou, tak bude poštovné účtováno jednorázově. (A ne pro každý ze 3 produktů).

4. Neobjednal jsem si mini USB kabel a připájel jej přímo k Arduinu a připojil dráty (od bodu 2) k internímu USB konektoru. Ale nemusíte se bát a objednejte https://goo.gl/LA7sb3 je to jednodušší

A začal čekat. Vše dorazilo celkem rychle, za 15 dní. V obvodu je také tlačítko, které při zavření přepíná obrazovky s informacemi o stavu systému. Nejprve jsem vzal tento:

ale nápad se ukázal jako nepříliš dobrý, protože... nebylo nic, co by jej připevnilo k přednímu panelu počítače. Proto bylo v místním obchodě s rádiovou elektronikou vybráno tlačítko bez aretace s pohodlným připevněním k pouzdru a také přepínač pro vypnutí tohoto „zázraku“ v noci. Protože vše, co je připojeno k portu USB mého počítače, je neustále napájeno a má tendenci svítit a blikat, přičemž se vypne pouze odpojením počítače ze zásuvky.

Obecně jsem strávil několik hodin montáží tohoto zázraku technický pokrok, vyříznutím místa pro obrazovku v předním krytu počítače a vyvrtáním otvorů pro tlačítko a přepínač. Další, pro plnohodnotnou práci, to vše muselo být připájeno podle obvodu a musel být spuštěn rezidentní program pro sledování zdrojů počítače. Co se stalo:

No, dopadlo to docela dobře, skoro jak jsem chtěl. Zbývá odstranit drobné problémy v softwaru, který přenáší teploty. Z nějakého důvodu jsou přenášeny na maximum: senzor mat. CPU, GPU, desky základní desky, které vám zabrání monitorovat počítač v klidném stavu, kdy teploty v nečinnosti nejsou vysoké.

Pokud někdo nemůže stáhnout zdrojový kód z webové stránky AlexGyver, zde je opětovné nahrání na můj web: .

Když jsem se prohrabal programem, našel jsem spoustu věcí, které mi nevyhovovaly a celkově nefungovaly správně. Po pár večerech jsem s pomocí přátel trochu přišel na to, jak kód náčrtu na Arduinu, tak kód OpenHardwareMonitor, který vlastně přenáší výstupní parametry na obrazovku. A udělal změny, které mě uspokojily.

Změny v programu OpenHardwareMonitor:

  • jak se nyní teplota CPU přenáší ne teplota nejžhavějšího jádra, ale teplota senzoru CPU od matky;
  • jak se nyní teplota GPU přenáší nikoli maximální teplota mezi základní deskou a GPU, ale teplota GPU ze snímače grafické karty;
  • Jak se nyní přenáší teplota základní desky, není maximální teplota mezi: základní deska, teplotní senzor GPU a CPU z matky a teplota základní desky ze senzoru;
  • V hodnotách 12 a 13 z OpenHardwareMonitor se nyní přenáší rychlost ventilátoru CPU a základní desky namísto příznaků ručního ovládání pro ventilátory a podsvícení.

Změny ve skice pro Arduino:

  • Odstraněno sledování stisknutí druhého tlačítka, které změnilo obrazovky v opačném pořadí;
  • Na druhé obrazovce je vyměněn informační výstup, nyní místo teploty 2 externích teplotních čidel (TMP1, TMP2) zobrazuji rychlost otáčení ventilátoru CPU (FanC) a základní desky (FanM).
  • Sledování pro ruční ovládání ventilátorů a osvětlení bylo odstraněno.

Archiv se všemi změnami a zdroji je ke stažení zde (Jak jsme empiricky zjistili, změny v OpenHardwareMonitor fungují dobře na základních deskách Gigabyte, jako je ten můj, a s největší pravděpodobností budou chyby na základních deskách jiných výrobců).

Zima a kočky všem!

Hodně štěstí při experimentování!

Naše organizace nasadila server Zabbix pro sledování výkonu serverů a pracovních stanic. Vzhledem ke zvláštnostem technického procesu je zařízení „rozloženo“ do několika místností a rozmístěno po celém podniku. Samozřejmě kromě základních parametrů počítačů (funguje/nefunguje) chci mít pod kontrolou i mikroklima v serverovnách. Možnosti jsou přitom jako obvykle velmi omezené a „shánění“ značných finančních prostředků na komplexní systémy sledování teploty (zahrnuji řídicí desky s teplotními senzory pro rackové UPS APC) je samostatným úkolem.

V hlavní serverovně je vše jednoduché - nainstaluje se jedna taková deska (koupená již dávno předchůdcem spolu s hlavním vybavením), zapojí se teplotní senzor APC, vytvoří se agent v Zabbix, vše funguje přes SNMP . Nuda :) Není zde žádné vybavení pro sledování vzdáleného hardwaru, ani finanční prostředky - viz výše. Proto bylo rozhodnuto být chytrý, ušetřit rozpočet a zároveň rozvinout novou dovednost vytvořením jednoduchého a levného „nárazového“ řešení, které přesto zapadá do stávající monitorovací infrastruktury Zabbix.

Požadované komponenty:

  • Základem systému je Arduino Nano V3
  • Modul místní sítě (ethernet-shield)
  • A ve skutečnosti digitální teplotní senzor založený na DS18B20
Celková cena komponent je 10 USD včetně dopravy.

Sestavení zařízení není obtížné. Síťový modul je umístěn na základní desce jako „sendvič“, k jeho pinům je připájen teplotní senzor. Připojení snímače: červená +5 V, černá - zem, žlutá - data; Mezi +5V a Data připájeme 4,7kOhm pull-up rezistor.

Datový kolík se vybírá na základě použitých kolíků síťový modul(D10 – SS; D11 – MOSI; D12 – MISO; D13 – SCK; D2 – IRQ).

Rake: u prototypu zařízení jsem narazil na konflikt - údaje o teplotě byly vydávány náhodně, „každé dva až tři“. Důvodem se ukázalo, že jsem na pin 2 připojil teplotní čidlo, které, jak jsem později našel na internetu, používá síťový modul ke generování přerušení při příchodu paketu. Přesunul jsem to na 4. - fungovalo to jako hodinky.

Po sestavení hardwaru přejdeme k softwaru.

Zařízení bude fungovat v síti a předstírat, že je agentem Zabbix, k tomu potřebuje MAC a IP adresu. Rozhodneme se, co je pohodlnější - při programování to napevno zapojit, vygenerovat MAC z adresy teplotního čidla a získat IP přes DHCP atd. Vybral jsem si nejjednodušší cestu a napevno zakódoval oba parametry.

Výměnný protokol se serverem Zabbix je popsán v dokumentaci. Naše zařízení bude reagovat na dva příkazy - agent.ping A env.tepl(zde je prostor pro další kreativitu; můžete připojit kterýkoli z rozšiřujících modulů dostupných pro Arduino – dokonce i senzor vlhkosti, dokonce i senzor světla – cokoliv, po čem vaše srdce touží). Na všechny ostatní příkazy bude reagovat standardní odpovědí, která je srozumitelná serveru Zabbix.

Pro ty, kteří začínají od nuly (jako já), se programování Arduina provádí pomocí Arduino IDE, jehož instalace a konfigurace je jednoduchá. Aby komponenty fungovaly, jsou nutné knihovny UIPEthernet a OneWire, které se nainstalují a připojí k projektu přes nabídku Skica - Připojit knihovnu - Spravovat knihovny...
Pokud máte další komponenty (například síťový modul ne na enc28j60, ale na jiném čipu), budete potřebovat další knihovny!

Kód pro práci se síťovým modulem a teplotním čidlem je typický z internetu s určitými předpoklady a zjednodušeními.

Po nahrání kódu do ovladače a připojení ethernetového kabelu z konzole zkontrolujeme:

$ zabbix_get -s 192.168.4.5 -k agent.ping 1 $ zabbix_get -s 192.168.4.5 -k env.temp 23,12 $ zabbix_get -s 192.168.4.5 -k bla-blah ZBX_NOTSUPPORTED
Rake: zkompilovaná verze zabbix_get pro Windows zveřejněná na zabbix.com je zastaralá a používá jiný protokol (s hlavičkou ZBXD\x01 v požadavku serveru). Verze pro Linux je aktuální a protokol odpovídá danému kódu.

Vše funguje jak má. V administračním panelu Zabbix vytvoříme nového hostitele s vybranou IP, obsahuje dva klíče, Numeric (nepodepsaný) agent.ping a Numeric (float) env.temp, a užijte si práci. Grafy, spouštěče – vše je jako obvykle.

Zařízení je napájeno přes nativní USB. Pouzdro - volitelné: vhodná plastová krabička, tepelně smrštitelná, modrá elektropáska.

Rozlišení snímače je přibližně 0,06 (přesněji 1/16) °C, přesnost - při ponoření do tajícího sněhu ukazoval 0,19 °C (možná by klesl níž, ale sněhu bylo málo a celý roztál rychle). Myslím, že je to více než dost pro zařízení, které stojí 10 $ a popsané účely.

Skica

#zahrnout #zahrnout byte mac = ( 0xDE, 0x05, 0xB6, 0x27, 0x39, 0x19); // náhodný MAC byte ip = ( 192, 168, 4, 5 ); // IP adresa v lokální síti String readString = String(20); byte addr; OneWire ds(4); // DS18B20 na pinu 4 EthernetServer server(10050); // Zabbix port void setup() ( Ethernet.begin(mac, ip); server.begin(); ds.search(addr); ) void loop() ( data byte; float celsius; readString = ""; if ( EthernetClient client = server.available()) ( while (client.connected()) ( if (client.available()) ( char c = client.read(); if (c == "\n") // konec dotazu ze serveru zabbix ( client.print("ZBXD\x01"); // hlavička odpovědi if (readString == "agent.ping") ( byte responseBytes = (0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, "1"); client.write(responseBytes, 9); ) else if (readString == "env.temp") ( ds.reset(); ds.select(addr); ds.write(0x44) ; // spusťte konverzi s běžným (neparazitním!) zpožděním napájení (1000); ds.reset(); ds.select(addr); ds.write(0xBE); // čtení dat ze zápisníku = ds.read() ; data = ds.read(); int16_t raw = (data<< 8) | data; celsius = (float)raw / 16.0; byte responseBytes = {(byte) String(celsius).length(), 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; client.write(responseBytes, 8); client.print(celsius); } else { byte responseBytes = {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; client.write(responseBytes, 8); client.print("ZBX_NOTSUPPORTED"); } break; } else if (readString.length() < 20) { readString = readString + c; } } } delay(10); client.stop(); } }