Dial Gauge With Pi Pico, SSD1306 and MicroPython - Advanced Graphics Routines
by tonygo2 in Circuits > Microcontrollers
1648 Views, 3 Favorites, 0 Comments
Dial Gauge With Pi Pico, SSD1306 and MicroPython - Advanced Graphics Routines
In this project I will show you how to display a Dial Gauge on an SSD1306 128x64 mono pixel display. It is driven by a Raspberry Pi Pico using MicroPython. The value displayed is controlled a potentiometer. All the components are inexpensive and widely available.
Supplies
We will need the following Items:
- Raspberry Pi Pico with soldered pins
- Breadboard
- SSD1306 128x64 pixel display
- 10K Ohm potentiometer
- Connecting wires
- Button switch
- LED and 330 Ohm current limiting resistor (Optional)
- Thonny Editor installed on your computer
- USB cable between Pico and computer
Build the Circuit
SSD1306 has SDA on GP8, SCL in GP9, VCC on 3.3 volt rail and GND on GND rail
The button is on GP15 and 3.3 volts, with pull-down
The potentiometer is connected ADC0 on GP26
The LED, if fitted, is on GP16 (Optional)
Try It Out
Run the video to see it working.
Download the SSD1306.py library and install it on your Pico.
Download the program and execute it from Thonny.
Setup Section
This section imports the required library routines and sets up the hardware - all very normal.
The listing includes the top of the character definitions for the re-sizeable font. It is quite long but the Pico has plenty of memory
Font Control
This shows the end of the extended font definitions and the three procedures to display text on the display.
- character(asc,xt,yt,sz,c) = Single character at (xt, yt) in size, sz and colour c
- prnt_st(asci,xx,yy,sz,c) = prints string of characters from (xx, yy) in size sz and colour c
- cntr_st(s,y,sz,c) = Centres a string on line y in size sz and colour c
Extra Routines
The SSD1306 library inherits pixel(), vline(), hline(), line(), fill(), show() and rect() from framebuf. You can find the documentation here:
https://docs.micropython.org/en/latest/library/framebuf.html?highlight=framebuf#module-framebuf
(Not all have been implemented at the moment.)
I have added the following routines:
block(x,y,w,h,c): # Filled rectangle
circle(x,y,r,c): # Filled circle
ring(x,y,r,c): # Edge of circle
get_ADC(max_required) = Read ADC and rescale value from 0 to max_required
Build the Dial
Here we display the 'Splash screen' or title using centred text in 2 sizes.
We start drawing the dial with the outer ring and then draw radial lines from the centre to the ring using a bit of trigonometry. The ticks are far too long; so we shorten them by drawing a black filled circle over them. We then draw a black rectangle to remove the arc at the bottom of the dial between 0 and 100 ticks.
Finally I put my name n the display. (Change to whatever you want.)
Note that we only draw the dial ring once. We do not wipe the whole screen and rebuild from scratch each time we loop.
Move the Needle Round the Dial
Here well run a loop counting the percentage from 0 to 100 and make the needle move. Look carefully to see that we rub out the previous needle and displayed value before drawing in the new versions.
The text is right aligned before being displayed. This stops it moving from side to side as its length increases.
Move the Pot to Control the Needle
This loop continues until the button is pressed. It gets a value for the percentage to to be displayed from the potentiometer. Twist the knob to change the value.
Once the button is pressed the looping halts and we say BYE with size 3 characters and tidy-up the display.
Conclusions
The Trigonometry and Pythagoras we did at school has at last come in for something useful!
If you have found this useful, please leave a comment.
You could also suggest a topic for another Pi Pico + MicroPython project you would like me to cover.
Have fun with your coding.