Οικιακός μετεωρολογικός σταθμός στο Arduino και αποστολή δεδομένων στο "People's Monitoring". Μετεωρολογικός σταθμός στο NodeMcu. Δημόσια παρακολούθηση Λήψη δεδομένων που αποστέλλονται από το "Port Monitor" στο Arduino

Αυτό είναι ένα κοινό έργο. Οι σύνδεσμοι προς τα κανάλια, τον ιστότοπο και το αρχείο συγγραφέων θα βρίσκονται στο τέλος της περιγραφής. Δημιουργείται σύστημα ελέγχου μπλοκ για τον Αιολικό και Ηλιακό Σταθμό. Διαθέτουμε δύο εξοχικές κατοικίες με εναλλακτική παροχή ενέργειας. Στη μία περιοχή υπάρχει εξωτερικό ηλεκτρικό ρεύμα, στη δεύτερη υπάρχει παντελής απουσία. Οι τοποθεσίες βρίσκονται σε διάφορες περιοχές της Ρωσίας. Στην πρώτη τοποθεσία υπάρχει μια σπιτική ανεμογεννήτρια ισχύος 1 kW, 6 σταθερά ηλιακά πάνελ, 100 W το καθένα, συνδεδεμένα σε σειρά, δύο τεμάχια στα 24 V και 6 αυτοσχέδια πάνελ, επίσης συνδεδεμένα στα 24 volt, εγκατεστημένα σε ηλιακός ιχνηλάτης. Στη δεύτερη τοποθεσία, υπάρχουν 4 μόνιμα εγκατεστημένα πάνελ των 100 W το καθένα και 2 αυτοσχέδια πάνελ των 60 W το καθένα, επίσης συνδεδεμένα σε σύστημα 24 volt. Το έργο θα επιτρέψει τη σύνδεση συστημάτων 12 volt και 24 volt χωρίς μηχανικές αλλαγές. Το σύστημα αποτελείται από πέντε ανεξάρτητα μπλοκ. Η επικοινωνία μεταξύ των μονάδων πραγματοποιείται μέσω ραδιοφωνικού καναλιού μέσω μονάδων NRF24L01 (με εξωτερική κεραία).

  1. Ενότητα "Μονάδα ελέγχου" με βάση ARDUINO MEGA2560— συλλέγει όλες τις πληροφορίες και τις εμφανίζει στην οθόνη LCD IIC/I2C 2004 4Χ20,ελέγξτε μπλοκ, συσκευές και εισάγετε διάφορες ρυθμίσεις χρησιμοποιώντας Πληκτρολόγιο matrix 4X4.Θερμοκρασία, υγρασία, πίεση (αισθητήρας πίεσης bmp180), ημερομηνία, ώρα (ώρες DS3231). Όλες οι πληροφορίες ρύθμισης εισάγονται μέσω του μενού και αποθηκεύονται στο EEPROM. Αφού ρυθμίσετε όλους τους απαραίτητους συντελεστές διόρθωσης στη λειτουργία εντοπισμού σφαλμάτων, αυτά τα δεδομένα αποστέλλονται μέσω ραδιοφωνικού καναλιού στα μπλοκ του, γεγονός που σας επιτρέπει να ρυθμίσετε με ακρίβεια όλα τα δεδομένα. (Το μπλοκ συνεχίζει να αναπτύσσεται).
  2. Ενότητα "μπλοκ βατόμετρου" με βάση ARDUINO NANOμαζί με τη μονάδα ισχύος - μετρά και υπολογίζει τα εισερχόμενα και εξερχόμενα ρεύματα και τάσεις χρησιμοποιώντας μια ράβδο μέτρησης με αισθητήρες ρεύματος εγκατεστημένους σε αυτήν ACS712 30A και ACS754SCU 100A, ADS1015 12-bit ADC, ωμικοί διαιρέτες τάσης. Επιπλέον, ρυθμίζει την τάση που παράγεται από την ανεμογεννήτρια που έχει ρυθμιστεί στις παραμέτρους χρησιμοποιώντας φορτίο έρματος, θερμαίνει νερό με προστασία βρασμού με βάση έναν σφραγισμένο αισθητήρα DS18B20. Απενεργοποιεί τον μετατροπέα όταν οι μπαταρίες είναι αποφορτισμένες κάτω από το % που ορίζεται στις παραμέτρους. Περιλαμβάνει σύστημα ψύξης για τριφασική διοδική γέφυρα (Αισθητήρας DS18B20).
  3. Ενότητα "Μπλοκ γεννήτριας ανέμου" με βάση ARDUINO NANO— Αποτελείται από δύο μπλοκ:
  • Απευθείας, η «Μονάδα Ανεμογεννήτριας» μετρά και μεταδίδει: ταχύτητα γεννήτριας (αισθητήρας Hall), θερμοκρασία των περιελίξεων της γεννήτριας, θερμοκρασία και υγρασία του διαμερίσματος της γεννήτριας ( DS18B20 και DHT22), προσδιορισμός ημέρας και νύχτας ( φωτοαντιστάσεις). Θέση ουράς ανεμογεννήτριας. Και επίσης, για λόγους ασφαλείας, φάρος LED τριών ακτίνων (ιστός ανεμογεννήτριας ύψους 17 m).
  • "Μπλοκ ανεμόμετρο" - μέτρηση ταχύτητας ανέμου (αισθητήρας Hall), ένδειξη κατεύθυνσης ανέμου (αισθητήρες Hall, ψηφιακή επέκταση θύρας IIC I2C MCP23017).

4. Μονάδα "Διακομιστής WEB" με βάση ARDUINO MEGA 2560και διαδικτυακή ασπίδα W5100 Ethernet— εμφανίζει όλες τις πληροφορίες σχετικά με το εργοστάσιο ηλεκτροπαραγωγής στον ιστότοπο για τη δυνατότητα παρακολούθησης των μετρήσεων εξ αποστάσεως.

5. Μονάδα “Solar Tracker” - έλεγχος της θέσης των ηλιακών συλλεκτών στον ήλιο και έγκαιρα εάν δεν υπάρχει, έλεγχος με τηλεχειριστήριο IR, αυτόματη επιστροφή του ιχνηλάτη στη θέση προς τα ανατολικά μετά το βράδυ. Ρύθμιση του ιχνηλάτη στη θέση «προστασία από τον αέρα» σε περίπτωση που η ταχύτητα του ανέμου υπερβεί την καθορισμένη. Έλεγχος μονάδας παρακολούθησης. Η μονάδα πράγματι λειτουργεί εδώ και ένα χρόνο. Δεν υπάρχει ακόμα στο αρχείο, γιατί... Εφαρμόζεται στο γενικό μπλοκ διάγραμμα.

Το έργο ξεκίνησε να χρησιμοποιεί την οθόνη NEXTION (ένα υπέροχο πράγμα, σίγουρα θα το χρησιμοποιήσουμε κάπου), αλλά στη συνέχεια το εγκαταλείψαμε, λόγω μεγάλων καθυστερήσεων λόγω του όγκου των μεταδιδόμενων πληροφοριών και της απόφασης να κάνουμε το σύστημα αρθρωτό.

Επίσης, όλα τα ARDUINO NANO αναβοσβήνουν μέσω WiFi χρησιμοποιώντας ESP8266-01. Αυτό γίνεται για την ενημέρωση του υλικολογισμικού, σε περίπτωση διόρθωσης σκίτσου, χωρίς να αφαιρεθούν τα μπλοκ από τις τοποθεσίες εγκατάστασής τους. Υπάρχει ακόμα ένα πρόβλημα με το MEGA2560, γνωρίζουμε τον λόγο, αλλά δεν μπορούμε να το λύσουμε ακόμα. Αλλά αυτό είναι μια διαφορετική ιστορία.

Σκίτσα σε μορφή FLProg, πλακέτες τυπωμένων κυκλωμάτωνσε μορφή Sprint-Layout σε τακτική ενημέρωση

Συνεχίζουμε να αναπτύσσουμε τον μετεωρολογικό μας σταθμό.

Πριν προχωρήσουμε στην ενημέρωση, θέλω να διευκρινίσω λίγο.

Ένας από τους συναδέλφους μας μου έγραψε ρωτώντας γιατί εισήχθη το χρονόμετρο παρακολούθησης;

Ο χρονοδιακόπτης παρακολούθησης βρίσκεται στη θέση του σε περίπτωση έκτακτης ανάγκης. Όπως δείχνει η πρακτική, το ENC28J60 δεν χειρίζεται περισσότερες από (εκτός εάν η μνήμη αποτύχει) 4 ταυτόχρονες συνδέσεις. Λαμβάνοντας υπόψη πόσες συνδέσεις υπηρεσιών πραγματοποιούνται συνεχώς για να διατηρηθεί η λειτουργία του ίδιου του δικτύου και μόλις έμεινε η κίνηση που δημιουργήθηκε από όλα τα είδη οικιακών παιχνιδιών (για παράδειγμα, σύγχρονες τηλεοράσεις, σάρωση των διαθέσιμων κεντρικών υπολογιστών στο δίκτυο και των ανοιχτών θυρών τους) η σχεδίαση απλώς καταλήγει σε λήθαργο. Το ENC28J60 δεν μπορεί να λειτουργήσει ανεξάρτητα πρωτόκολλα δικτύουκαι όλα υλοποιούνται σε βιβλιοθήκες. Ίσως είναι μόνο αυτοί.
Έλεγξα όλες τις διαθέσιμες βιβλιοθήκες και διάφορες μονάδες (ξαφνικά ελαττωματικές), αλλά δεν κατάφερα να επιτύχω σταθερή λειτουργία για μεγάλο χρονικό διάστημα. Η μέγιστη περίοδος ήταν περίπου 3-4 εβδομάδες.
Αυτός είναι ο λόγος που ο «σκύλος» γυρίζει εκεί και, αν συμβεί κάτι, τραβάει το χειριστήριο. Μετά από αυτό το πρόβλημα εξαφανίστηκε.
Επίσης δεν αρνούμαι ότι είναι δυνατό στο δικό μου οικιακό δίκτυουπάρχουν ορισμένες αποχρώσεις ή προβλήματα. Αλλά επειδή είχα πρόβλημα, μπορεί να το έχει και άλλο άτομο. Μέχρι στιγμής έχω βρει μόνο αυτή τη λύση.
Από όσο γνωρίζω, οι μάρκες από το Wiznet (W5100 και νεότερο) δεν το έχουν αυτό ή απλώς δεν φαίνονται αρκετά καλά.

Ας προχωρήσουμε στην ενημέρωση

Το πιο σημαντικό, απομακρυνόμαστε από το τσιπ ENC28J60και πηγαίνετε στο W5100. Προσπάθησα να εφαρμόσω τα πάντα στο παλιό τσιπ, αλλά δεν υπάρχει αρκετή μνήμη μικροελεγκτή λόγω πολύ μεγάλων βιβλιοθηκών για ENC28J60. Όταν χρησιμοποιείτε ένα νέο τσιπ, τυπικόβιβλιοθήκες από τον προγραμματιστή και όλες τις αλλαγές που έγιναν, μένουν ακόμα περισσότερες 20% δωρεάν μνήμη μικροελεγκτή ATMega328. Και αυτά είναι νέα ψωμάκια!

Σε αυτή την έκδοση (ας την ονομάσουμε δεύτερη) η δυνατότητα μετάδοσης μετρήσεων από αισθητήρες μέσω ασύρματη επικοινωνίαχρησιμοποιώντας συχνότητα 433 MHz. Πήρα τις ίδιες τις ενότητες από τους Κινέζους, σημάνσεις XY-MK-5V. Θα ήθελα να σημειώσω ότι η ποιότητα της μετάδοσης απέχει πολύ από το να είναι τέλεια. Πιθανή απώλεια σήματος, θόρυβος, αδυναμία ταυτόχρονης μετάδοσης κ.λπ., κ.λπ. Αλλά η τιμή τους (λιγότερο από 1 $ ανά σετ) αντισταθμίζει αυτές τις ελλείψεις. Θα σας πω ένα μυστικό ότι αυτές οι (οι φθηνότερες) μονάδες βρίσκονται σε πολλούς επώνυμους μετεωρολογικούς σταθμούς οικιακή χρήση. Ουάου, απροσδόκητο;

Ας ξεκινήσουμε με τον σταθμό βάσης

κινούμαστε σε Arduino UNO Και Ασπίδα Ethernet(πρώτη έκδοση) με βάση το τσιπ W5100. Αυτό είναι ένα σάντουιτς και δεν έχει νόημα να το περιγράψω. Θα περιγράψω μόνο τις επιπλέον εμπλεκόμενες επαφές για τις ενότητες XY-MK-5V.

Η μονάδα πομπού χρησιμοποιεί ισχύ 5V, GND(που θα ήμασταν χωρίς μάνα) και Δ2καρφίτσα στο χειριστήριο. Επεξεργασία επαφής D2 (ΔΕΔΟΜΕΝΑ)μπορείτε να χρησιμοποιήσετε τη λειτουργία vw_set_tx_pinαπό τη βιβλιοθήκη της vw.

Σε αντίθεση με το προηγούμενο σκίτσο, αυτό χρησιμοποιεί δύο επιπλέον βιβλιοθήκες:

#περιλαμβάνω #περιλαμβάνω

Το ίδιο το σκίτσο

Κρυφό κείμενο

#περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #define DHTTYPE DHT22 #define DHTPIN 5 DHT dht(DHTPIN, DHTTYPE); byte mac = (0x54, 0x34, 0x31, 0x31, 0x31, 0x31); διακομιστής char = "narodmon.ru"; int port = 8283; Διεύθυνση IPΑ ip(192,168,0,201); πελάτης EthernetClient. BMP085 dps = BMP085(); long Θερμοκρασία = 0, Πίεση = 0; float H, dP, dPt; διάστημα bool = true; EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( Αναγνωριστικό byte; // Αναγνωριστικό συσκευής int Θερμοκρασία; // Πίεση επιπλεύσεως θερμοκρασίας; // Υγρασία πλωτή πίεσης; // Σημείο δρόσου επιπλεύσεως υγρασίας; // Σημείο δρόσου/πάγωσης); SEND_DATA_STRUCTURE μετάδοση. void setup() ( // Εκκίνηση του χρονοδιακόπτη Watchdog wdt_disable(); delay(8000); wdt_enable(WDTO_8S); // Εκκίνηση της κονσόλας Serial.begin(9600); // Εκκίνηση του αισθητήρα DHT dht.begin(); / / Εκκίνηση της μονάδας 433 MHz 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); // Initializing 1-Wire Wire.begin(); delay(200); // Initializing BMP180 με ρύθμιση ύψους // dps.init (MODE_STANDARD, 3200, true); // Initialize 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 διπλό σημείο δρόσου(διπλός Κελσίου , διπλή υγρασία) ( // (1) Πίεση ατμών κορεσμού = ESGG(T) διπλός ΛΟΓΟΣ = 373,15 / (273,15 + Κελσίου); διπλό 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 * (RATIO - 1))) - 1) ; RHS += log10(1013.246); // ο συντελεστής -3 είναι για τη ρύθμιση των μονάδων - Πίεση ατμών SVP * υγρασία διπλή VP = pow(10, RHS - 3) * υγρασία; // (2) DEWPOINT = F(Πίεση ατμών) διπλό T = log(VP/0,61078); // temp var επιστροφή (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=DewPoint(Θερμοκρασία*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 MHzΈνα συνηθισμένο μακρύ χάλκινο σύρμα είναι αρκετό 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( Αναγνωριστικό byte; // Αναγνωριστικό συσκευής 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 rst 8 char Θερμοκρασία, Πίεση, Υγρασία, Σημείο δρόσου; Πληροφορίες συμβολοσειράς. TFT TFTscreen = TFT(cs, dc, rst); void setup())( Serial.begin(9600); // Αρχικοποίηση της μονάδας 433 MHz ET.begin(details(broadcast)); vw_set_ptt_inverted(true); vw_set_rx_pin(7); vw_setup(2000); vw_rx_st); // Αρχικοποίηση και αρχική ρύθμιση οθόνης 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 .text ("%), w/2+5, 100); TFTscreen.text("C", w/2+5, 120); εκπομπή. Θερμοκρασία = 0; εκπομπή. Πίεση = 0; εκπομπή. Υγρασία = 0 ; εκπομπή .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 change(int size, int x, int y, bool up, bool clear = false) ( if(clear) TFTscreen.stroke(0, 0, 0); else ( αλλαγές(μέγεθος, x, y, !επάνω, true); TFTscreen.stroke((επάνω)?0:255, 0, (πάνω);255:0); ) if((μέγεθος%2) == 0 ) μέγεθος++; while(size > 0) ( TFTscreen.line(x, y, x+(size--), y); ++x, (up)?--y:++y, --size; ) /* while( μέγεθος > 0) ( TFTscreen.line(x, y, (πάνω)?x+μέγεθος-1:x, (επάνω)?y:y+μέγεθος-1); ++x, ++y, --μέγεθος; ) */ ) int x_center(int w, int μήκος, int μέγεθος) ( return floor((w-length*(size*5)+size*2)/2); ) int x_alignment_right(int w, int length, int μέγεθος) ( return ceil(w-length*(size*5)+size*2); ) void TFTPrint() ( size = 3; // ================ ================================================== === ===============// Εμφάνιση ενδείξεων θερμοκρασίας // ========================= ============================================== αν(μεταδοση. Θερμοκρασία != Θερμοκρασία καταγραφής .toCharArray(Θερμοκρασία, info.length()+1); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Θερμοκρασία, x_center(w, info.length()+1 , μέγεθος), 35); / / Εμφάνιση πληροφοριών νέων αναγνώσεων = String (μετάδοση. Θερμοκρασία); 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); // Red b = map(broadcast.Temperature, 0, 40, 30, 0); // Αλλαγή του απόχρωση για μια πιο οπτική μετάβαση στο μηδέν ) else ( r = χάρτης (εκπομπή. Θερμοκρασία, -40, 0, 0, 30); // Αλλάξτε την απόχρωση για μια πιο οπτική μετάβαση στο μηδέν b = χάρτης (εκπομπή. Θερμοκρασία, - 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); // Έξοδος νέων πληροφοριών αναγνώσεων = String(broadcast.Pressure); info.toCharArray(Pressure, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen .text(Pressure, x_alignment_right(w/ 2-5, info.length(), size), 80); changes(10, 106, 85, (broadcast.Pressure > Log_Pressure)?true:false); ) else ( αλλαγές (10, 106, 85, true, true); αλλαγές(10, 106, 85, false, true); ) // ====================== ======== ========================================== =========== = // Έξοδος μετρήσεων υγρασίας // =============================== =================================================== ================== if(broadcast.Humidity != Log_Humidity) ( TFTscreen.setTextSize(size); // Αντικατάσταση πληροφοριών παλαιών δεδομένων = String(Log_Humidity); info.toCharArray(Υγρασία, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Υγρασία, x_alignment_right(w/2-5, info.length(), size), 100); // Εμφάνιση πληροφοριών νέων αναγνώσεων = String(broadcast.Humidity); info.toCharArray(Υγρασία, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(Υγρασία, x_alignment_right(w/2-5, info.length(), size), 100); αλλαγές(10, 106, 105, (εκπομπή.Υγρασία > Καταγραφή_Υγρασίας)?true:false); ) else ( αλλαγές(10, 106, 105, true, true); αλλαγές (10, 106, 105, false, true); ) // ================== ================================================== === ===============// Έξοδος ενδείξεων σημείου δρόσου/σημείου παγετού // ====================== =================================================== if(broadcast.dewPoint ! = Log_dewPoint) ( TFTscreen.setTextSize(μέγεθος); // Αντικατάσταση παρωχημένων πληροφοριών δεδομένων = 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); // Έξοδος νέων αναγνώσεων info = String(broadcast.dewPoint); info.toCharArray(dewPoint, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(dewPoint, x_alignment_right(w/2-5, info.length(), size), 120); changes(10, 106, 125, (broadcast.dewPoint > Log_dewPoint)?true:false); ) else ( changes(10, 106, 125, true, true); changes(10, 106, 125, false, true); ) // Ενημερώστε τις τιμές στα αρχεία καταγραφής για επόμενα Σύγκριση ενδείξεων Log_Temperature = εκπομπή.Θερμοκρασία; Log_Pressure = εκπομπή.Πίεση; Log_Humidity = εκπομπή.Υγρασία; Log_dewPoint = εκπομπή.dewPoint; )

Οι αναγνώσεις εμφανίζονται αρκετά συμπαγείς, αλλά όπως δείχνει η πρακτική (και οι συμβουλές των συντρόφων μου) - "γεύση και χρώμα, ακόμη και η σύζυγος δεν είναι φίλη". Άκουσα πολλές συμβουλές και προτάσεις, αλλά έρχονται σε αντίθεση μεταξύ τους. Επομένως, κάντε το σύμφωνα με το γούστο σας.

Μου φάνηκε ότι ο σχεδιασμός είναι το μέρος του έργου που καταλαμβάνει τον περισσότερο χρόνο!

Κρυφό κείμενο

Ορισμένα από τα δεδομένα κατασκευάζονται για να αντικατοπτρίζουν ορισμένα στοιχεία σχεδίασης.

Τα τεχνουργήματα στην οθόνη είναι σκόνη και άλλη βρωμιά που έχει συσσωρευτεί κατά τη διάρκεια του μεγάλου χρονικού διαστήματος που βρισκόταν η οθόνη... κάπου εκεί,... λοιπόν, εκεί, δεν θυμάμαι από πού την πήρα! Ασε με ήσυχο!

Το σκίτσο έχει λειτουργίες τοποθέτησης. Είναι αρκετά πρωτόγονα, αλλά σας επιτρέπουν να επιτύχετε ορισμένα αποτελέσματα.

  1. x_center
  2. x_alignment_right

Το πρώτο κεντράρει το κείμενο και το δεύτερο το ευθυγραμμίζει στη δεξιά πλευρά της καθορισμένης ζώνης. Όλοι οι υπολογισμοί γίνονται σε σχέση με τις διαστάσεις δεδομένο κείμενο, με βάση την έκφραση 1 μέγεθος = 1PX x 1PXτμήμα γραμματοσειράς.

Η οθόνη εμφανίζει επίσης στοιχεία που αντιστοιχούν σε αύξηση ή μείωση σε μια συγκεκριμένη τιμή ανάγνωσης. Εμφανίζονται με τη μορφή τριγώνων. Αλλά στον κωδικό λειτουργίας αλλαγέςΥπάρχει μια εναλλακτική οθόνη με τη μορφή τριγώνων που περιστρέφονται κατά 45 μοίρες. Εάν οι ενδείξεις αυξηθούν, το στοιχείο είναι κόκκινο, διαφορετικά, μπλε.

Παρεμπιπτόντως, το χρώμα και η απόχρωση της κύριας θερμοκρασίας αλλάζει ανάλογα με την ίδια τη θερμοκρασία. Αρκετά αμφιλεγόμενη απόφαση, αλλά κατά τη γνώμη μου, οπτικά άνετη. Το πάλεψα για λίγο και συνειδητοποίησα ότι οι τιμές στη συνάρτηση Εγκεφαλικό, τα αντικείμενα οθόνης TFT παρατίθενται με λάθος σειρά. BGRθέση RGB. Αυτό είναι σφάλμα προγραμματιστή ή δεν καταλαβαίνω κάτι.

ΥΣΤΕΡΟΓΡΑΦΟ: Όλα είναι αρκετά ενδιαφέροντα, αλλά κατά τη γνώμη μου αξίζει περαιτέρω ανάπτυξη. Αυτό θα κάνουμε μετά από κάποιο χρονικό διάστημα.

Καλημέρα, αναγνώστες και όσους μόλις ήρθαν εδώ. Είμαι συνδρομητής στο κανάλι YouTube AlexGyver και βλέποντας ένα βίντεο σχετικά με την "Παρακολούθηση υλικού υπολογιστή",

Αποφάσισα να επαναλάβω αυτό το σπιτικό προϊόν, γιατί... Το βρήκα αρκετά ενδιαφέρον και πάντα ήθελα να εμφανίσω την κατάσταση του συστήματος με τρόπο υλικού, σε μια πρόσθετη οθόνη και όχι σε οθόνη υπολογιστή. Φτιάξτε από υπολογιστή χριστουγεννιάτικο δέντροΔεν ήθελα, γι 'αυτό αποφάσισα να μην εγκαταστήσω οπίσθιο φωτισμό RGB και επίσης αποφάσισα να αρνηθώ σπιτικό ρεόμπασο, επειδή Η μητέρα μου Gigabyte ξέρει τέλεια πώς να ελέγχει τις ταχύτητες του ανεμιστήρα χωρίς κανέναν μεσάζοντα χρησιμοποιώντας το BOIS.

Επέλεξα και παρήγγειλα τα φθηνότερα εξαρτήματα που προσφέρει ο συγγραφέας:

  1. ATmega 328 https://goo.gl/DkWhmU
  2. Σύνδεση καλωδίων https://goo.gl/NHmQqs
  3. Οθόνη για 4 γραμμές 20 χαρακτήρες https://goo.gl/4MAowg

Όλα αυτά τα παρήγγειλα από έναν πωλητή για να έρθουν μαζί, σε ένα δέμα. Και ένα μικρό life hack: αν βάλετε τα πάντα στο καλάθι από έναν πωλητή που έχει έξοδα αποστολής και στη συνέχεια πληρώσετε μία φορά, τότε η χρέωση αποστολής θα χρεωθεί μία φορά. (Και όχι για καθένα από τα 3 προϊόντα).

4. Δεν παρήγγειλα καλώδιο mini USB και το κόλλησα απευθείας στο Arduino και το σύνδεσα με καλώδια (από το σημείο 2) στην εσωτερική υποδοχή USB. Αλλά δεν χρειάζεται να ανησυχείτε και να παραγγείλετε https://goo.gl/LA7sb3 είναι πιο εύκολο

Και άρχισε να περιμένει. Όλα ήρθαν αρκετά γρήγορα, σε 15 μέρες. Υπάρχει επίσης ένα κουμπί στο κύκλωμα, το οποίο, όταν είναι κλειστό, αλλάζει οθόνες με πληροφορίες για την κατάσταση του συστήματος. Πρώτα πήρα αυτό:

αλλά η ιδέα δεν ήταν πολύ καλή, γιατί... δεν υπήρχε τίποτα για να το ασφαλίσει στον μπροστινό πίνακα του υπολογιστή. Ως εκ τούτου, σε ένα τοπικό κατάστημα ηλεκτρονικών ραδιοφώνων, επιλέχθηκε ένα κουμπί που δεν ασφάλιζε, με μια βολική προσάρτηση στη θήκη, καθώς και έναν διακόπτη εναλλαγής για να απενεργοποιήσετε αυτό το "θαύμα" τη νύχτα. Επειδή οτιδήποτε είναι συνδεδεμένο στη θύρα USB του υπολογιστή μου τροφοδοτείται συνεχώς και τείνει να ανάβει και να αναβοσβήνει, απενεργοποιώντας μόνο αποσυνδέοντας τον υπολογιστή από την πρίζα.

Σε γενικές γραμμές, πέρασα αρκετές ώρες για να φτιάξω αυτό το θαύμα τεχνική πρόοδο, κόβοντας μια θέση για την οθόνη στο μπροστινό κάλυμμα του υπολογιστή και ανοίγοντας τρύπες για το κουμπί και τον διακόπτη εναλλαγής. Στη συνέχεια, για ολοκληρωμένη εργασία, όλα αυτά έπρεπε να συγκολληθούν σύμφωνα με το κύκλωμα και έπρεπε να ξεκινήσει ένα μόνιμο πρόγραμμα για την παρακολούθηση των πόρων του υπολογιστή. Να τι συνέβη:

Λοιπόν, έγινε πολύ καλό, σχεδόν όπως ήθελα. Μένει να εξαλειφθούν τα μικρά προβλήματα στο λογισμικό που μεταδίδει θερμοκρασίες. Για κάποιο λόγο μεταδίδονται στο μέγιστο: τάπητα αισθητήρα. CPU, GPU, πλακέτες μητρικής πλακέτας, που σας εμποδίζει να παρακολουθείτε τον υπολογιστή σας σε ήσυχη κατάσταση, όταν οι θερμοκρασίες αδράνειας δεν είναι υψηλές.

Αν κάποιος δεν μπορεί να κατεβάσει τον πηγαίο κώδικα από τη σελίδα του ιστότοπου AlexGyver, ακολουθεί μια εκ νέου μεταφόρτωση στον ιστότοπό μου: .

Έχοντας ψάξει το πρόγραμμα, βρήκα πολλά που δεν μου ταίριαζαν και, γενικά, δεν λειτουργούσαν σωστά. Αφού πέρασα μερικά βράδια, με τη βοήθεια φίλων, κατάλαβα λίγο τόσο τον κώδικα του σκίτσου στο Arduino όσο και τον κώδικα OpenHardwareMonitor, ο οποίος στην πραγματικότητα μεταδίδει τις παραμέτρους εξόδου στην οθόνη. Και έκανε αλλαγές που με ικανοποίησαν.

Αλλαγές στο πρόγραμμα OpenHardwareMonitor:

  • πώς η θερμοκρασία της CPU μεταδίδεται τώρα όχι η θερμοκρασία του πιο ζεστού πυρήνα, αλλά η θερμοκρασία του αισθητήρα της CPU από τη μητέρα.
  • πώς η θερμοκρασία της GPU μεταδίδεται τώρα όχι η μέγιστη θερμοκρασία μεταξύ της μητρικής πλακέτας και της GPU, αλλά η θερμοκρασία της GPU από τον αισθητήρα της κάρτας βίντεο.
  • Ο τρόπος με τον οποίο μεταδίδεται τώρα η θερμοκρασία της μητρικής πλακέτας δεν είναι η μέγιστη θερμοκρασία μεταξύ: μητρική πλακέτα, αισθητήρας θερμοκρασίας GPU και CPU από τη μητέρα και θερμοκρασία MotherBoard από τον αισθητήρα.
  • Επίσης, στις τιμές 12 και 13 από το OpenHardwareMonitor, η ταχύτητα του ανεμιστήρα της CPU και της MotherBoard μεταδίδεται πλέον αντί για σημαίες χειροκίνητου ελέγχου για ανεμιστήρες και οπίσθιο φωτισμό, αντίστοιχα.

Αλλαγές στο σκίτσο για το Arduino:

  • Καταργήθηκε η παρακολούθηση του πατήματος του δεύτερου κουμπιού που άλλαξε τις οθόνες με αντίστροφη σειρά.
  • Στη δεύτερη οθόνη, η έξοδος πληροφοριών έχει αντικατασταθεί· τώρα, αντί για τη θερμοκρασία 2 εξωτερικών αισθητήρων θερμοκρασίας (TMP1, TMP2), εμφανίζω την ταχύτητα περιστροφής του ανεμιστήρα της CPU (FanC) και της MotherBoard (FanM).
  • Η παρακολούθηση για χειροκίνητο έλεγχο των ανεμιστήρων και του φωτισμού έχει αφαιρεθεί.

Το αρχείο με όλες τις αλλαγές και τις πηγές μπορείτε να το κατεβάσετε εδώ (Όπως μάθαμε εμπειρικά, οι αλλαγές στο OpenHardwareMonitor λειτουργούν μια χαρά σε μητρικές Gigabyte, όπως η δική μου, και πιθανότατα θα υπάρξουν σφάλματα σε μητρικές από άλλους κατασκευαστές).

Χειμώνας και γάτες σε όλους!

Ευτυχισμένοι πειραματισμοί!

Ο οργανισμός μας έχει αναπτύξει έναν διακομιστή Zabbix για την παρακολούθηση της απόδοσης των διακομιστών και των σταθμών εργασίας. Λόγω των ιδιαιτεροτήτων της τεχνικής διαδικασίας, ο εξοπλισμός «απλώνεται» σε πολλά δωμάτια και διανέμεται σε όλη την επιχείρηση. Φυσικά, μαζί με τις βασικές παραμέτρους των υπολογιστών (λειτουργεί/δεν λειτουργεί), θέλω επίσης να ελέγξω το μικροκλίμα στα δωμάτια του διακομιστή. Ταυτόχρονα, ως συνήθως, οι δυνατότητες είναι πολύ περιορισμένες και η «εύρεση» σημαντικών κεφαλαίων για πολύπλοκα συστήματα παρακολούθησης θερμοκρασίας (περιλαμβάνω πλακέτες ελέγχου με θερμικούς αισθητήρες για UPS rack APC) είναι μια ξεχωριστή αναζήτηση.

Στην κύρια αίθουσα διακομιστή, όλα είναι απλά - εγκαθίσταται μια τέτοια πλακέτα (αγοράστηκε εδώ και πολύ καιρό από τον προκάτοχο μαζί με τον κύριο εξοπλισμό), ένας θερμικός αισθητήρας APC είναι συνδεδεμένος, ένας πράκτορας δημιουργείται στο Zabbix, όλα λειτουργούν μέσω SNMP . Βαρετό :) Δεν υπάρχει εξοπλισμός για την παρακολούθηση απομακρυσμένου υλικού, ούτε κεφάλαια - δείτε παραπάνω. Ως εκ τούτου, αποφασίστηκε να είμαστε έξυπνοι, να εξοικονομούμε προϋπολογισμό και ταυτόχρονα να αναπτύξουμε μια νέα δεξιότητα κατασκευάζοντας μια απλή και φθηνή λύση «knock-on» που εντούτοις ταιριάζει στην υπάρχουσα υποδομή παρακολούθησης Zabbix.

Απαιτούμενα εξαρτήματα:

  • Η βάση του συστήματος είναι το Arduino Nano V3
  • Μονάδα τοπικού δικτύου (ethernet-shield)
  • Και, μάλιστα, ένας ψηφιακός αισθητήρας θερμοκρασίας βασισμένος στο DS18B20
Το συνολικό κόστος των εξαρτημάτων είναι $10 συμπεριλαμβανομένης της παράδοσης.

Η συναρμολόγηση της συσκευής δεν είναι δύσκολη. Η μονάδα δικτύου τοποθετείται στην κύρια πλακέτα σαν "σάντουιτς", ο θερμικός αισθητήρας είναι κολλημένος στις ακίδες του. Σύνδεση αισθητήρα: κόκκινο +5 V, μαύρο - γείωση, κίτρινο - δεδομένα. Μεταξύ +5V και δεδομένων συγκολλάμε μια αντίσταση έλξης 4,7 kOhm.

Η καρφίτσα δεδομένων επιλέγεται με βάση τις ακίδες που χρησιμοποιούνται μονάδα δικτύου(D10 – SS; D11 – MOSI; D12 – MISO; D13 – SCK; D2 – IRQ).

Rake: στο πρωτότυπο της συσκευής αντιμετώπισα μια σύγκρουση - τα δεδομένα θερμοκρασίας εκδόθηκαν τυχαία, "κάθε δύο έως τρεις". Ο λόγος αποδείχθηκε ότι προσάρτησα έναν αισθητήρα θερμοκρασίας στον ακροδέκτη 2, ο οποίος, όπως βρήκα αργότερα στο Διαδίκτυο, χρησιμοποιείται από τη μονάδα δικτύου για να δημιουργήσει μια διακοπή κατά την άφιξη ενός πακέτου. Το μετέθεσα στο 4ο - λειτούργησε σαν ρολόι.

Αφού συναρμολογήσουμε το υλικό, προχωράμε στο λογισμικό.

Η συσκευή θα λειτουργεί στο δίκτυο και θα προσποιείται ότι είναι πράκτορας Zabbix, για αυτό χρειάζεται μια διεύθυνση MAC και IP. Αποφασίζουμε τι είναι πιο βολικό - καλώδισέ το κατά τον προγραμματισμό, δημιουργούμε ένα MAC από τη διεύθυνση του αισθητήρα θερμοκρασίας και λαμβάνουμε IP μέσω DHCP κ.λπ. Πήρα την απλούστερη διαδρομή και κωδικοποίησα και τις δύο παραμέτρους.

Το πρωτόκολλο ανταλλαγής με τον διακομιστή Zabbix περιγράφεται στην τεκμηρίωση. Η συσκευή μας θα ανταποκριθεί σε δύο εντολές - πράκτορας.πινγκΚαι env.temp(Υπάρχει χώρος για περαιτέρω δημιουργικότητα εδώ, μπορείτε να συνδέσετε οποιαδήποτε από τις μονάδες επέκτασης που είναι διαθέσιμες για το Arduino - ακόμα και έναν αισθητήρα υγρασίας, ακόμα και έναν αισθητήρα φωτός - ό,τι θέλει η καρδιά σας). Θα ανταποκρίνεται σε όλες τις άλλες εντολές με μια τυπική απόκριση που είναι κατανοητή από τον διακομιστή Zabbix.

Για όσους ξεκινούν από το μηδέν (όπως εγώ), ο προγραμματισμός του Arduino γίνεται χρησιμοποιώντας το Arduino IDE, η εγκατάσταση και η διαμόρφωση του οποίου είναι απλή. Για να λειτουργήσουν τα στοιχεία, απαιτούνται οι βιβλιοθήκες UIPEthernet και OneWire, οι οποίες εγκαθίστανται και συνδέονται με το έργο μέσω του μενού Σκίτσο - Σύνδεση βιβλιοθήκης - Διαχείριση βιβλιοθηκών...
Εάν έχετε άλλα στοιχεία (για παράδειγμα, μια μονάδα δικτύου όχι στο 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 μπλα-μπλα ZBX_NOTSUPED
Rake: η μεταγλωττισμένη έκδοση του zabbix_get για Windows που δημοσιεύτηκε στο zabbix.com είναι ξεπερασμένη και χρησιμοποιεί διαφορετικό πρωτόκολλο (με την κεφαλίδα ZBXD\x01 στο αίτημα διακομιστή). Η έκδοση Linux είναι ενημερωμένη και το πρωτόκολλο αντιστοιχεί στον δεδομένο κώδικα.

Όλα λειτουργούν όπως προβλέπεται. Στον πίνακα διαχείρισης του Zabbix, δημιουργούμε έναν νέο κεντρικό υπολογιστή με την επιλεγμένη IP, περιέχει δύο κλειδιά, Numeric (unsigned) agent.ping και Numeric (float) env.temp, και απολαύστε την εργασία. Διαγράμματα, εναύσματα - όλα είναι ως συνήθως.

Η συσκευή τροφοδοτείται μέσω εγγενούς USB. Θήκη - προαιρετική: κατάλληλο πλαστικό κουτί, θερμοσυστελλόμενο, μπλε ηλεκτρική ταινία.

Η ανάλυση του αισθητήρα είναι περίπου 0,06 (ακριβέστερα, 1/16) °C, η ακρίβεια - όταν βυθίστηκε σε χιόνι που έλιωνε, έδειξε 0,19 °C (ίσως να έπεφτε χαμηλότερα, αλλά είχε λίγο χιόνι και έλιωσε όλα γρήγορα). Νομίζω ότι είναι περισσότερο από αρκετό για μια συσκευή που κοστίζει $10 και τους σκοπούς που περιγράφονται.

Σκίτσο

#περιλαμβάνω #περιλαμβάνω byte mac = ( 0xDE, 0x05, 0xB6, 0x27, 0x39, 0x19 ); // τυχαίο byte MAC ip = ( 192, 168, 4, 5 ); // Διεύθυνση IP στο τοπικό δίκτυο String readString = String(20); byte adr? OneWire ds(4); // DS18B20 στο pin 4 διακομιστή EthernetServer(10050); // Zabbix port void setup() ( Ethernet.begin(mac, ip); server.begin(); ds.search(addr); ) void loop() (byte data; float Celsius; readString = ""; if ( EthernetClient client = server.available()) ( while (client.connected()) ( if (client.available()) (char c = client.read(); if (c == "\n") // end ερωτήματος από διακομιστή zabbix ( client.print("ZBXD\x01"); // κεφαλίδα απάντησης if (readString == "agent.ping") ( byte answerBytes = (0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, "1"); client.write(responseBytes, 9); ) other if (readString == "env.temp") ( ds.reset(); ds.select(addr); ds.write(0x44) . ; data = ds.read(); int16_t raw = (δεδομένα<< 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(); } }