Indicateur analogique de la charge de l'ordinateur

J'ai rencontré une fois un article de ClusterM où il a créé un widget sous la forme d'anciens indicateurs. J'ai vraiment aimé cette idée car il y a une agréable sensation de vintage dans ce projet. Mais ce n'est pas de chance - je n'ai jamais travaillé avec le microcontrôleur lui-même et je programme ainsi, donc j'ai repoussé l'idée pendant longtemps. Mais récemment, je suis tombé sur une vidéo où Alex a modifié le programme avec l'aide de ses amis Open source et développé un algorithme pour le traitement des données d'Arduino. Dans cet article, je veux montrer comment j'ai mis en œuvre cette tâche.


Étape I. Comment j'ai traité le code du moniteur de démarrage



Après avoir téléchargé le programme de surveillance, j'ai connecté un arduino avec un écran dans lequel le code de la bibliothèque d'exemples analogRead a été cousu, il affiche simplement tout ce que l'arduino reçoit sur le port com. Comme vous pouvez le voir, j'ai obtenu un tableau de caractères, au début j'ai essayé de comprendre expérimentalement, mais ensuite cracher J'ai décidé d'agir plus professionnellement et j'ai ouvert en utilisant le lecteur de code le code source fourni. Avec l'aide, j'ai trouvé la partie qui envoie toutes les données dans un tableau, pour ma commodité, je les ai écrites sur un morceau de papier, puisque j'ai ajouté le code à Alex et à son équipe, je n'ai rien changé, j'ai juste pris le processeur, la carte vidéo et les valeurs de charge RAM, ce sont des valeurs de données PC [ 4], PCdata [5], PCdata [6]. Après cela, j'ai pu continuer à travailler uniquement avec Arduino.


Étape II. Nous traitons l'analyse et le traitement des données


Honnêtement, je ne dirais pas que je l'ai compris, dans le style d'un geek débutant, je viens de réaliser que j'avais besoin du code écrit par Alex sans aucune modification, alors je l'ai ajouté à mon code. L'analyse ressemble à ceci:


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; } } } 

Pour être sûr, via la commande lcd.Write, je génère alternativement les valeurs PCdata [4] pour m'assurer que j'accepte les données dont j'ai besoin.


Ensuite, j'ai commencé à traduire les données de pourcentage en signal PWM. Sachant que le signal que nous envoyons est les valeurs de 0 à 255, et que nous acceptons les valeurs de 0 à 100 (c'est le pourcentage de la charge de travail) en utilisant la fonction de carte et en restreignant les valeurs en utilisant la fonction de contrainte, j'écris un code simple:


  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); 

Étape III. Comment connecter 3 indicateurs à un Arduino?


Quand je viens de commencer, je n'ai connecté qu'un seul indicateur et tout va très bien, mais dès que le second apparaît, les problèmes commencent. Arduino ne peut pas «balancer» les deux ensemble, je soupçonne que cela est dû à la carte Arduino, il y a beaucoup de choses qui museler consommer de l'énergie (toutes sortes de LED, stabilisateurs, protection contre les imbéciles, etc.) si vous utilisez Atmega lui-même comme ClusterM - cela devrait être suffisant, pour deux à coup sûr. J'ai résolu le problème à l'aide de transistors mosfet, j'avais un IRF520 sur la carte design avec Aliexpress, connecté un indicateur à travers le mosfet et le second directement dans l'arduino et cela a fonctionné. Étant donné que la planche avec Ali est excessivement énorme, j'ai décidé de la souder moi-même, je ne voulais pas soulever la planche du tout, alors j'ai dessiné un marqueur sur le textolite avec un marqueur.



Il est sorti de façon compacte, mais pour moi, c'est l'essentiel.


Le schéma de connexion est le même que celui de la carte avec Ali, enfin, presque, j'ai retiré la LED car l'indication de fonctionnement n'est pas nécessaire ici.



Étape IV. Décors de conception pour indicateur


J'ai spécialement conservé ma conception pour publication, mais j'ai réussi à perdre le croquis final, mais un prototype agrandi est resté. Plus tard, j'ai réalisé que ce n'était pas un gros problème, car il faudra s'adapter à la taille de vos indicateurs, je l'ai fait en peindre photoshop 2020, donc je suis sûr que vous pouvez également le modifier.



Il me semble que cela s'est avéré très intéressant, il reste à découper une place pour les vis et les flèches - c'est fait!




Rétroéclairage RVB Stage V.


Depuis, dans le processus, j'ai réalisé que je n'avais nulle part où pousser la LED - à la fin j'ai refusé, mais j'ai fait le code initial, c'est très simple - tout le monde peut le gérer, il suffit d'ajouter pour toutes les couleurs pour les trois indicateurs. Conçu sur une planche délirante - fonctionne comme une horloge:


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

Résumé
Il s'est avéré un widget intéressant, utile pour jouer à des jeux, éditer des vidéos et des photos, car il est possible d'évaluer si l'ordinateur est surchargé.


Conseil - essayez de ne pas faire tomber vos indicateurs, je suis tombé accidentellement de la RAM et la flèche ne revient pas à zéro, elle est fixe mais ce sont de terribles béquilles.


Le code complet pour 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);//   -  } //      } */ 

Le programme de surveillance est dans les archives d' Alex
J'ai utilisé l'ancienne version, elle fonctionne très bien, donc je vous conseille.


Je voudrais exprimer ma gratitude à Alex et à son équipe pour avoir finalisé le code Open Source, ainsi qu'à l'utilisateur ClusterM pour avoir démontré son gadget et à mon père pour son aide dans le décryptage du code.

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


All Articles