149 lines
3.3 KiB
Python
149 lines
3.3 KiB
Python
import time
|
|
import atexit
|
|
import board
|
|
import RPi.GPIO as GPIO
|
|
|
|
from datetime import datetime
|
|
from adafruit_ht16k33.segments import Seg7x4
|
|
|
|
# ADC configuration
|
|
CLK = 11
|
|
MISO = 9
|
|
MOSI = 10
|
|
CS = 8
|
|
CHANNEL = 0 # By default read sensor 0
|
|
|
|
# Display configuration
|
|
i2c = board.I2C()
|
|
display = Seg7x4(i2c)
|
|
|
|
# Button
|
|
BUTTON = 5 # GPIO5
|
|
|
|
# Function called on push button (change sensor)
|
|
def handlePushButton(button):
|
|
global CHANNEL
|
|
CHANNEL += 1
|
|
if ( CHANNEL > 8 ):
|
|
CHANNEL = 0
|
|
|
|
display.print(" :"+str(CHANNEL)+"-")
|
|
|
|
|
|
# On exit
|
|
def handleExit():
|
|
print("GoodBye!")
|
|
display.print("--:--")
|
|
sleep(2)
|
|
display.fill(0)
|
|
|
|
|
|
# Init program
|
|
def init():
|
|
# Set display
|
|
display.brightness = 1
|
|
display.blink_rate = 0 # Between 0 and 3
|
|
|
|
GPIO.setwarnings(False)
|
|
GPIO.setmode(GPIO.BCM)
|
|
|
|
GPIO.setup(BUTTON, GPIO.IN, pull_up_down=GPIO.PUD_UP)
|
|
GPIO.setup(MOSI, GPIO.OUT)
|
|
GPIO.setup(MISO, GPIO.IN)
|
|
GPIO.setup(CLK, GPIO.OUT)
|
|
GPIO.setup(CS, GPIO.OUT)
|
|
|
|
# Add button event
|
|
GPIO.add_event_detect(BUTTON, GPIO.FALLING, callback=handlePushButton, bouncetime=250)
|
|
|
|
pass
|
|
|
|
|
|
# Convert value to volt
|
|
def convertToVoltage(value):
|
|
return value * ( 3.3 / 1024 ) * 5
|
|
|
|
|
|
# Convert volt to celcius value
|
|
def convertToCelcius(value):
|
|
return ( ( 3300.0 / 1024.0 ) - 100.0 ) / 10.0 - 40.0
|
|
|
|
|
|
#read SPI data from MCP3008(or MCP3204) chip,8 possible adc's (0 thru 7)
|
|
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
|
|
if ((adcnum > 7) or (adcnum < 0)):
|
|
return -1
|
|
|
|
GPIO.output(cspin, True)
|
|
GPIO.output(clockpin, False) # start clock low
|
|
GPIO.output(cspin, False) # bring CS low
|
|
|
|
commandout = adcnum
|
|
commandout |= 0x18 # start bit + single-ended bit
|
|
commandout <<= 3 # we only need to send 5 bits here
|
|
for i in range(5):
|
|
if (commandout & 0x80):
|
|
GPIO.output(mosipin, True)
|
|
else:
|
|
GPIO.output(mosipin, False)
|
|
|
|
commandout <<= 1
|
|
GPIO.output(clockpin, True)
|
|
GPIO.output(clockpin, False)
|
|
|
|
adcout = 0
|
|
|
|
# read in one empty bit, one null bit and 10 ADC bits
|
|
for i in range(12):
|
|
GPIO.output(clockpin, True)
|
|
GPIO.output(clockpin, False)
|
|
adcout <<= 1
|
|
if (GPIO.input(misopin)):
|
|
adcout |= 0x1
|
|
|
|
GPIO.output(cspin, True)
|
|
|
|
#adcout >>= 1 # first bit is 'null' so drop it
|
|
return adcout
|
|
|
|
|
|
# Main programm
|
|
def main():
|
|
init()
|
|
time.sleep(2)
|
|
print("Let's go!")
|
|
|
|
while True:
|
|
if ( CHANNEL == 8 ): # Last sensor => clock mode
|
|
now = datetime.now()
|
|
printableValue = now.strftime("%H:%M")
|
|
else:
|
|
# Get current sensor value
|
|
ad_value = readadc(CHANNEL, CLK, MOSI, MISO, CS)
|
|
value = 0
|
|
|
|
# Convert value in readable Volt or Celcius
|
|
if ( CHANNEL == 0 ):
|
|
value = convertToVoltage(ad_value)
|
|
else:
|
|
value = convertToCelcius(ad_value)
|
|
|
|
# Format value with 2 decimals
|
|
printableValue = f"{value:.02f}"
|
|
|
|
# Clear display
|
|
display.fill(0)
|
|
# Print new value
|
|
display.print(str(printableValue))
|
|
|
|
# Wait between next loop
|
|
time.sleep(10)
|
|
|
|
|
|
atexit.register(handleExit)
|
|
|
|
if __name__ =='__main__':
|
|
try:
|
|
main()
|
|
except KeyboardInterrupt:
|
|
pass
|