Raspberry PiでAdafruit RGB Negative 16×2 LCD+Keypad Kit for Raspberry Pi – を使ったプログラムをAdafruitの公式ライブラリを使い書いてみました。
シールドの組立、ライブラリのインストールや使い方は公式の方をご覧ください。
下記のソースコードはRasbperry Piの時間とインターフェイス毎のIPアドレスをLCDに表示します。
インターフェイス毎のローカルIPアドレスを取得するために”netifaces”ライブラリを使用しております。
$ apt-get install python-netifaces
/LCDディレクトリを作成し公式ライブラリを入れておきます。
$ sudo mkdir /LCD
$ sudo vi /LCD/MENU_LCD.py
#!/usr/bin/env python
from netifaces import interfaces, ifaddresses, AF_INET
from time import sleep
from Adafruit_I2C import Adafruit_I2C
from Adafruit_MCP230xx import Adafruit_MCP230XX
from Adafruit_CharLCDPlate import Adafruit_CharLCDPlate
from IPaddr_LCD import IPaddr_LCD
from DateTime_LCD import DateTime_LCD
import smbus
lcd = Adafruit_CharLCDPlate(busnum = 1)
class MENU_LCD():
def get_const_list(self):
const_list = []
ip = IPaddr_LCD()
time = DateTime_LCD()
const_list.append(ip)
const_list.append(time)
return const_list
def print_progress(self, sleep_time, message):
lcd.clear()
lcd.message(message)
sleep(sleep_time)
self.print_lcd()
def print_lcd(self):
pointer_id = 0
push_flag = 0
lcd.clear()
lcd.message("Please Push\nRite/Left Button")
const_list = self.get_const_list()
const_list_size = len(const_list) - 1
while 1:
if (lcd.buttonPressed(lcd.RIGHT) or lcd.buttonPressed(lcd.LEFT)):
if (lcd.buttonPressed(lcd.RIGHT)):
if (pointer_id < const_list_size):
pointer_id += 1
else:
pointer_id = 0
if (lcd.buttonPressed(lcd.LEFT)):
if (pointer_id > 0):
pointer_id -= 1
else:
pointer_id = const_list_size
push_flag = 1
const_list[pointer_id].title()
if (push_flag > 0 and lcd.buttonPressed(lcd.SELECT)):
const_list[pointer_id].print_lcd()
break
if (push_flag > 0 and lcd.buttonPressed(lcd.UP)):
break
if (push_flag > 0 and lcd.buttonPressed(lcd.DOWN)):
break
sleep(.2)
return self.print_progress(1, "Reinitializeing\nPlease wate....")
if __name__ == '__main__':
try:
menu = MENU_LCD()
menu.print_progress(3, "Initializeing\nPlease wate....")
menu.print_lcd()
except KeyboardInterrupt:
print("Exit\n")
$ sudo vi /LCD/DateTime_LCD.py
#!/usr/bin/env python
import datetime
import locale
from time import sleep
from Adafruit_I2C import Adafruit_I2C
from Adafruit_MCP230xx import Adafruit_MCP230XX
from Adafruit_CharLCDPlate import Adafruit_CharLCDPlate
import smbus
lcd = Adafruit_CharLCDPlate(busnum = 1)
class DateTime_LCD():
def title(self):
lcd.clear()
lcd.message("Raspberry Pi\nDate Time")
return
def print_lcd(self):
while 1:
d = datetime.datetime.today()
time = d.strftime("Date %Y/%m/%d\nTime %H:%M:%S")
lcd.clear()
lcd.message(time)
if (lcd.buttonPressed(lcd.RIGHT)):
break
if (lcd.buttonPressed(lcd.LEFT)):
break
sleep(.2)
return
if __name__ == '__main__':
try:
time = DateTime_LCD()
time.print_lcd()
except KeyboardInterrupt:
print("Exit\n")
$ sudo vi /LCD/IPaddr_LCD.py
#!/usr/bin/env python
from netifaces import interfaces, ifaddresses, AF_INET
from time import sleep
from Adafruit_I2C import Adafruit_I2C
from Adafruit_MCP230xx import Adafruit_MCP230XX
from Adafruit_CharLCDPlate import Adafruit_CharLCDPlate
import smbus
lcd = Adafruit_CharLCDPlate(busnum = 1)
class IPaddr_LCD():
def title(self):
lcd.clear()
lcd.message("Raspberry Pi\nIP Address")
return
def get_ip_list(self):
ipaddr_list = []
for ifaceName in interfaces():
nic_ip_list = []
addresses = [i['addr'] for i in ifaddresses(ifaceName).setdefault(AF_INET, [{'addr':'No IP addr'}] )]
nic = '%s' % (ifaceName)
ip = '%s' % (', '.join(addresses))
nic_ip_list.append(nic)
nic_ip_list.append(ip)
ipaddr_list.append(nic_ip_list)
return ipaddr_list
def print_lcd(self):
pointer_id = 0
lcd.clear()
lcd.message("Please Push\nUp/Down Button")
while 1:
if (lcd.buttonPressed(lcd.UP) or lcd.buttonPressed(lcd.DOWN)):
ipaddr_list = self.get_ip_list()
ipaddr_list_size = len(ipaddr_list) - 1
if (lcd.buttonPressed(lcd.UP)):
if (pointer_id < ipaddr_list_size):
pointer_id += 1
else:
pointer_id = 0
if (lcd.buttonPressed(lcd.DOWN)):
if (pointer_id > 0):
pointer_id -= 1
else:
pointer_id = ipaddr_list_size
lcd.clear()
lcd.message(ipaddr_list[pointer_id][0] + "\n" + ipaddr_list[pointer_id][1])
if (lcd.buttonPressed(lcd.RIGHT)):
break
if (lcd.buttonPressed(lcd.LEFT)):
break
sleep(.2)
return
if __name__ == '__main__':
try:
ip = IPaddr_LCD()
ip.print_lcd()
except KeyboardInterrupt:
print("Exit\n")
コマンド用の実行ファイルを作成しておきます
$ sudo vi /LCD/LCD_PRINTER
#!/usr/bin/env python
from MENU_LCD import MENU_LCD
if __name__ == '__main__':
try:
menu = MENU_LCD()
menu.print_progress(3, "Initializeing\nPlease wate....")
menu.print_lcd()
except KeyboardInterrupt:
print("Exit\n")
実行権限を与えどこからでもパスが通るように”/usr/bin/”の中にシンボリックを貼っておきます。
$ sudo chmod 700 /LCD/LCD_PRINTER
$ sudo ln -s /LCD/LCD_PRINTER /usr/bin/LCD_PRINTER
せっかくなので起動スクリプトも書いてみました。
$ sudo mkdir /LCD/init.d/
$ sudo vi /LCD/init.d/lcd_printer
#!/bin/sh
### BEGIN INIT INFO
# Provides: LCD_PRINTER
# chkconfig: 2345 91 91
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: LCD_PRINTER daemon script.
### END INIT INFO
. /lib/lsb/init-functions
PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/LCD_PRINTER
DAEMON_NAME=`basename $DAEMON`
PIDFILE="/var/run/lcd_printer.pid"
set -e
start() {
log_daemon_msg "Starting $DAEMON_NAME"
if ! start-stop-daemon --stop --quiet --pidfile ${PIDFILE} --signal 0; then
start-stop-daemon --start --pidfile ${PIDFILE} --make-pidfile --quiet --background --exec ${DAEMON}
log_end_msg $?
else
echo -n " already running."
log_end_msg 1
fi
}
stop() {
log_daemon_msg "Stopping $DAEMON_NAME"
start-stop-daemon --stop --pidfile ${PIDFILE}
log_end_msg $?
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status_of_proc -p $PIDFILE $DAEMON $DAEMON_NAME && exit 0 || exit $?
;;
*)
echo $"Usage: $DAEMONNAME {start|stop|restart|status}" >&2
exit 1
;;
esac
exit 0
実行権限を与え、起動スクリプトとして”/etc/init.d/”の中にシンボリックを貼っておきます。
$ sudo chmod 755 /LCD/init.d/lcd_printer
$ sudo ln -s /LCD/init.d/lcd_printer /etc/init.d/lcd_printer
起動するか確認してみます。
$ sudo service lcd_printer start
自動起動するように設定します。
$ sudo update-rc.d lcd_printer defaults
自動起動するか確認します。完全に電源を落とすためrebootではなくシャットダウンして電源を入れます。
$ sudo shutdown -h now
余談ですがRedHat系はchkconfigで設定するのですがDebian系は違うのですね・・・勉強になりました。
0 Comments.