Monitor de PC en Tiempo Real con Arduino y Pantalla LCD
Componentes y Suministros
- Arduino Leonardo (o otro Arduino con UART) × 1
- Pantalla LCD 16×2 (con conversor I2C) × 1
- Cables jumper (genéricos) × 1
Sobre el Proyecto
Introducción
La idea de este proyecto surgió de la necesidad de diversión y aprendizaje. Es fácil de hacer y tiene muchas aplicaciones. Podemos usarlo, por ejemplo, para controlar, almacenar y mostrar variables de hardware.
Conexión del LCD
Primero, conectamos nuestro LCD (estaba usando un conversor I2C):

Código para Arduino
Configuramos la pantalla LCD 16×2 con dirección 0x3F (la dirección del bus I2C se puede encontrar escaneando con un sketch sencillo disponible en Arduino Playground).
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);
String inData;
void setup() {
lcd.init();
Serial.begin(9600);
lcd.backlight();
}
void loop() {
while (Serial.available() > 0) {
char recieved = Serial.read();
inData += recieved;
if (recieved == '*') {
inData.remove(inData.length() - 1, 1);
lcd.setCursor(0, 0);
lcd.print("GPU Temp.: " + inData + char(223) + "C ");
inData = "";
if (inData == "DIS") {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Desconectado!");
}
}
if (recieved == '#') {
inData.remove(inData.length() - 1, 1);
lcd.setCursor(0, 1);
lcd.print("CPU Temp.: " + inData + char(223) + "C ");
inData = "";
}
}
}
Explicación del Protocolo de Comunicación
- Usamos
charen lugar deStringpara evitar latencia de ~1 segundo. - El carácter
*indica fin de datos para la primera línea (GPU). - El carácter
#indica fin de datos para la segunda línea (CPU). - El comando
DIS*apaga la pantalla al desconectar.
Configuración en PC (Aplicación C#)
¿Por qué C#? Es fácil y rápido de escribir.
Librería Necesaria
Descarga Open Hardware Monitor y usa OpenHardwareMonitorLib.dll.
- Crea un proyecto Windows Forms Application.
- Click derecho en Referencias → Examinar → Selecciona la DLL.
Interfaz de Usuario


Código Principal (C#)
using System.IO.Ports;
using OpenHardwareMonitor.Hardware;
SerialPort port = new SerialPort();
Computer c = new Computer() { GPUEnabled = true, CPUEnabled = true };
float value1, value2; // GPU y CPU temp
private void Init() {
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.DataBits = 8;
port.Handshake = Handshake.None;
port.RtsEnable = true;
foreach (string p in SerialPort.GetPortNames())
comboBox1.Items.Add(p);
port.BaudRate = 9600;
}
private void Status() {
foreach (var hardware in c.Hardware) {
if (hardware.HardwareType == HardwareType.GpuNvidia) {
hardware.Update();
foreach (var sensor in hardware.Sensors)
if (sensor.SensorType == SensorType.Temperature)
value1 = sensor.Value.GetValueOrDefault();
}
if (hardware.HardwareType == HardwareType.CPU) {
hardware.Update();
foreach (var sensor in hardware.Sensors)
if (sensor.SensorType == SensorType.Temperature)
value2 = sensor.Value.GetValueOrDefault();
}
}
try {
port.Write(value1 + "*" + value2 + "#");
} catch (Exception ex) {
timer1.Stop();
MessageBox.Show(ex.Message);
toolStripStatusLabel1.Text = "Arduino no responde...";
}
}
Botones de Conexión/Desconexión
// Conectar
if (!port.IsOpen) {
port.PortName = comboBox1.Text;
port.Open();
timer1.Interval = Convert.ToInt32(comboBox2.Text);
timer1.Enabled = true;
toolStripStatusLabel1.Text = "Enviando datos...";
label2.Text = "Conectado";
}
// Desconectar
port.Write("DIS*");
port.Close();
timer1.Enabled = false;
label2.Text = "Desconectado";
¡El programa debe ejecutarse con privilegios de administrador!
Código Completo
Código Arduino
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2);
String inData;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
}
void loop() {
while (Serial.available() > 0) {
char recieved = Serial.read();
inData += recieved;
if (recieved == '*') {
inData.remove(inData.length() - 1, 1);
lcd.setCursor(0,0);
lcd.print("GPU Temp.: " + inData + char(223)+"C ");
inData = "";
if(inData == "DIS") {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Disconnected!");
}
}
if (recieved == '#') {
inData.remove(inData.length() - 1, 1);
lcd.setCursor(0,1);
lcd.print("CPU Temp.: " + inData + char(223)+"C ");
inData = "";
}
}
}
Aplicación C# Completa
El código completo de la aplicación Windows Forms está disponible en la sección de código del proyecto original.
Esquemáticos

Proceso de manufactura
- Panel de control para Flight Simulator 2020 con Arduino Nano: Pantallas LCD y CDI
- Crea un Impresionante Sistema Ambilight para Monitor con Arduino
- Crea Animaciones y Juegos en LCD 16×2 con Arduino UNO
- Monitor de Frecuencia Cardíaca IoT en Tiempo Real con Arduino y MAX30100
- Monitor de voltaje de termopar para piloto de calentador de agua: alertas seguras por email y SMS
- Cómo mostrar imágenes en una pantalla TFT LCD de 1.17 pulgadas con Arduino UNO
- Osciloscopio DIY con Arduino Nano (10 Hz–50 kHz) y LCD 128×64
- Monitor de frecuencia cardíaca MAX30102 con Arduino Nano y LCD 16x2
- Sistema Avanzado de Monitorización Doméstica con Arduino Mega y Sensores IoT
- Construye una Estación Meteorológica Arduino Fiable con Sensores DHT
- Construye un reloj despertador fiable con RTC DS1302 y Arduino UNO