Read fader's value and display it (optimization)

Hello there ! I’m sorry for that bad English…

I am a French student and I am working on an open DMX lighting console.

I writed a programm whitch reads and converts a fader’s values and which displays it on a little OLED screen. The problem is that I can’t refresh the text on the screen and the only solution that I have found is to delete the object and to create an other one. This solution is not optimized and I would like to know if someone has an other solution.

The fader is a Profader MF-914-B10K-10V

The ADC is a MCP3008

The OLED screen is a SSD1306

I am using Adafruit_GPIO.SPI, Adafruit_MCP3008, Adafruit_SSD1306 and PIL libs.

Here is the code :

import time
import Adafruit_GPIO.SPI as SPI
#ADC lib
import Adafruit_MCP3008
#OLED screen lib
import Adafruit_SSD1306
#Displaying libs
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

		###Hardware SPI configuration###

mcp = Adafruit_MCP3008.MCP3008(spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE))
RST = 0


#Create display object
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)
#init display
#Cleat display
# Create blank image for drawing with mode '1' for 1-bit color.
width = disp.width
height = disp.height
image ='1', (width, height))
# Get drawing object to draw on image.
draw = ImageDraw.Draw(image)
#load default font
font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 20)

raw_value = mcp.read_adc(0)
while True:
	new_raw_value = mcp.read_adc(0)

	#Because of a non stable input voltage, the read value is not constant
	#We need to do a hysteresis
	if new_raw_value < raw_value-5 or new_raw_value > raw_value+5:
		raw_value = new_raw_value

	raw_value_str = str(raw_value)
	value = (raw_value*100)/1023
	value_str = str(value)
	#print "The value is", value

	#Draw some text
	draw.text((0,0), value_str, font=font, fill=255)
        draw.text((40,0), "%", font=font, fill=255)
        draw.text((0,30), raw_value_str, font=font, fill=255)
	#Update display
	#Refresh text
	image ='1', (width, height))
	draw = ImageDraw.Draw(image)
	draw.text((0,0), " ", font=font, fill=255)
        draw.text((0,30), " ", font=font, fill=255)

I am running this on a raspberry Pi3B

When I run this program, it takes 23% of one CPU’s core. Thank you for your help !

You might take a look at the Adafruit example - in there they clear the image without re-creating it:

# Draw a black filled box to clear the image.
    draw.rectangle((0,0,width,height), outline=0, fill=0)

As to the 23% of CPU issue, the program as written is a tight little loop which is polling the fader as fast as possible.

Does the fader value change that often? Maybe check only once every couple of seconds, 5 seconds, ???

Two possibilities to reduce CPU usage, off the top of my head:

  1. If the new raw value hasn’t changed since the last time you checked, don’t do the work of updating the display

  2. Use sleep() inside the loop to delay for a certain number of seconds.