GUI interface in Python3 +Tkinter. Simple ADC..

-

It is incredibly easy to get a simple ADC able to read sensor devices whose resistance is changed by some physical property- with just a pair of components. The image shows a continuous display of the sensor in a GUI window.

All you need is say a LDR from +3.3V in series with a capacitor of say 0.1uF to earth. The junction goes to Pi pin 18.

A simple Python3 program discharges the capacitor, then counts up as it recharges, saving the count when it passes the CPU GPIO input threshold voltage. I chose to average the new reading with the previous one, to provide some smoothing but still a reasonably fast response.

The rest of the program just creates a Tkinter GUI display and calls the read routine at regular intervals.

You could of course instead save the values to a csv file for analysis; or display graphically on screen. Programming this helped me understand, among other things-Pythonesque, the ideas of operator overloading and of string-slicing and overlooading. If sent to a fan-fold old-fashined printer this makes a very impressive chart recorder!!


/usr/bin/env python3

<ctrl><C> to end
#sudo python analogPortViaRC_GUI_a.py to run, or run 'sudo idle3' and load first...

#   Assumes a LDR from +3.3V in series with capacitor of 0.1uF to ground. Junction to pin 18.
import time, os
import RPi.GPIO as GPIO
from tkinter import *

root =Tk()
root.title( "Cheapo-ADC")
meter =Label( root, font =('arial', 36, 'bold'), bg ='green')
meter.pack( fill=BOTH, expand=1)

GPIO.setwarnings( False)
GPIO.setmode( GPIO.BCM)    # we want to use the Pi connector's pin numbering scheme
GPIO.setup( 18, GPIO.OUT)  # setup pin 18

def RCtime( RCpin):        # read cycles taken to come back above threshold voltage
    reading =0
    GPIO.setup(  RCpin, GPIO.OUT)
    GPIO.output( RCpin, GPIO.LOW)           #   ...after first being pulled low & discharged.
    time.sleep( 0.1)
    GPIO.setup( RCpin, GPIO.IN)
    while ( GPIO.input( RCpin) ==GPIO.LOW):
        reading +=1
    return reading

def measure():  #   smooth data by loaded average of new and previous reading.
    global runAve
    sensor_value =RCtime( 18)
    runAve =0.8 *runAve +0.2 *sensor_value
    meter.config( text ='%4.1f' % runAve)   #   format to 1 d.p.
    meter.after( 1000, measure)             #   re-do after 1 second.

runAve =RCtime( 18)                         #   get an initial value

measure()
root.mainloop()

#GPIO.cleanup()

#!/usr/bin/env python

#<ctrl><C> to end
#sudo python analogPortViaRC5.py to run, or run 'sudo idle3' and load first...

import time, os, time
import RPi.GPIO as GPIO

GPIO.setwarnings( False)

    # we want to use the Pi connector's pin numbering scheme
GPIO.setmode( GPIO.BCM)

    # setup pin 18
GPIO.setup( 18, GPIO.OUT)

def RCtime ( RCpin):
    reading =0
    GPIO.setup( RCpin, GPIO.OUT)
    GPIO.output( RCpin, GPIO.LOW)
    time.sleep( 0.1)

    GPIO.setup( RCpin, GPIO.IN)

    while ( GPIO.input( RCpin) ==GPIO.LOW):
        reading +=1

    return reading

bar          ="#"
#runAverage10 =RCtime( 18)
start        = time.time()

print( "Displaying Analogue input on pin 18.")

while True:
    # read cycles taken to come back above threshold voltage
    
    z =( bar *int( RCtime( 18) /10), int( (time.time() - start)), " seconds")
    print( z)
    
    myfile =open( 'tempLog.csv', 'a')
    myfile.write( str( RCtime( 18)))
    myfile.write( ',')
    myfile.write( str( int( (time.time() - start))))
    myfile.write( '\n')
    myfile.close()
    
    time.sleep( 5)

GPIO.cleanup()

As always, e-mail me if you meet problems or have suggestions.