This little device shows you the CPU-load, how much physical and virtual memory is used. It shows this data per 10% on 3 ledbars. To do so it uses a VCP (Virtual COM Port), so that it can be connected to a PC via a USB connection to receive the data. Collecting the data and sending it to the device is done by a Python script.
By building my own onboard UART to USB converter and using SMD, I was able to make a relatively small device.
As always, comments and constructive criticisme are very much appreciated.
Step 1: What Do You Need?
- An attiny2313 (datasheet)
- A FT232RL Uart to USB converter (datasheet)
- A Mini USB B connector
- 3 x Kingbright DC-10EWA Ledbar(datasheet)
- 10 x 150Ohm resistor
- A ferrite bead
- 2 x 100nF capacitor
- A 10nF capacitor
- A 4.7uF capacitor
- A 6pin female header
- Materials to make a PCB or some veroboard
- A Programmer and compiler of your choice
To run the python script on your pc, you will need:
As always, you can use thru-hole components instead of smd parts.
Step 2: The Circuit
The circuit for this project is fairly easy. The USB part of the schematic can be found in the datasheet of the FT232RL as a USB-powered device with a microcontroller.
There are 2 connections from the FT232RL to the attiny2313: RX and TX (actually we need only The TX of the FT2313RL to the RX of attiny but connecting both lines makes debugging the microcontroller a lot easier).
The 3 ledbars are multiplexed. Their cathodes are connected to Port B, PortD.5 and PortD.6. The anodes are connected to Portd.2 - 4.
Miso, Mosi, SCK and Reset are connected to the header for programming together with VCC and GND.
Step 3: Programming
Once everything is soldered together and tested, you can load the actual code.
My code is written in BascomAVR so I added the original .bas-file here for other Bascom users and the code in a .txt-file as reference for C-programmers. I also added a .hex-file so that you can use it immediately.
The code receives the data via the USB and and multiplexes it into the 3 ledbars. The first one is the CPU-load, the second one is the physical memory and the last one is the virtual memory.
Step 4: The Python Script
'And now for something completely different...'
Indeed, a bit of Python.
I wrote the script in Python 2.7 while using PySerial and Psutil. You´ll need to download those 2 modules (links can be found in Step 1).
The script collects the CPU and Memory data via the Psutil-module and sends them over the virtual COM-port to the device.
ser = serial.Serial(2) #Change this according to your own COM-port. Remeber that the value you should add is one less than the
number of your COM-port.
q = psutil.cpu_percent(interval=1)
q = q/10
cpuload = '%.0f'%(q)
cpuload = 'a'+ cpuload
q = psutil.phymem_usage()
mem = '%.0f'%(q.percent/10)
mem = 'b'+mem
q = psutil.virtmem_usage()
virtmem = '%.0f'%(q.percent/10)
virtmem = 'c'+virtmem