Kućna meteorološka stanica na Arduinu i slanje podataka u "People's Monitoring". Meteorološka stanica na NodeMcu. Javni nadzor Prijem podataka koji se šalju sa “Port Monitora” na Arduino

Ovo je zajednički projekat. Linkovi na kanale, web stranicu i arhivu autora bit će na kraju opisa. Izrađuje se blok sistem upravljanja za Vjetroelektranu. Posjedujemo dvije vikendice sa alternativnim napajanjem. U jednom dijelu postoji vanjska struja, u drugom je potpuno odsustvo. Lokacije se nalaze u različitim regionima Rusije. Na prvoj lokaciji nalazi se domaći vetrogenerator snage 1 kW, 6 stacionarnih solarnih panela, po 100 W, povezanih serijski, dva komada na 24 V, i 6 kućnih panela, takođe spojenih na 24 volta, ugrađenih na solarni tracker. Na drugoj lokaciji nalaze se 4 trajno postavljena panela od po 100 W i 2 panela domaće izrade od po 60 W, takođe spojeni na sistem od 24 volta. Projekat će omogućiti povezivanje sistema od 12 volti i od 24 volta bez mehaničkih promena. Sistem se sastoji od pet nezavisnih blokova. Komunikacija između jedinica se odvija preko radio kanala preko NRF24L01 modula (sa eksternom antenom).

  1. Modul "Upravljačka jedinica" zasnovan na ARDUINO MEGA2560— prikuplja sve informacije i prikazuje ih na LCD ekranu IIC/I2C 2004 4H20, upravljati blokovima, uređajima i unositi različita podešavanja koristeći 4X4 matrična tastatura. Temperatura, vlažnost, pritisak (senzor pritiska bmp180), datum, vrijeme (sati DS3231). Sve informacije o podešavanjima se unose kroz meni i spremaju u EEPROM. Nakon postavljanja svih potrebnih faktora korekcije u debug modu, ovi podaci se šalju preko radio kanala u njegove blokove, što vam omogućava fino podešavanje svih podataka. (Blok nastavlja da se razvija).
  2. Modul "Vatmetar blok" baziran na ARDUINO NANO zajedno sa jedinicom za napajanje - mjeri i izračunava ulazne i izlazne struje i napone koristeći mjernu šipku na kojoj su ugrađeni senzori struje ACS712 30A i ACS754SCU 100A, ADS1015 12-bitni ADC, otporni razdjelnici napona. Osim toga, reguliše napon koji generiše vjetrogenerator postavljen u parametrima koristeći balastno opterećenje, zagrijava vodu sa zaštitom od ključanja na temelju zatvorenog senzora DS18B20. Isključuje pretvarač kada se baterije isprazne ispod % podešenog u parametrima. Uključuje sistem hlađenja za trofazni diodni most.(Senzor DS18B20).
  3. Modul "Blok vjetrogeneratora" baziran na ARDUINO NANO— Sastoji se od dva bloka:
  • Direktno, “Jedinica vjetrogeneratora” mjeri i prenosi: brzinu generatora (Halov senzor), temperaturu namotaja generatora, temperaturu i vlažnost odjeljka generatora ( DS18B20 i DHT22), određivanje dana i noći ( fotootpornici). Položaj repa vjetroturbine. I također, iz sigurnosnih razloga, trosnovni LED far (jarbol vjetrogeneratora visine 17 m).
  • “Anemometarski blok” - mjerenje brzine vjetra (Halov senzor), indikator smjera vjetra (Halovi senzori, digitalni ekspander porta IIC I2C MCP23017).

4. Modul “WEB server” zasnovan na ARDUINO MEGA 2560 i internet štit W5100 Ethernet— prikazuje sve informacije o elektrani na web stranici za mogućnost daljinskog praćenja očitanja.

5. Modul “Solar Tracker” - kontrola položaja solarnih panela na suncu i u vremenu ako ih nema, kontrola pomoću IR daljinskog upravljača, automatski povratak trackera na poziciju na istok nakon sumraka. Postavljanje trekera u položaj “zaštita od vjetra” u slučaju da brzina vjetra premaši postavljenu. Kontrola pogona tragača. Jedinica zapravo radi već godinu dana. Još nije u arhivi, jer... Implementira se u opći blok dijagram.

Projekat je počeo da koristi NEXTION monitor (divna stvar, sigurno ćemo ga negde koristiti), ali smo ga onda odustali, zbog velikih kašnjenja zbog obima prenetih informacija i odluke da sistem bude modularan.

Takođe, svi ARDUINO NANO uređaji se flešuju preko WiFi mreže koristeći ESP8266-01. Ovo je za ažuriranje firmvera, u slučaju korekcije skice, bez uklanjanja blokova sa njihovih instalacijskih mjesta. Još uvijek postoji problem sa MEGA2560, znamo razlog, ali ga još ne možemo riješiti. Ali to je druga priča.

Skice u FLProg formatu, štampane ploče u Sprint-Layout formatu u redovno ažuriranom

Nastavljamo sa razvojem naše meteorološke stanice.

Prije nego što pređemo na ažuriranje, želim malo pojasniti.

Jedan od naših kolega mi je napisao pitanje zašto je uveden watchdog tajmer?

Watchdog tajmer je postavljen u slučaju nužde. Kao što praksa pokazuje, ENC28J60 ne obrađuje više od (osim ako memorija ne uspije) 4 istovremene veze. S obzirom na to koliko se servisnih konekcija stalno javlja za održavanje rada same mreže, a tek prepušteni promet koji stvaraju razne vrste igračaka za domaćinstvo (npr. modernih televizora, skeniranje dostupnih hostova na mreži i njihovih otvorenih portova) dizajn jednostavno pada u stupor. ENC28J60 ne može raditi samostalno mrežni protokoli i sve je implementirano u bibliotekama. Možda su to samo oni.
Provjerio sam sve dostupne biblioteke i različite module (iznenada neispravan), ali nisam uspio postići stabilan rad dugo vremena. Maksimalni period je bio oko 3-4 sedmice.
Zbog toga se "pas" tu vrti i, ako se nešto dogodi, povlači kontroler. Nakon ovoga problem je nestao.
Takođe ne poričem da je to moguće u mom kućnu mrežu postoje određene nijanse ili problemi. Ali pošto sam ja imao problem, možda ga ima i druga osoba. Do sada sam pronašao samo ovo rješenje.
Koliko ja znam, čipovi iz Wizneta (W5100 i noviji) nemaju ovo, ili jednostavno nisu izgledali dovoljno dobro.

Idemo dalje na ažuriranje

Ono što je najvažnije, mi se udaljavamo od čipa ENC28J60 i idi na W5100. Pokušao sam sve implementirati na starom čipu, ali nema dovoljno memorije mikrokontrolera zbog veoma velikih biblioteka za ENC28J60. Kada koristite novi čip, standardno biblioteke od programera i svih unesenih promjena, ostaje još više 20% slobodna memorija mikrokontrolera ATMega328. A ovo su nove lepinje!

U ovoj verziji (nazovimo je drugom) mogućnost prijenosa očitavanja sa senzora putem bežičnu komunikaciju koristeći frekvenciju 433 MHz. Same module sam uzeo od Kineza, oznake XY-MK-5V. Želio bih napomenuti da je kvalitet prijenosa daleko od savršenog. Mogući gubitak signala, šum, nemogućnost istovremenog prenosa, itd, itd. Ali njihova cijena (manje od 1 USD po setu) kompenzira ove nedostatke. Odaću vam tajnu da se ovi (najjeftiniji) moduli nalaze u mnogim brendiranim meteorološkim stanicama za kućnu upotrebu. Vau, neočekivano?

Počnimo sa baznom stanicom

Selimo se u Arduino UNO I Ethernet Shield(prva verzija) bazirana na čipu W5100. Ovo je sendvič i nema smisla ga opisivati. Opisaću samo dodatno uključene kontakte za module XY-MK-5V.

Modul predajnika koristi napajanje 5V, GND(gdje bi bilo bez majke) i D2 pin na kontroleru. Uredite kontakt D2 (Podaci) možete koristiti funkciju vw_set_tx_pin iz vw biblioteke.

Za razliku od prethodne skice, ova koristi dvije dodatne biblioteke:

#include #include

Sama skica

Skriveni tekst

#include #include #include #include #include #include #include #include #define DHTTYPE DHT22 #define DHTPIN 5 DHT dht(DHTPIN, DHTTYPE); bajt mac = (0x54, 0x34, 0x31, 0x31, 0x31, 0x31); char server = "narodmon.ru"; int port = 8283; IP adresa ip(192,168,0,201); EthernetClient klijent; BMP085 dps = BMP085(); dugo Temperatura = 0, Pritisak = 0; float H, dP, dPt; bool interval = istina; EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( ID bajta; // ID uređaja int Temperatura; // Temperatura plutajući Tlak; // Tlak plutajući Vlažnost; // Vlažnost float rosa; // Tačka rose/mraz ); SEND_DATA_STRUCTURE emitiranje; void setup() ( // Inicijaliziraj Watchdog timer wdt_disable(); delay(8000); wdt_enable(WDTO_8S); // Inicijaliziraj konzolu Serial.begin(9600); // Inicijaliziraj DHT senzor dht.begin(); / / Inicijalizacija 433 MHz modula ET.begin(details(broadcast)); vw_set_ptt_inverted(true); vw_set_tx_pin(2); vw_setup(2000); // Pokrenimo mrežu, ako nismo čekali podatke sa DHCP servera, tada // sami sebi dodjeljujemo adresu if (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip); // Inicijalizacija 1-Wire Wire.begin(); delay(200); // Inicijalizacija BMP180 s podešavanjem visine // dps.init (MODE_STANDARD, 3200, true); // Inicijaliziraj BMP180 dps.init(); Serial.println(Ethernet.localIP()); // Pošalji prve podatke odmah nakon uključivanja uređaja send_info (true); ) // funkcija dewPoint NOAA / / referenca (1) : http://wahiduddin.net/calc/density_algorithms.htm // referenca (2) : http://www.colorado.edu/geography/weather_station /Geog_site/about.htm dvostruka tačka rose (dvostruka celzijusa, dvostruka vlažnost) ( // (1) Pritisak pare zasićenja = ESGG(T) dvostruki ODNOS = 373,15 / (273,15 + celzijus); dvostruki RHS = -7,90298 * (RACIO - 1); RHS += 5,02808 * log10(RACIO); RHS += -1,3816e-7 * (pow(10, (11,344 * (1 - 1/RATIO))) - 1) ; RHS += 8,1328e-3 * (pow(10, (-3,49149 * (RACIO - 1))) - 1) ; RHS += log10(1013.246); // faktor -3 je podešavanje jedinica - Pritisak pare SVP * vlažnost duplo VP = pow(10, RHS - 3) * vlažnost; // (2) TAČKA ROSE = F(pritisak pare) duplo T = log(VP/0,61078); // temp var return (241,88 * T) / (17,558 - T); ) void send_info(bool eth) ( bool fail = true; while(fail) ( // Pokušavamo čitati podatke sa DHT senzora vlažnosti dok ne dobijemo // rezultat. U 90% slučajeva sve radi dobro, ali trebamo 100 % if((H = dht.readHumidity()) >= 0) ( // Dobivanje vlage i temperature sa senzora BMP180 dps.getPressure(&Pressure); dps.getTemperature(&Temperature); // Izračunajte tačku rose ako temperatura je vani iznad 0 stepeni Celzijusa // i očekujte rezultat iznad 0, u suprotnom ispišite 0. Ovo je neophodno // kako ne bismo zavarali tokom zimske sezone. // dP = Temperatura>0?((dPt=Tačka rose(Temperatura*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); }

Samim modulima se mora dodati antena. Za 433 MHz Dovoljna je obična duga bakarna žica 17 cm. Bez antene možete zaboraviti na normalan rad.

Pređimo na najvažniji dio ovog ažuriranja - lokalnu bežičnu stanicu

Za implementaciju (na koljenu) koristio sam analogni Arduino NANO(na bazi ATMega328) I TFT prikaz na čipu ST7735S uz dozvolu 128 x 160

Skriveni tekst



Pinout displej -> kontroler

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

Modul prijemnika je povezan samo na isti način kao i predajnik PODACI to pin D7.

Par slika kako to izgleda:

Skriveni tekst

Skica prijemnika

Skriveni tekst

#include #include #include #include int x, y; int w = 128, h = 160; int size; // 433 EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( ID bajta; // ID uređaja int Temperatura; // Temperatura plutajući Tlak; // Tlak plutajući Vlažnost; // Vlažnost float rosa; // Tačka rose/mraz ); SEND_DATA_STRUCTURE emitiranje; int Log_Temperature = -1; float Log_Pressure = -1; float Log_Vlažnost = -1; float Log_dewPoint = -1; // TFT #define cs 10 #define dc 9 #define rst 8 char Temperatura, Pressure, Humidity, Dewpoint; String info; TFT TFTscreen = TFT(cs, dc, rst); void setup())( Serial.begin(9600); // Inicijalizacija 433 MHz modula ET.begin(details(broadcast)); vw_set_ptt_inverted(true); vw_set_rx_pin(7); vw_setup(2000); vw_rx_start(); // Inicijalizacija i početno podešavanje prikaza TFTscreen.begin(); TFTscreen.setRotation(2); TFTscreen.background(0, 0, 0); // Crtanje statičkih elemenata // 1. Posjetite nas TFTscreen.stroke(255, 255) , 255); TFTscreen.setTextSize(1); TFTscreen.text(" ", 10, 10); // 2. Opis očitavanja senzora TFTscreen.text("mmHg", w/2+5, 80); TFTscreen .text ("%", w/2+5, 100); TFTscreen.text("C", w/2+5, 120); emitiranje.Temperatura = 0; emitiranje.Pritisak = 0; emitiranje.Vlažnost = 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.Humidity); 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 ( promjene(veličina, x, y, !gore, istina); TFTscreen.stroke((gore)?0:255, 0, (gore)?255:0); ) if((size%2) == 0 ) size++; while(size > 0) ( TFTscreen.line(x, y, x+(size--), y); ++x, (gore)?--y:++y, --size; ) /* while( veličina > 0) ( TFTscreen.line(x, y, (gore)?x+size-1:x, (gore)?y:y+size-1); ++x, ++y, --size; ) */ ) int x_center(int w, int dužina, int veličina) ( return floor((w-length*(size*5)+size*2)/2); ) int x_alignment_right(int w, int length, int veličina) ( vrati ceil(w-dužina*(veličina*5)+veličina*2); ) void TFTPrint() ( veličina = 3; // ================= =================================================== === =============== // Prikaz očitavanja temperature // ============== =========== =============================================== if(emitovanje. Temperatura != Log_Temperature) ( TFTscreen.setTextSize(size); // Prebrišite zastarjele podatke String info = String(Log_Temperature); info.concat(" C"); if(Log_Temperature > 0) info = "+"+info; info .toCharArray(Temperatura, info.length()+1); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Temperatura, x_center(w, info.length()+1, veličina), 35); / / Prikaži informacije o novim očitanjima = String(emitovanje. temperatura); info.concat("C"); if(broadcast.Temperature > 0) info = "+"+info; info.toCharArray(Temperatura, info.length()+1); // Mijenjamo boju vrijednosti temperature ovisno o samoj temperaturi int r, g = 0, b; if(broadcast.Temperature > 0) ( r = map(broadcast.Temperature, 0, 40, 255, 150); // Crvena b = map(broadcast.Temperature, 0, 40, 30, 0); // Promijenite nijansa za vizualniji prijelaz kroz nulu ) else ( r = map(broadcast.Temperature, -40, 0, 0, 30); // Promijenite nijansu za vizualniji prijelaz kroz nulu b = map(broadcast.Temperature, - 40, 0, 150, 255); // Plava ) TFTscreen.stroke(b, g, r); // PAŽNJA: pozicije boja u biblioteci su pomiješane, RGB mjesto koristi BGR! TFTscreen.text(Temperatura, x_center(w, info.length()+1, veličina), 35); ) veličina = 1; // ================================================= ==== ===================================== // Očitavanje izlaznog pritiska // === ====== ============================================= ========= ======================= if(broadcast.Pressure != Log_Prissure) ( TFTscreen.setTextSize(size); / / Prepiši zastarjele podatke info = String(Log_Prissure); info.toCharArray(Pritisak, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Pritisak, x_alignment_right(w/2-5, info .length(), veličina), 80 ); // Izlaz novih očitanja info = String(broadcast.Pressure); info.toCharArray(Pressure, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen .text(Pritisak, x_alignment_right(w/ 2-5, info.length(), veličina), 80); promjene (10, 106, 85, (broadcast.Prissure > Log_Prissure)?true:false); ) ostalo (promjene (10, 106, 85, istina, istina); promjene (10, 106, 85, false, true); ) // ====================== ======== =========================================== =========== = // Izlazna očitanja vlažnosti // ================================ =========================== ======================== ================== if(broadcast.Humidity != Log_Humidity) ( TFTscreen.setTextSize(size); // Prepiši zastarjele podatke info = String(Log_Humidity); info.toCharArray(Vlažnost, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Vlažnost, x_alignment_right(w/2-5, info.length(), veličina), 100); // Prikaz novih očitanja info = String(broadcast.Humidity); info.toCharArray(Vlažnost, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(Vlažnost, x_alignment_right(w/2-5, info.length(), veličina), 100); promjene(10, 106, 105, (broadcast.Humidity > Log_Humidity)?true:false); ) else ( changes(10, 106, 105, true, true); changes(10, 106, 105, false, true); ) // =================== =================================================== === ============== // Izlaz očitavanja tačke rose/tačke smrzavanja // ============ ========= ============================================= ====== if(broadcast.dewPoint ! = Log_dewPoint) ( TFTscreen.setTextSize(size); // Prebrišite zastarjele podatke 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(), veličina), 120); // Izlaz novih očitanja 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(), veličina), 120); promjene (10, 106, 125, (broadcast.dewPoint > Log_dewPoint)?true:false); ) else ( changes(10, 106, 125, true, true); changes(10, 106, 125, false, true); ) // Ažurirajte vrijednosti u zapisnicima za naredne poređenje očitanja Log_Temperature = emitirana.Temperatura; Log_Prissure = emitiranje.Pritisak; Log_Humidity = emitiranje.Vlažnost; Log_dewPoint = broadcast.dewPoint; )

Očitavanja su prikazana prilično kompaktno, ali kako praksa pokazuje (i savjet mojih drugova) - „ukus i boja, čak ni žena nije prijatelj.“ Slušao sam puno savjeta i sugestija, ali su jedni drugima u suprotnosti. Stoga, uradite to po svom ukusu.

Činilo mi se da je dizajn dio projekta koji oduzima najviše vremena!

Skriveni tekst

Neki od podataka su izmišljeni da odražavaju neke elemente dizajna.

Artefakti na displeju su prašina i druga prljavština koja se nakupila tokom dužeg vremena u kojoj je displej bio... tu negde,... eto, ne sećam se odakle mi! Ostavi me na miru!

Skica ima funkcije pozicioniranja. Oni su prilično primitivni, ali vam omogućavaju da postignete određene efekte.

  1. x_center
  2. x_alignment_right

Prvi centrira tekst, a drugi ga poravnava na desnu stranu navedene zone. Svi proračuni se vrše u odnosu na dimenzije dati tekst, na osnovu izraza 1 veličina = 1PX x 1PX segment fonta.

Displej također prikazuje elemente koji odgovaraju povećanju ili smanjenju određene vrijednosti očitavanja. Prikazuju se u obliku trouglova. Ali u kodu funkcije promjene Postoji alternativni displej u obliku trouglova rotiranih za 45 stepeni. Ako se očitanja povećaju, element je crven, u suprotnom plavi.

Usput, boja i nijansa glavne temperature mijenjaju se ovisno o samoj temperaturi. Prilično kontroverzna odluka, ali po mom mišljenju, vizuelno udobna. Borio sam se s tim neko vrijeme i shvatio da su vrijednosti u funkciji moždani udar, TFT ekranski objekti su navedeni pogrešnim redoslijedom. BGR mjesto RGB. Ovo je greška programera ili ja nešto ne razumijem.

PS: Sve je prilično interesantno, ali po mom mišljenju zaslužuje daljnji razvoj. To ćemo uraditi nakon nekog vremena.

Dobar dan, čitaoci i oni koji su upravo došli. Pretplatnik sam na YouTube kanalu AlexGyver i gledanje video zapisa o “Nadzoru hardvera računara”,

Odlučila sam da ponovim ovaj domaći proizvod, jer... Bilo mi je prilično interesantno i uvek sam želeo da prikažem status sistema na hardverski način, na dodatnom ekranu, a ne na monitoru računara. Napravite sa kompjutera božićno drvce Nisam želeo, pa sam odlučio da ne instaliram RGB pozadinsko osvetljenje, a takođe sam odlučio da odbijem homemade reobass, jer moja Gigabyte majka savršeno zna kako da kontroliše brzinu ventilatora bez ikakvih posrednika koristeći BOIS.

Odabrao sam i naručio najjeftinije komponente koje je autor ponudio:

  1. ATmega 328 https://goo.gl/DkWhmU
  2. Žice za povezivanje https://goo.gl/NHmQqs
  3. Ekran za 4 reda 20 karaktera https://goo.gl/4MAowg

Sve ovo sam naručio od jednog prodavca da bi stiglo zajedno, u jednom paketu. I mali life hack: ako sve stavite u košaricu od jednog prodavača koji ima naknadu za dostavu, a zatim platite jednom, tada će se naknada za dostavu naplatiti jednom. (A ne za svaki od 3 proizvoda).

4. Nisam naručio mini USB kabl i zalemio sam ga direktno na Arduino i povezao ga žicama (od tačke 2) na interni USB konektor. Ali ne morate da brinete i naručite https://goo.gl/LA7sb3 lakše je

I počeo je da čeka. Sve je stiglo dosta brzo, za 15 dana. U krugu se nalazi i dugme koje, kada se zatvori, prebacuje ekrane sa informacijama o stanju sistema. Prvo sam uzeo ovo:

ali se pokazalo da ideja nije baš dobra, jer... nije bilo ničega što bi ga pričvrstilo za prednju ploču računara. Stoga je u lokalnoj prodavnici radio elektronike odabrano dugme koje se ne zaključava, s praktičnim pričvršćenjem na kućište, kao i prekidač za isključivanje ovog "čuda" noću. Jer sve što je povezano sa USB portom mog računara je stalno napajano i ima tendenciju da svetli i treperi, isključujući se samo isključivanjem računara iz utičnice.

Generalno, proveo sam nekoliko sati montirajući ovo čudo tehnički napredak, isecanje mesta za ekran u prednjem poklopcu kompjutera i bušenje rupa za dugme i prekidač. Dalje, za punopravan rad, sve je to moralo biti zalemljeno prema krugu i pokrenuti rezidentni program za praćenje resursa računala. Evo šta se dogodilo:

Pa, ispalo je prilično dobro, skoro kako sam želio. Ostaje otkloniti male probleme u softveru koji prenosi temperature. Iz nekog razloga oni se prenose do maksimuma od: senzorske prostirke. CPU, GPU, matična ploča, što vam onemogućava praćenje vašeg računara u tihom stanju, kada temperature mirovanja nisu visoke.

Ako neko ne može preuzeti izvorni kod sa stranice AlexGyver web stranice, evo ponovnog učitavanja na moju web stranicu: .

Preturajući po programu, našao sam mnogo toga što mi nije odgovaralo i uglavnom nije radilo kako treba. Nakon što sam proveo par večeri, uz pomoć prijatelja, malo sam shvatio i kod skice na Arduinu i kod OpenHardwareMonitor, koji zapravo prenosi izlazne parametre na ekran. I napravio je promjene koje su me zadovoljile.

Promjene u programu OpenHardwareMonitor:

  • kako se temperatura CPU-a sada prenosi ne temperaturom najtoplijeg jezgra, već temperaturom CPU senzora od majke;
  • kako se temperatura GPU-a sada prenosi ne maksimalna temperatura između matične ploče i GPU-a, već temperatura GPU-a sa senzora video kartice;
  • Način na koji se temperatura matične ploče sada prenosi nije maksimalna temperatura između: matična ploča, senzor temperature GPU-a i CPU-a sa majke i temperaturu matične ploče sa senzora;
  • Takođe, u vrednostima 12 i 13 iz OpenHardwareMonitor-a, brzina ventilatora CPU-a i matične ploče sada se prenosi umesto zastavica za ručnu kontrolu za ventilatore i pozadinsko osvetljenje, respektivno.

Promjene u skici za Arduino:

  • Uklonjeno praćenje pritiska na drugo dugme koje je menjalo ekrane obrnutim redosledom;
  • Na drugom ekranu je zamijenjen izlaz informacija; sada umjesto temperature 2 eksterna temperaturna senzora (TMP1, TMP2) prikazujem brzinu rotacije CPU ventilatora (FanC) i matične ploče (FanM).
  • Praćenje za ručnu kontrolu ventilatora i rasvjete je uklonjeno.

Arhivu sa svim izmjenama i izvorima možete preuzeti ovdje (Kao što smo empirijski saznali, promjene u OpenHardwareMonitoru dobro funkcioniraju na Gigabyte matičnim pločama, poput moje, a najvjerovatnije će biti grešaka i na matičnim pločama drugih proizvođača).

Zima i mačke svima!

Srećno eksperimentisanje!

Naša organizacija je postavila Zabbix server za praćenje performansi servera i radnih stanica. Zbog specifičnosti tehničkog procesa, oprema je „rasprostranjena“ u nekoliko prostorija i raspoređena po celom preduzeću. Naravno, pored osnovnih parametara računara (radi/ne radi), želim da kontrolišem i mikroklimu u server sobama. U isto vrijeme, kao i obično, mogućnosti su vrlo ograničene, a „pronalaženje“ značajnih sredstava za složene sisteme za praćenje temperature (uključujem kontrolne ploče sa termalnim senzorima za APC rack UPS-ove) je zasebna potraga.

U glavnoj server sobi sve je jednostavno - instalirana je jedna takva ploča (davno kupljena od prethodnika zajedno sa glavnom opremom), priključen je APC termalni senzor, kreira se agent u Zabbix-u, sve radi preko SNMP-a . Dosadno :) Nema opreme za nadgledanje udaljenog hardvera, niti sredstava - vidi gore. Stoga je odlučeno biti pametan, uštedjeti budžet i istovremeno razviti novu vještinu konstruiranjem jednostavnog i jeftinog “knock-on” rješenja koje se ipak uklapa u postojeću Zabbix infrastrukturu za nadzor.

Potrebne komponente:

  • Osnova sistema je Arduino Nano V3
  • Lokalni mrežni modul (ethernet-shield)
  • I, zapravo, digitalni temperaturni senzor baziran na DS18B20
Ukupna cijena komponenti je 10 USD uključujući dostavu.

Sastavljanje uređaja nije teško. Mrežni modul je postavljen na glavnu ploču kao „sendvič“, a termalni senzor je zalemljen na njegove pinove. Priključak senzora: crveni +5 V, crni - uzemljenje, žuti - podaci; Između +5V i Data lemimo 4,7 kOhm pull-up otpornik.

Pin za podatke se bira na osnovu korišćenih pinova mrežni modul(D10 – SS; D11 – MOSI; D12 – MISO; D13 – SCK; D2 – IRQ).

Rake: u prototipu uređaja naišao sam na sukob - podaci o temperaturi su izdavani nasumično, "svaka dva do tri". Ispostavilo se da je razlog to što sam na pin 2 priključio senzor temperature, koji, kako sam kasnije našao na internetu, koristi mrežni modul za generiranje prekida kada paket stigne. Premjestio sam ga na 4. - radio je kao sat.

Nakon sklapanja hardvera, prelazimo na softver.

Uređaj će raditi na mreži i pretvarati se da je Zabbix agent, za to su mu potrebni MAC i IP adresa. Odlučujemo šta je zgodnije - ožičiti ga tokom programiranja, generirati MAC iz adrese temperaturnog senzora i dobiti IP putem DHCP-a itd. Uzeo sam najjednostavniji put i tvrdo kodirao oba parametra.

Protokol razmjene sa Zabbix serverom je opisan u dokumentaciji. Naš uređaj će odgovoriti na dvije komande - agent.ping I env.temp(ovdje ima prostora za daljnju kreativnost; možete priključiti bilo koji od modula za proširenje dostupnih za Arduino - čak i senzor vlažnosti, čak i senzor svjetla - što god vam srce poželi). Na sve ostale komande će odgovoriti standardnim odgovorom koji je razumljiv Zabbix serveru.

Za one koji počinju od nule (kao ja), Arduino programiranje se radi pomoću Arduino IDE, čija je instalacija i konfiguracija jednostavna. Da bi komponente radile potrebne su UIPEthernet i OneWire biblioteke koje se instaliraju i povezuju sa projektom preko menija Sketch - Poveži biblioteku - Upravljaj bibliotekama...
Ako imate druge komponente (na primjer, mrežni modul ne na enc28j60, već na drugom čipu), trebat će vam druge biblioteke!

Kod za rad sa mrežnim modulom i temperaturnim senzorom je tipičan, sa interneta, uz neke pretpostavke i pojednostavljenja.

Nakon učitavanja koda na kontroler i povezivanja ethernet kabla, provjeravamo sa konzole:

$ 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_NOTSUP
Rake: kompajlirana verzija zabbix_get za Windows objavljena na zabbix.com je zastarjela i koristi drugačiji protokol (sa ZBXD\x01 zaglavljem u zahtjevu servera). Linux verzija je ažurirana i protokol odgovara datom kodu.

Sve radi kako je predviđeno. U Zabbix admin panelu kreiramo novi host sa odabranim IP-om, sadrži dva ključa Numeric (unsigned) agent.ping i Numeric (float) env.temp, i uživamo u radu. Grafikoni, trigeri - sve je kao i obično.

Uređaj se napaja preko izvornog USB-a. Kućište - opciono: odgovarajuća plastična kutija, termoskupljajuća, plava električna traka.

Rezolucija senzora je otprilike 0,06 (tačnije 1/16) °C, tačnost - kada je uronjen u snijeg koji se topi pokazao je 0,19 °C (možda bi pao niže, ali snijega je bilo malo i sve se otopilo brzo). Mislim da je to više nego dovoljno za uređaj koji košta 10 dolara i opisane namjene.

Skica

#include #include bajt mac = ( 0xDE, 0x05, 0xB6, 0x27, 0x39, 0x19); // nasumični MAC bajt ip = ( 192, 168, 4, 5); // IP adresa u lokalnoj mreži String readString = String(20); byte addr; OneWire ds(4); // DS18B20 na pin 4 EthernetServer server(10050); // Zabbix port void setup() ( Ethernet.begin(mac, ip); server.begin(); ds.search(addr); ) void loop() ( bajt podaci; float celzijus; readString = ""; if ( EthernetClient klijent = server.available()) ( while (client.connected()) ( if (client.available()) ( char c = client.read(); if (c == "\n") // kraj upita sa zabbix servera ( client.print("ZBXD\x01"); // zaglavlje odgovora 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) ; // započnemo konverziju s uobičajenim (neparazitskim!) power delay(1000); ds.reset(); ds.select(addr); ds.write(0xBE); // čitanje Scratchpad podataka = ds.read() ; data = ds.read(); int16_t raw = (podaci<< 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(); } }