My Question is for the very end, I am trying to get the script to clear the display and disable the backlight when Control + C is pressed in linux, half of the time the lcd display will not clear
I have tried to get the python to close properly and clear the display but it only works a portion of time, even with sleep(1) added
#!/usr/bin/env python
import RPi.GPIO as GPIO
import lcd_driver
import socket
import struct
import fcntl
import time
import os
import re
from time import sleep
PIN = 23
COUNT = 0
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(PIN,GPIO.IN,pull_up_down=GPIO.PUD_UP)
print('Writing to Display!')
disp = lcd_driver.lcd()
def cputemp():
while True:
cputemp = os.popen("vcgencmd measure_temp").readline()
celsius = re.sub("[^0123456789/.]", "", cputemp)
fahrenheit = int(9.0/5.0*int(float(celsius)+32))
disp.lcdstring("Cpu : {} C".format(celsius), 1)
disp.lcdstring("Temp: {} F".format(fahrenheit), 2)
button = GPIO.input(PIN)
if button == False:
break
def curtime():
while True:
disp.lcdstring("Time: {}".format(time.strftime("%H:%M:%S")), 1)
disp.lcdstring("Date: {}".format(time.strftime("%m/%d/%Y")), 2)
button = GPIO.input(PIN)
if button == False:
break
def getaddr(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915,
struct.pack('256s', ifname[:15])
)[20:24])
def getip():
ip = getaddr('wlan0')
while True:
disp.lcdstring("IP Address: WiFi", 1)
disp.lcdstring(ip, 2)
button = GPIO.input(PIN)
if button == False:
break
try:
while True:
button = GPIO.input(PIN)
if button == True:
if COUNT == 0:
disp.lcdstring("Press the Button",1,0)
disp.lcdstring("To Start Demo!",2,1)
if COUNT == 1:
disp.clear()
cputemp()
if COUNT == 2:
disp.clear()
curtime()
if COUNT == 3:
disp.clear()
getip()
if COUNT == 4:
disp.clear()
COUNT = 1
if COUNT > 4:
disp.clear()
COUNT = 0
if button == False:
COUNT = COUNT +1
sleep(0.5)
except KeyboardInterrupt:
pass
finally:
disp.clear()
disp.backlight(0)
GPIO.cleanup()
You can add a shutdown hook using the atexit module
example code:
import RPi.GPIO as GPIO
import lcd_driver
import socket
import struct
import atexit
import fcntl
import time
import os
import re
from time import sleep
def exit_handler():
print(' Cleaning Up!')
disp.clear()
disp.backlight(0)
GPIO.cleanup()
exit(1)
atexit.register(exit_handler)
try:
while True:
button = GPIO.input(PIN)
if button == True:
if COUNT == 0:
disp.lcdstring("Press the Button",1,0)
disp.lcdstring("To Start Demo!",2,1)
if COUNT == 1:
disp.clear()
cputemp()
if COUNT == 2:
disp.clear()
curtime()
if COUNT == 3:
disp.clear()
getip()
if COUNT == 4:
disp.clear()
COUNT = 1
if COUNT > 4:
disp.clear()
COUNT = 0
if button == False:
COUNT = COUNT +1
sleep(0.5)
except KeyboardInterrupt:
pass
I use it on OrangePI to close a value when my code crash/exit and it works every time