Monitoring suhu CPU komputer (CPU Temperature), terutama CPU Server, sangatlah penting, karena dari data suhu kita bisa mengetahui apakah CPU komputer kita sedang kepanasan atau sedang dalam kondisi normal.

Pastinya kita tidak ingin CPU komputer kita bekerja pada suhu di atas normal (overheated). Dan jika dikaitkan dengan data beban CPU (CPU Load), maka kita bisa mengetahui kondisi CPU apakah normal atau tidak. Semisal, jika pada suatu rentang waktu tertentu (time frame) CPU Temperature cenderung tinggi (diatas normal) pada saat kondisi CPU Load yang rendah atau normal, maka kita bisa melakukan pengecekan dan pemeliharaan (maintenance) terhadap CPU tersebut. Mungkin saja fan tidak bekerja baik. Mungkin juga ventilasi kurang baik.

Pada eksperimen ini, saya membuat penampil (display) CPU Temperature menggunakan modul display Dot Matrix P10.

Prinsip kerjanya sederhana. Program pada PC membaca suhu CPU dan mengirimkan data suhu ke Arduino UNO. Selanjutnya, Arduino UNO menampilkan data suhu tersebut pada display Dot Matrix P10.

Nah, sebelumnya, mari kita berkenalan dulu dengan Core Temp, yakni software CPU Monitoring yang tersedia gratis dari alcpu.com.

Core Temp

Core Temp adalah program untuk memonitor suhu prosesor dan informasi penting lain seperti CPU Load, Tj. Max dan Frekuensi. Tampilan program Core Temp adalah sebagai berikut.

Core Temp berukuran kecil dan hanya membutuhkan ruangan sekitar 1 kilobyte saja di RAM.

Core Temp mampu membaca data suhu setiap prosesor yang dimiliki komputer. Core Temp membaca suhu dari DTS (Digital Thermal Sensor) yang ada pada masing-masing prosesor. Jadi, data suhu yang ditampilkan Core Temp sangat akurat. Lebih akurat dibanding data suhu hasil pembacaan dari sensor suhu yang terdapat pada motherboard.

Core Temp mampu membaca data suhu dari berbagai vendor prosesor top antara lain: Intel, AMD dan VIA.

Core Temp Shared Memory

Core Temp menyediakan antarmuka Shared Memory sehingga aplikasi lain dapat membaca data hasil pembacaan sensor dengan cara mengakses blok memori yang disediakan oleh aplikasi Core Temp.

Dengan cara ini, aplikasi dapat memanfaatkan data dari Core Temp untuk tujuan lain seperti:

  • mengirimkan data ke cloud server
  • membuat aplikasi alarm jika terjadi overheat
  • menampilkan data ke display eksternal

Adapun struktur data dari interface Shared Memory yang disediakan oleh Core temp adalah sbb:

typedef struct core_temp_shared_data_ex
{
	// Original structure (CoreTempSharedData)
	unsigned int	uiLoad[256];
	unsigned int	uiTjMax[128];
	unsigned int	uiCoreCnt;
	unsigned int	uiCPUCnt;
	float		fTemp[256];
	float		fVID;
	float		fCPUSpeed;
	float		fFSBSpeed;
	float		fMultiplier;	
	char		sCPUName[100];
	unsigned char	ucFahrenheit;
	unsigned char	ucDeltaToTjMax;
	// uiStructVersion = 2
	unsigned char	ucTdpSupported;
	unsigned char	ucPowerSupported;
	unsigned int	uiStructVersion;
	unsigned int	uiTdp[128];
	float		fPower[128];
	float		fMultipliers[256];
} CoreTempSharedDataEx, *LPCoreTempSharedDataEx, **PPCoreTempSharedDataEx;

Nah, sekarang kita masuk ke pembahasan sistem penampil suhu CPU menggunakan Arduino UNO dan Display Dot Matrix P10. Blok diagramnya adalah sebagai berikut.

Program Lazarus/Freepascal bertugas membaca data dari Shared Memory yang disediakan oleh Core Temp. Selanjutnya, data suhu ditampilkan pada form dan dikirimkan ke Arduino UNO dengan format JSON.

Format data JSON adalah format data teks yang menjadi standar paling populer saat ini. Jadi mempelajari dan menggunakannya dalam aplikasi sangatlah perlu untuk kita lakukan.

Lazarus/Freepascal memiliki unit-unit pendukung untuk pemrosesan data dengan format JSON. Dan pada platform Arduino, ada library JSON yang sangat bagus, yakni ArduinoJson.

Untuk urusan komunikasi serial, program menggunakan komponen TLazSerial yang merupakan turunan dari library Synaser.

Selama program berjalan, program akan membaca data dari Core Temp Shared Memory, kemudian menampilkan data ke form dan mengirimkan data suhu CPU ke Arduino dengan interval 500ms. Untuk keperluan ini, digunakan komponen TTimer. Berikut ini adalah kode program prosedur Timer yang dijalankan dengan interval 500ms.

procedure TForm1.Timer1Timer(Sender: TObject);
var
  s: String;
begin
  if fnGetCoreTempIndo(Data) then
  begin
    Label1.Caption:= 'Processor: ' + Data.sCPUName;
    Label2.Caption:= 'Jumlah Core: ' + IntToStr(Datqa.uiCoreCnt);
    Label3.Caption:= 'Jumlah CPU: ' + IntToStr(Data.uiCPUCnt);
    Label4.Caption:= 'CPU Speed: ' + FloatToStrF(Data.fCPUSpeed, ffFixed, 7, 0);
    Label8.Caption:= 'CPU Load: ' + IntToStr(Data.uiLoad[0]) + ' %';
    Temp:= Data.ftemp[0];
    Label5.Caption:= 'Temperature: ' + FloatToStrF(Temp, ffFixed, 7, 0) + ' C';
    Edit1.Text:= FloatToStr(Temp);
    Edit3.Text:= IntToStr(Data.uiLoad[0]);

    s:= '{"Sender":"Lazarus", "Temperature":"' + FloatToStr(Temp, ffFixed, 2, 0)+'"}';
    if LazSerial1.Active then LazSerial1.WriteData(s);
  end;
end;

Setiap kali Arduino menerima data dari PC, maka Arduino akan mengirimkan kembali data tersebut ke PC dengan menambahkan karakter ‘#’ sebagai tanda akhir data. Ini untuk memudahkan saja. Data kembalian ini diterima dan ditampilkan pada komponen TEdit.

procedure TForm1.LazSerial1RxData(Sender: TObject);
var
  sa: string;
begin
  if LazSerial1.DataAvailable then
  begin
    sa:= LazSerial1.SynSer.RecvTerminated(500, '#');
  if sa<>'' then
    Edit2.Text:= sa;
  end;
end;

Berikut ini adalaah tampilan dari program display suhu CPU yang dibuat menggunakan Lazarus/Freepascal.

CPU Temp Load Lazarus Freepascal

Kode Program Arduino

/*
   Display CPU Temperature Dot Matrix P10
   PC - Lazarus/Freepascal, Core Temp, JSON
   Chandra MDE - teknikelektrolinks.com
 */

#include <SPI.h>
#include <DMD2.h>
#include <fonts/Arial_Black_16.h>
#include <ArduinoJson.h>

StaticJsonDocument<50> jsonIN;

SoftDMD dmd(1,1);  // DMD controls the entire display
DMD_TextBox box(dmd, 0, 0, 32, 16);

void setup()
{
  Serial.begin(9600);
  dmd.setBrightness(40);
  dmd.selectFont(Arial_Black_16);
  dmd.begin();
  dmd.drawString(2, 1, "00");
  dmd.drawString(21, 1, "C");
}

void loop()
{
  if (Serial.available())
  {
    deserializeJson(jsonIN, Serial);

    String c;
    serializeJson(jsonIN, c);
    Serial.print(c);
    Serial.print("#");
    
    const char *sender = jsonIN["Sender"];
    const char *temp = jsonIN["Temperature"];
    
    if (strcmp(sender, "CoreTemp")==0)
    {
      dmd.drawString(1, 1, "    ");
      dmd.drawString(1, 1, temp);
      dmd.drawString(21, 1, "C");
    }
  }
}

Setelah program di Compile dan Upload dan Arduino terhubung ke PC, maka hasilnya adalah sbb:

Untuk tampilan program aplikasi Lazarus/Freepascal pada foto adalah program sebelum di update. Tampilan program setelah di update adalah seperti pada gambar sebelumnya.

Video bisa dilihat di Channel Youtube dengan link berikut ini.

Nah, dengan adanya display besar yang menampilkan suhu CPU, maka kita bisa lebih nyaman memantau suhu CPU kita.

Kita bisa mengembangkan lebih lanjut eksperimen ini dengan menambahkan fitur-fitur sebagai berikut:

  • memperbesar ukuran display sehingga bisa menampilkan suhu dari semua Core yang ada
  • menambahkan fitur alarm jika suhu CPU melebih batas yang ditentukan
  • menambahkan fitur notifikasi melalui email
  • menambahkan fitur IoT dengan mengirimkan data ke IoT Server sehingga bisa dipantau dari mana saja melalui internet

Demikian laporan singkat mengenai eksperimen saya dengan software Core Temp, Arduino UNO, Dot Matrix P10 dan JSON.

Semoga bermanfaat.

Kunjungi Situs Kami

https://teknikelektrolinks.com

Pelatihan PRIVAT Online

Kami menyediakan layanan Pelatihan/Bimbingan PRIVAT Online untuk materi pemrograman dan perancangan hardware berbasis Arduino dan Mikrokontroler 8051, AVR, STM8 dan PIC.

Kami juga merancang dan membuat panel kontrol berbasis Zelio Smart-Relay.

Jika Anda membutuhkan bantuan kami, silakan menghubungi melalaui WA 0882-3560-7047.

Selamat berkarya.