Gnat-Stats, Tiny OLED PC Performance Monitor

Arduino OLED PC Performance Monitor with Client software

Similar projects worth following
Gnat-Stats, Tiny OLED PC Performance Monitor.

After a recent purchase of a Nvidia GTX1080 graphics card, 4k monitor, plus Doom(2016), I thought it would be great to see some external telemetry..

I then Stumbled upon Psyrax's Hackaday.IO project.

Armed with an Arduino ProMicro and a 128x64 pixel OLED display, I compiled the source code.

The GnatStats Hardware Serial Monitor Visual Studio application is based around Psyrax's "SerialSender" Application , yet heavily modified by Colin Conway.

(Auto Reconnect, CPU/GPU Hardware Name ID's, Frequencies, Serial activity display timeout)

Version 1.32 : Add screen height/width definitions for updated Adafruit SSD1306 library. Arduino UNO/NANO/MICRO ETC. (Atmel ATMega 328 Chips) are not supported, Please don't ask!!!

x-zip-compressed - 14.06 kB - 12/02/2020 at 23:24


TFT Version 1.5. : STM32 BluePill & ProMicro Suppport : 128x160 ST7735 & 240x320 ILI9341 TFT Support : Add PWM Output for Back Light : Separate "Configuration_Settings.h" to make setting up easier

x-zip-compressed - 23.54 kB - 09/12/2020 at 16:06


Gnats Stats PC serial Monitor Program Compiled with .Net 4.6.2 to make use of LibreHardwareMonitor's updated DLL (Fork of OpenHardwareMonitor)

x-zip-compressed - 5.51 MB - 06/04/2020 at 20:01


Add separate "Configuration_Settings.h" to make setting up easier

x-zip-compressed - 17.00 kB - 03/21/2019 at 22:44


Version 1.4 : STM32 BluePill Support : Remove PowerPin Support

x-zip-compressed - 16.67 kB - 03/17/2019 at 18:00


View all 6 files

  • 1 × Arduino ProMicro
  • 1 × SSD1306 or SH1106 OLED Display

  • 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

  • GitHub Links

    Rupert Hirst06/12/2020 at 16:08 0 comments
  • Gnat-Stats TFT Version 1.5

    Rupert Hirst03/21/2019 at 18:49 0 comments

    TFT Version 1.5 

    : STM32 BluePill & ProMicro Suppport
    : 128x160 ST7735 & 240x320 ILI9341 TFT Support
    : Add PWM Output for Back Light
    : Separate "Configuration_Settings.h" to make settings easier

    2.8" ILI9341 240x320  Running on a BluePill STM32.  A bit large maybe to be called Gnat-Stats :)

  • Gnat-Stats OLED Version 1.4

    Rupert Hirst03/17/2019 at 18:06 0 comments

    Gnat-Stats OLED v1.4  

    : STM32 BluePill Support
    : Remove PowerPin Support

    Gnat-Stats small TFT versions coming soon.

  • Hardware Serial Moniitor v1.1

    Rupert Hirst10/16/2018 at 11:29 0 comments

    Hardware Serial Moniitor updated to v1.1

    Compiled with  .Net 4.6.2  to make use of LibreHardwareMonitor's updated  DLL (Fork of OpenHardwareMonitor) 

  • Gnats-Stats Updates

    Rupert Hirst10/16/2018 at 11:26 1 comment

    Version 1.3: 

    Top Config option to disable all pre-selected power/gnd pins on Arduino pins D4 and D5 when not powering OLED from ProMicro 

    Top Config option to disable/enable "activitychecker" (Enable blank screen on serial timeout eg: PC powered down, Disable to retain last sampled info eg: PC crash or overclocking diagnostics) 

    Option to trigger an event at a given CPU or GPU threshold eg: LED indicator at 100% CPU Load. 

    NeoPixel Ring CPU/GPU Bargraph example:


    Custom overlay

View all 6 project logs

  • 1
    Step 1

    Gnatstats Tiny OLED PC performance monitor

    by Rupert Hirst and Colin Conway

    The HardwareSerialMonitor application uses the open source OpenHardwareMonitorLib.dll to sniff the sensors of most modern PC graphics, CPU and motherboards whilst, also pooling windows hardware stats.

    Part of Psyrax's original arduino sketch, is a "anti screen burn" feature. This feature, inverts the screen background (black - white), after a preset time, to give even wear to the OLED display. This feature has been extended to totally turn off the OLED screen when no serial data is available, such as PC power down.

    I wanted to keep the overall footprint as small as possible. The i2C pins on the ProMicro reside on D2(SDA) and D3(SCL). The displays i2c pins lined up but, obviously the power pins would be a problem.

    After measuring a current of 18.6mA on a fully lit OLED display, I decided to pull pin D5 High(5v) and D4 Low(to ground) on the ProMicro to providing the necessary VCC / GND for the display.



    ProMicro Pins: D5(HIGH) D4(LOW) D3 D2


    18mA is within the Atmel 32u4 maximum pin current limit of 20mA. This allowed the display to be simply soldered straight to the header of the ProMicro.

    The HardwareSerialMonitor application is based of Psyrax's original source code and heavily modified by Colin Conway to include additional hardware stats.

View all instructions

Enjoy this project?



adamnemeth0 wrote 07/23/2019 at 07:44 point

Hi, does anybody have the same problem as I ?

I am running this on a ryzen cpu and I got no temps. When I modified the hwmonitor 1.0 to look for different name for temps it was working.

But the hwmonitor 1.0 using openhardware monitor lib which is not showing correct cpu speeds. So I would like to use the Hwmonitor 1.1 with the librehardware lib. But I have the same issue that I have no temp readings, and the source code is password protected so I can't make the same modification as it was on the hwmonitor 1.0

Could anybody tell me how to make the Hwmonitor 1.0 using librehardware lib. Or send me the source for the Hw 1.1. ?

  Are you sure? yes | no

estebangmn wrote 07/06/2019 at 14:23 point

guys i need help,im trying to make it works the version 1.4 with CFG on arduino uno and one oled 0'96" this version i have a problem,when turn it on part of the GPU and sysram data appers and disapear for seconds,i dont have the microPro and i tweak part of the code to make it work in a simple arduino uno directly to the oled screen,i tried everything but i dont know what happend,part of the info appear and disapear for seconds,when it run works well and show all the info for 2 seconds and then disappear everything on the display type 1,someone can help me?

FIXED MYSELF,the problem was the amount of Pixels,when you put more than 20 pixels on the arduino sketch the info of the display works very bad or dont even works,if you choose NUMPIXELS 10 all works perfect,the fucking skect is glitched with the number of pixels

  Are you sure? yes | no

Rupert Hirst wrote 07/07/2019 at 21:25 point

The sketch is not glitchy it runs fine on a ProMicro with more than 10 pixels, It clearly states use a 32u4. yet people still fight it and try to use a 328P .

  Are you sure? yes | no

estebangmn wrote 07/07/2019 at 21:35 point

ok thank you rupert and thanks for the proyect,i just made a video on youtube talking about this proyect and my problems during this last days

  Are you sure? yes | no

openmy wrote 06/21/2019 at 13:46 point 
gnant.src gplv3 license open source is password protect ??? Do not open this zip file. ??? it is still open source

  Are you sure? yes | no

adamnemeth0 wrote 07/22/2019 at 08:41 point

Hi, did you managed to get the password? I have asked him for it, but no reply yet.

  Are you sure? yes | no

Don wrote 06/16/2019 at 04:43 point

I have built a portable version of Gnat Stats V1.31 for my laptop and a Gnat Stats TFT 1.5 that is mounted in the window of my PC case. On the PC, everything works fine except the GPU shader section which shows 0MHz. My GPU is an RTX 2060 (nvidia driver ver 430.86), Windows 10 Pro, and using Hardware Serial Monitor v1.1.

I'm not sure if this issue has/is been popping up, but I'm guessing that it might be due to the RTX cards config with the Turing gpu.

  Are you sure? yes | no

Rupert Hirst wrote 07/07/2019 at 21:26 point

I'm not sure if Libre hardware monitor supports RTX series yet

  Are you sure? yes | no

Don wrote 07/07/2019 at 23:14 point

Thank you for the reply.

On a separate note, I updated my build of the TFT version with two 8-count WS2812 pixel sticks. They are the same width as the 2.8 TFT, so the CPU meter is on top and the GPU meter is on bottom.

Your code works perfectly with them, I just had to change the NeoPin to P4 on the ProMicro. P5 does work (tested with a different sketch), but the pixels wouldn't light.

If you'd like a photo of the build, let me know.

  Are you sure? yes | no

gitxmax wrote 04/06/2019 at 15:33 point

Hello, received a  blue pill and ILI9341  screen Today and now checking all the connections and pin assignments. I presume, the 3.3v regulator of the blue pill is too weak to supply all the power for the screen? Since the screen itself is 5v tolerant, will it be ok, to supply 5v, from the usb power, directly to the screen's vcc pin, while the logic power will be provided by blue pill's 3.3v regulator? Or better to replace the regulator with a more powerful one ( I have a few 1117 3.3v)

Also, bit confused by your picture, the part where the A12 pin is connected to 3.3v pin, through a resistor. Could not find any information on that...


  Are you sure? yes | no

Rupert Hirst wrote 04/06/2019 at 15:42 point

I powered the screen inc blacklight off the 3.3v on the BluePill. If the VCC on the screen is 5v tolerant then use the 5v on the bluepill its tied to the USB input .

The resistor is for the reason below

I didn't have any issue without out the resistor on my PC

  Are you sure? yes | no

gitxmax wrote 04/06/2019 at 15:50 point


  Are you sure? yes | no

quannhe18 wrote 04/05/2019 at 14:09 point

Can you add the Ram usage in the screen  ??? thanks =) 

  Are you sure? yes | no

Rupert Hirst wrote 04/05/2019 at 14:46 point

Ram usage is  displayed at the bottom

  Are you sure? yes | no

quannhe18 wrote 04/05/2019 at 14:58 point

"Memory usage" ??? what exactly the "Memory usage" in the bottom  i think it is show the percent of memory use???and the CPU load and CPU usage are different ???thanks you for your project, it is very fantastic =)))

  Are you sure? yes | no

Rupert Hirst wrote 04/05/2019 at 22:44 point

I don't understand your question.

"Can you add the Ram usage in the screen  ??? thanks =) "

"Memory usage" is the amount for system ram currently being used

  Are you sure? yes | no

quannhe18 wrote 04/06/2019 at 03:27 point

oh thanks, now i'm understand about the "Memory usage" many thanks =)))))

  Are you sure? yes | no

gitxmax wrote 03/28/2019 at 15:09 point

Could you elaborate, on the voltage subject, of the TFT screen?

Most of them, appear to be 3.3/5v tolerant, yet the logic seems to be 3.3v. So, what's the right way to connect them?

  Are you sure? yes | no

Rupert Hirst wrote 03/28/2019 at 18:02 point


Yes they do often state they are 5v tolerant but you have to take it with a pinch of salt. The 2.8" ILI9341 in the picture has a voltage regulator (SMD part 662K) but I had to use 1.5k resistors in series on all the logic using a 5v ProMicro .  So in essence they are really not 5v tolerant :)

I'm liking the BluePill more and more. Over half its pins are 5v tolerant and that includes TX/RX, despite it being 3.3v, and they are so cheap

  Are you sure? yes | no

gitxmax wrote 03/29/2019 at 02:16 point

Cheers! So the bluepill requires no extra resistors? Simply attached directly with the wires? Would you mind, posting a simple connection diagram ( for the Stm32 + ILI9341, for example)?

  Are you sure? yes | no

gitxmax wrote 03/22/2019 at 11:23 point

Yet another fantastic update, thanks!

Do both screens work with either STM32 BluePill or ProMicro?

  Are you sure? yes | no

Rupert Hirst wrote 03/22/2019 at 11:51 point

Thanks 😁

Yes both screens work with both micros. Just uncommented  the micro and the screen you are using from the config tab. 

The BluePill has a lot more memory for bitmaps. The only downside is that neopixels on the STM use the MOSI SPi pin. This being the case I left it out for the moment.

 You can use software SPi and get the pin back but it really impacts the refresh of the screen.

  Are you sure? yes | no

Boris wrote 03/21/2019 at 18:19 point


Having an odd issue and wondering if I've mucked up somewhere!

I purchased

When I load the display up, the bottom bit of the screen seems cut off as can be seen in this screenshot:

Have I ordered an incorrect display, or is this a configuration setting I can change?


  Are you sure? yes | no

Rupert Hirst wrote 03/21/2019 at 18:44 point

I noticed this issue using the newer adafruit SSD1306 libraries. 

I have never had this issue before in earlier libraries.

Kind of got around it in v1.4 by specifying the pixel height and width

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels


Most vendors just call it a SSD1306 but often they are SH1106. The 1.3" screens are always SH1106 it appears, even though they call them SSD1306

Try selecting the SH1106 library 

  Are you sure? yes | no

Boris wrote 03/21/2019 at 19:14 point

Which SH1106 library did you use? I seem to be having compile errors with the choice I have (

Alternatively, would v1.4 work with my particular setup? I noticed that the power pin option was removed, so didn't want to risk it lest I fried an OLED!


Edit: Ignore - if I RTFM'd, I'd see you already included a link!

  Are you sure? yes | no

Boris wrote 03/21/2019 at 19:36 point

All working perfectly with the 1106 library! Thank you very much!

  Are you sure? yes | no

gitxmax wrote 03/21/2019 at 12:02 point

Having a small issue with the neopixel ring... 

I received a ring whch is marked wcmcu-2812B-16, which seems to be a clone of the original, but of a larger size. It works ok-ish, but has 2 issues..

The leds seem to be reversed. The cpu leds are mapped to the bottom part and the gpu leds are at the top.

There's no startup animation (as seen on one of the youtube videos.)

Mostly concerned with reversing the top and bottom mapping. Could you give me  a hint, what needs to be changed in the code?


  Are you sure? yes | no

Rupert Hirst wrote 03/21/2019 at 12:26 point

if you look in the "NeoPixelGauges" tab and take the following as an example

//---------------------- CPU--------------------

void CPU_loadGauge(int cpuUsage ) {


  float CPUloadfactor = cpuUsage ;

  if (CPUloadfactor >= 0 ) {
    pixels.setPixelColor( number of the pixel you want to be lit  round the ring, 229, 193, 0);


if you have 16 pixels the numbers start at 0 -15 , so the first pixel is address "0"

In your case the PCB is laid out in reverse. You will have to go down the "NeoPixelGauges" tab and change all the numbers.

Example: CPU_loadGauge

  pixels.setPixelColor( 15, 229, 193, 0);

  pixels.setPixelColor( 14, 230, 165, 1);

  pixels.setPixelColor( 13, 232, 137, 2);

Above becomes 

   pixels.setPixelColor( 0, 229, 193, 0);

   pixels.setPixelColor( 1, 230, 165, 1);

   pixels.setPixelColor( 2, 232, 137, 2);

and so on..................

Hope this is as clear as mud :)

  Are you sure? yes | no

gitxmax wrote 03/21/2019 at 12:42 point

Thanks man, will dive into it ;)

  Are you sure? yes | no

gitxmax wrote 02/24/2019 at 20:57 point

Thanks for the fantastic project.

I recreated the project, using an arduini nano instead. V1.2 works somewhat ok, but with the v1.31 the telemetry data is not pulled. Is there anything in the latest code, which possible conflicts with the arduino nano?

  Are you sure? yes | no

gitxmax wrote 03/10/2019 at 06:47 point

Replaced Arduino nano with Arduino ProMicro and all the issues gone.

  Are you sure? yes | no

Rupert Hirst wrote 03/10/2019 at 22:04 point

The code needs hardware USB to function correctly

  Are you sure? yes | no

Belean wrote 03/24/2019 at 10:53 point

I did the same thing and I solved my problems! Nano doesn't have enough memory imho.

  Are you sure? yes | no

alexyecla wrote 02/19/2019 at 11:08 point

Hi Rupert, thanks for your proyect i'd love it, I'm trying use your gnat-serial-monitor, and detects usage. and temps, but I want send more data like vram, voltage, cpu & gpu how I can add these parameters?? hope you can help me.

  Are you sure? yes | no

Belean wrote 01/12/2019 at 09:14 point

Hi Rupert! I've been looking for a project like yours for a long time. So thanks a lot! But I'm stuck with one meter to go, can you help me out? Everything works great, but the data is missing: no temp, no hardware names, just CPU...blank, GPU...blank, hertz...blank. I've an i7-7700 and a GTX 1080. Hardware Serial Monitor tray v1.1 is up and running. Any suggestions could be very useful to me, thank you!

  Are you sure? yes | no

Rupert Hirst wrote 01/13/2019 at 20:53 point

HI Belean,

Did you run HardwareSerialMonitor as Admin?

  Are you sure? yes | no

Belean wrote 01/13/2019 at 21:35 point

Thaks for your answer Rupert! Yes I did. HardwareSerialMonitor_v1.1. And OpenHardwareMonitor v0.8.0-beta works fine, if this can help. You can confirm that if I did everything right it should work even on an updated PC, right? There should be no external variables that could interfere with the project therefore?

  Are you sure? yes | no

Rupert Hirst wrote 01/13/2019 at 22:50 point

if you ran the app as admin and you have selected the correct com port from the tray it should work. The only other things that may effect it are folder permissions, the arduino Com port driver, Antivirus or a firewall blocking the com port.

  Are you sure? yes | no

Nosdrahcir Iniburehc wrote 01/09/2019 at 21:52 point

Hello. Excellent project. I'm trying to reproduce this project, but I'm having the following problem. Can you give me a hand?

  Are you sure? yes | no

acid company wrote 12/11/2018 at 18:17 point

how to fix form1 windows problem on serialmonitor?

  Are you sure? yes | no

acid company wrote 11/24/2018 at 13:26 point

great project. thanks for share it but i want to same build for my pc. how i set up this parts and how i install to code in arduino? can u help me about this issue?

  Are you sure? yes | no

valentin-bykov-1990 wrote 11/13/2018 at 08:43 point

tell me please,what command do I need to write to display information about the gpu ram load?

  Are you sure? yes | no

Rupert Hirst wrote 10/21/2018 at 21:24 point

Asrul...  Which display have you got ?

  Are you sure? yes | no

Asrul Yol wrote 10/19/2018 at 22:45 point

hey Rupert, im really new to adruino. im trying to varify the scetch, and i got "splashscreen was not include in this scope" error. How do i fix this? 

  Are you sure? yes | no

Rupert Hirst wrote 10/20/2018 at 00:03 point


Did you alter something in the sketch before you verified it? 

Did you download the libraries?

In arduino IDE 1.85 with correct libraries it should complie just fine.

Just because it complains about "splashscreens" does not mean the problem is with that. It could be something as simple as you deleted or  missed out a semicolon somewhere above, in the code.

  Are you sure? yes | no

Asrul Yol wrote 10/20/2018 at 12:11 point

hi.. i've find out the problem and able to upload the sketch.. but now no display.. can u help me on this.. i ve try as your previous comment below.. but still didnt light up.. any suggestion?

  Are you sure? yes | no

valentin wrote 10/19/2018 at 13:47 point

really very happy with this monitor. I will buy WS2812 digital leds right now ;)

  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