Finish python code

This commit is contained in:
pangduckwai
2019-04-26 23:07:03 +08:00
parent 67c04e1ab4
commit 622c7705f0
2 changed files with 94 additions and 34 deletions
+17 -1
View File
@@ -64,6 +64,9 @@ Well I'm not too sure about what is the point to install python-pip then remove
* `sudo apt-get purge python-pip` * `sudo apt-get purge python-pip`
* `sudo -H pip install --upgrade luma.oled` * `sudo -H pip install --upgrade luma.oled`
### Install `ifstat` for displaying network statistic
* `sudo apt-get install ifstat`
## Test ## Test
That's it, the display is ready to use. That's it, the display is ready to use.
@@ -74,6 +77,19 @@ That's it, the display is ready to use.
* `sudo python demo.py` * `sudo python demo.py`
## Next step ## Next step
The original Python code in this repo is adopted from `demo.py` provided by the manufacturer, which is no good for 'production' use. Because your Pi will be too busy looking for button inputs instead of doing anything else useful. The Python code in this repo (`monitor.py`) display system information of the Pi:
1. **Button 1** - Display information relating to the main purpose of the Pi: _Disk space_ and _WiFi_.
2. **Button 2** - Display _IP Address_, _CPU Idle %_, _Memory usage_ and _System temperature_.
3. **Button 3** - Display the system shutdown dialog, use the Joystick to select options, press **Button 3** to confirm your choice.
The screen will turn off after idling for around 20 seconds.
### CPU usage
The original Python code in this repo (`monitor.py`) is adopted from `demo.py` provided by the manufacturer, which is no good for 'production' use. Because your Pi will be too busy looking for button inputs instead of doing anything else useful.
The latest version utilize GPIO input detection instead of busy wait, which is much more reasonable CPU-wise. The latest version utilize GPIO input detection instead of busy wait, which is much more reasonable CPU-wise.
### Enable the display at startup
* `sudo vi /etc/rc.local`
* Add the following line at the end of the file, assuming `monitor.py` is in /home/pi/:
* `sudo python /home/pi/monitor.py &`
* _**IMPORTANT**_ Don't forget the `&` character at the end!
+76 -32
View File
@@ -17,19 +17,21 @@ from PIL import ImageDraw
from PIL import ImageFont from PIL import ImageFont
#GPIO define #GPIO define
RST_PIN = 25 RST_PIN = 25 #Reset
CS_PIN = 8 CS_PIN = 8
DC_PIN = 24 DC_PIN = 24
JS_U_PIN = 6 JS_U_PIN = 6 #Joystick Up
JS_D_PIN = 19 JS_D_PIN = 19 #Joystick Down
JS_L_PIN = 5 JS_L_PIN = 5 #Joystick Left
JS_R_PIN = 26 JS_R_PIN = 26 #Joystick Right
JS_P_PIN = 13 JS_P_PIN = 13 #Joystick Pressed
BTN1_PIN = 21 BTN1_PIN = 21
BTN2_PIN = 20 BTN2_PIN = 20
BTN3_PIN = 16 BTN3_PIN = 16
# Some constants # Some constants
SCREEN_SAVER = 20.0
CHAR_WIDTH = 19
font = ImageFont.load_default() font = ImageFont.load_default()
width = 128 width = 128
height = 64 height = 64
@@ -55,13 +57,34 @@ device = sh1106(serial, rotate=2) #sh1106
draw = ImageDraw.Draw(Image.new('1', (width, height))) draw = ImageDraw.Draw(Image.new('1', (width, height)))
draw.rectangle((0,0,width,height), outline=0, fill=0) draw.rectangle((0,0,width,height), outline=0, fill=0)
SCREEN_SAVER = 20.0 state = 0 #System state: 0 - scrren is off; equal to channel number (e.g. BTN2_PIN, JS_P_PIN) otherwise
state = 0 stops = 0 #Shutdown choice: 0 - No; 1 - Yes
stamp = time.time() stamp = time.time() #Current timestamp
start = time.time() start = time.time() #Start screen saver count down
def end_process(channel): def shutdown(channel):
os.system("sudo shutdown -h now") global stops
if state == BTN3_PIN:
if stops == 1:
draw_process(RST_PIN)
os.system("sudo shutdown -h now")
else:
main_process(BTN1_PIN)
else:
stops = 0
main_process(BTN3_PIN)
def select(channel):
global stops
if state == BTN3_PIN:
if channel == JS_L_PIN:
stops = 1
draw_process(state)
elif channel == JS_R_PIN:
stops = 0
draw_process(state)
else:
pass
def draw_process(channel): def draw_process(channel):
with canvas(device) as draw: with canvas(device) as draw:
@@ -70,31 +93,50 @@ def draw_process(channel):
LINE2 = "" LINE2 = ""
LINE3 = "" LINE3 = ""
LINE4 = "" LINE4 = ""
LINE5 = "" if channel == BTN2_PIN:
if channel == BTN1_PIN:
LINE1 = subprocess.check_output("hostname -I | awk '{printf \"IP :%s\", $1}'", shell = True ) LINE1 = subprocess.check_output("hostname -I | awk '{printf \"IP :%s\", $1}'", shell = True )
LINE3 = subprocess.check_output("top -bn1 | awk 'NR==3{printf \"CPU:%.1f%% idle\", $8}'", shell = True ) LINE2 = subprocess.check_output("top -bn1 | awk 'NR==3{printf \"CPU:%.1f%% idle\", $8}'", shell = True )
LINE4 = subprocess.check_output("free -mh | awk 'NR==2{printf \"Mem:%s/%s %.1f%%\", $3,$2,$3*100/$2 }'", shell = True ) LINE3 = subprocess.check_output("free -mh | awk 'NR==2{printf \"Mem:%s/%s %.1f%%\", $3,$2,$3*100/$2 }'", shell = True )
LINE5 = subprocess.check_output("cat /sys/class/thermal/thermal_zone0/temp | awk '{printf \"Tmp:%.1fC\", $1/1000}'", shell = True ) LINE4 = subprocess.check_output("cat /sys/class/thermal/thermal_zone0/temp | awk '{printf \"Tmp:%.1fC\", $1/1000}'", shell = True )
elif channel == BTN2_PIN: elif channel == BTN1_PIN:
ssid = subprocess.check_output("iwgetid --raw | awk '{printf \"Net: %s\", $0}'", shell = True) ssid = subprocess.check_output("iwgetid --raw | awk '{printf \"WiFi:%s\", $0}'", shell = True)
freq = subprocess.check_output("iwgetid --freq | awk '{gsub(/Frequency:/,\"\"); printf \" %.1f %s\", $2,$3}'", shell = True) freq = subprocess.check_output("iwgetid --freq | awk '{gsub(/Frequency:/,\"\"); printf \" %.1f %s\", $2,$3}'", shell = True)
LINE2 = subprocess.check_output("df -h /mnt/usb | awk '$NF==\"/mnt/usb\"{printf \"USB:%s/%s %s\", $3,$2,$5}'", shell = True ) LINE1 = subprocess.check_output("df -h /mnt/usb | awk '$NF==\"/mnt/usb\"{printf \"Disk:%s/%s %s\", $3,$2,$5}'", shell = True )
LINE3 = ssid + freq LINE2 = ssid + freq
LINE4 = " in Kbps out Kbps" LINE3 = " in Kbps out Kbps"
LINE5 = subprocess.check_output("ifstat -bT 0.1 1 | awk 'NR==3{printf \"%9.2f %9.2f\",$3,$4}'", shell = True) LINE4 = subprocess.check_output("ifstat -bT 0.1 1 | awk 'NR==3{printf \"%9.2f %9.2f\",$3,$4}'", shell = True)
elif channel == BTN3_PIN: elif channel == BTN3_PIN:
LINE2 = " Shutdown?" LINE1 = " Shutdown ?"
LINE4 = " Yes No" LINE3 = " Yes No"
if stops == 0:
draw.rectangle((72,50,94,52), outline=255, fill=1)
else:
draw.rectangle((15,50,37,52), outline=255, fill=1)
elif channel == RST_PIN:
LINE2 = " Shutting down..."
else: else:
pass pass
draw.text((xpos, top), LINE0, font=font, fill=255) draw.text((xpos, top), LINE0, font=font, fill=255)
draw.text((xpos, top+12), LINE1, font=font, fill=255) if len(LINE1) > CHAR_WIDTH:
draw.text((xpos, top+22), LINE2, font=font, fill=255) draw.text((xpos, top+12), LINE1[:CHAR_WIDTH], font=font, fill=255)
draw.text((xpos, top+32), LINE3, font=font, fill=255) else:
draw.text((xpos, top+42), LINE4, font=font, fill=255) draw.text((xpos, top+12), LINE1, font=font, fill=255)
draw.text((xpos, top+52), LINE5, font=font, fill=255)
if len(LINE2) > CHAR_WIDTH:
draw.text((xpos, top+28), LINE2[:CHAR_WIDTH], font=font, fill=255)
else:
draw.text((xpos, top+28), LINE2, font=font, fill=255)
if len(LINE3) > CHAR_WIDTH:
draw.text((xpos, top+40), LINE3[:CHAR_WIDTH], font=font, fill=255)
else:
draw.text((xpos, top+40), LINE3, font=font, fill=255)
if len(LINE4) > CHAR_WIDTH:
draw.text((xpos, top+52), LINE4[:CHAR_WIDTH], font=font, fill=255)
else:
draw.text((xpos, top+52), LINE4, font=font, fill=255)
def main_process(channel): def main_process(channel):
global serial global serial
@@ -127,10 +169,12 @@ def main_process(channel):
else: # state > 0 && channel == 0 && not-yet-timeout, refresh screen else: # state > 0 && channel == 0 && not-yet-timeout, refresh screen
draw_process(state) draw_process(state)
GPIO.add_event_detect(JS_P_PIN, GPIO.RISING, callback=main_process, bouncetime=200)
GPIO.add_event_detect(BTN1_PIN, GPIO.RISING, callback=main_process, bouncetime=200) GPIO.add_event_detect(BTN1_PIN, GPIO.RISING, callback=main_process, bouncetime=200)
GPIO.add_event_detect(BTN2_PIN, GPIO.RISING, callback=main_process, bouncetime=200) GPIO.add_event_detect(BTN2_PIN, GPIO.RISING, callback=main_process, bouncetime=200)
GPIO.add_event_detect(BTN3_PIN, GPIO.RISING, callback=main_process, bouncetime=200) GPIO.add_event_detect(BTN3_PIN, GPIO.RISING, callback=shutdown, bouncetime=200)
GPIO.add_event_detect(JS_L_PIN, GPIO.RISING, callback=select, bouncetime=200)
GPIO.add_event_detect(JS_R_PIN, GPIO.RISING, callback=select, bouncetime=200)
try: try:
main_process(BTN1_PIN) main_process(BTN1_PIN)