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.