TM1630のライブラリっぽいものを作りたかった

スポンサーリンク
スポンサーリンク

TM1630

こう、なんていうか、誰かが作ったライブラリを使う時って、importして、インスタンス作って、メソッド使うみたいな感じだと思うんだけど、そういうのを自分も作れたらいいなーと思って。で、そういうのはクラスを作ったりするオブジェクト指向プログラミングが必要みたいなことはなんとなく分かる。ただ、イマイチちゃんと分かってないので書けたとしても、それが果たして正しいのかという。でもまぁとりあえずやってみてダメなところを気付けるようにしたい、みたいな。っぽいってつけるのは、ライブラリ作りました!って言えるほどのことは出来てる自信ないし、おこがましいしみたいなことで。ダラダラつらつら。

7セグドライバのTM1630をRaspberry Pi Zero WHで使ってみたい
7セグドライバのTM1630 7セグ1桁ができたので、4桁もできんだろー、ついでにドライバも使っちゃえーってやってみたら茨の道だった。まぁ大半はケアレスミスなんだけどさ。できるまでに GPIOでクロックやらなんやらを自前で書いてみる...

この記事の手続型?逐次型?のプログラムをオブジェクト指向型っぽく書き直していってみる。

スポンサーリンク

ソース

import pigpio

class TM1630:

    #0-9, " ", %L, %R, degL, degR
    DISP_HEX = [0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x6f, 0x0, 0x6b, 0x5d, 0x63, 0x39]

    def __init__(self, pi, DATA_PIN, CLK_PIN, STB_PIN):
        self.pi = pi
        self.DATA_PIN = DATA_PIN
        self.CLK_PIN = CLK_PIN
        self.STB_PIN = STB_PIN

        self.pi.set_mode(DATA_PIN, pigpio.OUTPUT)
        self.pi.set_mode(CLK_PIN, pigpio.OUTPUT)
        self.pi.set_mode(STB_PIN, pigpio.OUTPUT)

        self.pi.write(DATA_PIN,0)
        self.pi.write(CLK_PIN,1)
        self.pi.write(STB_PIN,1)

    def breakSTB(self):
        self.pi.write(self.STB_PIN,1)
        self.pi.write(self.STB_PIN,0)

    def write_databit(self, bin):
        if bin == 0:
            self.pi.write(self.DATA_PIN,0)
        elif bin == 1:
            self.pi.write(self.DATA_PIN,1)

    def write_byte(self, hex):
        for i in range(8):
            shiftb = hex >> i & 0b1
            self.pi.write(self.CLK_PIN,0)
            self.write_databit(shiftb)
            self.pi.write(self.CLK_PIN,1)
            self.pi.write(self.CLK_PIN,0)

        self.pi.write(self.CLK_PIN,1)

    def begin(self):
        self.pi.write(self.STB_PIN,0)

    def end(self):
        self.pi.write(self.STB_PIN,1)

    def set_displaymode(self, hex):
        self.write_byte(hex)
        self.breakSTB()

    def set_datacommand(self, hex):
        self.write_byte(hex)
        self.breakSTB()

    def set_displayaddress(self, hex):
        self.write_byte(hex)

    def set_displaycontrol(self, hex):
        self.write_byte(hex)

    def str2segdata(self, str):
        arr = []
        for i in range(4):
            arr.insert(i, self.DISP_HEX[int(str[i])])

        return arr

    def write_data(self, str):
        ADDR_BASE = 192
        data = self.str2segdata(str)

        for j in range(4):
            self.set_displayaddress(int(ADDR_BASE + j * 2))
            self.write_byte(int(data[j]))
            self.breakSTB()

    def display(self, str):
        self.begin()
        self.set_displaymode(0x0)
        self.set_datacommand(0x44)
        self.write_data(str)
        self.set_displaycontrol(0x8f)
        self.end()

ということでとりあえず書いてみた。意識してクラス書いたの初めてかもしんない。取りあえず動くは動く。TM1630はいろんな機能があるし、もっとそういう設定もできるように作りたかったけど、途中で力尽きてしまった。

スポンサーリンク

改善点・疑問点

  • selfってこんなに使うもんなの。61個もあるんだけど省略したいよ。
  • スコープが分からん。どこにでもアクセスできるガバガバクラスになってると思う。インスタンス変数とメンバ変数とpublicメソッドとprivateメソッドとちゃんと考えて書いてない。
  • 前のプログラムを関数に切り分けていった、みたいな感じなので、クラス使ってるけどオブジェクト指向になってるかというとなってないんじゃないか。
  • 外部から使う関数って.displayだけなので他の関数は外から使えないようにしないといけないと思うんだけどやり方がわからない。
  • 肝心の.displayも4桁で0-9までしか対応してない。例えば123とか12345とかを引数にするとエラーになる。バリデーションとかもしてない。
  • %と℃を表示できるようにしたかったけど、力尽きたしまだどうすればいいか思いつかない。DISP_HEXのインデックス11-14はその名残。
  • など

でも、とりあえず形になったので、それはやっぱり嬉しいなぁ。

スポンサーリンク

BME280の表示で使ってみる

BME280のサンプルプログラムの一番下

if __name__ == "__main__":

   import time
   import BME280
   import pigpio

   pi = pigpio.pi()

   if not pi.connected:
      exit(0)

   s = BME280.sensor(pi)

   stop = time.time() + 60

   while stop > time.time():
      t, p, h = s.read_data()
      print("h={:.2f} p={:.1f} t={:.2f}".format(h, p/100.0, t))
      time.sleep(0.9)

   s.cancel()

   pi.stop()

を、恐れ多くも

if __name__ == "__main__":

   import time
   import BME280
   import pigpio
   import TM1630

   pi = pigpio.pi()

   if not pi.connected:
      exit(0)

   s = BME280.sensor(pi)
   tm1630 = TM1630.TM1630(pi, 17, 27, 22)

   t, p, h = s.read_data()
   tm1630.display(str(int(round(h))).zfill(4))
   time.sleep(1)
   tm1630.display(str(int(round(p/100.0))).zfill(4))
   time.sleep(1)
   tm1630.display(str(int(round(t))).zfill(4))
   time.sleep(1)

   s.cancel()

   pi.stop()

て書き換えて、実行すると

こんな感じ。動くは動くでしょ。湿度→気圧→温度の順。

スポンサーリンク

使ってみたい人用

https://dalomo.net/app/TM1630_for_Rpi_python.zip

そんな人いるかどうかわかんないけど、使ってみたい人いれば。直してくれたらもっと嬉しい。1から書き直しってレベルになるだろうけど。

スポンサーリンク

参考

とほほのPython入門 - クラス - とほほのWWW入門
Pythonのキーワード(予約語)一覧を確認するkeyword | note.nkmk.me
Pythonのキーワード(予約語)の一覧は標準ライブラリのkeywordモジュールで確認できる。keyword --- Python キーワードチェック — Python 3.7.3 ドキュメント キーワード(予約語)は変数名、関数名、クラス名などの名前として使えない。ここでは以下の内容について説明する。Pythonの...
Python - typeerrorの意味がわかりません|teratail
TypeError:init()takesexactly3arguments(4given)てどうゆう意味ですか?
Pythonの関数で複数の戻り値を返す方法 | note.nkmk.me
C言語などでは関数から複数の戻り値(返り値)を返すのはけっこう面倒だが、Pythonだとものすごく簡単に実現できる。defによる関数の定義など基本的な内容は以下の記事を参照。関連記事: Pythonで関数を定義・呼び出し(def, return) Pythonでは、単純にカンマ区切りでreturnするだけで文字列だろう...
Python - 処理を繰り返すfor文
pythonで処理を繰り返す制御を行うfor分と、range関数を組み合わせてプログラムを作ってみます。
Pythonで文字列を抽出(位置・文字数、正規表現) | note.nkmk.me
Pythonで文字列strから部分文字列を抽出する方法について説明する。任意の位置・文字数を指定して抽出したり、正規表現のパターンで抽出したりできる。位置(文字数)を指定して抽出: インデックス、スライスインデックスで文字を抽出スライスで文字列を抽出文字数を利用日本語(全角文字)の場合 インデックスで文字を抽出...
Python基礎講座(13 クラス) - Qiita
オブジェクト指向とオブジェクト指向プログラミングは現代のプログラミングでは理解必須の概念です。 Pythonのプログラムにおけるデータは全て、オブジェクトまたはオブジェクト間の関係として表されます。 これまで機能を説明してきた文字列や...
python 配列基礎はこれで完璧!便利なメソッド多数紹介 | Udemy メディア
プログラミング言語python…
Pythonで数字の文字列strを数値int, floatに変換 | note.nkmk.me
Pythonで数字の文字列strを数値に変換したい場合、整数に変換するにはint()、浮動小数点数に変換するにはfloat()を使う。ここでは、数字の文字列を整数に変換: int() 数字の文字列を浮動小数点数に変換: float() の基本的な使い方、および、特殊な場合である、2進数、8進数、16進数表記の文字列を数...
Pythonのrange関数の使い方 | note.nkmk.me
Pythonで連番や等差数列を生成してfor文で使ったり、それらのリストを取得するには、range()を使う。組み込み関数: range() — Python 3.7.2 ドキュメント ここでは以下の内容について説明する。Python2とPython3でのrange()の違いPython2のrange()とxrange...
【python】外部ファイルのクラスを読み込みたい | ハックノート
最近やってなかったので久々に python をやります。 (2016/12/29:タイトル修正) ■ output.py (読み込む class を記述) ``` # -*- coding: utf-8 -*- # 現在日付と時刻だけを出すプログラム import datetime class output_text ...
Pythonで小数・整数を四捨五入するroundとDecimal.quantize | note.nkmk.me
Pythonで数値(浮動小数点float型または整数int型)を四捨五入や偶数への丸めで丸める方法について、以下の内容を説明する。組み込み関数のround()小数を任意の桁数で丸める整数を任意の桁数で丸めるround()は一般的な四捨五入ではなく、偶数への丸め 小数を任意の桁数で丸める 整数を任意の桁数で丸める rou...
Pythonエラー一覧(日本語) - Qiita
英語が分からないからエラーを読まない。 はい、私です。 反省します。 日々ここにpythonエラーを(正確性より分かりやすさ重視)をストックしていきます。 皆さんの力もお貸しいただいて、猿でも分かるエラー辞典を作りたいと思います...
Python - invalid syntax エラー が出る原因箇所がどうしても分かりません。|teratail
前提・実現したいことAtCoderBeginnersSelectionの問題(traveling)を解いていたが、コードテストを行ないコードが内容的に正しいかどうか確認したいです。 発生している問題・エラーメッセージ下のようにエラーメッセ
python3で小数点以下を四捨五入で計算する簡単な方法 - Qiita
python3で指定した小数点位置で四捨五入で計算する方法 すぐに忘れそうなので備忘のために書いておく。 round()があるよ 小数点以下の四捨五入は簡単だけど、知らなかったので。 ※切り捨て、切り上げはmathモジュールでや...
Python 3.x - Pythonの「SyntaxError: invalid syntax」の理由|teratail
【質問】現在、Python3で簡単なゲームを作成中です。下記コードの24行目print(board)でSyntaxErrorが発生しました。理由が分かりません。教えていただければ幸いです。 【環境】Python3.7.1pycharm-community-2018.3 【コード】
数値を文字列に変換して文字列と連結する
文字列に数値を連結させる場合にはまず数値を文字列に変換する必要があります。ここでは組み込み関数の str 関数を使って数値を文字列変更してから文字列と連結する方法について解説します。
Python: 対処法→TypeError: 'module' object is not callable | Yukun's Blog
| Python: 対処法→TypeError: 'module' object is not callable
Python, formatで書式変換(0埋め、指数表記、16進数など) | note.nkmk.me
Pythonで数値や文字列を様々な書式に変換(フォーマット)する場合、組み込み関数format()または文字列メソッドstr.format()を使う。ここでは、組み込み関数format() 文字列メソッドstr.format() の使い方を説明したあとで、左寄せ、中央寄せ、右寄せ ゼロ埋め 符号(プラス、マイナス) 桁...
Pythonの文字列フォーマット(formatメソッドの使い方) | ガンマソフト株式会社
ログファイルでは、以下のようにファイル名に日付を含めることがよくあります。 file_20180904.txt 日付の部分(20180904)は毎日変わるのでコードで毎回作成し直す必要がありますが、そ...
Python3の整数int型に最大値はない(上限なし) | note.nkmk.me
Python2の整数型にはintとlongの2つの型があったが、Python3にはintしかない。Python3のintはPython2のlongに相当し、最大値の上限はなく、メモリの許す限り大きな値を扱うことが可能。ここでは以下の内容について説明する。Python2の整数int型と長整数long型 Python3の整...
[Python]クラスってなんだろう
最近よく耳にするオブジェクト指向プログラミング オブジェクトって何?それメリットあんの? そう思う方も多いことでしょう。 Python3を利用する場合、どんな使い方ができるのかを例にあげ…
Pythonのインスタンスとかクラスとか__init__メソッドとかがよくわからなかったから自分なりに解釈してみた - Heppoko Binbo Yarou no Newbie Nikki
勝手に解釈しただけなので、たぶん厳密に言うと全然違う。 でもうまいこと解説してあるサイトというのもあまり見つからなかった。 まず当たり前のように解説サイトに出現しやがる 『クラスのインスタンス』ってヤツ。 勝手に引用する。(引用元:インスタンスとは 【 instance 】 - 意味/解説/説明/定義 : IT用語辞典...
Python はなんで self を書かないといけないの? | 民主主義に乾杯
self を書いた方が、いろんなことができるから。
Python - Python:class内でself.とつける変数とつけない変数の違い|teratail
Pythonのクラスを書く際のselfについての質問です。 クラス内のメソッドを定義する際に引数としてselfを渡し、メソッド内で定義するの変数のはじめにself.とつけると思うのですが、この後者のself.の意味がわかりません。 self.とつける変数とつけない変数はどのように異なっているので

コメント

タイトルとURLをコピーしました