Arduino дээрх гэрийн цаг агаарын станц болон "Ардын хяналт" руу мэдээлэл илгээж байна. NodeMcu дээрх цаг агаарын станц. Олон нийтийн хяналт "Порт монитор"-оос Arduino руу илгээсэн өгөгдлийг хүлээн авч байна

Энэ бол хамтарсан төсөл юм. Суваг, вэбсайт болон зохиогчийн архивын холбоосууд тайлбарын төгсгөлд байх болно. Салхи, нарны цахилгаан станцын блокийн удирдлагын системийг бий болгож байна. Альтернатив эрчим хүчээр хангадаг хоёр зуслангийн байшинтай. Нэг хэсэгт гаднах цахилгаан эрчим хүч байгаа бол хоёрдугаарт бүрэн байхгүй байна. Энэ сайтууд Оросын янз бүрийн бүс нутагт байрладаг. Эхний талбайд 1 кВт чадалтай гар хийцийн салхин үүсгүүр, тус бүр нь 100 Вт чадалтай 6 суурин нарны хавтан, цуваа холбогдсон, 24 В-т хоёр хэсэг, мөн 24 вольтын хүчдэлд холбогдсон 6 гар хийцийн хавтанг суурилуулсан. нарны ажиглагч. Хоёрдахь талбайд тус бүр нь 100 Вт хүчин чадалтай 4 байнгын суурилуулсан хавтан, тус бүр нь 60 Вт-ын хүчин чадалтай 2 гар хийцийн хавтан, мөн 24 вольтын системд холбогдсон байна. Энэхүү төсөл нь 12 вольт ба 24 вольтын системийг механик өөрчлөлтгүйгээр холбох боломжийг олгоно. Систем нь бие даасан таван блокоос бүрдэнэ. Нэгжүүдийн хоорондын холбоог NRF24L01 модулиар (гадна антентай) радио сувгаар гүйцэтгэдэг.

  1. Модуль "Хяналтын нэгж" дээр суурилсан ARDUINO MEGA2560— бүх мэдээллийг цуглуулж, LCD дэлгэц дээр харуулна IIC/I2C 2004 4Х20,блокууд, төхөөрөмжүүдийг удирдаж, янз бүрийн тохиргоог ашиглан оруулна 4X4 матриц гар.Температур, чийгшил, даралт (даралт мэдрэгч bmp180), огноо, цаг (цаг DS3231). Бүх тохиргооны мэдээллийг цэсээр оруулж, EEPROM-д хадгална. Дибаг хийх горимд шаардлагатай бүх залруулгын хүчин зүйлсийг тохируулсны дараа энэ өгөгдлийг радио сувгаар блокууд руу илгээдэг бөгөөд энэ нь бүх өгөгдлийг нарийн тохируулах боломжийг олгодог. (Блок үргэлжлүүлэн хөгжиж байна).
  2. Модуль "Ваттметрийн блок" дээр суурилсан АРДУИНО НАНОэрчим хүчний нэгжийн хамт - үүн дээр суурилуулсан гүйдэл мэдрэгч бүхий хэмжих самбар ашиглан орж ирж буй болон гарч буй гүйдэл, хүчдэлийг хэмжиж тооцоолно. ACS712 30A ба ACS754SCU 100A, ADS1015 12 битийн ADC, эсэргүүцэлтэй хүчдэл хуваагч. Нэмж дурдахад, энэ нь тогтворжуулагч ачааллыг ашиглан параметрт тохируулсан салхины үүсгүүрээс үүссэн хүчдэлийг зохицуулж, битүүмжилсэн мэдрэгч дээр үндэслэн буцалгах хамгаалалттай усыг халаана. DS18B20. Батерейг параметрт заасан %-иас доогуур цэнэггүй болгох үед инвертерийг унтраана. Гурван фазын диодын гүүрний хөргөлтийн системийг багтаасан болно.(Мэдрэгч DS18B20).
  3. "Салхины генераторын блок" модуль дээр суурилсан АРДУИНО НАНО- Хоёр блокоос бүрдэнэ.
  • "Салхины үүсгүүрийн нэгж" нь генераторын хурд (холл мэдрэгч), генераторын ороомгийн температур, генераторын тасалгааны температур, чийгшлийг хэмжиж, дамжуулдаг. DS18B20 ба DHT22), өдөр шөнө тодорхойлох ( фоторезисторууд). Салхин турбины сүүлний байрлал. Мөн аюулгүй байдлын үүднээс гурван туяа LED гэрэлт цамхаг (салхины генераторын 17 м өндөр).
  • "Анемометрийн блок" - салхины хурдыг хэмжих (холл мэдрэгч), салхины чиглэлийн заагч (холл мэдрэгч, дижитал порт өргөтгөгч) IIC I2C MCP23017).

4. “ВЭБ сервер” модуль дээр суурилсан ARDUINO MEGA 2560болон интернетийн бамбай W5100 Ethernet— цахилгаан станцын талаарх бүх мэдээллийг цахим хуудсанд харуулснаар уншилтыг алсаас хянах боломжтой.

5. “Нарны зайн хэмжигч” модуль - нарны зайн хавтангийн байрлалыг нарны гэрэлд, хэрэв байхгүй бол цаг тухайд нь хянах, IR алсын удирдлага ашиглан хянах, шөнө болсны дараа трекерийг зүүн тийш автоматаар буцаах. Салхины хурд тогтоосон хэмжээнээс хэтэрсэн тохиолдолд трекерийг "салхинаас хамгаалах" байрлалд тохируулах. Tracker хөтөчийн удирдлага. Тус нэгж яг бүтэн жил ажиллаж байна. Одоохондоо архивт байхгүй, учир нь... Энэ нь ерөнхий блок диаграммд хэрэгжиж байна.

Төсөл нь NEXTION мониторыг ашиглаж эхэлсэн (гайхалтай зүйл, бид үүнийг хаа нэгтээ ашиглах нь гарцаагүй) боловч дамжуулсан мэдээллийн хэмжээ, системийг модульчлах шийдвэрийн улмаас их хэмжээний саатал гарсан тул бид үүнийг орхисон.

Мөн бүх ARDUINO NANO-г ESP8266-01 ашиглан WiFi-ээр дамжуулдаг. Энэ нь ноорог засвар хийсэн тохиолдолд суулгацын талбайн блокуудыг арилгахгүйгээр програм хангамжийг шинэчлэх явдал юм. MEGA2560-тай холбоотой асуудал байсаар байгаа бөгөөд бид шалтгааныг нь мэдэж байгаа ч шийдэж чадахгүй байна. Гэхдээ энэ бол өөр түүх юм.

FLProg формат дахь тойм зураг, хэвлэмэл хэлхээний самбар Sprint-Layout форматаар байнга шинэчлэгддэг

Бид цаг уурын станцаа үргэлжлүүлэн хөгжүүлсээр байна.

Шинэчлэлт рүү шилжихээсээ өмнө би бага зэрэг тодруулахыг хүсч байна.

Манай нэг мэргэжил нэгт над руу захидал бичсэн: яагаад харуулын цаг хэмжигч нэвтрүүлсэн бэ?

Онцгой байдлын үед харуулын цаг хэмжигчийг ажиллуулдаг. Дадлагаас харахад ENC28J60 нь нэгэн зэрэг 4 холболтоос илүү (санах ой ажиллахгүй бол) ажиллахгүй. Сүлжээний үйл ажиллагааг хангахын тулд хэдэн үйлчилгээний холболт байнга гарч ирдэг бөгөөд гэр ахуйн бүх төрлийн тоглоомоор үүсгэгдсэн урсгалыг зүгээр л орхиж байгааг харгалзан үзэх (жишээлбэл, орчин үеийн телевизүүд, сүлжээн дэх боломжтой хостууд болон тэдгээрийн нээлттэй портуудыг сканнердах) загвар нь зүгээр л тэнэг байдалд ордог. ENC28J60 нь бие даан ажиллах боломжгүй сүлжээний протоколуудбүх зүйл номын санд хэрэгждэг. Магадгүй энэ нь зөвхөн тэд юм.
Би бүх боломжтой номын сан, янз бүрийн модулиудыг шалгасан (гэнэт гэмтэлтэй байсан), гэхдээ би удаан хугацаанд тогтвортой ажиллах боломжгүй байсан. Хамгийн их хугацаа нь ойролцоогоор 3-4 долоо хоног байв.
Ийм учраас "нохой" тэнд эргэлдэж, хэрэв ямар нэгэн зүйл тохиолдвол хянагчийг татдаг. Үүний дараа асуудал арилсан.
Энэ нь миний хувьд боломжтой гэдгийг би бас үгүйсгэхгүй гэрийн сүлжээтодорхой нюансууд эсвэл асуудлууд байдаг. Гэхдээ надад асуудал тулгарсан болохоор өөр хүнд ч бас тохиолдож магадгүй. Одоогоор би зөвхөн энэ шийдлийг олсон.
Миний мэдэж байгаагаар Wiznet-ийн чипүүдэд (W5100 ба түүнээс дээш) ийм зүйл байхгүй, эсвэл зүгээр л хангалттай сайн харагдахгүй байсан.

Шинэчлэлт рүү шилжье

Хамгийн гол нь бид чипээс холдож байна ENC28J60болон очих W5100. Би бүх зүйлийг хуучин чип дээр хэрэгжүүлэх гэж оролдсон боловч маш том номын сангаас болж микроконтроллерийн санах ой хангалтгүй байна. ENC28J60. Шинэ чип ашиглах үед стандартномын сангууд хөгжүүлэгчээс болон хийсэн бүх өөрчлөлтүүдээс илүү их зүйл үлдсэн 20% үнэгүй микроконтроллер санах ой ATMega328. Мөн эдгээр нь шинэ боов юм!

Энэ хувилбарт (хоёр дахь гэж нэрлэе) мэдрэгчээс уншсан мэдээллийг дамжуулах чадвартай утасгүй холбоодавтамжийг ашиглан 433 МГц. Би модулиудыг хятадуудаас өөрсдөө авсан, тэмдэглэгээ XY-MK-5V. Дамжуулах чанар нь төгс биш гэдгийг тэмдэглэхийг хүсч байна. Боломжит дохио алдагдах, дуу чимээ, нэгэн зэрэг дамжуулах боломжгүй гэх мэт. Гэхдээ тэдний үнэ (нэг иж бүрдэл нь 1 доллараас бага) эдгээр дутагдлыг нөхдөг. Эдгээр (хамгийн хямд) модулиуд нь олон брэндийн цаг уурын станцуудаас олддог нууцыг би танд хэлье гэрийн хэрэглээ. Хөөх, гэнэтийн үү?

Суурь станцаас эхэлье

Бид нүүж байна Arduino UNO Тэгээд Ethernet Shield(эхний хувилбар) чип дээр суурилсан W5100. Энэ бол сэндвич бөгөөд үүнийг тайлбарлах нь утгагүй юм. Би зөвхөн модулиудын нэмэлт холболтуудыг тайлбарлах болно XY-MK-5V.

Дамжуулагчийн модуль нь эрчим хүчийг ашигладаг 5V, GND(ээжгүйгээр бид хаана байх байсан бэ) ба D2хянагч дээрх зүү. Харилцагчийг засах D2 (ДАТА)функцийг ашиглаж болно vw_set_tx_pin vw номын сангаас.

Өмнөх ноорогоос ялгаатай нь энэ нь хоёр нэмэлт санг ашигладаг:

#оруулна #оруулна

Ноорог өөрөө

Нуугдсан текст

#оруулна #оруулна #оруулна #оруулна #оруулна #оруулна #оруулна #оруулна #define DHTTYPE DHT22 #define DHTPIN 5 DHT dht(DHTPIN, DHTTYPE); байт mac = (0x54, 0x34, 0x31, 0x31, 0x31, 0x31); char сервер = "narodmon.ru"; int порт = 8283; IPaddress ip(192,168,0,201); EthernetClient үйлчлүүлэгч; BMP085 dps = BMP085(); урт Температур = 0, Даралт = 0; хөвөх H, dP, dPt; bool интервал = үнэн; EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( байт ID; // Төхөөрөмжийн ID int Температур; // Температурын хөвөх даралт; // Даралтын хөвөгч чийгшил; // Чийгийн хөвөгч шүүдэр цэг; // Шүүдэр/хөлдөлтийн цэг ); SEND_DATA_STRUCTURE нэвтрүүлэг; void setup() ( // Watchdog цаг хэмжигчийг эхлүүлэх wdt_disable(); delay(8000); wdt_enable(WDTO_8S); // Консолыг эхлүүлэх Serial.begin(9600); // DHT мэдрэгчийг эхлүүлэх dht.begin(); / / 433 МГц модулийг эхлүүлж байна ET.begin(details(broadcast)); vw_set_ptt_inverted(true); vw_set_tx_pin(2); vw_setup(2000); // Хэрэв бид DHCP серверээс өгөгдөл хүлээж амжаагүй бол сүлжээг эхлүүлнэ үү. дараа нь // хэрэв (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip); // 1-Wire Wire.begin(); delay(200); Delay(200); // BMP180-г эхлүүлж байгаа бол өөрсдөдөө хаяг тогтооно. өндрийн тохируулгатай // dps.init (MODE_STANDARD, 3200, үнэн); // BMP180-ийг эхлүүлэх dps.init(); Serial.println(Ethernet.localIP()); // Төхөөрөмжийг асаасаны дараа анхны өгөгдлийг илгээх send_info (үнэн); ) // dewPoint функц NOAA / / лавлагаа (1) : http://wahiduddin.net/calc/density_algorithms.htm // лавлагаа (2) : http://www.colorado.edu/geography/weather_station /Geog_site/about.htm double dewPoint(цельсийн давхар , давхар чийгшил) ( // (1) Ханалтын уурын даралт = ESGG(T) давхар ХАРЬЦАА = 373.15 / (273.15 + Цельсийн); давхар RHS = -7.90298 * (Харьцаа - 1); RHS += 5.02808 * log10(RATIO); RHS += -1.3816e-7 * (pow(10, (11.344 * (1 - 1/Харьцаа)))) - 1) ; RHS += 8.1328e-3 * (pow(10, (-3.49149 * (Харьцаа - 1))) - 1) ; RHS += log10(1013.246); // хүчин зүйл -3 нь нэгжийг тохируулах явдал юм - Уурын даралт SVP * чийгшил давхар VP = pow(10, RHS - 3) * чийгшил; // (2) DEWPOINT = F(Уурын даралт) давхар T = log(VP/0.61078); // temp var return (241.88 * T) / (17.558 - T); ) void send_info(bool eth) ( bool fail = true; while(fail) ( // Бид үр дүн гарах хүртэл DHT чийгийн мэдрэгчээс өгөгдлийг уншихыг оролддог. Тохиолдлын 90% нь бүх зүйл хэвийн ажилладаг, гэхдээ бидэнд хэрэгтэй байна. 100 % if((H = dht.readHumidity()) >= 0) ( // BMP180 мэдрэгчээс чийг ба температурыг авах dps.getPressure(&Pressure); dps.getTemperature(&Temperature); // Хэрэв шүүдэр цэгийг тооцоол. температур Цельсийн 0 хэмээс дээш байвал // 0-ээс дээш үр дүн гарна, эс тэгвээс 0 гарна. Энэ нь өвлийн улиралд төөрөгдүүлэхгүйн тулд // зайлшгүй шаардлагатай. // dP = Температур>0?((dPt=ШүүдэрЦэг(Температур*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); }

Модулуудад өөрсдөө антен нэмэх ёстой. Учир нь 433 МГцЭнгийн урт зэс утас хангалттай 17 см. Антенгүй бол та хэвийн ажиллагааг мартаж болно.

Энэ шинэчлэлийн хамгийн чухал хэсэг болох орон нутгийн утасгүй станц руу шилжье

Үүнийг хэрэгжүүлэхийн тулд (өвдөг дээр) би аналог ашигласан Arduino NANO(суурь дээр ATMega328) Мөн TFTчип дээр харуулах ST7735Sзөвшөөрөлтэйгээр 128 x 160

Нуугдсан текст



Pinout дэлгэц -> хянагч

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

Хүлээн авагчийн модуль нь зөвхөн дамжуулагчтай ижил аргаар холбогдсон байна ӨГӨГДӨЛбэхлэх D7.

Энэ нь ямар харагдаж байгааг харуулсан хэдэн зураг:

Нуугдсан текст

Хүлээн авагчийн ноорог

Нуугдсан текст

#оруулна #оруулна #оруулна #оруулна int x, y; int w = 128, h = 160; int хэмжээ; // 433 EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( байт ID; // Төхөөрөмжийн ID int Температур; // Температурын хөвөх даралт; // Даралтын хөвөгч чийгшил; // Чийгийн хөвөгч шүүдэр цэг; // Шүүдэр/хөлдөлтийн цэг ); 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 st 8 char Температур, даралт, чийгшил, шүүдэр цэг; Мөрийн мэдээлэл; TFT TFT дэлгэц = TFT(cs, dc, rst); void setup())( Serial.begin(9600); // 433 МГц модулийг эхлүүлэх // Эхлүүлэх ба дэлгэцийн анхны тохиргоо TFTscreen.begin(); TFTscreen.setRotation(2); TFTscreen.background(0, 0, 0); // Статик элементүүдийг зурах // 1. TFTscreen.stroke(255, 255) дээр зочилно уу. , 255); TFTscreen.setTextSize(1); TFTscreen.text(" ", 10, 10); // 2. Мэдрэгчийн уншилтын тайлбар TFTscreen.text("mmHg", w/2+5, 80); TFTscreen .текст ("%", w/2+5, 100); TFTscreen.text("C", w/2+5, 120); цацалт.Температур = 0; цацалт.Даралт = 0; нэвтрүүлэг. Чийгшил = 0 ; цацах .dewPoint = 0; TFTPrint(); ) хүчингүй давталт())( if(ET.receiveData())( if(broadcast.ID == 1) TFTPrint(); /* Serial.println(broadcast.Temperature) ; Цуврал.println(нэвтрүүлэг.Даралт); Цуваа.println(нэвтрүүлэг.Чийгшил); Цуваа.println(broadcast.dewPoint); Serial.println(); */ ) ) хүчингүй өөрчлөлт (int хэмжээ, int x, int y, bool up, bool clear = false) ( if(clear) TFTscreen.stroke(0, 0, 0); else ( өөрчлөлт(хэмжээ, x, y, !дээш, үнэн); TFTscreen.stroke((дээш)?0:255, 0, (дээш)?255:0); ) if((хэмжээ%2) == 0 ) хэмжээ++; while(хэмжээ > 0) ( TFTscreen.line(x, y, x+(size--), y); ++x, (дээш)?--y:++y, --size; ) /* while( хэмжээ > 0) ( TFTscreen.line(x, y, (дээш)?x+size-1:x, (дээш)?y:y+size-1); ++x, ++y, --size; ) */ ) int x_center(int w, int урт, int хэмжээ) ( буцах шал((w-урт*(хэмжээ*5)+хэмжээ*2)/2); ) int x_alignment_right(int w, int урт, int) хэмжээ) ( буцах тааз(w-урт*(хэмжээ*5)+хэмжээ*2); ) хүчингүй TFTPrint() ( хэмжээ = 3; // =============== ================================================== === =============== // Температурын заалтыг харуулах // ============== ========== ================================================ хэрэв(нэвтрүүлэг. Температур != Log_Temperature) ( TFTscreen.setTextSize(хэмжээ); // Хуучирсан өгөгдлийг дарж бичих 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(Температур, x_center(w, info.length()+1 , хэмжээ), 35); / / Шинэ уншилтын мэдээллийг харуулах = String(broadcast. Температур); info.concat("C"); if(broadcast.Temperature > 0) info = "+"+info; info.toCharArray(Температур, info.length()+1); // Температураас хамаарч температурын утгын өнгийг өөрчлөх int r, g = 0, b; if(broadcast.Temperature > 0) ( r = map(broadcast.Temperature, 0, 40, 255, 150); // Улаан b = газрын зураг (өргөн нэвтрүүлэг. Температур, 0, 40, 30, 0); // Өөрчлөх тэгээр илүү харагдахуйц шилжилтийн өнгө ) else ( r = газрын зураг(broadcast.Temperature, -40, 0, 0, 30); // Тэгээр илүү харагдахуйц шилжихийн тулд өнгийг өөрчил b = map(broadcast.Temperature, - 40, 0, 150, 255); // Цэнхэр ) TFTscreen.stroke(b, g, r); // АНХААРУУЛГА: номын сангийн өнгөний байрлал холилдсон, RGB газрыг BGR ашигладаг! TFTscreen.text(Температур, x_center(w, info.length()+1, хэмжээ), 35); ) хэмжээ = 1; // ================================================ ==== ==================================== // Гаралтын даралтын уншилт // === ====== ============================================ ========= ====================== if(broadcast.Pressure != Log_Pressure) ( TFTscreen.setTextSize(size); / / Хуучирсан өгөгдлийн мэдээллийг дарж бичих = 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 ); // Шинэ уншилтуудыг гаргана уу info = String(broadcast.Pressure); info.toCharArray(Даралт, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen .text(Даралт, x_alignment_right(w/ 2-5, info.length(), size), 80); өөрчлөлтүүд(10, 106, 85, (broadcast.Pressure > Log_Pressure)?true:false); ) else ( өөрчлөлт (10, 106, 85, үнэн, үнэн); өөрчлөлт (10, 106, 85, худал, үнэн); ) // ===================== ======== ========================================== =========== = // Гаралтын чийгшлийн заалт // ============================== ================================================== ================= if(broadcast.Humidity != Log_Humidity) ( TFTscreen.setTextSize(хэмжээ); // Хуучирсан өгөгдлийн мэдээллийг дарж бичих = String(Log_Humidity); info.toCharArray(Чийгшил, мэдээлэл.урт()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Чийглэг, x_alignment_right(w/2-5, info.length(), size), 100); // Шинэ уншилтын мэдээллийг харуулах = String(broadcast.Humidity); info.toCharArray(Чийгшил, мэдээлэл.урт()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(Чийглэг, x_alignment_right(w/2-5, info.length(), size), 100); өөрчлөлт(10, 106, 105, (нэвтрүүлэг. Чийглэг > Лог_Чийглэг)? үнэн: худал); ) else ( өөрчлөлт(10, 106, 105, үнэн, үнэн); өөрчлөлт (10, 106, 105, худал, үнэн); ) // ================= ================================================== === ============== // Шүүдэр/хөлдөлтийн цэгийн уншилтын гаралт // =========== ======== ================================================== хэрэв(broadcast.dewPoint! = Log_dewPoint) ( TFTscreen.setTextSize(size); // Хуучирсан өгөгдлийн мэдээллийг дарж бичих = 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); // Шинэ уншилтуудыг гаргах мэдээлэл = String(broadcast.dewPoint); info.toCharArray(dewPoint, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(dewPoint, x_alignment_right(w/2-5, info.length(), size), 120); өөрчлөлтүүд (10, 106, 125, (broadcast.dewPoint >) Log_dewPoint)?true:false); ) else (өөрчлөлт (10, 106, 125, үнэн, үнэн); өөрчлөлт (10, 106, 125, худал, үнэн); ) // Дараачийн бүртгэлд байгаа утгыг шинэчилнэ үү. уншилтын харьцуулалт Log_Temperature = broadcast.Temperature; Log_Pressure = broadcast.Pressure; Log_Humidity = нэвтрүүлэг.Humidity; Log_dewPoint = broadcast.dewPoint; )

Уншлага нь нэлээд нягт харагддаг, гэхдээ практикээс харахад (мөн миний нөхдийн зөвлөгөө) - "амт, өнгө, эхнэр нь ч найз биш юм." Маш олон зөвлөгөө, санал сонссон ч хоорондоо зөрчилддөг. Тиймээс үүнийг өөрийн үзэмжээр хий.

Загвар бол төслийн ихэнх цагийг зарцуулдаг хэсэг юм шиг надад санагдсан!

Нуугдсан текст

Зарим өгөгдлүүд нь дизайны зарим элементүүдийг тусгах зорилгоор бүтээгдсэн.

Дэлгэц дээрх олдворууд нь дэлгэцийг байрлуулсан удаан хугацааны туршид хуримтлагдсан тоос шороо болон бусад шороо юм ... хаа нэгтээ, ... би хаанаас авснаа санахгүй байна! Намайг тайван орхи!

Ноорог нь байрлал тогтоох функцтэй. Тэд нэлээд анхдагч боловч тодорхой үр дүнд хүрэх боломжийг олгодог.

  1. x_center
  2. x_alignment_баруун

Эхнийх нь текстийг голд байрлуулж, хоёр дахь нь заасан бүсийн баруун талд зэрэгцүүлнэ. Бүх тооцооллыг хэмжээстэй харьцуулан хийдэг өгөгдсөн текст, илэрхийлэлд үндэслэсэн 1 хэмжээ = 1PX x 1PXүсгийн сегмент.

Дэлгэц нь тодорхой унших утгын өсөлт эсвэл бууралттай харгалзах элементүүдийг харуулдаг. Тэдгээрийг гурвалжин хэлбэрээр харуулав. Гэхдээ функцийн кодонд өөрчлөлтүүд 45 градусаар эргүүлсэн гурвалжин хэлбэртэй өөр дэлгэц бий. Хэрэв уншилт нэмэгдэж байвал элемент нь улаан, эс тэгвээс цэнхэр өнгөтэй байна.

Дашрамд хэлэхэд, үндсэн температурын өнгө, сүүдэр нь температураас хамаарч өөрчлөгддөг. Маш маргаантай шийдвэр, гэхдээ миний бодлоор харахад эвтэйхэн. Би үүнтэй хэсэг хугацаанд тэмцэж, функц дэх үнэ цэнэ гэдгийг ойлгосон цус харвалт, TFT дэлгэцийн объектуудыг буруу дарааллаар жагсаасан байна. BGRгазар RGB. Энэ бол хөгжүүлэгчийн алдаа эсвэл би ямар нэг зүйлийг ойлгохгүй байна.

Жич: Бүх зүйл нэлээд сонирхолтой, гэхдээ миний бодлоор энэ нь цаашид хөгжих ёстой. Энэ бол хэсэг хугацааны дараа бидний хийх зүйл юм.

Уншигчид болон энд дөнгөж ирсэн хүмүүст энэ өдрийн мэнд хүргэе. Би YouTube сувгийн захиалагч Алекс Гивер "Компьютерийн техник хангамжийн хяналт"-ын тухай видеог үзэх,

Би энэ гар хийцийн бүтээгдэхүүнийг давтахаар шийдсэн, учир нь... Энэ нь надад нэлээд сонирхолтой санагдсан бөгөөд системийн статусыг компьютерийн дэлгэц дээр биш харин нэмэлт дэлгэц дээр техник хангамжаар харуулахыг үргэлж хүсдэг байсан. Компьютерээс хийх Зул Сарын модБи хүсээгүй тул RGB арын гэрэлтүүлэг суулгахгүй, мөн татгалзахаар шийдсэн гар хийцийн reobass, учир нь Миний Гигабайт ээж BOIS ашиглан ямар ч зуучлагчгүйгээр сэнсний хурдыг хэрхэн хянахаа маш сайн мэддэг.

Би зохиогчийн санал болгож буй хамгийн хямд бүрэлдэхүүн хэсгүүдийг сонгож, захиалсан:

  1. ATmega 328 https://goo.gl/DkWhmU
  2. Холбох утас https://goo.gl/NHmQqs
  3. Дэлгэц 4 мөр 20 тэмдэгт https://goo.gl/4MAowg

Би энэ бүгдийг нэг худалдагчаас захиалсан, ингэснээр хамтдаа, нэг илгээмжээр ирэх болно. Мөн жижиг лайф хакер: Хэрэв та тээвэрлэлтийн төлбөртэй нэг худалдагчийн бүх зүйлийг сагсанд хийж, дараа нь нэг удаа төлвөл тээвэрлэлтийн төлбөрийг нэг удаа авах болно. (Мөн 3 бүтээгдэхүүн тус бүрийн хувьд биш).

4. Би мини USB кабель захиалаагүй бөгөөд үүнийг шууд Arduino-д гагнаж, утсаар (2-р цэгээс) дотоод USB холбогч руу холбосон. Гэхдээ та санаа зовох хэрэггүй бөгөөд https://goo.gl/LA7sb3 захиалах нь илүү хялбар болно

Тэгээд тэр хүлээж эхлэв. Бүх зүйл маш хурдан, 15 хоногийн дотор ирсэн. Хэлхээнд мөн товчлуур байдаг бөгөөд энэ нь хаалттай үед системийн төлөв байдлын талаарх мэдээлэл бүхий дэлгэцийг сольж өгдөг. Эхлээд би үүнийг авсан:

гэхдээ санаа нь тийм ч сайн биш болсон, учир нь... Үүнийг компьютерийн урд самбарт бэхлэх ямар ч зүйл байгаагүй. Тиймээс орон нутгийн радио электроникийн дэлгүүрт хайрцагт тохиромжтой хавсралт бүхий түгжээгүй товчлуур, мөн шөнийн цагаар энэхүү "гайхамшгийг" унтраах унтраалгатай товчлуурыг сонгосон. Учир нь Миний компьютерийн USB порттой холбогдсон бүх зүйл байнга тэжээгддэг бөгөөд асч, анивчих хандлагатай байдаг бөгөөд зөвхөн компьютерийг залгуураас салгахад л унтардаг.

Ерөнхийдөө би энэ гайхамшгийг бүтээхийн тулд хэдэн цаг зарцуулсан техникийн дэвшил, компьютерийн нүүрэн талд дэлгэц байрлуулах газрыг хайчилж, товчлуур болон унтраалга хийх нүхийг өрөмдөнө. Дараа нь, төлөө бүрэн хэмжээний ажил, энэ бүгдийг хэлхээний дагуу гагнаж, компьютерийн нөөцийг хянахын тулд оршин суугч програмыг ажиллуулах шаардлагатай байв. Юу болсныг энд харуулав.

За бараг миний хүссэнээр дажгүй болсон. Температурыг дамжуулдаг програм хангамжийн жижиг асуудлуудыг арилгах хэвээр байна. Зарим шалтгааны улмаас тэдгээр нь хамгийн дээд хэмжээнд дамждаг: мэдрэгчтэй дэвсгэр. CPU, GPU, эх хавтангийн хавтангууд нь сул зогсолтын температур өндөр биш үед компьютерээ чимээгүй байдалд хянахаас сэргийлдэг.

Хэрэв хэн нэгэн нь AlexGyver вэбсайтын хуудаснаас эх кодыг татаж авах боломжгүй бол миний вэбсайт руу дахин байршуулах болно: .

Хөтөлбөрийг сайтар судалж үзээд би өөртөө тохирохгүй олон зүйлийг олж мэдсэн бөгөөд ерөнхийдөө зөв ажиллахгүй байна. Хэдэн үдшийг өнгөрөөсний дараа найзуудынхаа тусламжтайгаар би Arduino дээрх ноорог код болон гаралтын параметрүүдийг дэлгэц рүү дамжуулдаг OpenHardwareMonitor кодыг хоёуланг нь бага зэрэг олж мэдсэн. Тэгээд тэр миний сэтгэлд нийцсэн өөрчлөлтүүдийг хийсэн.

OpenHardwareMonitor программын өөрчлөлтүүд:

  • CPU-ийн температурыг одоо хамгийн халуун цөмийн температур биш харин эхээс CPU мэдрэгчийн температур хэрхэн дамжуулдаг вэ;
  • GPU температурыг одоо эх хавтан ба GPU хоорондох хамгийн дээд температур биш харин видео карт мэдрэгчээс GPU температур хэрхэн дамжуулж байна;
  • Эх хавтангийн температурыг хэрхэн дамжуулж байгаа нь дараахь хоорондох хамгийн дээд температур биш юм. эх хавтан, эхээс GPU болон CPU-ийн температур мэдрэгч, мэдрэгчээс эх хавтангийн температур;
  • Мөн OpenHardwareMonitor-ийн 12 ба 13 утгуудад CPU болон эх хавтангийн сэнсний хурдыг фенүүд болон арын гэрэлтүүлгийн гарын авлагын удирдлагын тугуудын оронд тус тус дамжуулдаг болсон.

Arduino-ийн ноорог дээрх өөрчлөлтүүд:

  • Дэлгэцийг урвуу дарааллаар өөрчилсөн хоёр дахь товчлуурыг дарахад хяналтыг устгасан;
  • Хоёрдахь дэлгэц дээр мэдээллийн гаралтыг сольсон; одоо 2 гадаад температур мэдрэгчийн (TMP1, TMP2) температурын оронд би CPU-ийн сэнс (FanC) болон эх хавтангийн (FanM) эргэлтийн хурдыг харуулж байна.
  • Сэнс болон гэрэлтүүлгийг гараар удирдахад зориулсан мөрийг устгасан.

Бүх өөрчлөлт, эх сурвалж бүхий архивыг эндээс татаж авах боломжтой (бидний туршилтаар олж мэдсэнээр OpenHardwareMonitor-ийн өөрчлөлтүүд минийх шиг Gigabyte эх хавтан дээр сайн ажилладаг бөгөөд бусад үйлдвэрлэгчийн эх хавтан дээр алдаа гарах магадлалтай).

Бүгдэд нь өвөл, муур!

Аз жаргалтай туршилт!

Манай байгууллага сервер болон ажлын станцуудын гүйцэтгэлийг хянах зорилгоор Zabbix серверийг байршуулсан. Техникийн үйл явцын онцлогоос шалтгаалан тоног төхөөрөмжийг хэд хэдэн өрөөнд "тархаж", аж ахуйн нэгжийн хэмжээнд тараадаг. Мэдээжийн хэрэг, компьютерийн үндсэн параметрүүдийн зэрэгцээ (ажиллах / ажиллахгүй) би серверийн өрөөнүүдийн бичил цаг уурыг хянахыг хүсч байна. Үүний зэрэгцээ, ердийнх шиг боломжууд нь маш хязгаарлагдмал бөгөөд температурын хяналтын нарийн төвөгтэй системд ихээхэн хэмжээний хөрөнгө "олж" (би APC өлгүүр UPS-ийн дулааны мэдрэгч бүхий хяналтын самбаруудыг оруулсан) тусдаа эрэл хайгуул юм.

Үндсэн серверийн өрөөнд бүх зүйл энгийн байдаг - нэг ийм самбар суурилуулсан (өмнөх төхөөрөмж нь удаан хугацааны өмнө үндсэн тоног төхөөрөмжийн хамт худалдаж авсан), APC дулааны мэдрэгч залгагдсан, Zabbix-д агент үүсгэгдсэн, бүх зүйл SNMP-ээр ажилладаг. . Уйтгартай :) Алсын техник хангамжийг хянах төхөөрөмж, хөрөнгө байхгүй - дээрээс үзнэ үү. Тиймээс ухаалаг байж, төсвөө хэмнэж, нэгэн зэрэг одоо байгаа Zabbix мониторингийн дэд бүтцэд нийцсэн энгийн бөгөөд хямд "цохих" шийдлийг бий болгох замаар шинэ ур чадварыг хөгжүүлэхээр шийдсэн.

Шаардлагатай бүрэлдэхүүн хэсгүүд:

  • Системийн үндэс нь Arduino Nano V3 юм
  • Дотоод сүлжээний модуль (ethernet-бамбай)
  • Үнэн хэрэгтээ DS18B20 дээр суурилсан дижитал температур мэдрэгч
Бүрэлдэхүүн хэсгүүдийн нийт өртөг нь хүргэлтийг оруулаад 10 доллар болно.

Төхөөрөмжийг угсрах нь тийм ч хэцүү биш юм. Сүлжээний модулийг үндсэн самбар дээр "сэндвич" шиг байрлуулж, дулааны мэдрэгчийг голтой нь гагнаж байна. Мэдрэгчийн холболт: улаан +5 В, хар - газар, шар - өгөгдөл; +5V ба Өгөгдлийн хооронд бид 4.7 кОм татах резисторыг гагнах болно.

Өгөгдлийн зүүг ашигласан зүү дээр үндэслэн сонгоно сүлжээний модуль(D10 – SS; D11 – MOSI; D12 – MISO; D13 – SCK; D2 – IRQ).

Тармуур: төхөөрөмжийн прототип дээр би зөрчилтэй тулгарсан - температурын өгөгдлийг санамсаргүй байдлаар "хоёроос гурав тутамд" гаргасан. Үүний шалтгаан нь би 2-р зүү дээр температур мэдрэгч хавсаргасан бөгөөд дараа нь интернетээс олж мэдсэнээр пакет ирэх үед сүлжээний модуль нь тасалдал үүсгэдэг. Би үүнийг 4-р байранд шилжүүлсэн - энэ нь цаг шиг ажилласан.

Техник хангамжийг угсарсны дараа бид програм хангамж руу шилждэг.

Төхөөрөмж нь сүлжээнд ажиллаж, Zabbix агент мэт дүр эсгэх бөгөөд үүний тулд түүнд MAC болон IP хаяг хэрэгтэй. Бид юу илүү тохиромжтой болохыг шийддэг - програмчлалын явцад үүнийг холбох, температур мэдрэгчийн хаягаас MAC үүсгэх, DHCP-ээр дамжуулан IP авах гэх мэт. Би хамгийн энгийн замыг сонгож, хоёр параметрийг хатуу кодлосон.

Zabbix сервертэй солилцооны протоколыг баримт бичигт тайлбарласан болно. Манай төхөөрөмж хоёр тушаалд хариулах болно - agent.pingТэгээд env.temp(энд цаашид бүтээлч байх орон зай бий; та Arduino-д ашиглах боломжтой өргөтгөлийн модулиудын аль нэгийг - чийгшил мэдрэгч, бүр гэрлийн мэдрэгч ч гэсэн - таны зүрх сэтгэлд юу ч хамаагүй холбож болно). Энэ нь бусад бүх тушаалуудад Zabbix серверт ойлгомжтой стандарт хариултаар хариулах болно.

Эхнээс нь эхэлж байгаа хүмүүсийн хувьд (над шиг) Arduino програмчлалыг Arduino IDE ашиглан хийдэг бөгөөд суулгах, тохируулах нь маш энгийн. Бүрэлдэхүүн хэсгүүдийг ажиллуулахын тулд UIPEthernet болон OneWire номын сангууд шаардлагатай бөгөөд тэдгээрийг Sketch цэс - Connect library - Manage library-ээр дамжуулан суулгаж, төсөлд холбоно.
Хэрэв танд өөр бүрэлдэхүүн хэсгүүд байгаа бол (жишээлбэл, сүлжээний модуль нь enc28j60 дээр биш, харин өөр чип дээр) байвал танд өөр номын сан хэрэгтэй болно!

Сүлжээний модуль ба температур мэдрэгчтэй ажиллах код нь зарим таамаглал, хялбаршуулсан байдлаар Интернетээс авсан ердийн код юм.

Кодыг хянагч руу байршуулж, ethernet кабелийг холбосны дараа бид консолоос шалгана.

$ 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 дээр нийтлэгдсэн Windows-д зориулсан zabbix_get-ийн эмхэтгэсэн хувилбар хуучирсан бөгөөд өөр протокол ашигладаг (серверийн хүсэлтэд ZBXD\x01 толгойтой). Линукс хувилбар нь шинэчлэгдсэн бөгөөд протокол нь өгөгдсөн кодтой тохирч байна.

Бүх зүйл зориулалтын дагуу ажилладаг. Zabbix админ самбар дээр бид сонгосон IP-тэй шинэ хост үүсгэсэн бөгөөд энэ нь Numeric (unsigned) agent.ping болон Numeric (float) env.temp гэсэн хоёр түлхүүрийг агуулж, ажлаа сайхан өнгөрүүлээрэй. График, триггерүүд - бүх зүйл ердийнх шиг байна.

Төхөөрөмж нь эх USB-ээр тэжээгддэг. Кейс - нэмэлт: тохиромжтой хуванцар хайрцаг, дулаан агшилт, цэнхэр цахилгаан соронзон хальс.

Мэдрэгчийн нягтрал нь ойролцоогоор 0.06 (илүү нарийвчлалтай, 1/16) ° C, нарийвчлал нь - хайлж буй цасанд дүрэх үед 0.19 ° C байсан (магадгүй энэ нь бага унах байсан, гэхдээ цас багатай байсан бөгөөд бүгд хайлсан) түргэн). Энэ нь 10 долларын үнэтэй төхөөрөмж болон тайлбарласан зорилгын хувьд хангалттай гэж бодож байна.

Ноорог

#оруулна #оруулна байт mac = ( 0xDE, 0x05, 0xB6, 0x27, 0x39, 0x19 ); // санамсаргүй MAC байт ip = ( 192, 168, 4, 5 ); // Дотоод сүлжээн дэх IP хаяг String readString = String(20); байт хаяг; OneWire ds(4); // DS18B20 pin 4 дээр EthernetServer сервер(10050); // Zabbix порт хүчингүй тохиргоо() ( Ethernet.begin(mac, ip); server.begin(); ds.search(addr); ) хүчингүй давталт() (байт өгөгдөл; хөвөх цельс; readString = ""; хэрэв ( EthernetClient клиент = server.available()) ( while (client.connected()) ( if (client.available()) ( char c = client.read(); if (c == "\n") // төгсгөл zabbix серверээс асуулга ( client.print("ZBXD\x01"); // хариултын толгой хэрэв (readString == "agent.ping") (байтын хариуБайт = (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) ; // ердийн (шимэгчгүй!) тэжээлийн саатал (1000); ds.reset(); ds.select(addr); ds.write(0xBE); // Scratchpad өгөгдлийг унших = ds.read()-тай хөрвүүлэлтийг эхлүүлэх ; өгөгдөл = ds.read(); int16_t түүхий = (өгөгдөл<< 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(); } }