-
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()