Una vez conocí una publicación de ClusterM donde hizo un widget en forma de indicadores antiguos. Realmente me gustó esta idea porque hay una agradable sensación de vintage en este proyecto. Pero esto es mala suerte: nunca trabajé con el microcontrolador en sí y programo más o menos, así que pospuse la idea durante mucho tiempo. Pero recientemente, me encontré con un video donde Alex modificó el programa con la ayuda de sus amigos de código abierto y desarrolló un algoritmo para procesar datos de Arduino. En este artículo quiero mostrar cómo implementé esta tarea.
Etapa I. Cómo manejé el código del monitor de arranque

Después de descargar el programa de monitoreo, conecté un arduino con una pantalla en la que se coseba el código de la biblioteca de ejemplos analogRead, simplemente muestra todo lo que el arduino recibe en el puerto com. Como puede ver, obtuve una variedad de personajes, al principio traté de entender experimentalmente, pero luego escupir Decidí actuar de manera más profesional y abrí usando el lector de código que me proporcionó el código fuente. Con ayuda, encontré la parte que envía todos los datos en una matriz, los anoté en una hoja de papel para mi conveniencia, ya que no cambié el código con Alex y su equipo, simplemente tomé los valores de procesador, tarjeta de video y carga de RAM, estos son valores de PCdata [ 4], PCdata [5], PCdata [6]. Después de eso, pude continuar trabajando solo con Arduino.
Etapa II Nos ocupamos del análisis y procesamiento de datos.
Honestamente, no diría que lo descubrí, al estilo de un geek principiante, me di cuenta de que necesitaba el código escrito por Alex sin ninguna modificación, así que lo agregué a mi código. El análisis se ve así:
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; } } }
Para estar seguro, a través del comando lcd.Write, alterno los valores de PCdata [4] para asegurarme de aceptar los datos que necesito.
Luego, comencé a traducir los datos porcentuales a la señal PWM. Sabiendo que la señal que enviamos son los valores de 0 a 255, y aceptamos los valores de 0 a 100 (esta es la carga porcentual) usando la función de mapa y restringiendo los valores usando la función de restricción, escribo un código 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);
Etapa III ¿Cómo conectar 3 indicadores a un arduino?
Cuando recién comencé, conecté solo un indicador y todo está realmente bien, pero tan pronto como aparece el segundo, comienzan los problemas. Arduino no puede "balancear" los dos juntos, sospecho que esto se debe a la placa Arduino, hay muchas cosas que engullir Consuma energía (todo tipo de LED, estabilizadores, protección contra tontos, etc.) si usa el propio Atmega como ClusterM: debería ser suficiente, para dos con seguridad. Resolví el problema con la ayuda de los transistores mosfet, tenía un IRF520 en el tablero de diseño con Aliexpress, conecté un indicador a través del mosfet y el segundo directamente en el arduino y funcionó. Como el tablero con Ali es excesivamente grande, decidí soldarlo yo mismo, no quería levantar el tablero en absoluto, así que dibujé un marcador en la textolita con un marcador.

Salió de forma compacta, pero para mí es lo principal.
El diagrama de conexión es el mismo que el de la placa con Ali, bueno, casi, eliminé el LED ya que la indicación de operación no es necesaria aquí.

Etapa IV Fondos de diseño para indicador
Especialmente mantuve mi diseño para publicación, pero perdí con éxito el boceto final, pero quedó un prototipo ampliado. Más tarde me di cuenta de que este no es un gran problema, ya que será necesario ajustar el tamaño de sus indicadores, lo hice en pintar Photoshop 2020, así que estoy seguro de que también puedes modificarlo.

Me parece que resultó muy interesante, queda por cortar un lugar para tornillos y flechas, ¡listo!

Etapa V. retroiluminación RGB
Como en el proceso me di cuenta de que no tenía dónde empujar el LED, al final me negué, pero hice el código inicial, es muy simple: todos pueden manejarlo, solo agregue todos los colores para los tres indicadores. Diseñado en una placa de ilusión, funciona como un reloj:
void led() { if (PCdata[4] < 20 ) { digitalWrite (6, HIGH);//, rgb } else{ digitalWrite (6, LOW); } if (PCdata[4] > 20 && PCdata[4] < 60 );// , // { digitalWrite(5, HIGH);// - } // }
Resumen
Resultó ser un widget interesante, útil para jugar, editar videos y fotos, ya que es posible evaluar si la computadora está sobrecargada.
Consejo: trate de no dejar caer sus indicadores, me caí accidentalmente de la RAM y la flecha no vuelve a cero, está arreglada pero son muletas terribles.
Todo el código para 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; } } }
El programa de monitoreo está en el archivo de Alex
Usé la versión anterior, funciona muy bien, así que te aconsejo.
Me gustaría agradecer a Alex y su equipo por finalizar el código de código abierto, así como al usuario de ClusterM por demostrar su dispositivo y a mi padre por ayudarme a descifrar el código.