Pages

Friday, November 26, 2021

電車の運行情報をOLEDディスプレイでチェックする - ITmedia

bintangsef.blogspot.com

 第49回では、3色のLEDで簡易的に鉄道の運行状況を知る方法についてご紹介しました。しかしLEDだけだと詳しく分からないですよね。そこでやはり、ディスプレイを使って運行情報を表示する仕組みを作っていきましょう。

 第45回で紹介した「DSD TECH 2 PCS OLED 0.91インチディスプレイ IIC I2C シリアルポート ARM用」(1599円)を利用します。これなら日本語も表示できるので便利です。

Raspberry Pi SSD1306

 このデバイスを動かすためには「SSD1306」のライブラリを使います。SSD1306のライブラリが用意されている「CircuitPython」で動かすことにします。まずはCircuitPythonをインストールしましょう。

$ sudo pip3 install adafruit-circuitpython-ssd1306

 続いては日本語フォントのインストールです。情報処理推進機構が配布しているIPAフォントをインストールしましょう。

$ sudo apt install fonts-ipafont -y

 フォントは「/usr/share/fonts/opentype/ipafont-gothic/」に、ゴシック体の「ipag.ttf」、明朝体の「ipam.ttf」としてインストールされます。ここでもテストプログラムを使って、ちゃんと表示されるか確かめておきます。プログラムの18行目にある「ipag.ttf」はゴシック体の指定なので、これを「ipam.ttf」にすると明朝体になります。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import board
import adafruit_ssd1306
import time
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
i2c = board.I2C()
oled = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c, addr=0x3c)
# ディスプレイの初期化
oled.fill(0)
oled.show()
image = Image.new("1", (oled.width, oled.height))
draw = ImageDraw.Draw(image)
# フォントの指定
font = ImageFont.truetype("/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf", 13)
# テキストを表示させる
draw.text((0, 0), "運行情報は以下の通りです", font=font, fill=255)
draw.text((0, 17), "遅延しています", font=font, fill=255)
oled.image(image)
oled.show()
time.sleep(5)
oled.fill(0)
oled.show()
≪fonttest.py≫

 以下のコマンドで動かしてみましょう。

$ python3 fonttest.py

 プログラムの中で指定した「運行情報は以下の通りです」と表示され、その下の行に「遅延しています」と5秒間表示されればOKです。

 第49回で利用したプログラムは以下の通りでした。

#!/usr/bin/python
# coding: utf-8
 
import urllib.request
from gpiozero import LED
from time import sleep
# LEDのGPIO番号
green=LED(14)
yellow=LED(15)
red=LED(18)
# 情報を取得する路線名
rosenname = '山手線'
 
# Yahoo! Japan運行情報ページのURL
# 以下は関東地方の運行情報URL
url = "https://transit.yahoo.co.jp/traininfo/area/4/"
 
while True:
    # HTMLデータを1行ずつリストに格納
    response = urllib.request.urlopen(url)
    htmldata = response.read().decode("utf-8")
    rosendata = htmldata.splitlines()
    for i in range(0, len(rosendata)):
        # 路線名の文字列があるか確認
        pos = rosendata[i].find(rosenname+'</a></td>')
        if pos >= 0:
            # 「平常」が含まれるか確認
            pos = rosendata[i+1].find('平常')
            if pos >= 0:
                # 平常運転であれば緑が点灯
                green.on()
                sleep(1)
    
            else:
                # 「遅延」が含まれるか確認
                pos = rosendata[i+1].find('遅延')
                if pos >= 0:
                    # 遅延であれば黄色が点滅
                    yellow.on()
                    sleep(0.5)
                    yellow.off()
                    sleep(0.5)
                else:
                    # 平常運転、遅延でもなければ赤色を点灯して警告
                    red.on()
    # 更新する間隔
    sleep(600)

 これを踏まえて、文字をプリントするように改変していきます。

#!/usr/bin/python
# coding: utf-8
import urllib.request
import board
import adafruit_ssd1306
import time
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
i2c = board.I2C()
oled = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c, addr=0x3c)
# ディスプレイの初期化
oled.fill(0)
oled.show()
image = Image.new("1", (oled.width, oled.height))
draw = ImageDraw.Draw(image)
# フォントの指定
font = ImageFont.truetype("/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf", 13)
# 情報を取得する路線名
rosenname = '山手線'
 
# Yahoo! Japan運行情報ページのURL
# 以下は関東地方の運行情報URL
url = "https://transit.yahoo.co.jp/traininfo/area/4/"
 
# テキストを表示させる
draw.text((0, 0), "運行情報:"+ rosenname, font=font, fill=255)
try:
    while True:
        # HTMLデータを1行ずつリストに格納
        response = urllib.request.urlopen(url)
        htmldata = response.read().decode("utf-8")
        rosendata = htmldata.splitlines()
        for i in range(0, len(rosendata)):
            # 路線名の文字列があるか確認
            pos = rosendata[i].find(rosenname+'</a></td>')
            if pos >= 0:
                # 「平常」が含まれるか確認
                pos = rosendata[i+1].find('平常')
                if pos >= 0:
                    # 平常運転であれば緑が点灯
                    draw.text((0, 17), "平常", font=font, fill=255)
                    oled.image(image)
                    oled.show()
                    time.sleep(1)
    
                else:
                    # 「遅延」が含まれるか確認
                    pos = rosendata[i+1].find('遅延')
                    if pos >= 0:
                        # 遅延であれば黄色が点滅
                        draw.text((0, 17), "遅延", font=font, fill=255)
                        oled.image(image)
                        oled.show()
                        time.sleep(1)
                    else:
                        # 平常運転、遅延でもなければ赤色を点灯して警告
                        draw.text((0, 17), "事故", font=font, fill=255)
                        oled.image(image)
                        oled.show()
                        time.sleep(1)
        # 更新する間隔
        time.sleep(60)
except:KeyboardInterrupt
# Ctrl+CでLCDをクリア
oled.fill(0)
oled.show()

 Ctrl+Cで中断したときに液晶ディスプレイの表示がクリアされるようにしています。情報は1分おきに更新されます。

 LEDの表示だけでなく液晶ディスプレイでも文字情報として表示できるようになりました。液晶ディスプレイの種類を変えてみたり、フォントサイズを変更したりして、改変してみてください。

Raspberry Pi 山手線の路線情報を表示した結果

Adblock test (Why?)


からの記事と詳細 ( 電車の運行情報をOLEDディスプレイでチェックする - ITmedia )
https://ift.tt/3p7nVPy

No comments:

Post a Comment