Domáca meteostanica na Arduine a odosielanie údajov do „People's Monitoring“. Meteorologická stanica na NodeMcu. Verejné monitorovanie Prijímanie údajov odoslaných z „Port Monitor“ do Arduina

Ide o spoločný projekt. Odkazy na kanály, webovú stránku a archív autorov budú na konci popisu. Vytvára sa blokový riadiaci systém pre veternú a solárnu elektráreň. Máme dve letné chaty s alternatívnym zásobovaním energiou. V jednej oblasti je externá elektrina, v druhej je jej úplná absencia. Lokality sa nachádzajú v rôznych regiónoch Ruska. Na prvom mieste je domáci veterný generátor s výkonom 1 kW, 6 stacionárnych solárnych panelov, každý 100 W, zapojených do série, dva kusy na 24 V a 6 domácich panelov, tiež zapojených na 24 voltov, inštalovaných na solárny sledovač. Na druhom mieste sú 4 napevno inštalované panely po 100 W a 2 domáce panely po 60 W, tiež pripojené k 24 voltovému systému. Projekt umožní pripojenie 12 voltových aj 24 voltových systémov bez mechanických zmien. Systém pozostáva z piatich nezávislých blokov. Komunikácia medzi jednotkami prebieha cez rádiový kanál cez moduly NRF24L01 (s externou anténou).

  1. Modul "Riadiaca jednotka" na základe ARDUINO MEGA2560— zhromažďuje všetky informácie a zobrazuje ich na LCD displeji IIC/I2C 2004 4H20, ovládať bloky, zariadenia a zadávať rôzne nastavenia pomocou 4X4 maticová klávesnica. Teplota, vlhkosť, tlak (snímač tlaku bmp180), dátum, čas (hodiny DS3231). Všetky informácie o nastavení sa zadávajú cez menu a ukladajú sa do EEPROM. Po nastavení všetkých potrebných korekčných faktorov v režime ladenia sú tieto údaje odoslané rádiovým kanálom do jeho blokov, čo umožňuje doladiť všetky údaje. (Blok sa ďalej rozvíja).
  2. Modul "Wattmetrový blok" založený na ARDUINO NANO spolu s napájacou jednotkou - meria a vypočítava prichádzajúce a odchádzajúce prúdy a napätia pomocou meracej lišty s nainštalovanými prúdovými snímačmi ACS712 30A a ACS754SCU 100A, ADS1015 12-bitový ADC, odporové rozdeľovače napätia. Okrem toho reguluje napätie generované veterným generátorom nastaveným v parametroch pomocou balastovej záťaže, ohrieva vodu s ochranou proti varu na základe utesneného snímača DS18B20. Vypne menič, keď sú batérie vybité pod % nastavenú v parametroch. Obsahuje chladiaci systém pre trojfázový diódový mostík.(Snímač DS18B20).
  3. Modul "Blok veterného generátora" založený na ARDUINO NANO— Pozostáva z dvoch blokov:
  • „Jednotka generátora vetra“ priamo meria a prenáša: rýchlosť generátora (Hallov senzor), teplotu vinutia generátora, teplotu a vlhkosť priestoru generátora ( DS18B20 a DHT22), určenie dňa a noci ( fotoodpory). Poloha chvosta veternej turbíny. A tiež z bezpečnostných dôvodov trojlúčový LED maják (stožiar veterného generátora vysoký 17 m).
  • „blok anemometra“ - meranie rýchlosti vetra (Hallov senzor), ukazovateľ smeru vetra (Hallove senzory, digitálny expandér portov IIC I2C MCP23017).

4. Modul „WEB server“ založený na ARDUINO MEGA 2560 a internetovým štítom W5100 Ethernet— zobrazuje všetky informácie o elektrárni na webovej stránke pre možnosť vzdialeného monitorovania hodnôt.

5. Modul “Solar Tracker” - kontrola polohy solárnych panelov na slnku a v čase, ak nie sú, ovládanie pomocou IR diaľkového ovládača, automatický návrat trackera do polohy na východ po zotmení. Nastavenie trackera do polohy „ochrana pred vetrom“ v prípade, že rýchlosť vetra prekročí nastavenú hodnotu. Ovládanie pohonu trackeru. Jednotka vlastne funguje už rok. Zatiaľ nie je v archíve, pretože... Implementuje sa do všeobecného blokového diagramu.

Projekt začal používať monitor NEXTION (skvelá vec, určite ho niekde využijeme), ale potom sme od toho upustili, kvôli veľkým oneskoreniam kvôli objemu prenášaných informácií a rozhodnutiu urobiť systém modulárny.

Všetky ARDUINO NANO sú tiež flashované cez WiFi pomocou ESP8266-01. Ide o aktualizáciu firmvéru v prípade opravy náčrtu bez odstránenia blokov z ich inštalačných miest. S MEGA2560 je stále problém, poznáme príčinu, ale zatiaľ ju nevieme vyriešiť. Ale to je iný príbeh.

Náčrty vo formáte FLProg, dosky plošných spojov vo formáte Sprint-Layout v pravidelne aktualizovanom

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

Než prejdeme 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 je na mieste pre prípad núdze. Ako ukazuje prax, ENC28J60 nezvláda viac ako (pokiaľ zlyhá pamäť) 4 súčasné pripojenia. Vzhľadom na to, koľko servisných pripojení sa neustále vyskytuje na udržanie prevádzky samotnej siete a práve opustila prevádzka vytvorená všetkými druhmi domácich hračiek (napr. moderné televízory, skenovanie dostupných hostiteľov v sieti a ich otvorených portov) dizajn jednoducho prejde do stuporov. ENC28J60 nemôže pracovať samostatne sieťové protokoly 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 chybné), ale dlho som nedokázal dosiahnuť stabilnú prevádzku. Maximálne obdobie bolo asi 3-4 týždne.
Preto sa tam „pes“ točí a ak sa niečo stane, stiahne ovládač. Po tomto problém zmizol.
Tiež nepopieram, že je to možné v mojom domácej siete existujú určité nuansy alebo problémy. Ale keďže som mal problém ja, môže ho mať aj iná osoba. Zatiaľ som našiel len toto riešenie.
Pokiaľ viem, čipy od Wiznet (W5100 a vyššie) to nemajú, alebo jednoducho nevyzerali dosť dobre.

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!

V tejto verzii (nazvime ju druhá) schopnosť prenášať údaje zo senzorov cez bezdrôtová komunikácia pomocou frekvencie 433 MHz. Samotné moduly som prevzal od Číňanov, značenie XY-MK-5V. Chcel by som poznamenať, že kvalita prenosu má ďaleko od dokonalosti. Možná strata signálu, šum, nemožnosť súčasného prenosu atď., atď. Ale ich cena (menej ako 1 dolár za sadu) kompenzuje tieto nedostatky. Poviem vám tajomstvo, že tieto (najlacnejšie) moduly nájdete v mnohých značkových meteorologických staniciach 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ť. Opíšem len dodatočne zapojené kontakty na moduly XY-MK-5V.

Vysielací modul využíva energiu 5V, GND(kde by sme boli 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); char server = "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; 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; void setup() ( // Inicializácia časovača Watchdog wdt_disable(); delay(8000); wdt_enable(WDTO_8S); // Inicializácia konzoly Serial.begin(9600); // Inicializácia senzora DHT dht.begin(); / / Inicializácia 433 MHz modulu ET.begin(details(broadcast)); vw_set_ptt_inverted(true); vw_set_tx_pin(2); vw_setup(2000); // Spustenie siete, ak sme nečakali na dáta z DHCP servera, potom // si sami priradíme adresu if (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip); // Inicializuje sa 1-Wire Wire.begin(); delay(200); // Inicializuje sa 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 double dewPoint(double celsius , double vlhkosti) ( // (1) Saturation Vapor Pressure = ESGG(T) double RATIO = 373,15 / (273,15 + celsius); 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) ( // Snažíme sa čítať údaje 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 počas zimnej sezóny nezavádzalo. // 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ý dlhý 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 – lokálnej bezdrôtovej stanici

Na jeho realizá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č Ú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; int veľkosť; // 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; Informácie o reťazci; TFT TFTscreen = TFT(cs, dc, rst); void setup())( Serial.begin(9600); // Inicializácia 433 MHz modulu ET.begin(podrobnosti(vysielanie)); vw_set_ptt_inverted(true); vw_set_rx_pin(7); vw_setup(2000); vw_rx_start(); // Inicializácia a počiatočné 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 ; broadcast .dewPoint = 0; TFTPrint(); ) void loop())( if(ET.receiveData())( if(broadcast.ID == 1) TFTPrint(); /* Serial.println(broadcast.Temperature) ; Serial. println(vysielanie.Tlak); 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(vysielať. Teplota != 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(Temperature, info.length()+1); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Teplota, x_center(w, info.length()+1, size), 35); / / Zobraziť informácie o nových údajoch = String(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); // Červené b = map(broadcast.Temperature, 0, 40, 30, 0); // Zmena odtieň pre vizuálnejší prechod cez nulu ) else ( r = mapa(vysielanie.Temperature, -40, 0, 0, 30); // Zmena odtieňa pre vizuálnejší prechod cez nulu b = mapa(vysielanie.Teplota, - 40, 0, 150, 255); // Modrá ) TFTscreen.stroke(b, g, r); // POZOR: farebné pozície v knižnici sú pomiešané, miesto RGB používa BGR! TFTscreen.text(Teplota, x_center(š, info.dĺžka()+1, veľkosť), 35); ) veľkosť = 1; // ================================================= ==== ===================================== // Údaje o výstupnom tlaku // === ====== ============================================= ========= ======================= if(vysielanie.Pressure != Log_Pressure) ( TFTscreen.setTextSize(size); / / Prepísať zastarané údaje 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 hodnôt info = String(vysielanie.Tlak); info.toCharArray(Tlak, 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); zmeny (10, 106, 85, nepravda, pravda); ) // ======================= ======== =========================================== =========== = // Odčítanie výstupnej vlhkosti // =============================== ==================================================== ================== if(vysielanie.Humidity != Log_Humidity) ( TFTscreen.setTextSize(size); // Prepíše neaktuálne ú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); // Zobrazenie 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); ) // ================== ==================================================== === ============== // Výstup hodnôt rosného bodu/bodu mrazu // ====================== ==================================================== if(broadcast.dewPoint ! = Log_dewPoint) ( TFTscreen.setTextSize(size); // Prepísať zastarané údaje info = 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); // Výstup 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 pre ďalšie porovnanie nameraných hodnôt 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 rada mojich súdruhov) - „chuť a farba, ani manželka nie je priateľka“. Vypočul som si veľa rád a návrhov, ale navzájom si odporujú. Preto si to urobte podľa svojho gusta.

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

Skrytý text

Niektoré údaje sú vyrobené tak, aby odrážali niektoré prvky dizajnu.

Artefakty na displeji sú prach a iné nečistoty, ktoré sa nahromadili počas dlhej doby, kedy bol displej v... niekde tam,... no, tam, už si nepamätám, odkiaľ som to vzal! Nechaj 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 rozmery daný text, na základe výrazu 1 veľkosť = 1PX x 1PX segment písma.

Displej zobrazuje aj prvky zodpovedajúce zvýšeniu alebo zníženiu konkrétnej hodnoty odčítania. Sú zobrazené vo forme trojuholníkov. Ale v kóde funkcie zmeny K dispozícii je alternatívne zobrazenie v podobe trojuholníkov otočených o 45 stupňov. Ak sa hodnoty zvýšia, prvok je červený, v opačnom prípade 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, Objekty 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. To je to, čo po určitom čase urobíme.

Dobrý deň, čitatelia a tí, ktorí sem práve prišli. Som odberateľom kanála YouTube AlexGyver a pozrieť si video o „Monitorovaní hardvéru PC“,

Tento domáci produkt som sa rozhodla zopakovať, pretože... Zdalo sa mi to celkom zaujímavé a vždy som chcel zobraziť stav systému hardvérovým spôsobom, na ďalšej obrazovke a nie na monitore počítača. Urobiť z počítača vianočný stromček Nechcel som, a tak som sa rozhodol neinštalovať podsvietenie RGB a tiež som sa rozhodol odmietnuť domáci reobass, pretože moja matka Gigabyte dokonale vie, ako ovládať rýchlosť ventilátora bez akýchkoľvek sprostredkovateľov pomocou BOIS.

Vybral som a objednal najlacnejšie komponenty, ktoré ponúka autor:

  1. ATmega 328 https://goo.gl/DkWhmU
  2. Prepojovacie káble https://goo.gl/NHmQqs
  3. Obrazovka pre 4 riadky 20 znakov https://goo.gl/4MAowg

Objednal som to všetko u jedného predajcu, aby to prišlo spolu, v jednom balíku. A malý životný hack: ak všetko vložíte do košíka od jedného predajcu, ktorý má poštovné, a potom zaplatíte raz, tak vám bude poštovné účtované raz. (A nie pre každý z 3 produktov).

4. Neobjednal som si mini USB kábel a prispájkoval som ho priamo na Arduino a pripojil ho drôtmi (od bodu 2) k internému USB konektoru. Nemusíte sa však báť a objednajte si https://goo.gl/LA7sb3 je to jednoduchšie

A začal čakať. Všetko prišlo veľmi rýchlo, za 15 dní. V obvode je aj tlačidlo, ktoré po zatvorení prepína obrazovky s informáciami o stave systému. Najprv som zobral toto:

ale nápad sa ukázal ako nie veľmi dobrý, pretože... nebolo nič, čo by ho pripevnilo k prednému panelu počítača. Preto sa v miestnom obchode s rádiovou elektronikou vybralo tlačidlo bez aretácie s pohodlným pripevnením k puzdru, ako aj prepínač na vypnutie tohto „zázraku“ v noci. Pretože všetko pripojené k portu USB môjho počítača je neustále napájané a má tendenciu svietiť a blikať, pričom sa vypne iba odpojením počítača zo zásuvky.

Vo všeobecnosti som strávil niekoľko hodín montážou tohto zázraku technický pokrok, vyrezanie miesta pre obrazovku v prednom kryte počítača a vyvŕtanie otvorov pre tlačidlo a prepínač. Ďalej pre plnohodnotnú prácu, to všetko bolo treba prispájkovať podľa obvodu a spustiť rezidentný program na monitorovanie zdrojov počítača. Tu je to, čo sa stalo:

No dopadlo to celkom dobre, skoro ako som chcel. Zostáva odstrániť drobné problémy v softvéri, ktorý prenáša teploty. Z nejakého dôvodu sa prenášajú na maximum: senzorová rohož. CPU, GPU, dosky základnej dosky, ktoré vám bránia monitorovať počítač v pokojnom stave, keď teploty v nečinnosti nie sú vysoké.

Ak si niekto nedokáže stiahnuť zdrojový kód z webovej stránky AlexGyver, tu je opätovné nahranie na moju webovú stránku: .

Po prehrabaní programu som našiel veľa vecí, ktoré mi nevyhovovali a celkovo nefungovali správne. Po pár večeroch som s pomocou priateľov trochu prišiel na kód náčrtu na Arduine a kód OpenHardwareMonitor, ktorý v skutočnosti prenáša výstupné parametre na obrazovku. A urobil zmeny, ktoré ma uspokojili.

Zmeny v programe OpenHardwareMonitor:

  • ako sa teraz teplota CPU neprenáša teplota najhorúcejšieho jadra, ale teplota snímača CPU od matky;
  • ako sa teplota GPU teraz prenáša nie maximálna teplota medzi základnou doskou a GPU, ale teplota GPU zo snímača grafickej karty;
  • Ako sa teraz prenáša teplota základnej dosky, nie je maximálna teplota medzi: základná doska, snímač teploty GPU a CPU od matky a teplota základnej dosky zo snímača;
  • V hodnotách 12 a 13 z OpenHardwareMonitor sa teraz prenáša rýchlosť ventilátora CPU a základnej dosky namiesto príznakov manuálneho ovládania pre ventilátory a podsvietenie.

Zmeny v náčrte pre Arduino:

  • Odstránené sledovanie stlačenia druhého tlačidla, ktoré zmenilo obrazovky v opačnom poradí;
  • Na druhej obrazovke je vymenený informačný výstup, teraz namiesto teploty 2 externých snímačov teploty (TMP1, TMP2) zobrazujem rýchlosť otáčania ventilátora CPU (FanC) a základnej dosky (FanM).
  • Sledovanie pre manuálne ovládanie ventilátorov a osvetlenia bolo odstránené.

Archív so všetkými zmenami a zdrojmi si môžete stiahnuť tu (Ako sme empiricky zistili, zmeny v OpenHardwareMonitor fungujú dobre na základných doskách Gigabyte, ako je ten môj, a s najväčšou pravdepodobnosťou budú chyby aj na základných doskách iných výrobcov).

Zima a mačky všetkým!

Veľa šťastia pri experimentovaní!

Naša organizácia nasadila server Zabbix na monitorovanie výkonu serverov a pracovných staníc. Vzhľadom na zvláštnosti technického procesu je zariadenie „rozmiestnené“ v niekoľkých miestnostiach a rozmiestnené po celom podniku. Samozrejme, popri základných parametroch počítačov (funguje/nefunguje) chcem ovládať aj mikroklímu v serverovniach. Zároveň sú ako obvykle veľmi obmedzené možnosti a „hľadanie“ značných finančných prostriedkov na komplexné systémy monitorovania teplôt (zahŕňam riadiace dosky s teplotnými snímačmi pre rackové UPS APC) je samostatnou úlohou.

V hlavnej serverovni je všetko jednoduché - nainštaluje sa jedna takáto doska (predchodca ju už dávno zakúpil spolu s hlavným zariadením), zapojí sa teplotný senzor APC, vytvorí sa agent v Zabbix, všetko funguje cez SNMP . Nuda :) Chýba vybavenie na monitorovanie vzdialeného hardvéru, ani finančné prostriedky - viď vyššie. Preto bolo rozhodnuté byť šikovný, šetriť rozpočet a zároveň rozvíjať novú zručnosť vytvorením jednoduchého a lacného „nárazového“ riešenia, ktoré však zapadá do existujúcej monitorovacej infraštruktúry Zabbix.

Požadované komponenty:

  • Základom systému je Arduino Nano V3
  • Modul lokálnej siete (ethernet-shield)
  • A v skutočnosti digitálny snímač teploty založený na DS18B20
Celková cena komponentov je 10 USD vrátane dopravy.

Zostavenie zariadenia nie je ťažké. Sieťový modul je umiestnený na základnej doske ako „sendvič“, na jeho kolíky je prispájkovaný tepelný senzor. Pripojenie snímača: červená +5 V, čierna - zem, žltá - dáta; Medzi +5V a Data pripájame 4,7 kOhm pull-up odpor.

Dátový kolík sa vyberá na základe použitých kolíkov sieťový modul(D10 – SS; D11 – MOSI; D12 – MISO; D13 – SCK; D2 – IRQ).

Hrable: v prototype zariadenia som sa stretol s konfliktom - údaje o teplote boli vydávané náhodne, „každé dva až tri“. Dôvodom sa ukázalo, že som na pin 2 pripojil teplotný senzor, ktorý, ako som neskôr našiel na internete, používa sieťový modul na generovanie prerušenia pri príchode paketu. Presunul som to na 4. - fungovalo to ako hodinky.

Po zložení hardvéru prejdeme k softvéru.

Zariadenie bude fungovať v sieti a bude predstierať, že je agentom Zabbix, na to potrebuje MAC a IP adresu. Rozhodneme sa, čo je pohodlnejšie - pri programovaní ho napevno prepojiť, vygenerovať MAC z adresy teplotného senzora a získať IP cez DHCP atď. Vybral som si najjednoduchšiu cestu a pevne som zakódoval oba parametre.

Výmenný protokol so serverom Zabbix je popísaný v dokumentácii. Naše zariadenie bude reagovať na dva príkazy - agent.ping A env.tepl(je tu priestor pre ďalšiu kreativitu; môžete pripojiť ktorýkoľvek z rozširujúcich modulov dostupných pre Arduino - dokonca aj snímač vlhkosti, dokonca aj svetelný snímač - čokoľvek, po čom vaše srdce túži). Na všetky ostatné príkazy bude reagovať štandardnou odpoveďou, ktorá je zrozumiteľná pre server Zabbix.

Pre tých, ktorí začínajú od nuly (ako ja), programovanie Arduina prebieha pomocou Arduino IDE, ktorého inštalácia a konfigurácia je jednoduchá. Na fungovanie komponentov sú potrebné knižnice UIPEthernet a OneWire, ktoré sa inštalujú a pripájajú k projektu cez menu Náčrt - Pripojiť knižnicu - Spravovať knižnice...
Ak máte iné komponenty (napríklad sieťový modul nie na enc28j60, ale na inom čipe), budete potrebovať iné knižnice!

Kód pre prácu so sieťovým modulom a snímačom teploty je typický z internetu s určitými predpokladmi a zjednodušeniami.

Po nahraní kódu do ovládača a pripojení ethernetového kábla skontrolujeme z konzoly:

$ 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: skompilovaná verzia zabbix_get pre Windows uverejnená na zabbix.com je zastaraná a používa iný protokol (s hlavičkou ZBXD\x01 v požiadavke servera). Verzia pre Linux je aktuálna a protokol zodpovedá danému kódu.

Všetko funguje ako má. V administračnom paneli Zabbix vytvoríme nového hostiteľa s vybranou IP, obsahuje dva kľúče, Numeric (nepodpísaný) agent.ping a Numeric (float) env.temp a užite si prácu. Grafy, spúšťače - všetko je ako obvykle.

Zariadenie je napájané cez natívne USB. Puzdro - voliteľné: vhodná plastová krabička, zmršťovacia, modrá elektrická páska.

Rozlíšenie snímača je približne 0,06 (presnejšie 1/16) °C, presnosť - pri ponorení do topiaceho sa snehu ukazoval 0,19 °C (možno by klesol nižšie, ale snehu bolo málo a celý sa roztopil rýchlo). Myslím, že je to viac než dosť na zariadenie, ktoré stojí 10 dolárov a na opísané účely.

Skica

#include #include byte mac = ( 0xDE, 0x05, 0xB6, 0x27, 0x39, 0x19); // náhodný MAC byte ip = ( 192, 168, 4, 5 ); // IP adresa v lokálnej sieti String readString = String(20); byte addr; OneWire ds(4); // DS18B20 na pine 4 EthernetServer server(10050); // Zabbix port void setup() ( Ethernet.begin(mac, ip); server.begin(); ds.search(addr); ) void loop() ( byte data; float celsius; readString = ""; if ( EthernetClient klient = server.available()) ( while (client.connected()) ( if (client.available()) ( char c = client.read(); if (c == "\n") // koniec dotazu zo servera zabbix ( client.print("ZBXD\x01"); // hlavička odpovede 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) ; // spustenie konverzie s bežným (neparazitným!) oneskorením napájania (1000); ds.reset(); ds.select(addr); ds.write(0xBE); // čítanie údajov aplikácie Scratchpad = ds.read() ; data = ds.read(); int16_t raw = (údaje<< 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(); } }