Phat-Stats PC Performance TFT Display

Arduino TFT PC Performance Monitor with Client software

Similar projects worth following
Phat-Stats ili9341 TFT PC Performance Monitor Display

Gnat-Stats (OLED) has moved to a new project page here

PhatStats (TFT) form an Arduino serial display. HardwareSerialMonitor is a PC serial client, both are written by Rupert Hirst and Colin Conway.

HardwareSerialMonitor Windows client reads the hardware statistics from the PC.

This data is forwarded over the hosts’ serial  port to an Arduino compatible micro processor. It is then, displayed using the Phat-Stats sketch.

This project, assumes you have a above average experience with Arduino, the IDE and the compatible boards available.

The HardwareSerialMonitor was designed for dedicated GPU's . Your mileage may vary with Integrated Graphics

To help with construction there are hook up guides, links below:

Phat-Stats ILI9341 TFT Display Hook up Guide

Going Forward:

The project needs to be ported over to LibreHardwareMonitor , a fork of OpenHardwareMonitor  for future support, as this gets a lot more updates for new PC hardware. If anyone can help please get in touch, thanks.

The above software/code is licensed under the following terms: 


GPL v2

Gnat-Stats, Phat-Stats & Hardware Serial Monitor Copyright (C) 2016 Colin Conway, Rupert Hirst and contributors

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; If not, see

HardwareSerialMonitor only was inspired by Psyrax's "SerialSender". Psyrax is given attribution and thanks, by being an honorary member of the project.

x-zip-compressed - 232.99 kB - 10/27/2021 at 16:37


x-zip-compressed - 1.38 MB - 04/30/2021 at 15:39


x-zip-compressed - 1.38 MB - 04/30/2021 at 15:39


V2.0.8 (ESP32 only) Add Support for LolinD32 (Tested) Add Support for Lolin32 LITE (Tested) Add ESP32 BT ESP Board ID Workaround for Dual Mode

x-zip-compressed - 155.02 kB - 10/27/2021 at 16:34


Fix CPU & GPU Overclock gains "-+" bug

x-zip-compressed - 795.31 kB - 07/21/2021 at 13:50


  • 1 × Arduino Leonardo/ ProMicro / STM32F1 / ATSAMD21 / ESP32
  • 1 × SSD1306 0.96" i2C OLED or ILI9341 2.2, 2.4, 2.8, 3.2" TFT SPi Display
  • 5 × Arduino Experience

  • Phat-Tacho ILI9341 2.8" TFT Enclosure Prototype

    Rupert Hirst08/03/2021 at 15:11 0 comments

    Phat-Tacho Gauge Style Clip on Facia

    Additional Facias:

  • Phat-Stats ILI9341 2.8" TFT Enclosure Prototype

    Rupert Hirst07/31/2021 at 20:07 0 comments

    Phat-Stats  ILI9341 2.8" TFT Enclosure Prototype

    Rear view  MCU "sight glass"

     Bottom USB C input, so the cable can lay in any position.

  • Phat-Stats Slim USB Concept Case

    Rupert Hirst06/16/2021 at 15:02 0 comments

  • Phat-Tacho Bluetooth Concept Case with new DisplayStyle

    Rupert Hirst05/27/2021 at 23:04 1 comment

    Phat-Tacho Bluetooth Concept Case with new DisplayStyle

  • Gnat-Stats (OLED) & Phat-Stats (TFT) Hook Up Guides

    Rupert Hirst03/11/2021 at 23:32 0 comments

    *Hook up guides for Gnat-Stats(SSD1306 OLED) and Phat-Stats(ILI9341 TFT) 

    *for supported Micro Controllers.

    Phat-Stats Hook Up Guide
    Phat-Stats Hook Up Guide
    Gnat-Stats Hook Up Guide
    Gnat-Stats Hook Up Guide

  • Phat-Stats ​TFT V1.6.3 ATSAMD21

    Rupert Hirst01/06/2021 at 17:23 1 comment

    Phat-Stats TFT V1.6.3 ATSAMD21

    (requires HardwareSerialMonitor 1.3 Upwards)

    Minimize blinking on screen data value changes and screen refresh.

     CPU Turbo or GPU Boost Mode frequency gains. (eg: +895MHz) or gain %

    Show when CPU or GPU is Throttling (Hit Thermal Junction Max temp)

    Show when CPU or GPU Turbo or Boost Mode is active.

    Add rotary encoder for PWM screen brightness.

  • Run on Startup Win10

    Rupert Hirst06/15/2020 at 22:21 0 comments

    Due to the Windows 10 not allowing programs to run on startup as admin, here is a workaround script.

    1)  Right-click on the HardwareSerialMonitor.exe , go to properties, then compatibility and check "Run as Administrator"

    2)  Create the VBScript using a text editor (I used Notepad)

      Set WshShell = CreateObject("WScript.Shell" ) 
      WshShell.Run chr(34) & "C:\Program Files (x86)\HardwareSerialMonitor\HardwareSerialMonitor.exe" & Chr(34), 0 
      Set WshShell = Nothing

    (The above path is an example, edit this to where your HardwareSerialMonitor.exe path is located)

    Save the script as "HardwareSerialMonitor.vbs" (no quotes)

    Note: Make sure to save it as a .vbs not .txt

    3)  Now place the HardwareSerialMonitor.vbs in the HardwareSerialMonitor folder:

    4)  Goto the Windows startup folder

    %AppData%\Microsoft\Windows\Start Menu\Programs\Startup, alternatively access it by Win+R ⇒ shell:startup ⇒ Enter

    Create a shortcut to the .vbs script above by right clicking then "New" ⇒ "Shortcut" ⇒ "Browse" for the "HardwareSerialMonitor.vbs" Script and select it.

    HardwareSerialMonitor Should now run on startup

View all 7 project logs

  • 1
    Step 1
    • Gnatstats Tiny OLED PC performance monitor  &  HardwareSerialMonitor  Windows Client  

    by Rupert Hirst and Colin Conway

    This project, assumes you have above average experience with Arduino, the IDE, compatible boards available and other related hardware.


    Project principles:

    The HardwareSerialMonitor application  detects the sensors of most modern PC graphics, CPU and motherboards whilst, also pooling windows hardware stats.

    This data is then sent over a serial com port to an Arduino Microcontroller running the GnatStats Sketch and displayed on the OLED/TFT display.


    Compatible boards:

    •    ProMicro   (Atmel ATMega 32u4) (Gnat-Stats)   Note: supports Neopixels
    •    QT-PY / XIAO Atmel ATSAMD21  (Phat-Stats)    Note: supports Neopixels
    •     BluePill   Ti STM32F103C8   (Phat-Stats)   Note: Does not support Neopixels!!!
    •     ESP32 LoLin32 / Lite / D32  (Phat-Stats)   Note: supports Neopixels

           ATMega 32u4 boards are more suited to (OLED) GnatStats .  They do not have the required memory for (TFT) PhatStats.


    Compatible Screens:

    • OLED :  SSD1306 (i2c) or SH1106 (i2c)  128x64 Pixels  (SH1106 is not supported on the ATSAMD21 due to library restrictions)

    Note: SH1106 are usually  screens over 0.96" but not limited to. The (GND/ VCC) pin out order is different, although, more recent versions have the same pin order as the SSD1306 (VCC/GND), buyer beware!!!

    •  TFT    :  Red PCB ILI9341 (SPi) 320x240 Pixels 

    Library and MCU core links are included within the Arduino sketch.



    •               Plug the Arduino into a dedicated USB Port, try avoid using a USB hub. Timings can be critical to avoid garbled or corrupted screen info
    •               HardwareSerialMonitor was designed for dedicated GPU's . Your mileage will vary with Integrated Graphics


    Guides: Making an External Temperature Gauge Additional Tiny Performance Monitor for a Computer

    Technopat YouTube (Turkish)

    TallmanLabs: Phat-Stats ILI9341 TFT Display Hook up Guide

    TallmanLabs: Gnat-Stats SSD1306 OLED Display Hook up Guide

    SAMM Market



                         My coding ability...     eg: There is no CPU fan support, the CPU fan is a motherboard fan. It requires a motherboard chip to be detected, and the correct fan sensor.

    I can only test the hardware I own. Overall it has worked with everything I have tried.

    HardwareSerialMonitor and the way some things have to be detected.  See (4) as it relies on the "OpenHardwareMonitorLib.dll"

    OpenHardwareMonitor updates are few and far between. 

    Going forward:

                               Some PC hardware support for certain CPU / GPU's is lacking, particularly certain Ryzen CPU's.

    HardwareSerialMonitor needs to be ported from the OpenHardwareMonitorLib.dll to the LibreHardwareMonitorLib.dll (open source) as this has more features such as network /ethernet and receives updates on a more frequent basis.

    My time is limited, if you can help with this please get in touch, thanks.

View all instructions

Enjoy this project?



Benjamin wrote 12/04/2020 at 18:11 point

Hi everyone. :)

I currently try to recreate this project and am stuck at the point where I need to flash the firmware on the arduino. I have an Arduino Micro and the SSD1306 128x64 OLED screen.

With a test-firmware from a tutorial I get the screen working, but the GnatStat V1.41 firmware doesn't show me anything on the screen after flashing. I already double checked the SDATA and SCLK Pinout, included an Reset-Pin and went over all the needed definitions in the firmware-script.

Any ideas what I could have made wrong?

  Are you sure? yes | no

Rupert Hirst wrote 12/07/2020 at 18:53 point

Hi Benjamin

Looks like your using the SPI version of the screen not the i2C

BTW although the code shows "OLED_RESET" it does not get connected physically

If the screen is also i2C compatible try using Gnat-Stats sketch 1.32b

it is specifically for the 32u4 based Arduino's only

  Are you sure? yes | no

archieve.minimadrid wrote 12/01/2020 at 22:53 point

Hello everyone. First i would like to thank the developers for this nice project. I would love this to keep evolving as its a very nice monitoring setup.

I managed to run the TFT 1.5 version with an Arduino Pro Micro 5V and a 2.8 ILI9341 screen. After properly setting up the pro micro in the Arduino IDE, and flashing the software (prior commenting and uncommenting my hardware in the Configuration.h file) it works as it should. I had to add 2.2K resistors (what i had around) between all pins of screen and Arduino (except VCC, GND and LED pins) because as others commented, the screen does not properly manage 5V signals even if it says so. 

So after wiring the resistors my setup is working nicely! Two things im doubtful:

HardwareSerialMonitor V1.1a its supposed to use Librehardwaremonitor dll library (as it says in the Arduino code) but i think it does not. The DLL incluided is from OpenHardwareMonitor dll, version 0.82. I've manually changed it for the 0.95 version, but for my hardware it does not detect all parameters as it should. Im running a Ryzen 5800X and a RTX3080, so not all data is displayed, for example, cpu temp, and cpu frequency. OpenHardwareMonitor software is not able to fetch this info as its outdated. I would please ask the developers to move the support to the latest LibreHardwareMonitor library, as this one does properly detect the stats and gets updated frequently (OpenHardwareMonitor was forked, and its a dead project now)

- The second thing i would love to be able is to have more screen layouts with better graphics, or at least some documentation to be able to redesign myself, or even better, have different layouts made by the community. That would be awesome. I would love to know how could i add different parameters fetched from the Open/Libre library.

So thanks again, i hope that at least LibreHardwareMonitor library is properly supported soon. Please tell me if you need any help that i can provide. Thanks!

  Are you sure? yes | no

Rupert Hirst wrote 12/07/2020 at 19:01 point

At the moment we are stuck on OpenHardwareMonitor till it can be switched over to LibreHardwareMonitor, which for me will not be easy.

Older LibreHardwareMonitor was still compatible with a name change of the DLL, now it is not.

Originally, I was hoping people would modify the HSM source code and share. While a few people have taken the code as their own, other have added great features but do not share.

  Are you sure? yes | no

Edgaras wrote 11/27/2020 at 14:41 point

Hello peeps. Wanted to ask for help. I have succesfully managed to get it test-working with arduino uno (tested with this because I had faulty arduino micro pro), oled shows data with temps model number (ryzen 3600 and rtx 2060) interlaced with blanking lines. Upon some investigation (im not coder, my girl is) we faund out that original adafruit ssd1306 library has default setting for 128x32, so We changed the H file so it would be for 128x64, literally changed just one line of code. It started showing proper screen, correct resolution, but with no data anymore. Any ideas?

  Are you sure? yes | no

dehavok1 wrote 11/09/2020 at 15:50 point

Hi I am not getting any temperature values on a Ryzen 3700X and 5700XT. Any suggestions? Thanks

  Are you sure? yes | no

Cristian Caceres wrote 10/30/2020 at 12:23 point

Hi guys, i have the same issue, a ILI9341 and a Arduino Pro Micro (Atmel Mega 32u4) and only get a White Screen =( please help

  Are you sure? yes | no

ragook wrote 11/10/2020 at 12:15 point

Does the screen work when you use the standard Adafruit graphics test example?

  Are you sure? yes | no

Cristian Caceres wrote 11/10/2020 at 12:34 point

with the adafruit script it does nothing, with the Gnat script it shows only the white screen.

  Are you sure? yes | no

ragook wrote 11/11/2020 at 02:24 point

 If you can't get it working with the basic Adafruit ILI9341 sketch you need to check your wiring and pin assignments. I assume you have  uncommented the correct things in the "Configuration_Settings.h" tab in the gnatstats sketch.

  Are you sure? yes | no

Pogz wrote 10/21/2020 at 09:31 point

Anyone got pin connection with a TFT_ILI9341? Do I need a Logic Level Converter for it? I just get a white screen wiring it directly. 

This is the only one I cant get to work.

  Are you sure? yes | no

ragook wrote 10/21/2020 at 13:59 point

If your MCU is 5v you need a 1.5k resistor  on each of the CS/RST/DC/MOSI/SCLK connections

  Are you sure? yes | no

kyouko wrote 09/22/2020 at 18:18 point

Hi sorry if this question is a bit stupid but i'm new with using arduino's.

I bouth a STM32 (

and an SSD1306 (

my question is what pins do i need to connect because i couldn't really find documentation about these 2 together and they should work.

  Are you sure? yes | no

Pogz wrote 10/21/2020 at 09:29 point

Make sure you have the file GnatStats_ProMicro_STM32_OLED_V1.41_CFG

1.) Check Configuration_Settings.h

2.) Comment out #define ProMicro and uncomment //#define STM32_BluePill

3.) This is  your pinouts: 

- SDA connect to PB7 (B7) 

- SCL(SCK) connect to PB6 (PB7) 

- Ground and VCC pins on its corresponding pins. 

  Are you sure? yes | no

estebangmn wrote 01/02/2021 at 16:30 point

the pinout is explained in the documents of the arduino files

  Are you sure? yes | no

levan wrote 09/21/2020 at 13:06 point

Hello. how can i rotate display? i can not find this line in code? i have ST7735 1.8 inch display.

  Are you sure? yes | no

Pogz wrote 10/21/2020 at 09:18 point

/* Display screen rotation  0, 1, 2 or 3 = (0, 90, 180 or 270 degrees)*/

int ASPECT = 2;

on file Configuration_Settings.h

  Are you sure? yes | no

Tomas wrote 09/20/2020 at 06:32 point

Using HardwareSerialMonitor 1.1 the RAM String is not showing up any value. its R(BLANK)G

  Are you sure? yes | no

Pogz wrote 09/12/2020 at 08:34 point

Can anyone give me a working pin connection with a TFT_ILI9341? I got the TFT_ST7735 but not this bigger TFT_ILI9341? 

My current connection is (following the writeup) 

TFT_ILI9341 - Adruino Pro Micro
CS - 10
RES - RES (set to 0 on source)
DC - 9 
SDI (MOSI) - 16
SCK - 15
LED - 6
SDO (MISO) - 14

but all i get is just a white screen. any tips

  Are you sure? yes | no

ragook wrote 09/12/2020 at 15:58 point

Why do you need a working list when you dont have a ILI9341?

ProMicro SPi= CS:10 RST:0 DC:9 SCLK:15 MOSI:16    MISO isnt needed

Backlight pin is 6

  Are you sure? yes | no

Pogz wrote 09/19/2020 at 07:50 point

i have the ILI9341 .. and im trying to get it to work for it (i have already made it work for ST7735 (as i previously posted) so i dont know what you meant by " you dont have a ILI9341" 

  Are you sure? yes | no

Pogz wrote 09/19/2020 at 08:23 point

FYI, I did follow the pinouts as recommended. But again im just getting a white screen

  Are you sure? yes | no

Pogz wrote 08/30/2020 at 10:23 point

Any solution for the addtional white lines on the display?

Looks like adding an offset should fix? 

  Are you sure? yes | no

RolandoooR1 wrote 09/19/2020 at 20:45 point

I had the same problem. In the Setup ST7735 setup code, comment out the INITR_BLACKTAB and add the INITR_GREENTAB as shown below. This will correct it. 

  /* ST7735 SETUP */
#ifdef TFT_ST7735
  delay(100); // Give the micro time to initiate the SPi bus
  // Use this initializer if you're using a 1.8" TFT
  //tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
  tft.setRotation(ASPECT);// Rotate the display at the start:  0, 1, 2 or 3 = (0, 90, 180 or 270 degrees)

  Are you sure? yes | no

Pogz wrote 08/24/2020 at 12:39 point

Hi, im an absolute Arduino beginner (but I have experiences with the Pi and basic electronic knowledge) and I cant seem to make this work. Below is the board that I used and the OLED I used.


I think I wired it correctly (the OLED had the GND on the 1st pin and the VCC on the 2nd thats why I had to use a wire first to test). SCL and SDA seems to be wired correctly.

On the Arduino side i've done the following: 

1.) Made sure that the Arduino is selected and the correct COM port is selected
2.) Installed the following libraries: Adafruit GFX, Adafruit NeoPixel, Adafruit ST7735
3.) Double clicked on the GnatStats_TFT_ProMicro_STM32_CFG_V1.5.ino and compiled/test. All good. Then uploaded it to the Arduino. No problem.
4.) Ran HardwareSerialMonitor.exe as administrator

But as you see from the photo, I dont get any output. Am I missing something or did I do something wrong? I've also tried directly wiring VCC to the VCC pin of the Arduino and the GND to ground to make sure that its getting enough power but still no dice.

  Are you sure? yes | no

Pogz wrote 08/25/2020 at 10:54 point

ok I was stupid. i was using the TFT version. i though that 1.5 is the latest thus i got that instead. now working with the OLED sketch. 

just a question though, how did you guys power the screen? from the instructions: " D5 High(5v) and D4 Low(to ground) " but its not powering my display. do i need to modify something in the code?

hooking it up to regular vcc and ground line works tho. 

  Are you sure? yes | no

Fizzgig84 wrote 08/31/2020 at 20:42 point

Hey buddy, Im running the exact same everything but still the same issue of nothing showing up. You're running "" ? I feel like I'm missing something.

  Are you sure? yes | no

Pogz wrote 09/02/2020 at 12:34 point

@Fizzgig84 took some wrangling and re-reading due to my inexperience in working with arduino. 

the versioning seems to add to the confusion as people tend to always get the one with the latest version.. 

if you're using something like mine, you need the OLED version (v1.41). 

If you're using the 4 pin OLED, you need to connect (OLED <- > Pro Micro)

SDA - Pin 2
SCK - Pin 3
VCC - VCC 5V rail 
GND - Ground

I was not able to get pins 4 and 5 to word as described in the instruction. I dont get any display light. 

I was able to get the TFT_ST7735 to work too.. but im having trouble on making TFT_ILI9341 work. 

I would probably write a better documentation for those without prior knowledge on Arduino.

  Are you sure? yes | no

Poiaman wrote 07/23/2020 at 12:33 point

Tnks for sharing, i have made the project and its amazing! Now i´m tryng to customize and i need help to understand how can i get the index list of Monitor Serial. For exemple, i would like to make a % for ram use, so i´ll need more information, how the total of memory. Could you help me to understand this part? 

  Are you sure? yes | no

ImmodderNation wrote 06/14/2020 at 23:01 point

How do I add int and strings to the code for voltage and fan speed?

  Are you sure? yes | no

taitelcoms wrote 06/13/2020 at 07:24 point

hello there! I am using ryzen 2700X  but no data for temp and clock speed. CPU Usage working fine. Could you update? I try lastest dll from OpenHardWareMonitor but not working.

  Are you sure? yes | no

Rupert Hirst wrote 06/15/2020 at 22:06 point

are you running the program as admin? that is the usual reason for no CPU frequency or temp. 

HardwareSerialMonitor has always had issues with Ryzen as has openharwaremonitor in the past

  Are you sure? yes | no

taitelcoms wrote 06/16/2020 at 02:08 point

I tried as admin but nothing has changed. Now I commented out frequency and clock then keep waiting if there is any changed ... Thanks. 

  Are you sure? yes | no

Juanillo62gm wrote 05/06/2020 at 03:22 point

Could you compile the code with new OpenHardWareMonitor.dll ? I can't get data from my i9-9900k and RX5700 XT. I'm running OLED_SSD1306 with GnatStats v1.44

  Are you sure? yes | no

Rupert Hirst wrote 06/15/2020 at 22:02 point

I don't  know why its not reading your 9900K , my 9600k works fine 

  Are you sure? yes | no

Psyrax wrote 12/26/2019 at 19:28 point

OMG didn't knew it was forked!!! I'm blushing.

  Are you sure? yes | no

Lautaro wrote 09/06/2019 at 17:37 point

Hi, does anybody have the same problem as I ?

I try to run the compiler and i always get the same error. The error is called ERROR STATUS 1.

Im tring to run the code with an ARDUINO MEGA 2560

Any help please ?

  Are you sure? yes | no

Rupert Hirst wrote 06/15/2020 at 15:20 point

Don't use a MEGA

  Are you sure? yes | no

deemmkka wrote 08/19/2019 at 06:33 point

Help please, does not display CPU temperature i5-8400, although in the program of all shows. Tell me how to fix it?

  Are you sure? yes | no

Ivan wrote 08/06/2019 at 15:18 point

I'm new to Arduino :( someone can explain to me, if it is enough to move the files I find here or I have to do something else

Thank you in advance guys

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates