Analoge Anzeige der Computerlast

Ich habe einmal einen Beitrag von ClusterM getroffen, in dem er ein Widget in Form alter Indikatoren erstellt hat. Diese Idee hat mir sehr gut gefallen, weil dieses Projekt ein angenehmes Vintage-Gefühl vermittelt. Aber das ist Pech - ich habe nie mit dem Mikrocontroller selbst gearbeitet und ich programmiere so lala, also habe ich die Idee für lange Zeit aufgeschoben. Aber kürzlich bin ich auf ein Video gestoßen, in dem Alex das Programm mit Hilfe von Freunden von Open Source modifiziert und einen Algorithmus zur Verarbeitung von Daten aus Arduino entwickelt hat. In diesem Artikel möchte ich zeigen, wie ich diese Aufgabe implementiert habe.


Stufe I. Wie ich mit dem Boot-Monitor-Code umgegangen bin



Nach dem Herunterladen des Überwachungsprogramms habe ich ein Arduino mit einem Display verbunden, in das der Code aus der analogRead-Beispielbibliothek eingenäht wurde. Es zeigt einfach alles an, was das Arduino über den COM-Port empfängt. Wie Sie sehen können, habe ich eine Reihe von Zeichen, zuerst habe ich versucht, experimentell zu verstehen, aber dann spuckte aus Ich entschied mich für professionelleres Handeln und öffnete mit dem Codeleser den bereitgestellten Quellcode. Mit der Hilfe habe ich den Teil gefunden, der alle Daten in einem Array sendet. Zur Vereinfachung habe ich sie auf ein Blatt Papier geschrieben. Da ich Alex und seinem Team den Code hinzugefügt habe, habe ich nichts geändert. Ich habe nur die Ladewerte für Prozessor, Grafikkarte und RAM genommen. Dies sind PCdata-Werte [ 4], PCdata [5], PCdata [6]. Danach konnte ich nur noch mit Arduino weiterarbeiten.


Stufe II. Wir beschäftigen uns mit der Analyse und Verarbeitung von Daten


Ehrlich gesagt würde ich nicht sagen, dass ich es herausgefunden habe, im Stil eines Anfängerfreaks. Ich habe gerade festgestellt, dass ich den von Alex geschriebenen Code ohne Änderungen brauchte, also habe ich ihn meinem Code hinzugefügt. Das Parsen sieht folgendermaßen aus:


while (Serial.available() > 0) { char aChar = Serial.read(); if (aChar != 'E') { inData[index] = aChar; index++; inData[index] = '\0'; } else { char *p = inData; char *str; index = 0; String value = ""; while ((str = strtok_r(p, ";", &p)) != NULL) { string_convert = str; PCdata[index] = string_convert.toInt(); index++; } index = 0; isDataExist = true; } } } 

Um sicherzugehen, gebe ich über den Befehl lcd.Write abwechselnd die PCdata [4] -Werte aus, um sicherzustellen, dass ich die benötigten Daten akzeptiere.


Als nächstes begann ich, die prozentualen Daten in das PWM-Signal zu übersetzen. Da ich weiß, dass das von uns gesendete Signal Werte von 0 bis 255 sind und wir die Werte von 0 bis 100 (dies ist der Prozentsatz der Arbeitslast) mithilfe der Kartenfunktion akzeptieren und die Werte mithilfe der Einschränkungsfunktion einschränken, schreibe ich einen einfachen Code:


  cpu = map(cpu, 0, 100, 0, 255); cpu = constrain(cpu, 0, 255); analogWrite(9, cpu); gpu= PCdata[5]; gpu = map(gpu, 0, 100, 0, 255); gpu = constrain(gpu, 0, 255); analogWrite(3, gpu); mem= PCdata[6]; mem = map(mem, 0, 100, 0, 255); mem = constrain(mem, 0, 255); analogWrite(5, mem); 

Stufe III. Wie verbinde ich 3 Indikatoren mit einem Arduino?


Als ich gerade angefangen habe, habe ich nur einen Indikator angeschlossen und alles ist wirklich in Ordnung, aber sobald der zweite erscheint, beginnen Probleme. Arduino kann die beiden nicht zusammen „schwingen“, ich vermute, dass dies am Arduino-Board liegt, es gibt eine Menge Dinge, die fressen Verbrauchen Sie Energie (alle Arten von LEDs, Stabilisatoren, Schutz vor Narren usw.), wenn Sie Atmega selbst als ClusterM verwenden - es sollte sicher für zwei ausreichen. Ich löste das Problem mit Hilfe von Mosfet-Transistoren, ich hatte einen IRF520 auf dem Designer-Board mit Aliexpress, verband einen Indikator über den Mosfet und den zweiten direkt mit dem Arduino und es funktionierte. Da das Board mit Ali zu groß ist, habe ich beschlossen, es selbst zu löten. Ich wollte das Board überhaupt nicht anheben, also habe ich einen Marker mit einem Marker auf den Textolite gezeichnet.



Es kam kompakt heraus, aber für mich ist es die Hauptsache.


Das Anschlussdiagramm ist das gleiche wie das der Platine mit Ali. Nun, fast, ich habe die LED entfernt, da die Betriebsanzeige hier nicht benötigt wird.



Stufe IV. Designhintergründe für Indikator


Ich habe mein Design speziell für die Veröffentlichung aufbewahrt, aber ich habe die endgültige Skizze erfolgreich verloren, aber ein vergrößerter Prototyp ist geblieben. Später wurde mir klar, dass dies kein großes Problem ist, da ich mich an die Größe Ihrer Indikatoren anpassen muss malen Photoshop 2020, daher bin ich sicher, dass Sie es auch ändern können.



Es scheint mir, dass es sich als sehr interessant herausgestellt hat, es bleibt noch ein Platz für Schrauben und Pfeile auszuschneiden - fertig!




Stufe V. RGB-Hintergrundbeleuchtung


Da mir dabei klar wurde, dass ich die LED nirgends schieben kann - am Ende habe ich mich geweigert, aber ich habe den ursprünglichen Code gemacht, es ist sehr einfach - jeder kann damit umgehen, füge einfach alle Farben für die drei Indikatoren hinzu. Entworfen auf einem Wahnbrett - funktioniert wie eine Uhr:


  void led() { if (PCdata[4] < 20 ) { digitalWrite (6, HIGH);//,       rgb } else{ digitalWrite (6, LOW); } if (PCdata[4] > 20 && PCdata[4] < 60 );// ,     //     { digitalWrite(5, HIGH);//   -  } //      } 

Zusammenfassung
Es stellte sich ein interessantes Widget heraus, das beim Spielen, Bearbeiten von Videos und Fotos nützlich ist, da bewertet werden kann, ob der Computer überlastet ist.


Tipp - versuchen Sie, Ihre Indikatoren nicht fallen zu lassen. Ich bin versehentlich aus dem RAM gefallen und der Pfeil kehrt nicht auf Null zurück. Er ist behoben, aber es sind schreckliche Krücken.


Der ganze Code für Arduino


 //#include <Wire.h> //    //#include <LiquidCrystal.h> //    ,     //LiquidCrystal lcd(8, 9, 4, 5, 6, 7); char inData[82]; //    () int PCdata[20]; //       byte index = 0; String string_convert; bool isDataExist = false; int cpu; int mem; int gpu; void setup() { Serial.begin(9600); } void loop() { parsing(); //led();       cpu = PCdata[4]; cpu = map(cpu, 0, 100, 0, 255); cpu = constrain(cpu, 0, 255); analogWrite(9, cpu); gpu= PCdata[5]; gpu = map(gpu, 0, 100, 0, 255); gpu = constrain(gpu, 0, 255); analogWrite(3, gpu); mem= PCdata[6]; mem = map(mem, 0, 100, 0, 255); mem = constrain(mem, 0, 255); analogWrite(5, mem); } void parsing() { while (Serial.available() > 0) { char aChar = Serial.read(); if (aChar != 'E') { inData[index] = aChar; index++; inData[index] = '\0'; } else { char *p = inData; char *str; index = 0; String value = ""; while ((str = strtok_r(p, ";", &p)) != NULL) { string_convert = str; PCdata[index] = string_convert.toInt(); index++; } index = 0; isDataExist = true; } } } /*void led() { if (PCdata[4] < 20 ) { digitalWrite (6, HIGH);//       rgb } else{ digitalWrite (6, LOW); } if (PCdata[4] > 20 && PCdata[4] < 60 );// ,     ,     { digitalWrite(5, HIGH);//   -  } //      } */ 

Das Überwachungsprogramm befindet sich im Archiv von Alex
Ich habe die alte Version verwendet, sie funktioniert hervorragend, daher rate ich Ihnen.


Ich möchte Alex und seinem Team für die Fertigstellung des Open Source-Codes sowie dem ClusterM- Benutzer für die Demonstration seines Gadgets und meinem Vater für die Unterstützung beim Entschlüsseln des Codes danken.

Source: https://habr.com/ru/post/de429582/


All Articles