아두이노로 실시간 PC 모니터 만들기: LCD에 CPU/GPU 온도 표시
부품 및 소모품
| 아두이노 레오나르도 (또는 UART 변환기가 있는 아두이노/ATmega) | ×1 |
| LCD 16x2 (I2C 모듈 포함) | ×1 |
| 점퍼 와이어 (일반) | ×1 |
프로젝트 소개
단순한 재미와 학습 목적으로 시작된 프로젝트지만, 하드웨어 변수를 제어·저장·표시하는 등 다양한 응용이 가능합니다.
1. LCD 연결 (I2C 어댑터 사용)
I2C 주소는 아두이노 플레이그라운드의 I2C 스캐너 스케치로 확인할 수 있습니다. (보통 0x3F 또는 0x27)
2. 아두이노 코드 작성
시리얼 통신으로 들어오는 데이터를 문자 단위로 읽어 버퍼에 저장하고, 종료 문자(* 또는 #)를 만나면 LCD 해당 줄에 출력합니다.
#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 == '*') { // 첫 번째 줄 (GPU 온도)
inData.remove(inData.length() - 1, 1); // '*' 제거
lcd.setCursor(0, 0);
lcd.print("GPU Temp.: " + inData + char(223) + "C ");
inData = "";
}
if (recieved == '#') { // 두 번째 줄 (CPU 온도)
inData.remove(inData.length() - 1, 1); // '#' 제거
lcd.setCursor(0, 1);
lcd.print("CPU Temp.: " + inData + char(223) + "C ");
inData = "";
}
// 연결 해제 시 화면 초기화
if (inData == "DIS") {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Disconnected!");
}
}
}
3. PC 측 C# 애플리케이션 (OpenHardwareMonitorLib 사용)
C#으로 윈도우 폼 애플리케이션을 만들어 OpenHardwareMonitor 라이브러리로 CPU/GPU 온도를 읽고, 시리얼 포트로 아두이노에 전송합니다.
필수 준비물
- Visual Studio (Windows Forms App 프로젝트)
- OpenHardwareMonitorLib.dll 참조 추가
주요 코드 구조
using System.IO.Ports;
using OpenHardwareMonitor.Hardware;
SerialPort port = new SerialPort();
Computer c = new Computer() { GPUEnabled = true, CPUEnabled = true };
float gpuTemp, cpuTemp;
// 폼 로드 시
private void Form1_Load(object sender, EventArgs e) {
c.Open(); // 하드웨어 모니터링 시작
// 사용 가능한 COM 포트 콤보박스에 추가
foreach (string p in SerialPort.GetPortNames()) comboBox1.Items.Add(p);
port.BaudRate = 9600;
}
// 타이머 틱 이벤트 (주기적 전송)
private void timer1_Tick(object sender, EventArgs e) {
Status();
}
// 하드웨어 정보 수집 및 전송
private void Status() {
foreach (var hw in c.Hardware) {
hw.Update();
foreach (var sensor in hw.Sensors) {
if (sensor.SensorType == SensorType.Temperature) {
if (hw.HardwareType == HardwareType.GpuNvidia)
gpuTemp = sensor.Value.GetValueOrDefault();
else if (hw.HardwareType == HardwareType.CPU)
cpuTemp = sensor.Value.GetValueOrDefault();
}
}
}
// 프로토콜: "GPU온도*CPU온도#"
try {
port.Write(gpuTemp + "*" + cpuTemp + "#");
} catch { /* 에러 처리 */ }
}
// 연결 버튼
private void btnConnect_Click(...) {
port.PortName = comboBox1.Text;
port.Open();
timer1.Interval = Convert.ToInt32(comboBox2.Text); // 갱신 주기(ms)
timer1.Enabled = true;
}
// 해제 버튼
private void btnDisconnect_Click(...) {
port.Write("DIS*"); // 아두이노에 알림
port.Close();
timer1.Enabled = false;
}
중요: 관리자 권한으로 실행해야 하드웨어 센서에 접근할 수 있습니다.
회로도
완성 모습
이제 고가의 모니터링 장비 없이도 아두이노와 LCD로 실시간 PC 하드웨어 상태를 확인할 수 있습니다.