【Switchbot】温湿度計 プローブタイプの温度センサ接続
下記のページを参考にさせていただき、Switch botの温湿度系をプローブタイプの温度センサに換装。
boule.tech
センサは下記のSHT40を使った防水センサを使用、温湿度系についている温度センサ部をカットして、もともと存在するI2C用のスルーホールにプローブタイプのセンサから出ている配線を接続。これのみで無事動作した。






水槽に水没させて使っているので耐久性が心配だが、2週間ほど経過した現在でも無事動作中。他の水温計と比べると20℃環境で差は多くて±1℃程度。
python consoleでmatplotlibのグラフが表示されない
Python console上でplt.figure()等を実行しようとすると、グラフのウィンドウは表示されるものの、グラフは表示されず、下記のエラーが出る。
スクリプトから実行するとグラフは問題なく表示される。
Failed to enable GUI event loop integration for 'qt' ImportError: Could not load requested Qt binding. Please ensure that PyQt4 >= 4.7 or PySide >= 1.0.3 is available, and only one is imported per session. Currently-imported Qt library: 'pyqt6' PyQt4 installed: False PyQt5 installed: False PyQt6 installed: False PySide >= 1.0.3 installed: False Tried to load: ['pyqt6']

matplotlibrc内のbackendがデフォルトでAggになっているところをQt5Aggかほかのものに変えると解決。
【Arduino】【MCP_CAN】Seeed CAN BUS Sheild 古いライブラリ
最新のSeeed MCP CAN Shield (MCP2515) のライブラリを導入したところ下記のエラーが発生。
cannot declare variable 'CAN' to be of abstract type 'MCP_CAN'
調べたところライブラリが大きくアップデートされているようで、インポートする側のプログラムもその変更に応じた修正が必要とのこと。
https://github.com/Seeed-Studio/Seeed_Arduino_CAN/issues/106
プログラムの変更をしたくない場合は下記から古いライブラリが入手可能。
https://github.com/Seeed-Studio/Seeed_Arduino_CAN/tree/old
【wxPython】長いTextCtrlの中身の末尾を表示する方法
ファイルのパスなどを短いTextCtrlに表示する時など、ファイル名が表示されるように右揃え?にしたい場合。下記のようにTextCtrlのstyleで右揃えを指定しますが、TextCtrlを操作した後などに無効になっていることがある。
![]()
![]()
この場合はTextCtrl内のテキストを全選択することで右揃えを再度有効にすることが出来る。
m_textCtrl.SetSelection(-2, -1)

畳み込み積分の確認
畳み込み積分がいまいちイメージしづらかったので実際にプログラムを書いて確認してみた。
畳み込み積分の式

伝達関数
1自由度振動系にt=0でインパルス入力した応答を伝達関数として使う。
インパルス入力は周波数領域で全周波数で大きさ1のスペクトルを持つので、インパルス応答の周波数スペクトルがそのまま伝達関数となる性質を使う。
減衰しながら振動が収束する系。

入力
t<1までは0で1<=tで1となるステップ入力。インパルス入力がずっと続く入力とみなせる。

出力(畳み込み積分)
畳み込み積分によって最初の図のような応答を示す系に入力を入れた際の時系列の応答が求まった。ステップ入力を入れた瞬間オーバーシュートして、振動しながら一定値に収束するのでイメージ通り。

例えばt=2.0sec時点の出力はt=2.0での入力と、t=1.0からステップ入力を入れた出力の名残りの影響を受けていて、それはt=2.0secまでの畳み込み積分で求まる。
イメージとしては入力波形の時間軸を左右ひっくり返して、応答と入力の内積をとる感じが個人的にしっくりくる。

使ったコードはこちら
dt = 0.05 time = np.arange(0, 5, dt) m = 400 # [kg] omega = 2 * np.pi * 1.5 zeta = 0.2 sigma = omega * zeta # ----- 粘性1自由度振動系 インパルス入力の応答 h = np.exp(-sigma * time) * np.sin(omega * time) / (m * omega) # ----- 0<=t<1まで0で 1<=t<=5まで1が続くステップ入力(インパルスが連続している状態) f = np.hstack([np.zeros(int(1 /dt)), np.ones(int((5 -1 + dt) / dt))]) # ----- ステップ入力と粘性1自由度振動系の畳み込み積分 y = np.zeros(time.shape[0]) for t in range(time.shape[0]): for tau in range(t+1): y[t] = y[t] + f[tau] * h[t - tau] # ----- グラフ化 fig, ax = plt.subplots(3, 1, gridspec_kw=dict(hspace=0.4), figsize=(5, 6)) ax[0].plot(time, h) ax[0].set_xlabel("Time[sec]") ax[1].plot(time, f) ax[1].set_xlabel("Time[sec]") ax[2].plot(time, y) ax[2].set_xlabel("Time[sec]")
【Android】バータイプのインジケータ -> ProgressBarクラスの応用
以前書いた円形のプログレスバーで値に応じで色をグラデーションさせる方法のバータイプのプログレスバーへの応用。
oregengo.hatenablog.com
設定は全てxml側で完結できて、
Layout



