Tabla de contenido:

Monitor de hardware de PC: 6 pasos (con imágenes)
Monitor de hardware de PC: 6 pasos (con imágenes)

Video: Monitor de hardware de PC: 6 pasos (con imágenes)

Video: Monitor de hardware de PC: 6 pasos (con imágenes)
Video: Cómo realizar maqueta de COMPUTADOR - PC, sus partes 2024, Mes de julio
Anonim
Monitor de hardware de PC
Monitor de hardware de PC
Monitor de hardware de PC
Monitor de hardware de PC
Monitor de hardware de PC
Monitor de hardware de PC

Hola a todos. Comencé este proyecto por dos razones: recientemente construí un bucle de refrigeración por agua en mi PC y necesitaba algo para llenar visualmente algo de espacio en el gabinete Y quería poder verificar las temperaturas y otras estadísticas con un vistazo rápido sin que las travesuras de OSD llenen el esquina de la pantalla. Por supuesto, hay soluciones ya preparadas para eso, pero la mayoría de ellas simplemente no se ajustan a mi feng shui. Entonces, en lugar de poner una pantalla HDMI de 7 en mi caja con un cable que sobresale de la caja y la barra de tareas de Windows siempre encendida, decidí construir mi propio juguete.

Como no soy un ingeniero ni un programador, sino solo un tipo con un soldador y algunos conocimientos autodidactas, esto no será solo un instructivo paso a paso, también intentaré concentrarme en el problema. resolución e investigación de los aspectos que me llevaron a esta construcción.

DESCARGO DE RESPONSABILIDAD: TODO MI TRABAJO SE COMPARTE COMO ATRIBUCIÓN COMÚN CREATIVA, COMPARTIDA COMO 4.0. ME INSPIRATE DE MUCHOS EJEMPLOS EN TODO INTERNET, SI RECONOCE ALGUNA PARTE DE ESTE TRABAJO COMO SUYO, POR FAVOR CONTACTE CONMIGO PARA ATRIBUCIÓN. NO SE PRETENDE INFRACCIÓN, ESTARÉ FELIZ DE CORREGIR CUALQUIER ERROR. GRACIAS

SEGUNDA EXENCIÓN DE RESPONSABILIDAD: MI TRABAJO SE COMPARTE TAL CUAL. NO SOY RESPONSABLE DE NINGÚN DAÑO DERIVADO DEL USO DE CUALQUIERA DE MI CÓDIGO O INSTRUCCIONES

Suministros

  • Arduino Nano (o UNO si quieres)
  • Pantalla TFT. En mi caso es una pantalla de 3,5 "compatible con ILI9486 / ILI9488L.
  • Sensor de temperatura. En caso de mu un sensor de temperatura analógico TMP36.
  • Cables, alambres, conectores dupont (más sobre eso más adelante)
  • (opcional) Placa de pruebas para pruebas
  • (opcional pero recomendado) un pequeño perfboard

Paso 1: Estudio de viabilidad (más o menos)

Como dije, no quería y la pantalla HDMI se atascó en la carcasa de mi PC, así que, envuelto en mi propio ingenio, comencé a buscar ideas similares en Internet. Y este es el consejo número uno: Google es tu amigo (bueno, cualquier motor de búsqueda decente…). Vivimos en un mundo donde ya nada es realmente original, pero en lugar de mirar esta frase con un significado negativo, podríamos usar esto para nuestra ventaja: lo que sea que quieras crear, probablemente alguien en algún lugar ya haya hecho algo similar, así que si no sabe cómo implementar una idea, es muy probable que encuentre información útil por ahí. Al buscar en Internet, a menudo es útil tener en cuenta dos reglas:

  1. no se moleste en ir después de la página 3 o 4 de cualquier búsqueda, casi siempre es una pérdida de tiempo. En lugar de
  2. cambie los términos de búsqueda, simplemente reformule la pregunta desde otro punto de vista (es decir: "sensor de temperatura arduino" -> "leer temperatura con arduino").

En realidad, está lleno de buenos proyectos y admito que pasé los primeros días estudiando la mayoría de estos proyectos. Pero ninguno de ellos estaba listo para ir por mí, ya que quería algo que se ajustara a mis necesidades.

Como tenía que hacer algo personalizado, decidí centrarme en el hardware adecuado para usar y dejar el lado del software para más adelante, porque el software siempre se puede crear y adaptar a las necesidades, por otro lado, el hardware estoy obligado a la disponibilidad. y características.

Quería algo basado en Arduino, porque ya lo tenía, está bien documentado y su comunidad está floreciendo. No hay problema aquí, como dije antes, mucha información.

Quería una pantalla lo suficientemente grande como para ser vista claramente desde un par de metros de distancia y que se ajustara al aspecto y la sensación de mi construcción, esto excluía cualquier pantalla de caracteres de Nokia y LCD. Los OLED también están fuera de discusión, ya que son pequeños. Así que opté por una pantalla a color TFT. No necesita pantalla táctil, ya que estará dentro de la PC. Encontré uno de 3,5 , ya diseñado para Arduino, ~ 15 € en Amazon. Bastante bueno.

Ahora, después de identificar el hardware, me concentré en el software.

Casi todos los proyectos, del lado de Arduino, son bastante similares. Solo necesito adaptar el código para la pantalla y para que el protocolo de comunicación recopile datos de la aplicación del servidor. Del lado de la computadora, la mayoría de los proyectos se basaron en C, C ++, C #, python y la mayoría de los proyectos ofrecían solo una interfaz CLI o un servidor similar a un servicio de Windows. En su lugar, quería una GUI. Nunca usé ningún lenguaje similar a C en Windows, por no hablar de la construcción de la GUI. Pero aprendí algo de Visual Basic hace 15 años, así que lo probé y descargué la versión gratuita de Visual Studio de Microsoft.

Después de estudiar muchos proyectos similares, me decidí por usar OpenHardwareMonitor para obtener toda la información del hardware y RivaTuner para FPS, porque son gratuitos y están suficientemente documentados.

Paso 2: prueba de hardware

Pruebas de hardware
Pruebas de hardware
Pruebas de hardware
Pruebas de hardware
Pruebas de hardware
Pruebas de hardware

Antes de encender el soldador y fijar para siempre en el tiempo y el espacio cualquier componente electrónico, es una buena práctica construir un prototipo de prueba (consejo número dos). Afortunadamente, ya no es 1995. Hoy en día es bastante fácil organizar prototipos bastante complejos incluso en placas de prueba pequeñas. En mi caso, la pantalla TFT tenía una caída en el pinout para Arduino Uno, así que lo dejé caer en mi Arduino uno y comencé a jugar con las bibliotecas de ejemplo y leí los manuales de referencia para comprender sus principios operativos y limitaciones.

En este punto, descubrí cómo dibujar líneas y mapas de bits y escribir texto, así que comencé a jugar con la codificación del software, dejando todas las cosas secundarias para más adelante, pero incluiré aquí el sensor de temperatura.

En algún momento, tenía un lugar vacío en la pantalla, pero ninguno de los datos de los sensores de la PC era realmente útil, así que decidí colocar un sensor de temperatura dentro de la carcasa para la temperatura ambiente. La pantalla consume casi todos los pines de Arduino, afortunadamente el pin analógico A5 no se usa, así que até un TMP36. Incluso probé un DHT22 pero es demasiado para esta aplicación.

Hay muchos ejemplos para el TMP36, acabo de copiar uno de estos en una función. El TMP35 tiene 3 pines, Vin va a 5V, GND va a tierra y Out va al pin A5. Coloqué un condensador cerámico de 0.1uF entre Vin y GND. Dicen que es necesario. Probablemente sea inútil en este caso, pero … Incluso configuré el voltaje de referencia analógico de Arduino en el pin de 3.3v para una mejor lectura de temperatura. Todavía inútil en este caso, pero …

Paso 3: Código Arduino

Descargue y abra el código Arduino incluido para seguir la explicación en este paso. Traté de dejar suficientes comentarios en el código para que quede claro sin inundarlo.

Definitivamente necesitará las bibliotecas MCUFRIEND_kbv y Adafruit GFX. Ambos se pueden instalar fácilmente desde Arduino IDE.

El programa se puede subdividir en secciones como esta:

  1. definir y declarar todas las variables globales y otras cosas necesarias
  2. inicialice la pantalla, establezca la referencia externa y dibuje la interfaz de usuario (todo esto está contenido en la función setup (), ya que debe ejecutarse solo una vez)
  3. leer datos de la conexión en serie y asignarlos en la matriz (función loop ())
  4. leer datos del sensor de temperatura externo (función readExtTemp ())
  5. imprimir datos en la pantalla (función printData ())
  6. de vuelta al bucle

SECCIÓN 1: Declaraciones y definiciones

En la sección inicial del código, utilicé muchos punteros y matrices, por lo que pude comprimir muchas líneas repetitivas de código en ciclos más cortos para escribir FOR. Sí, soy un vago. Como puede ver, declaré una matriz de punteros y la completé con todas las imágenes del archivo pics.h. Esto hizo posible hacer el truco del ciclo FOR para dibujar todos los iconos.

SECCIÓN 2: configuración (), principalmente dibujo de interfaz de usuario

Me conformé con la fuente predeterminada ya que no tiene fondo transparente, por lo que permite escribir una nueva línea de texto sobre una anterior sin necesidad de borrarla. Usar otra fuente habría significado dibujar un cuadrado negro sobre el texto anterior antes de escribir una nueva línea, lo que habría provocado un efecto de parpadeo desagradable.

Después de algunas pruebas, logré un buen compromiso entre la legibilidad y la información mostrada. Dividí la pantalla en dos columnas y 5 filas. La columna de la izquierda corresponde a los datos de la CPU y la placa base, incluido el nombre de la CPU de arriba a abajo, la temperatura, la carga, el uso de RAM y la temperatura de la placa base. El correcto dedicado a la GPU e incluye el nombre de la GPU, la temperatura, la carga, el contador de cuadros por segundo y el sensor de temperatura externo.

Como puede ver en el código, decidí evitar el uso de imágenes en la tarjeta SD, ya que es muy lenta de cargar. Decidí incluir todos los iconos en la memoria de PROGMEM y dibujar las líneas con el comando dedicado drawLine (). esto también es útil para pequeñas correcciones de la interfaz de usuario.

En el débil intento de darle a la interfaz de usuario una apariencia de profundidad, dibujé dos de todo (líneas, rectángulos, imágenes) con diferentes colores y con un pequeño desplazamiento. Lamentablemente, no es el resultado que esperaba, pero funcionará.

Las últimas líneas de esta función son para imprimir marcadores de posición en el TFT, hasta que Arduino reciba los datos.

SECCIÓN 3: bucle principal (), obtención y formateo de datos

Aquí ocurre la magia: los datos se reciben a través de una serie, se asignan a la variable correcta y luego se imprimen. Para lograr todo esto en el menor número de líneas, utilicé un comando switch case y un ciclo for.

El protocolo de comunicación con el que vine se divide en dos partes: un apretón de manos de ejecución inicial una vez y la parte de datos reales.

El protocolo de enlace es necesario para implementar la función de conexión automática cuando se inicia el programa de PC. Dice así:

  • La PC envía la cadena de protocolo de enlace (en este caso es solo "*****;")
  • Arduino envía una respuesta

Pan comido.

La parte de datos se ve así: "i: xxx, yyy, zzz, aaa,;" el significado es:

"i" es el índice, lo llamé componentSelector en el código. Los valores de "i" son:

  • i = 0 - NOMBRES. Los siguientes valores son los nombres que se muestran en la primera fila de la pantalla. Esto se enviará e imprimirá en la pantalla solo una vez, a partir de hoy es bastante difícil intercambiar CPU y GPU …
  • i = 1 - DATOS DE LA PRIMERA COLUMNA: los siguientes valores se muestran en la mitad izquierda de la pantalla de arriba a abajo. En mi caso: temperatura de la CPU, carga de la CPU, uso de RAM, temperatura de la placa base.
  • i = 2 - DATOS DE LA SEGUNDA COLUMNA - como arriba, pero para la mitad derecha de la pantalla
  • i = 3 - IMPRIMIR COMANDO. En este caso, la cadena de serie sin formato será simplemente "3:;" ya que no se necesitan otros datos.

"xxx, yyy, zzz, aaa" son los valores reales. el arduino lee como cadenas y el programa de PC realiza todo el formateo. Para i = 0, estos valores son 14 caracteres cada uno para los nombres de hardware. Para i = 1 o 2, estos serán solo tres caracteres cada uno, lo suficiente para mostrar temperaturas y cuadros por segundo. Por supuesto, los ":", "," y ";" Los caracteres están prohibidos en estos campos.

El ":" es el separador entre componentSelector y los valores, el "," es el separador de valores y el ";" es el final de la linea

Al recibir los datos, Arduino los guardará como una cadena hasta que aparezca ";" se recibe el símbolo, luego buscará el símbolo ":" y lo usará para obtener el valor de componentSelecor. Esto se utilizará para que la función de caja del interruptor seleccione el procedimiento correcto a seguir. También se utiliza para seleccionar el índice correcto en la matriz allData.

Después de esto, Arduino buscará el símbolo "," y procederá a poner los valores en la matriz allData.

Si el componenteSelector es 0, el indicador printName se establecerá en verdadero. Si componentSelector es 3, se llaman a las funciones readExtTemp () y printData ().

Sección 4: función readExtTemp ()

No hay mucho que decir aquí, lee 32 veces desde el pin A5 y emite el valor de temperatura como una cadena. Estoy con los rebeldes, entonces uso grados Celsius. Cualquier valor superior a 100 ° C es incorrecto, por lo que se mostrará como "---" en la pantalla. Para cualquier valor inferior a 100 ° C, se formateará para tener suficientes espacios para cubrir un espacio de 3 caracteres en la pantalla. Es posible quitar y volver a insertar el sensor y no se mostrará ningún valor extraño.

Sección 5: función printData ()

Como siempre, utilicé ciclos para imprimir cosas secuencialmente en la pantalla. Si el indicador printNames es verdadero, imprimirá los nombres, establecerá el indicador en falso y continuará.

Sección 6: de vuelta al bucle

Autoexplicarse lo suficiente, diría …

archivo pics.h

Aquí guardé todos los íconos de la interfaz de usuario. Es posible usar el lector de tarjetas SD incluido en la pantalla, pero me quedaba suficiente memoria en el Arduino para mis íconos en blanco y negro.

Los diseñé con Junior Icon Editor, ya que es gratis y bastante bueno para pintar íconos pequeños con píxeles. Tuve que convertir los archivos de iconos (guardados como PNG) con la herramienta en línea SKAARHOJ.

Paso 4: código de Visual Basic

Código de Visual Basic
Código de Visual Basic

Aquí está el código VB

AVISO: esta es la primera vez que comparto un proyecto de Visual Studio. Copié las carpetas del proyecto y las comprimí. Si esto no funciona, avíseme una mejor manera de compartir este tipo de proyectos. Gracias

Como dije anteriormente, no puedo crear una GUI en C # u otros lenguajes, pero tuve algunas experiencias en Visual Basic hace mucho tiempo. Descargué la edición de Visual Studio Community (es gratis, por supuesto) con el entorno de Visual Basic. Bueno, tuve que averiguar muchas cosas, ya que la última vez que usé VB fue la versión 2005 o algo así… Pero Internet está lleno de buenas pistas, como de costumbre.

Después de descubrir algunas cosas de la interfaz, la versión más nueva es en realidad más fácil y más flexible que la anterior.

Para este programa, quería algo con un formulario de Windows pero completamente manejable desde un ícono de la bandeja del sistema. De hecho, utilicé el formulario casi solo con fines de depuración, ya que me gusta poner cuadros de texto y listas para leer los valores de salida de las funciones y algunos botones de comando para probarlos.

El programa "final" es solo un icono de bandeja con un menú emergente que muestra los diversos controles y un formulario principal con dos cuadros de lista que muestran los datos enviados al Arduino.

Implementé una función de conexión automática y una función de "iniciar al arrancar". Más sobre eso más tarde.

El programa principal es solo una adaptación de varios ejemplos y fragmentos de código que utilizan la biblioteca OpenHardwareMonitor y la biblioteca RivaTuner Shared Memory.

El programa es así:

  • obtener los datos de las bibliotecas OpenHardwareMonitor y RTSSSm
  • preparar y formatear todos los datos para el protocolo de comunicación
  • enviar los datos al Arduino
  • enjuague y repita

por supuesto, los nombres de hardware se leen al inicio y se envían solo una vez.

El contador de FPS se activa solo cuando se usa una aplicación compatible (por ejemplo, un juego, un programa de modelado 3D, etc.); de lo contrario, el marcador de posición "---" se enviará a la pantalla.

No profundizaré en explicar cómo obtener los valores de las bibliotecas, ya que está bien documentado en Internet y es algo comprensible a partir del código. Solo quiero hablar sobre los problemas de hacer que la temperatura de la placa base se muestre a través de la biblioteca OpenHardwareMonitor (de ahora en adelante OHMonitor, porque la vida es demasiado corta). Tengo un Asus Maximus VIII Gene MoBo, que está equipado con sensores de temperatura fu ** ton en la placa base, pero OHMonitor los nombra como Sensor de temperatura # 1, # 2… #n Y en ninguna parte se especifica la ubicación de la temperatura. Así que tuve que instalar el horrible software de la suite Asus AI, donde los sensores tienen al menos NOMBRES y comparan las distintas temperaturas entre los dos programas. Parece que el sensor de temperatura genérico de mi placa base es el n. ° 2 para OHMonitor, así que como puede ver en el sub Timer1_tick debajo de las cosas de MoBo, tuve que buscar un nombre de sensor que contenga la cadena "n. ° 2" para obtener la lectura correcta.

TL; DR: tendrás que cuidar los sensores de temperatura de la placa base correctos por ti mismo. El resto probablemente esté listo.

Sin embargo, esta es solo la Versión 1, planeo instalar este dispositivo en mi otra PC, por lo que probablemente implemente una forma de seleccionar los sensores y tal vez incluso rediseñe la interfaz en el Arduino sobre la marcha.

La función de conexión automática

Esta función es realmente simple: si la PC no está conectada con un Arduino, cada x milisegundos (según el Timer1) se llama a esta función. Intenta conectarse con todos los puertos COM de la PC, si tiene éxito envía la cadena de protocolo de enlace "*****;". Si la respuesta es "R", entonces el dispositivo correcto está conectado y se sigue el procedimiento normal. De lo contrario, intenta el siguiente puerto COM.

Como puede ver, hay muchas excepciones en esta función. Esto se debe a que lo quería completamente plug and play, sin salida de error. Manejando las excepciones, he podido hacer que ignore la ausencia total del dispositivo externo e incluso puedo conectar y desconectar el dispositivo cuando quiera, sin generar un error de ruptura para el programa.

La función Start At Boot

Quería que el programa se iniciara al arrancar. Bastante fácil, dices. Pon un enlace en la carpeta apropiada, dices. Pero no. Debido a las bibliotecas OHMonitor y RTSS, necesitamos un nivel de ejecución de administrador para recopilar información. Esto significa la pantalla UAC completamente molesta cada vez que se inicia esta aplicación. De ninguna manera. Así que adapté el guión hecho por Matthew Wai (enlace aquí) para lograr un inicio silencioso en el arranque. Simplemente copié el script en el archivo Resources1, lo dividí en varias partes, luego implementé una subrutina que crea (o elimina) un archivo de tareas de Windows, personalizado con la ubicación actual del ejecutable del programa y cosas por el estilo.

El icono de la bandeja del sistema

Gracias a los objetos NotifyIcon y ContextMenu, he podido implementar una forma fácil y sencilla de controlar la aplicación. Simplemente haga clic con el botón derecho en el icono de la bandeja y aparecerá el menú. Existen estas opciones:

  • Iniciar en el arranque: puede marcarlo y desmarcarlo para habilitar o deshabilitar la función de inicio en el arranque
  • Conexión automática: igual que el anterior, pero maneja la función de conexión automática
  • Conectar / Desconectar: se encarga de la conexión. No funciona con la Autoconexión habilitada
  • Tiempo de actualización: ofrece un submenú desplegable, puede elegir el tiempo de actualización de 1 a diez segundos.
  • Maximizar: abre la ventana principal. Igual que hacer doble clic en el icono
  • Salida: autoexplicativo

Compilando el software

Para compilar el software probablemente necesite descargar y agregar una referencia a las bibliotecas que no se incluyen en el código.

Puede encontrar la biblioteca OpenHardwareMonitor aquí. Debe descargar el software, abrir el archivo zip y copiar el archivo OpenHardwareMonitorLib. DLL en la carpeta del proyecto.

Aquí está el enlace para la biblioteca RTSSharedMemoryNET, debe descargar y compilar para su arquitectura, luego copiar el RTSS [TL; DR] moryNET. DLL en la carpeta de su proyecto.

Ahora necesita agregar una referencia en su código, instrucciones aquí

Solo asegúrese de compilar los proyectos de servidor RTSS [TL; DR] moryNET y PCHwMon para la misma arquitectura.

Incluí un programa de instalación listo para usar, para que pueda instalar todo sin tener que jugar con Visual Basic. Está compilado para x86, funcionará tanto en arquitecturas x86 como x64. Requiere el. NET framework 4.7.2 para ejecutarse.

En cualquier caso, deberá instalar RivaTuner. Puede encontrarlo aquí como una aplicación independiente o puede instalar Msi Afterburner, que debería incluir RTServer.

Paso 5: Implementación final del hardware

Recomendado: