Arduino-da uy ob-havo stantsiyasi va ma'lumotlarni "Xalq monitoringi" ga yuborish. NodeMcu-dagi ob-havo stantsiyasi. Jamoatchilik monitoringi "Port monitor" dan Arduino-ga yuborilgan ma'lumotlarni qabul qilish

Bu qo'shma loyiha. Kanallar, veb-sayt va mualliflar arxiviga havolalar tavsif oxirida bo'ladi. Shamol va quyosh elektr stansiyasi uchun bloklarni boshqarish tizimi yaratilmoqda. Muqobil energiya bilan ta’minlangan ikkita yozgi uyimiz bor. Bir hududda tashqi elektr quvvati mavjud, ikkinchisida uning to'liq yo'qligi mavjud. Saytlar Rossiyaning turli mintaqalarida joylashgan. Birinchi uchastkada quvvati 1 kVt bo'lgan uy qurilishi shamol generatori, har biri 100 Vt bo'lgan 6 ta statsionar quyosh panellari, ketma-ket ulangan, ikkita bo'lak 24 V kuchlanishli va 6 ta uy qurilishi paneli, shuningdek, 24 voltga ulangan. quyosh kuzatuvchisi. Ikkinchi saytda har biri 100 Vt quvvatga ega 4 ta doimiy o'rnatilgan panel va har biri 60 Vt quvvatga ega 2 ta uy qurilishi paneli mavjud bo'lib, ular 24 voltli tizimga ulangan. Loyiha 12 voltli va 24 voltli tizimlarni mexanik o'zgarishlarsiz ulash imkonini beradi. Tizim beshta mustaqil blokdan iborat. Birliklar orasidagi aloqa NRF24L01 modullari (tashqi antenna bilan) orqali radiokanal orqali amalga oshiriladi.

  1. "Boshqaruv bloki" moduli asosida ARDUINO MEGA2560— barcha ma'lumotlarni to'playdi va uni LCD displeyda ko'rsatadi IIC/I2C 2004 4X20, yordamida bloklarni, qurilmalarni boshqarish va turli xil sozlamalarni kiritish 4X4 matritsali klaviatura. Harorat, namlik, bosim (bosim sensori bmp180), sana, vaqt (soat DS3231). Barcha sozlash ma'lumotlari menyu orqali kiritiladi va EEPROMda saqlanadi. Nosozliklarni tuzatish rejimida barcha kerakli tuzatish omillarini o'rnatgandan so'ng, ushbu ma'lumotlar radiokanal orqali uning bloklariga yuboriladi, bu sizga barcha ma'lumotlarni nozik sozlash imkonini beradi. (Blok rivojlanishda davom etmoqda).
  2. "Vattmetr bloki" moduli asosida ARDUINO NANO quvvat bloki bilan birgalikda - oqim sensorlari o'rnatilgan o'lchov paneli yordamida kiruvchi va chiquvchi oqim va kuchlanishlarni o'lchaydi va hisoblaydi ACS712 30A va ACS754SCU 100A, ADS1015 12 bitli ADC, rezistiv kuchlanish ajratgichlar. Bundan tashqari, u balast yukidan foydalangan holda parametrlarda o'rnatilgan shamol generatori tomonidan ishlab chiqarilgan kuchlanishni tartibga soladi, muhrlangan sensorga asoslangan qaynoq himoyasi bilan suvni isitadi. DS18B20. Batareyalar parametrlarda o'rnatilgan % dan past zaryadsizlanganda inverterni o'chiradi. Uch fazali diodli ko'prik uchun sovutish tizimini o'z ichiga oladi. (Sensor DS18B20).
  3. "Shamol generator bloki" moduli asosida ARDUINO NANO- Ikki blokdan iborat:
  • To'g'ridan-to'g'ri "Shamol generatori bloki" o'lchaydi va uzatadi: generator tezligi (Hall sensori), generator o'rashlarining harorati, generator bo'linmasining harorati va namligi ( DS18B20 va DHT22), kechayu kunduzni aniqlash ( fotorezistorlar). Shamol turbinasi dumining holati. Shuningdek, xavfsizlik nuqtai nazaridan, uch nurli LED mayoq (17 m balandlikdagi shamol generatori ustuni).
  • "Anemometr bloki" - shamol tezligini o'lchash (Hall sensori), shamol yo'nalishi ko'rsatkichi (Hall sensorlari, raqamli port kengaytirgichi) IIC I2C MCP23017).

4. “WEB server” moduli asosida ARDUINO MEGA 2560 va internet qalqoni W5100 Ethernet— o'qishlarni masofadan turib kuzatish imkoniyati uchun veb-saytda elektr stansiyasi haqidagi barcha ma'lumotlarni ko'rsatadi.

5. "Quyosh kuzatuvchisi" moduli - quyosh panellarining quyoshdagi holatini va agar yo'q bo'lsa, o'z vaqtida nazorat qilish, IQ masofadan boshqarish pulti yordamida boshqarish, tun tushgandan keyin kuzatuvchini Sharqqa avtomatik ravishda qaytarish. Shamol tezligi belgilanganidan oshib ketgan taqdirda trekerni "shamoldan himoya qilish" holatiga o'rnatish. Tracker haydovchi nazorati. Birlik aslida bir yildan beri ishlamoqda. Hozircha arxivda emas, chunki... U umumiy blok diagrammada amalga oshirilmoqda.

Loyiha NEXTION monitoridan foydalanishni boshladi (ajoyib narsa, biz uni bir joyda ishlatamiz), lekin keyin uzatilgan ma'lumotlar hajmi va tizimni modulli qilish qarori tufayli katta kechikishlar tufayli biz undan voz kechdik.

Bundan tashqari, barcha ARDUINO NANO-lar ESP8266-01 yordamida WiFi orqali yonadi. Bu eskizni to'g'rilagan taqdirda, o'rnatish joylaridan bloklarni olib tashlamasdan, proshivkani yangilashdir. MEGA2560 bilan bog'liq muammo hali ham mavjud, biz sababini bilamiz, lekin biz uni hali hal qila olmaymiz. Lekin bu boshqa hikoya.

FLProg formatidagi eskizlar, bosilgan elektron platalar Sprint-Layout formatida muntazam yangilanadi

Biz ob-havo stantsiyamizni rivojlantirishda davom etamiz.

Yangilanishga o'tishdan oldin, men biroz aniqlik kiritmoqchiman.

Bizning hamkasblarimizdan biri menga nima uchun qo'riqchi taymer joriy qilinganligini so'rab yozdi.

Favqulodda vaziyatda qo'riqchi taymer mavjud. Amaliyot shuni ko'rsatadiki, ENC28J60 bir vaqtning o'zida 4 dan ortiq ulanishni (xotira ishlamay qolganda) ishlamaydi. Tarmoqning ishlashini ta'minlash uchun doimiy ravishda qancha xizmat ko'rsatish ulanishlari paydo bo'lishini hisobga olsak va faqat uy o'yinchoqlarining barcha turlari tomonidan yaratilgan trafikni qoldirgan (masalan, zamonaviy televizorlar, tarmoqdagi mavjud xostlarni va ularning ochiq portlarini skanerlang) dizayn shunchaki bema'ni bo'lib ketadi. ENC28J60 bilan mustaqil ishlay olmaydi tarmoq protokollari va hamma narsa kutubxonalarda amalga oshiriladi. Ehtimol, bu faqat ulardir.
Men barcha mavjud kutubxonalarni va turli modullarni (to'satdan nuqsonli) tekshirdim, lekin uzoq vaqt davomida barqaror ishlashga erisha olmadim. Maksimal davr taxminan 3-4 hafta edi.
Shuning uchun "it" u erda aylanadi va agar biror narsa yuz bersa, boshqaruvchini tortadi. Shundan so'ng muammo yo'qoldi.
Men ham buni inkor etmayman uy tarmog'i muayyan nuances yoki muammolar mavjud. Ammo menda muammo bo'lganligi sababli, boshqa odamda ham bo'lishi mumkin. Hozircha men faqat bu yechimni topdim.
Men bilishimcha, Wiznet (W5100 va undan yuqori) chiplarida bunday yo'q yoki ular etarlicha yaxshi ko'rinmagan.

Keling, yangilanishga o'tamiz

Eng muhimi, biz chipdan uzoqlashmoqdamiz ENC28J60 va ga boring W5100. Men hamma narsani eski chipda amalga oshirishga harakat qildim, lekin juda katta kutubxonalar tufayli mikrokontroller xotirasi etarli emas. ENC28J60. Yangi chipdan foydalanilganda, standart kutubxonalar ishlab chiquvchidan va kiritilgan barcha o'zgarishlardan ko'proq narsa qoladi 20% bepul mikrokontroller xotirasi ATMega328. Va bu yangi bulochkalar!

Ushbu versiyada (uni ikkinchi deb ataymiz) sensorlardan o'qishlarni uzatish qobiliyati simsiz aloqa chastotadan foydalanish 433 MGts. Men modullarni xitoyliklardan oldim, belgilar XY-MK-5V. Shuni ta'kidlashni istardimki, uzatish sifati mukammallikdan yiroq. Mumkin bo'lgan signal yo'qolishi, shovqin, bir vaqtning o'zida uzatishning mumkin emasligi va boshqalar. Ammo ularning narxi (bir to'plam uchun 1 dollardan kam) bu kamchiliklarni qoplaydi. Men sizga sirni aytamanki, bu (eng arzon) modullar ko'plab markali ob-havo stantsiyalarida mavjud uyda foydalanish. Voy, kutilmaganmi?

Baza stantsiyasidan boshlaylik

ga ko'chyapmiz Arduino UNO Va Ethernet qalqoni(birinchi versiya) chipga asoslangan W5100. Bu sendvich va uni ta'riflashning ma'nosi yo'q. Men faqat modullar uchun qo'shimcha jalb qilingan kontaktlarni tasvirlab beraman XY-MK-5V.

Transmitter moduli quvvat sarflaydi 5V, GND(onasiz qayerda bo'lardi) va D2 boshqaruvchidagi pin. Kontaktni tahrirlash D2 (DATA) funksiyasidan foydalanishingiz mumkin vw_set_tx_pin vw kutubxonasidan.

Oldingi eskizdan farqli o'laroq, bu ikkita qo'shimcha kutubxonadan foydalanadi:

#o'z ichiga oladi #o'z ichiga oladi

Eskizning o'zi

Yashirin matn

#o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi #define DHTTYPE DHT22 #define DHTPIN 5 DHT dht(DHTPIN, DHTTYPE); bayt mac = (0x54, 0x34, 0x31, 0x31, 0x31, 0x31); char server = "narodmon.ru"; int port = 8283; IP manzili ip(192,168,0,201); EthernetClient mijozi; BMP085 dps = BMP085(); uzoq Harorat = 0, Bosim = 0; float H, dP, dPt; bool oralig'i = rost; EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( bayt identifikatori; // Qurilma identifikatori int Harorat; // Harorat suzuvchisi Bosim; // Bosim float Namlik; // Namlik suzuvchi shudring nuqtasi; // Shudring/muzlash nuqtasi ); SEND_DATA_STRUCTURE translyatsiyasi; void setup() ( // Watchdog taymerini ishga tushirish wdt_disable(); delay(8000); wdt_enable(WDTO_8S); // Konsolni ishga tushirish Serial.begin(9600); // DHT sensorini ishga tushirish dht.begin(); / / 433 MGts modulni ishga tushirish ET.begin(tafsilotlar(eshittirish)); vw_set_ptt_inverted(true); vw_set_tx_pin(2); vw_setup(2000); // Agar DHCP serveridan ma'lumotlarni kutmagan bo'lsak, tarmoqni ishga tushiring, keyin // o'zimizga manzil belgilaymiz, agar (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip); // 1-simli Wire.begin(); kechikish (200); // BMP180 ishga tushirilmoqda balandlikni sozlash bilan // dps.init (MODE_STANDARD, 3200, rost); // BMP180 ni ishga tushirish dps.init(); Serial.println(Ethernet.localIP()); // Qurilmani yoqgandan so'ng darhol birinchi ma'lumotlarni yuboring send_info (to'g'ri); ) // dewPoint funktsiyasi NOAA // ma'lumotnoma (1) : http://wahiduddin.net/calc/density_algorithms.htm // ma'lumotnoma (2) : http://www.colorado.edu/geography/weather_station /Geog_site/about.htm double dewPoint(ikki barobar tselsiy , er-xotin namlik) ( // (1) To'yingan bug 'bosimi = ESGG(T) ikki barobar RATIO = 373,15 / (273,15 + selsiy); er-xotin RHS = -7,90298 * (RATIO - 1); RHS += 5,02808 * log10 (RATIO); RHS += -1.3816e-7 * (pow(10, (11.344 * (1 - 1/RATIO))) - 1); RHS += 8.1328e-3 * (pow(10, (-3.49149 * (NORISAT - 1))) - 1) ; RHS += log10 (1013.246); // omil -3 birliklarni sozlash uchun - Bug 'bosimi SVP * namlik er-xotin VP = pow(10, RHS - 3) * namlik; // (2) DEWPOINT = F (Bug 'bosimi) er-xotin T = log (VP/0,61078); // temp var qaytish (241,88 * T) / (17,558 - T); ) void send_info(bool eth) ( bool fail = true; while(fail) ( // Natija olinmaguncha DHT namlik sensori maʼlumotlarini oʻqishga harakat qilamiz. 90% hollarda hammasi yaxshi ishlaydi, lekin bizga kerak boʻladi. 100 % if((H = dht.readHumidity()) >= 0) ( // BMP180 sensoridan namlik va haroratni olish dps.getPressure(&Pressure); dps.getTemperature(&Temperature); // Agar shudring nuqtasini hisoblang harorat Tselsiy bo'yicha 0 darajadan tashqarida // va 0 dan yuqori natijani kuting, aks holda chiqish 0. Qish mavsumida chalg'itmaslik uchun bu zarur //. // dP = Harorat>0?((dPt=shudring nuqtasi(harorat*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); }

Modullarning o'ziga antenna qo'shilishi kerak. Uchun 433 MGts Oddiy uzun mis sim etarli 17 sm. Antenna bo'lmasa, siz normal ishlashni unutishingiz mumkin.

Keling, ushbu yangilanishning eng muhim qismiga - mahalliy simsiz stantsiyaga o'tamiz

Uni amalga oshirish uchun (tizzada) men analogdan foydalandim Arduino NANO(tayanchda ATMega328) Va TFT chipda ko'rsatish ST7735S ruxsati bilan 128 x 160

Yashirin matn



Pinout displey -> kontroller

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

Qabul qiluvchi modul transmitter bilan bir xil tarzda ulanadi, faqat DATA pin qilish D7.

Qanday ko'rinishga ega bo'lgan bir nechta rasm:

Yashirin matn

Qabul qiluvchining eskizi

Yashirin matn

#o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi int x, y; int w = 128, h = 160; int hajmi; // 433 EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( bayt identifikatori; // Qurilma identifikatori int Harorat; // Harorat suzuvchisi Bosim; // Bosim float Namlik; // Namlik suzuvchi shudring nuqtasi; // Shudring/muzlash nuqtasi ); SEND_DATA_STRUCTURE translyatsiyasi; int Log_Temperature = -1; float Log_Pressure = -1; float Log_Humidity = -1; float Log_dewPoint = -1; // TFT #define cs 10 #define dc 9 #define st 8 char Harorat, Bosim, Namlik, shudring nuqtasi; String ma'lumotlari; TFT TFTscreen = TFT(cs, DC, rst); void setup())( Serial.begin(9600); // 433 MGts modulni ishga tushirish ET.begin(details(efir)); vw_set_ptt_inverted(true); vw_set_rx_pin(7); vw_setup(2000); vw_rx_start(); // Initializatsiya va displeyni dastlabki sozlash TFTscreen.begin(); TFTscreen.setRotation(2); TFTscreen.background(0, 0, 0); // Statik elementlarni chizish // 1. Bizga tashrif buyuring TFTscreen.stroke(255, 255) , 255); TFTscreen.setTextSize(1); TFTscreen.text(" ", 10, 10); // 2. Sensorlarning oʻqishlari tavsifi TFTscreen.text("mmHg", w/2+5, 80); TFTscreen .matn ("%", w/2+5, 100); TFTscreen.text("C", w/2+5, 120); translyatsiya.Temperatura = 0; eshittirish.Bosim = 0; translyatsiya.Namlik = 0 ; translyatsiya .dewPoint = 0; TFTPrint(); ) bekor sikl())( if(ET.receiveData())( if(broadcast.ID == 1) TFTPrint(); /* Serial.println(broadcast.Temperature) ; Serial. println(broadcast.Pressure); Serial.println(efir.Namlik); Serial.println(broadcast.dewPoint); Serial.println(); */ ) ) bekor oʻzgarishlar (int hajmi, int x, int y, bool up, bool clear = false) ( if(clear) TFTscreen.stroke(0, 0, 0); else ( oʻzgarishlar (oʻlcham, x, y, !yuqoriga, rost); TFTscreen.stroke((yuqoriga)?0:255, 0, (yuqoriga)?255:0); ) if((size%2) == 0 ) hajmi++; while(size > 0) ( TFTscreen.line(x, y, x+(size--), y); ++x, (yuqoriga)?--y:++y, --size; ) /* while( hajmi > 0) ( TFTscreen.line(x, y, (yuqori)?x+size-1:x, (yuqoriga)?y:y+size-1); ++x, ++y, --size; ) */ ) int x_center(int w, int uzunlik, int hajmi) ( Qaytish qavati((w-uzunlik*(hajmi*5)+hajm*2)/2); ) int x_alignment_right(int w, int uzunlik, int) o'lcham) ( qaytaruvchi shift(w-uzunlik*(hajmi*5)+hajm*2); ) void TFTPrint() ( o'lcham = 3; // ================ =================================================== === =============== // Harorat ko'rsatkichlarini ko'rsatish // ============== ========== ================================================= agar(efir. Harorat != Log_Temperature) ( TFTscreen.setTextSize(size); // Eskirgan ma'lumotlarni qayta yozish String info = String(Log_Temperature); info.concat(" C"); if(Log_Temperature > 0) info = "+"+info; info .toCharArray(harorat, info.length()+1); TFTscreen.stroke(0, 0, 0); TFTscreen.text (harorat, x_center(w, info.length()+1 , oʻlcham), 35); / / Yangi o'qishlar haqida ma'lumotni ko'rsatish = String (efir. Harorat); info.concat("C"); agar(efir.Temperatura > 0) info = "+"+info; info.toCharArray(harorat, info.length()+1); // Harorat qiymatining rangini haroratning o'ziga qarab o'zgartiring int r, g = 0, b; if(eshittirish.Temperatura > 0) ( r = xarita (efir. Harorat, 0, 40, 255, 150); // Qizil b = xarita (efir. Harorat, 0, 40, 30, 0); // O'zgartirish noldan koʻproq vizual oʻtish uchun rang ) else ( r = map(broadcast.Temperature, -40, 0, 0, 30); // Nol orqali koʻproq vizual oʻtish uchun rangni oʻzgartiring b = map(broadcast.Temperature, - 40, 0, 150, 255); // Moviy ) TFTscreen.stroke(b, g, r); // DIQQAT: kutubxonadagi rang pozitsiyalari aralashtiriladi, RGB joyi BGR tomonidan ishlatiladi! TFTscreen.text(Temperatura, x_center(w, info.length()+1, o'lcham), 35); ) hajmi = 1; // ================================================ ==== ===================================== // Chiqish bosimi ko'rsatkichlari // === ====== ============================================ ========= ====================== if(broadcast.Pressure != Log_Pressure) ( TFTscreen.setTextSize(size); / / Eskirgan maʼlumotlarning ustiga yozish = String(Log_Pressure ); info.toCharArray(Pressure, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Pressure, x_alignment_right(w/2-5, info) .length(), size), 80); // Yangi oʻqishlarni chiqarish info = String(broadcast.Pressure); info.toCharArray(Bosim, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen .text(Pressure, x_alignment_right(w/ 2-5, info.length(), size), 80); o'zgarishlar (10, 106, 85, (translyatsiya.Pressure > Log_Pressure)?true:false); ) else ( o'zgarishlar (10, 106, 85, rost, rost); o'zgarishlar (10, 106, 85, noto'g'ri, rost); ) // ===================== ======== ========================================== =========== = // Chiqish namligi ko'rsatkichlari // ============================== =================================================== ================== if(translyatsiya.Humidity != Log_Humidity) ( TFTscreen.setTextSize(hajmi); // Eskirgan ma'lumotlarning ustiga yozish = String(Log_Humidity); info.toCharArray(Namlik, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Namlik, x_alignment_right(w/2-5, info.length(), o'lcham), 100); // Yangi o'qishlar haqida ma'lumotni ko'rsatish = String(broadcast.Humidity); info.toCharArray(Namlik, info.length()); TFTscreen.stroke (255, 255, 255); TFTscreen.text(Namlik, x_alignment_right(w/2-5, info.length(), o'lcham), 100); o'zgarishlar (10, 106, 105, (efir.Humidity > Log_Humidity)?true:false); ) else (o‘zgarishlar (10, 106, 105, rost, rost); o‘zgarishlar (10, 106, 105, noto‘g‘ri, rost); ) // ================= =================================================== === ============== // Shudring nuqtasi/muzlash nuqtasi ko'rsatkichlari chiqishi // =========== ======== =================================================== agar(broadcast.dewPoint ! = Log_dewPoint) ( TFTscreen.setTextSize(size); // Eskirgan ma'lumotlarning ustiga yozish = 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); // Yangi o'qishlarni chiqarish 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(), o'lcham), 120); o'zgarishlar (10, 106, 125, (broadcast.dewPoint >) Log_dewPoint). ko'rsatkichlarni taqqoslash Log_Temperature = translyatsiya.Temperature; Log_Pressure = broadcast.Pressure; Log_Humidity = translyatsiya.Humidity; Log_dewPoint = broadcast.dewPoint; )

O'qishlar juda ixcham ko'rsatilgan, ammo amaliyot shuni ko'rsatadiki (va o'rtoqlarimning maslahati) - "ta'mi va rangi, hatto xotini ham do'st emas". Men juda ko'p maslahat va takliflarni tingladim, lekin ular bir-biriga zid. Shuning uchun, buni o'zingizning didingizga qarab qiling.

Menga dizayn ko'p vaqtni oladigan loyihaning bir qismidek tuyuldi!

Yashirin matn

Ba'zi ma'lumotlar ba'zi dizayn elementlarini aks ettirish uchun ishlab chiqilgan.

Displeydagi artefaktlar chang va displey uzoq vaqt davomida to'plangan boshqa axloqsizlikdir ... u erda, ... yaxshi, u erda, men uni qaerdan olganimni eslay olmayman! Meni yolg'iz qoldir!

Eskizda joylashishni aniqlash funksiyalari mavjud. Ular juda ibtidoiy, ammo ular sizga ma'lum effektlarga erishishga imkon beradi.

  1. x_center
  2. x_alignment_right

Birinchisi matnni markazlashtiradi, ikkinchisi esa uni belgilangan zonaning o'ng tomoniga tekislaydi. Barcha hisob-kitoblar o'lchamlarga nisbatan amalga oshiriladi berilgan matn, ifodaga asoslanadi 1 o'lcham = 1PX x 1PX shrift segmenti.

Displey, shuningdek, ma'lum bir o'qish qiymatining oshishi yoki pasayishiga mos keladigan elementlarni ko'rsatadi. Ular uchburchaklar shaklida ko'rsatiladi. Ammo funktsiya kodida o'zgarishlar 45 gradusga aylantirilgan uchburchaklar ko'rinishidagi muqobil displey mavjud. Agar ko'rsatkichlar oshsa, element qizil, aks holda ko'k rangga ega.

Aytgancha, asosiy haroratning rangi va soyasi haroratning o'ziga qarab o'zgaradi. Juda munozarali qaror, lekin mening fikrimcha, vizual jihatdan qulay. Men u bilan bir muncha vaqt kurashdim va funktsiyadagi qadriyatlar ekanligini angladim insult, TFT displey ob'ektlari noto'g'ri tartibda keltirilgan. BGR joy RGB. Bu dasturchi xatosi yoki men biror narsani tushunmayapman.

PS: Hammasi juda qiziq, lekin menimcha, u yanada rivojlantirishga loyiq. Biroz vaqt o'tgach, biz buni qilamiz.

Xayrli kun, o'quvchilar va bu erga endi kelganlar. Men YouTube kanaliga obunachiman AleksGyver va "Kompyuter apparati monitoringi" haqidagi videoni ko'rish,

Men ushbu uy qurilishi mahsulotini takrorlashga qaror qildim, chunki ... Menga juda qiziq tuyuldi va men har doim tizim holatini kompyuter monitorida emas, balki qo'shimcha ekranda apparat usulida ko'rsatishni xohlardim. Kompyuterdan yasang Rojdestvo daraxti Men xohlamadim, shuning uchun RGB yoritgichini o'rnatmaslikka qaror qildim, shuningdek, rad etishga qaror qildim uy qurilishi reobass, chunki Mening Gigabayt onam BOIS yordamida hech qanday vositachilarsiz fan tezligini qanday boshqarishni juda yaxshi biladi.

Men muallif tomonidan taklif qilingan eng arzon komponentlarni tanladim va buyurtma qildim:

  1. ATmega 328 https://goo.gl/DkWhmU
  2. Ulanish simlari https://goo.gl/NHmQqs
  3. 4 qatorli ekran 20 belgi https://goo.gl/4MAowg

Men bularning barchasini bitta sotuvchiga buyurtma qildim, shunda u birga, bitta posilkada keladi. Kichkina layfxik: agar siz hamma narsani savatga jo'natish to'lovi bo'lgan bitta sotuvchidan qo'yib, keyin bir marta to'lasangiz, etkazib berish to'lovi bir marta olinadi. (Va 3 ta mahsulotning har biri uchun emas).

4. Men mini USB kabeliga buyurtma bermadim va uni to'g'ridan-to'g'ri Arduino-ga lehimladim va uni simlar bilan (2-banddan) ichki USB ulagichiga uladim. Lekin tashvishlanishingiz shart emas va https://goo.gl/LA7sb3 ga buyurtma berish osonroq

Va u kutishni boshladi. Hammasi juda tez keldi, 15 kun ichida. Shuningdek, sxemada tugma mavjud bo'lib, u yopiq bo'lsa, tizimning holati haqida ma'lumotga ega ekranlarni almashtiradi. Avval buni oldim:

lekin g'oya unchalik yaxshi emas edi, chunki... uni kompyuterning old paneliga mahkamlash uchun hech narsa yo'q edi. Shu sababli, mahalliy radioelektronika do'konida korpusga qulay biriktirilgan, shuningdek, tunda bu "mo''jiza" ni o'chirish uchun o'tish tugmasi bilan qulflanmagan tugma tanlangan. Chunki mening kompyuterimning USB portiga ulangan hamma narsa doimiy ravishda quvvatlanadi va yonadi va miltillaydi, faqat kompyuterni rozetkadan uzish orqali o'chadi.

Umuman olganda, men bu mo''jizani o'rnatish uchun bir necha soat vaqt sarfladim texnik taraqqiyot, kompyuterning old qopqog'ida ekran uchun joyni kesib, tugma va o'tish tugmasi uchun teshiklarni burg'ulash. Keyingi, uchun to'liq huquqli ish, bularning barchasi sxema bo'yicha lehimlanishi va kompyuter resurslarini kuzatish uchun rezident dasturni ishga tushirish kerak edi. Mana nima bo'ldi:

Xo'sh, bu juda yaxshi chiqdi, deyarli men xohlaganimdek. Bu haroratni uzatuvchi dasturiy ta'minotdagi kichik muammolarni bartaraf etish uchun qoladi. Ba'zi sabablarga ko'ra ular maksimal darajada uzatiladi: sensorli mat. CPU, GPU, anakart platalari, bu sizning kompyuteringizni jim holatda, bo'sh harorat yuqori bo'lmaganda kuzatishingizga to'sqinlik qiladi.

Agar kimdir AlexGyver veb-saytidan manba kodini yuklab ololmasa, mening veb-saytimga qayta yuklash mumkin: .

Dasturni ko'zdan kechirib, men o'zimga to'g'ri kelmaydigan va umuman to'g'ri ishlamagan ko'p narsalarni topdim. Bir-ikki kechani o'tkazganimdan so'ng, do'stlarim yordamida men Arduino-dagi eskiz kodini va chiqish parametrlarini ekranga uzatuvchi OpenHardwareMonitor kodini biroz tushundim. Va u meni qoniqtiradigan o'zgarishlarni amalga oshirdi.

OpenHardwareMonitor dasturidagi o'zgarishlar:

  • protsessor harorati endi eng issiq yadroning harorati emas, balki onadan CPU sensori harorati qanday uzatiladi;
  • GPU harorati endi qanday qilib Anakart va GPU o'rtasidagi maksimal haroratni emas, balki video karta sensoridan GPU haroratini uzatadi;
  • Anakartning harorati qanday uzatiladi, bu maksimal harorat emas: anakart, onadan GPU va CPU harorati sensori va sensordan Motherboard harorati;
  • Bundan tashqari, OpenHardwareMonitor-dan 12 va 13 qiymatlarida protsessor va Motherboard fan tezligi endi mos ravishda fanatlar va orqa yoritish uchun qo'lda boshqarish bayroqlari o'rniga uzatiladi.

Arduino uchun eskizdagi o'zgarishlar:

  • Ekranni teskari tartibda o'zgartirgan ikkinchi tugmani bosish kuzatuvi olib tashlandi;
  • Ikkinchi ekranda ma'lumot chiqishi almashtirildi; endi 2 ta tashqi harorat sensori (TMP1, TMP2) harorati o'rniga men CPU fanining (FanC) va Motherboard (FanM) aylanish tezligini ko'rsataman.
  • Fanatlarni qo'lda boshqarish va yoritish uchun kuzatuv olib tashlandi.

Barcha o'zgarishlar va manbalar bilan arxivni bu yerdan yuklab olish mumkin (Biz empirik tarzda aniqlaganimizdek, OpenHardwareMonitor-dagi o'zgarishlar meniki kabi Gigabyte anakartlarida yaxshi ishlaydi va boshqa ishlab chiqaruvchilarning anakartlarida xatolar bo'lishi mumkin).

Hammaga qish va mushuklar!

Baxtli tajriba!

Tashkilotimiz serverlar va ish stantsiyalarining ishlashini kuzatish uchun Zabbix serverini o'rnatdi. Texnik jarayonning o'ziga xos xususiyatlaridan kelib chiqqan holda, asbob-uskunalar bir nechta xonalarga "tarqalgan" va korxona bo'ylab taqsimlanadi. Tabiiyki, kompyuterlarning asosiy parametrlari bilan bir qatorda (ishlaydi / ishlamaydi), men ham server xonalarida mikroiqlimni nazorat qilishni xohlayman. Shu bilan birga, odatdagidek, imkoniyatlar juda cheklangan va haroratni nazorat qilishning murakkab tizimlari (men APC rack UPS uchun termal sensorli boshqaruv platalarini o'z ichiga olaman) uchun katta mablag'larni "topish" alohida ishdir.

Asosiy server xonasida hamma narsa oddiy - bunday platalardan biri o'rnatilgan (asosiy jihozlar bilan birga o'tmishdosh tomonidan uzoq vaqt oldin sotib olingan), APC termal sensori ulangan, Zabbix-da agent yaratilgan, hamma narsa SNMP orqali ishlaydi . Zerikarli :) Masofaviy uskunani kuzatish uchun uskunalar ham, mablag' ham yo'q - yuqoriga qarang. Shu sababli, aqlli bo'lishga, byudjetni tejashga va shu bilan birga, mavjud Zabbix monitoringi infratuzilmasiga mos keladigan oddiy va arzon "taqillatuvchi" yechimni yaratish orqali yangi mahoratni rivojlantirishga qaror qilindi.

Kerakli komponentlar:

  • Tizimning asosi Arduino Nano V3 hisoblanadi
  • Mahalliy tarmoq moduli (ethernet qalqoni)
  • Va, aslida, DS18B20 asosidagi raqamli harorat sensori
Komponentlarning umumiy narxi yetkazib berish bilan birga 10 dollarni tashkil qiladi.

Qurilmani yig'ish qiyin emas. Tarmoq moduli asosiy plataga "sendvich" kabi joylashtirilgan, termal sensor uning pinlariga lehimlangan. Sensor ulanishi: qizil +5 V, qora - tuproq, sariq - ma'lumotlar; +5V va Data o'rtasida biz 4,7 kOhm tortishish qarshiligini lehimlaymiz.

Ma'lumotlar pinlari ishlatiladigan pinlar asosida tanlanadi tarmoq moduli(D10 – SS; D11 – MOSI; D12 – MISO; D13 – SCK; D2 – IRQ).

Rake: qurilma prototipida men ziddiyatga duch keldim - harorat ma'lumotlari tasodifiy ravishda "har ikki-uchta" berilgan. Buning sababi, men 2-pinga harorat sensorini biriktirganim bo'lib chiqdi, keyinroq Internetda aniqlaganimdek, paket kelganda uzilish hosil qilish uchun tarmoq moduli foydalanadi. Men uni 4-ga o'tkazdim - u soat mexanizmi kabi ishladi.

Uskunani yig'ib bo'lgach, biz dasturiy ta'minotga o'tamiz.

Qurilma tarmoqda ishlaydi va o'zini Zabbix agenti sifatida ko'rsatadi, buning uchun unga MAC va IP manzil kerak. Biz nima qulayroq ekanligini hal qilamiz - dasturlash paytida uni ulang, harorat sensori manzilidan MAC hosil qiling va DHCP orqali IP-ni oling va hokazo. Men eng oddiy yo'lni tanladim va ikkala parametrni qattiq kodladim.

Zabbix serveri bilan almashish protokoli hujjatlarda tasvirlangan. Bizning qurilmamiz ikkita buyruqqa javob beradi - agent.ping Va env.temp(bu yerda qo'shimcha ijodkorlik uchun joy bor; siz Arduino uchun mavjud bo'lgan har qanday kengaytirish modullarini - hatto namlik sensori, hatto yorug'lik sensori - yuragingiz xohlagan narsani biriktirishingiz mumkin). U boshqa barcha buyruqlarga Zabbix serveriga tushunarli standart javob bilan javob beradi.

Noldan boshlayotganlar uchun (men kabi) Arduino dasturlash Arduino IDE yordamida amalga oshiriladi, uning o'rnatilishi va konfiguratsiyasi oddiy. Komponentlarning ishlashi uchun UIPEthernet va OneWire kutubxonalari talab qilinadi, ular o'rnatiladi va Sketch menyusi - Ulanish kutubxonasi - Kutubxonalarni boshqarish... orqali loyihaga ulanadi.
Agar sizda boshqa komponentlar bo'lsa (masalan, tarmoq moduli enc28j60 da emas, balki boshqa chipda), sizga boshqa kutubxonalar kerak bo'ladi!

Tarmoq moduli va harorat sensori bilan ishlash uchun kod odatiy, Internetdan, ba'zi taxminlar va soddalashtirishlar bilan.

Kodni kontrollerga yuklagandan va chekilgan kabelni ulagandan so'ng, biz konsoldan tekshiramiz:

$ 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: zabbix.com saytida joylashtirilgan Windows uchun zabbix_get ning kompilyatsiya qilingan versiyasi eskirgan va boshqa protokoldan foydalanadi (server so'rovida ZBXD\x01 sarlavhasi bilan). Linux versiyasi yangilangan va protokol berilgan kodga mos keladi.

Hamma narsa mo'ljallangandek ishlaydi. Zabbix admin panelida biz tanlangan IP bilan yangi xost yaratamiz, u ikkita kalitni o'z ichiga oladi, Numeric (imzosiz) agent.ping va Numeric (float) env.temp va ishdan zavqlanamiz. Grafiklar, triggerlar - hamma narsa odatdagidek.

Qurilma mahalliy USB orqali quvvatlanadi. Koson - ixtiyoriy: mos plastik quti, issiqlik qisqarishi, ko'k elektr lenta.

Sensorning o'lchamlari taxminan 0,06 (aniqrog'i, 1/16) ° C, aniqlik - erigan qorga botganda, u 0,19 ° C ni ko'rsatdi (balki u pastga tushgan bo'lar edi, lekin qor oz edi va hammasi erib ketdi. tez). Menimcha, bu 10 dollar turadigan qurilma va tavsiflangan maqsadlar uchun etarli.

Eskiz

#o'z ichiga oladi #o'z ichiga oladi bayt mac = ( 0xDE, 0x05, 0xB6, 0x27, 0x39, 0x19 ); // tasodifiy MAC bayt ip = ( 192, 168, 4, 5 ); // Mahalliy tarmoqdagi IP manzil String readString = String(20); bayt manzili; OneWire ds(4); // DS18B20 pin 4 EthernetServer serveri (10050); // Zabbix port void setup() ( Ethernet.begin(mac, ip); server.begin(); ds.search(addr); ) void loop() (bayt ma'lumotlar; float tsellsiy; readString = ""; agar ( EthernetClient mijozi = server.available()) ( while (client.connected()) ( if (client.available()) ( char c = client.read(); if (c == "\n") // end zabbix serveridan so'rovlar ( client.print("ZBXD\x01"); // javob sarlavhasi agar (readString == "agent.ping") (bayt respondBytes = (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) ; // muntazam (parazit bo'lmagan!) quvvat kechikishi (1000); ds.reset(); ds.select(addr); ds.write(0xBE); // Scratchpad ma'lumotlarini o'qish = ds.read() bilan konvertatsiya qilishni boshlang. ; ma'lumotlar = ds.read(); int16_t xom = (ma'lumotlar<< 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(); } }