TM1630
こう、なんていうか、誰かが作ったライブラリを使う時って、importして、インスタンス作って、メソッド使うみたいな感じだと思うんだけど、そういうのを自分も作れたらいいなーと思って。で、そういうのはクラスを作ったりするオブジェクト指向プログラミングが必要みたいなことはなんとなく分かる。ただ、イマイチちゃんと分かってないので書けたとしても、それが果たして正しいのかという。でもまぁとりあえずやってみてダメなところを気付けるようにしたい、みたいな。っぽいってつけるのは、ライブラリ作りました!って言えるほどのことは出来てる自信ないし、おこがましいしみたいなことで。ダラダラつらつら。
7セグドライバのTM1630をRaspberry Pi Zero WHで使ってみたい
7セグドライバのTM16307セグ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 ドキュメント キーワード(予約語)は変数名、関数名、ク...
typeerrorの意味がわかりません
TypeError: __init__() takes exactly 3 arguments (4 given)てどうゆう意味ですか?
Pythonの関数で複数の戻り値を返す方法 | note.nkmk.me
C言語などでは関数から複数の戻り値(返り値)を返すのはけっこう面倒だが、Pythonだと簡単。複数の値をカンマ区切りでreturnするだけでよい。 カンマ区切りでreturn リストを戻り値とする defによる関数の定義など ...
Python - 処理を繰り返すfor文
pythonで処理を繰り返す制御を行うfor分と、range関数を組み合わせてプログラムを作ってみます。
Pythonで文字列を抽出(位置・文字数、正規表現) | note.nkmk.me
Pythonで文字列strから部分文字列を抽出する方法について説明する。任意の位置・文字数を指定して抽出したり、正規表現のパターンで抽出したりできる。 位置(文字数)を指定して抽出: インデックス、スライスインデ ...
Python基礎講座(13 クラス) - Qiita
オブジェクト指向とオブジェクト指向プログラミングは現代のプログラミングでは理解必須の概念です。Pythonのプログラムにおけるデータは全て、オブジェクトまたはオブジェクト間の関係として表されます。…
https://udemy.benesse.co.jp/development/web/python-list.html
Pythonで数字の文字列strを数値int, floatに変換 | note.nkmk.me
Pythonで数字の文字列strを数値に変換したい場合、整数に変換するにはint()、浮動小数点数に変換するにはfloat()を使う。 数字の文字列を整数に変換: int() 数字の文字列を浮動小数点数に変換: float() 2進数、8進...
Pythonのrange関数の使い方 | note.nkmk.me
Pythonで連番を生成してfor文で使ったりそのリストを取得するにはrange()を使う。範囲やステップの指定も可能で、0からではなく1から、飛ばし飛ばし、逆順の連番も生成できる。 組み込み関数 - range() — Python 3....
【python】外部ファイルのクラスを読み込みたい | クロジカ
最近やってなかったので久々に python をやります。 (2016/12/29:タイトル修正) ■ outp
Pythonで小数・整数を四捨五入するroundとDecimal.quantize | note.nkmk.me
Pythonで数値(浮動小数点数floatや整数int)を四捨五入や偶数への丸めで丸める方法について説明する。 組み込み関数round()は一般的な四捨五入ではなく偶数への丸めなので注意。一般的な四捨五入を実現するには標準 ...
Pythonエラー一覧(日本語) - Qiita
#英語が分からないからエラーを読まない。はい、私です。反省します。日々ここにpythonエラーを(正確性より分かりやすさ重視)をストックしていきます。皆さんの力もお貸しいただいて、猿でも分か…
invalid syntax エラー が出る原因箇所がどうしても分かりません。
### 前提・実現したいことAtCoder Beginners Selection の問題(traveling)を解いていたが、コードテストを行ないコードが内容的に正しいかどうか確認したいです
python3で小数点以下を四捨五入で計算する簡単な方法 - Qiita
python3で指定した小数点位置で四捨五入で計算する方法すぐに忘れそうなので備忘のために書いておく。round()があるよ小数点以下の四捨五入は簡単だけど、知らなかったので。※切り捨て、切…
Pythonの「SyntaxError: invalid syntax」の理由
【質問】現在、Python3で簡単なゲームを作成中です。下記コードの24行目print(board)でSyntaxErrorが発生しました。理由が分かりません。教えていただければ幸いです。
数値を文字列に変換して文字列と連結する
文字列に数値を連結させる場合にはまず数値を文字列に変換する必要があります。ここでは組み込み関数の str 関数を使って数値を文字列変更してから文字列と連結する方法について解説します。
Python: 対処法→TypeError: 'module' object is not callable
最近久々にBitcoin取引所のWeb APIをCallするPythonスクリプトのテストをしている際に、首題のエラーのエラーが発生した為、備忘録として簡単に纏めておく。
Python, formatで書式変換(0埋め、指数表記、16進数など) | note.nkmk.me
Pythonで数値や文字列を様々な書式に変換(フォーマット)するには、組み込み関数format()または文字列メソッドstr.format()を使う。 組み込み関数 format() 文字列メソッド str.format()置換フィールド{...
Pythonの文字列フォーマット(formatメソッドの使い方) - ガンマソフト
Pythonでは文字列を書式指定して出力するのに、format()メソッドを使うことができます。小数点以下の桁を指定したり、文字寄せ、ゼロ埋めなどを設定できます。Python3.6からはf文字列が追加され、変数名や式を直接書式に記入できるよ...
Python3の整数int型に最大値はない(上限なし) | note.nkmk.me
Python2の整数型にはintとlongの2つの型があったが、Python3にはintしかない。Python3のintはPython2のlongに相当し、最大値の上限はなく、メモリの許す限り大きな値を扱うことが可能。 Python2の整数...
Heroku | Application Error
お探しのページは見つかりませんでした。 - はてなブログ
Python はなんで self を書かないといけないの? | 民主主義に乾杯
self を書いた方が、いろんなことができるから。
Python:class内でself.とつける変数とつけない変数の違い
Pythonのクラスを書く際のselfについての質問です。クラス内のメソッドを定義する際に引数としてselfを渡し、メソッド内で定義するの変数のはじめにself.とつけると思うのですが、この後
コメント