Raspberry Pi 3 [LCD Text Display with Python]

จากตอนที่แล้ว เราทำการเชื่อมต่อจอ LCD 16×2 และเขียน Basic Python ให้สามารถแสดงข้อความง่ายๆ ได้แล้ว

ตอนนี้เราจะลองนำค่าที่อยู่ในตัว Raspberry Pi 3 มาแสดง เช่น

Date & Time
Network Adapter IP Address
CPU Percentage Usage
CPU Temperature
Memory Total
Memory Usage
Memory Free
Disk Total
Disk Usage
Disk Free

เป็นต้น

 

** ส่วนตัวผมจะถนัดใช้ nano เป็น text editor นะครับ ส่วนท่านอื่นที่ไม่คล่อง จะใช้ผ่าน vi หรือ text editor บน gui ก็ไม่ว่ากันครับ **

** ไฟล์ทั้งหมดผม mkdir LCD เอาไว้บน home directory ของ user: pi ครับ **
ซึ่งดาวน์โหลดตัวอย่าง ได้ที่นี่ จากนั้นนำไฟล์ RPi_LCD_Driver.py (จากตอนที่แล้ว) วางไว้ที่ directory เดียวกัน

 

การแสดงวัน/เวลาบนหน้าจอ

ใช้คำสั่งเพื่อสร้างไฟล์ sudo nano show_dt.py จากนั้นเขียนโค้ดตามด้านล่างนี้ครับ

 

import RPi_I2C_Driver
from datetime import datetime
mylcd = RPi_I2C_Driver.lcd()

while True:
    mylcd.lcd_display_string(“%s” %datetime.now().strftime(“%d/%m/%Y”), 1)
    mylcd.lcd_display_string(“%s” %datetime.now().strftime(“%H:%M:%S.%f”), 2)

 

while True เนื่องจากต้องการให้รันแบบ infinite loop แสดงวันเวลาโดยที่

%d แสดงวันที่
%m แสดงเดือน
%Y แสดงปี ค.ศ.

%H แสดงหลักชั่วโมง
%M แสดงหลักนาที
%S แสดงหลักวินาที
%f แสดง milli-seconds

 

เมื่อทดลองรันด้วยคำสั่ง sudo python show_dt.py หน้าจอ LCD จะแสดงดังตัวอย่างข้างล่างนี้


หลัก milli-seconds จะวิ่งเร็วมากจนหน้าจอแสดงไม่ทัน

จากนั้นท่านจะเห็นว่าไม่สามารถพิมพ์คำสั่งอื่นๆ ที่ terminal ได้อีก เนื่องจากโปรแกรมรันอยู่นั่นเอง ให้ท่าน Ctrl+C ออกมา

 

การแสดงค่า IP Address

ใช้โค้ดด้านล่างนี้ พร้อมกับเซฟไว้ในชื่อ myip.py

 

import RPi_I2C_Driver
import socket

mylcd = RPi_I2C_Driver.lcd()

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((‘psu.ac.th’, 80))
ip = s.getsockname()[0]
s.close()

mylcd.lcd_display_string(“IP Address:”, 1)
mylcd.lcd_display_string(ip, 2)

 

หน้าจอ LCD ก็จะแสดงข้อความดังนี้

** มีวิธีการเขียนแสดง ip address อีกหลายวิธี แต่ใช้วิธีนี้เนื่องจากเป็นวิธีที่จะได้ ip address ที่ใช้งานจริง เพราะในบางกรณีจะได้ loopback ip 127.0.0.1 แทน และในบางแบบ ก็สามารถระบุ interface เช่น eth0 หรือ wlan0 ได้ด้วย **

 

ต่อจากนี้ไปจะเป็นการเขียนเพื่อแสดงค่า Environment ของเครื่อง (เช่นเดียวกับ Performance ใน Task Manager ของ Windows) และเนื่องจากหน้าจอ LCD มีขนาดจำกัด จึงได้เขียนให้มีการวนแสดงค่าต่างๆ ออกมาตามเวลาที่กำหนด

 

ซึ่งเราจะต้องทำการอาศัย library ชื่อ python package ชื่อ psutil มาใช้เป็น library เพื่อดู process และเพื่อทำ system monitoring ครับ

 

ทำการติดตั้ง psutil ด้วยคำสั่งต่อไปนี้

sudo apt-get install build-essential python-dev python-pip

 

จากนั้นทำการติดตั้ง psutil ด้วย PIP คำสั่ง

sudo pip install psutil

 

จากนั้นทำการทดสอบการติดตั้ง จะต้องไม่แสดง error ให้เห็น (ไม่แสดงอะไรเลยนั่นเอง)

sudo python -c “import psutil”

 

ตามตัวอย่างต่อไปนี้

 

เมื่อเรียบร้อยแล้ว ให้ท่านลองเขียนโค้ดตามด้านล่างนี้ จากนั้นเซฟไว้ในไฟล์ชื่อ resource_mon.py

 

import os
import time
import socket
import psutil
import RPi_I2C_Driver

mylcd = RPi_I2C_Driver.lcd()

# Return CPU temperature as string
def getCPUtemperature():
    res = os.popen(‘vcgencmd measure_temp’).readline()
    return(res.replace(“temp=”,””).replace(“‘C\n”,””))

# Return RAM info (in kb)
# [0]: total RAM
# [1]: RAM in used
# [2]: free RAM
def getRAMinfo():
    p = os.popen(‘free’)
    i = 0
    while 1:
        i = i + 1
        line = p.readline()
        if i==2:
            return(line.split()[1:4])

# Return disk info (with unit)
# [0]: disk space total
# [1]: disk space in used
# [2]: disk space remaining
# [3]: percentage of used space
def getDiskInfo():
    p = os.popen(“df -h /”)
    i = 0
    while 1:
        i = i +1
        line = p.readline()
        if i==2:
            return(line.split()[1:5])

#CPU Usage
CPU_usage = str(psutil.cpu_percent(interval=1))

# CPU Temp
CPU_temp = getCPUtemperature()

# RAM info (converted to MB)
RAM_info = getRAMinfo()
RAM_total = round(int(RAM_info[0]) / 1000,1)
RAM_used = round(int(RAM_info[1]) / 1000,1)
RAM_free = round(int(RAM_info[2]) / 1000,1)

#Disk info
DISK_info = getDiskInfo()
DISK_total = DISK_info[0]
DISK_free = DISK_info[2]
DISK_perc = DISK_info[3]

while True:
 mylcd.lcd_display_string(“CPU Temperature:”, 1)
 mylcd.lcd_display_string(CPU_temp + ” DegCelcius”, 2)
 time.sleep(5)
 mylcd.lcd_clear()
 mylcd.lcd_display_string(“CPU Usage:”, 1)
 mylcd.lcd_display_string (CPU_usage + “%”, 2)
 time.sleep(5)
 mylcd.lcd_clear()
 mylcd.lcd_display_string(“RAM Total/Used”, 1)
 mylcd.lcd_display_string(str(RAM_total) + ” / ” + str(RAM_used) + “MB”, 2)
 time.sleep(5)
 mylcd.lcd_clear()
 mylcd.lcd_display_string(“DISK Total/%Used”, 1)
 mylcd.lcd_display_string(str(DISK_total) + ” / ” + str(DISK_perc), 2)
 time.sleep(5)
 mylcd.lcd_clear()

 

โดยในโค้ดนี้จะมีการเขียนแยก method และเขียนคำอธิบายเอาไว้ใน comment ของโค้ดให้แล้ว
สามารถนำปรับการแสดงผลได้ตามที่ท่านต้องการครับ และเมื่อรันด้วยคำสั่ง sudo python resource_mon.py
ก็จะพบกับหน้าจอวนไปเรื่อยๆ ดังนี้

           

บนซ้าย แสดงอุณหภูมิ CPU
บนขวา แสดง CPU Usage %
ล่างซ้าย แสดงการใช้ RAM ทั้งหมด/ที่ใช้ไป
ล่างขวา แสดงการใช้ DISK ทั้งหมด/%ที่ใช้ไป

           

 

ท่านสามารถปรับค่าที่ต้องการให้แสดงได้ตามที่ต้องการ
โดยค่าที่สามารถดึงมาใช้ได้ จะ comment เอาไว้ในโค้ดของ method ที่ทำการ assign ค่าให้กับตัวแปรมาแสดง

 

ผิดพลาดประการใด ขออภัยมา ณ โอกาสนี้ครับ

 

สำหรับตอนหน้า จะเป็นการเชื่อมกับเซนเซอร์ภายนอก

จะเป็นเซนเซอร์อะไรนั้น ติดตามต่อตอนหน้า ในอีกระยะเวลาหนึ่ง

 

สวัสดีครับ