ラズパイ電光掲示板/天気予報の表示内容を変えてみる!RaspberryPiで電光掲示板part11

シェアする

Pocket

1.表示内容の変更

電光掲示板への天気予報のスクロール表示ですが、現状は全て日本語表示になっています。

これは、最初、電光掲示板への表示をすることに注力していたためであり、また、勝手もわからないことだらけだったことが、その理由となっています。

今回、新たに、電光掲示板を追加するに当たり、表示内容に変化をつけてみようと思います。

その内容は次の二点です。
① 天気は、日本語から、お天気マークに変更

② 気温は、ある温度を境に色を付けて表示

2.実現方法

さて、実現方法ですが、次のようにしていきます。

①の「お天気マーク」ですが、Livedoor天気のRSS配信のページにありますので使用します。

  •   本日:▼forecasts: > ▼0 > image > url
  •   明日:▼forecasts: > ▼1 > image > url

②の「気温」も同じページにあります。表示には、明日のものだけ使用しています。

  •   最低気温:▼forecasts: > ▼1 > temperature > min > celsius
  •   最高気温:▼forecasts: > ▼1 > temperature > max > celsius

気温は、次のようにしましょう。

  •   25℃以上:
  •   20℃以上:オレンジ
  •   10℃以下:青
  •   5℃以下:
  •   上記以外:

こうするためには、背景と文字色も大事ですね。背景は黒、日時は緑、文字色は黄色でやってみます。

3.電光掲示板表示までの流れ

以下の手順で実現します。

  • 手順1:pythonプログラムで、必要なファイルを作成します。
  • 手順2:imagemagick の convertを使用して、image ファイルに変換します。それぞれのファイルを接続します。
  • 手順3:作成した imageファイルを電光掲示板に流します。

テロップは、次のようになります。

4月10日、21時38分59秒 神奈川県 横浜 の天気 今日の天気は ■ です。明日の天気は ▼ です。明日の予想最高気温、XX℃、予想最低気温、YY℃です。

  • 背景       :文字色 黒
  • 日時~の天気   :文字色 緑
  • 今日の天気は~です:文字色 黄
  • ■、▼      :お天気マーク
  • XX℃、YY℃    :気温による色替え(2.参照)

(1) 手順1の詳細

pythonプログラムで、それぞれのファイルを作成します。イメージファイルの形式は、お天気マークの関係で gif とします。

  • ファイル1 テキストファイル 内容:日時+「 神奈川県 横浜 の天気 」
  • ファイル2 テキストファイル 内容:「今日の天気は」
  • ファイル3 イメージファイル 内容:本日のお天気マーク
  • ファイル4 テキストファイル 内容:「です。明日の天気は」
  • ファイル5 イメージファイル 内容:明日のお天気マーク
  • ファイル6 テキストファイル 内容:「です。明日の予想最高気温、」
  • ファイル7 イメージファイル 内容:「最高気温+℃」を該当の文字色
  • ファイル8 テキストファイル 内容:「、予想最低気温、」
  • ファイル9 イメージファイル 内容:「最低気温+℃」を該当の文字色
  • ファイル10 テキストファイル 内容:「です。」

(2) 手順2の詳細

次の二つの作業を行います。

① イメージファイル作成

作成したテキストファイルを convert文を使用して、イメージファイルを作成します。
お天気マークは、サイズが少し大きいので、他のイメージファイルと同様の大きさに変換します。

② イメージファイル接続

作成したイメージファイルを接続します。

(3) 手順3の詳細

サンプルプログラム image-scroller.py を使用して、作成された imageファイルを電光掲示板に流します。

4.勉強になったところ

60爺は、根を詰めてやらないので、なかなか熟練者になれませんが、pythonのプログラミングで勉強になった部分が下記の四点です。

(1) pythonでのファイル出力

f = open(name,'w')
f.write(naiyo)
f.close()

(2) pythonからのコマンド発行

いろいろやり方がありましたが、これが一番簡単でした。

cmd = "convert -background black -fill %s -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:%s℃ /home/pi/work/%s.gif" % (color,ondo , file)

try:
    res = subprocess.call( cmd.strip().split(" ") )
    except:
    print("Error. test")

(3) pythonでの型変換

max_temp = temperature['max']['celsius']
 ※この段階では、max_tempは、文字列となる

そのため、気温の判定では、int型として扱うようにする

if int(max_temp) >= 25:
 img_file_out("red", max_temp, "file7")・・・

(4) 引数を使用して関数を使う

def file_out(name,naiyo):
    f = open(name,'w')
    f.write(naiyo)
呼び出し側
file8_text = '、予想最低気温 '
file_out("/home/pi/work/file8.txt",file8_text)

5.表示結果

以下のようになりました。当初のものより、インパクトがありますかね。ご覧ください。

6.ソースプログラムとシェル

最後に、ソースプログラムとシェルを載せておきます。

(1) ソースプログラム

#!/usr/bin/env python3 
# -*- coding:utf-8 -*- 

from datetime import datetime

import urllib.request 
import json 

import subprocess 

def main(): 
    print ('start') 
    txt_weather() 
    return

def file_out(name,naiyo):

    f = open(name,'w') 
    f.write(naiyo) 
    f.close() 

    return

def img_file_out(color, ondo, file): 

    print(color,ondo,file) 

    cmd = "convert -background black -fill %s -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:%s℃ /home/pi/work/%s.gif" % (color, ondo , file) 

    try: 
        res = subprocess.call( cmd.strip().split(" ") ) 

    except: 
        print("Error. test") 

    return

def txt_weather(): 
    city = '140010'; # Yokohama 
    print (city) 
    json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1' 
#API URL 

    weather_text = u'%sの天気は' 
    temperature_text = u'です。%sの予想最高気温、%s℃、予想最低気温、%s℃です。'
    file6_text = 'です。明日の予想最高気温 ' 
    file8_text = '、予想最低気温 ' 
    file10_text = 'です。'

    try:
        r = urllib.request.urlopen('%s?city=%s' % (json_url, city) ) 
        obj = json.loads( r.read().decode('utf-8') ) 

        title = obj['title'] 
        forecasts = obj['forecasts'] 

        d = datetime.now() 
        text_day = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second) 
        # TODAY 
        cast = forecasts[0] 
        image = cast['image'] 
        today_w_txt = weather_text % (cast['dateLabel']) 

        today_w_url = image['url'] 
        today_name = "/home/pi/work/file3.gif" 
        urllib.request.urlretrieve(today_w_url, today_name) 

        # TOMMOROW 
        cast = forecasts[1] 
        temperature = cast['temperature'] 
        image = cast['image'] 
        tommorow_w_txt = weather_text % (cast['dateLabel']) 
        tommorow_w_gif = urllib.request.urlopen(image['url']) 

        tommorow_w_url = image['url'] 
        tommorow_name = "/home/pi/work/file5.gif" 

        urllib.request.urlretrieve(tommorow_w_url, tommorow_name) 

        max_temp = temperature['max']['celsius'] 
        min_temp = temperature['min']['celsius'] 

        # text_file set & out 
        file1_text = text_day + ' ' + title + ' ' 
        file2_text = today_w_txt + ' ' 
        file4_text = file10_text + tommorow_w_txt + ' ' 

        file_out("/home/pi/work/file1.txt",file1_text) 
        file_out("/home/pi/work/file2.txt",file2_text) 
        file_out("/home/pi/work/file4.txt",file4_text) 
        file_out("/home/pi/work/file6.txt",file6_text) 
        file_out("/home/pi/work/file8.txt",file8_text) 
        file_out("/home/pi/work/file10.txt",file10_text) 

        # max temp file7 
        if int(max_temp) >= 25: 
            img_file_out("red", max_temp, "file7") 
        elif int(max_temp) >= 20: 
            img_file_out("orange", max_temp, "file7") 
        else: 
            img_file_out("yellow", max_temp, "file7") 

        # mix temp file9
        if int(min_temp) < 5:
            img_file_out("white", min_temp, "file9")
        elif int(min_temp) < 10:
            img_file_out("blue", min_temp, "file9")
        else:
            img_file_out("yellow", min_temp, "file9")

   finally:
       r.close()

   return

### Execute
if __name__ == "__main__":
 main()

(2) シェル

# file product 
python3 /home/pi/python-pg/tenki_file.py 

# text --> gif 
convert -background black -fill green -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:@/home/pi/work/file1.txt /home/pi/work/file1.gif
convert -background black -fill yellow -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:@/home/pi/work/file2.txt /home/pi/work/file2.gif 
convert -background black -fill yellow -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:@/home/pi/work/file4.txt /home/pi/work/file4.gif 
convert -background black -fill yellow -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:@/home/pi/work/file6.txt /home/pi/work/file6.gif 
convert -background black -fill yellow -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:@/home/pi/work/file8.txt /home/pi/work/file8.gif 
convert -background black -fill yellow -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:@/home/pi/work/file10.txt /home/pi/work/file10.gif 
echo "convert end" 
# gif1 add border 
convert -border 1x1 -bordercolor red /home/pi/work/file1.gif /home/pi/work/file1_border.gif 
echo "add border end" 

# gif --> size change 
convert /home/pi/work/file1_border.gif -resize x16 /home/pi/work/file1_border1.gif 
convert /home/pi/work/file3.gif -resize x16 /home/pi/work/file3_2.gif 
convert /home/pi/work/file5.gif -resize x16 /home/pi/work/file5_2.gif 

echo "size change end"
# file add 
convert +append /home/pi/work/file1_border1.gif /home/pi/work/file2.gif /home/pi/work/file3_2.gif /home/pi/work/file4.gif /home/pi/work/file5_2.gif /home/pi/work/file6.gif /home/pi/work/file7.gif /home/pi/work/file8.gif /home/pi/work/file9.gif /home/pi/work/file10.gif /home/pi/work/tenki.gif

# imagescroller 
#/home/pi/rpi-rgb-led-matrix/bindings/python/samples/stopafter 10 sudo python3 /home/pi/rpi-rgb-led-matrix/bindings/python/samples/image-scroller.py -r 16 --led-no-hardware-pulse yes -c 2 --led-slowdown-gpio 0 -i /home/pi/work/tenki.gif 
/home/pi/rpi-rgb-led-matrix/bindings/python/samples/stopafter 60 sudo python3 /home/pi/rpi-rgb-led-matrix/bindings/python/samples/image-scroller.py -r 16 --led-no-hardware-pulse yes -c 2 -i /home/pi/work/tenki.gif 

#demo run for LED PANEL reset 
sudo /home/pi/rpi-rgb-led-matrix/examples-api-use/demo -D 1 -t 5 /home/pi/rpi-rgb-led-matrix/examples-api-use/runtext16.ppm --led-rows=16 --led-no-hardware-pulse --led-chain=2

※最後のLED PANEL resetは、直前のimagescrollerが止まった段階で、電光掲示板に不要な形で残ってしまうものをリセットするため、Hello Worldを流しています。

part10 RaspberryPi3 電光掲示板設定作業で大苦戦!はこちら

スポンサーリンク

シェアする

フォローする