みなさん、こんばんは。 トドお父さんです。
PZEM-004Tを使った電力計、前回の続きになります。
まずプログラムの説明をします(といっても、ラジオペンチさんのプログラムからの変更部だけですw)
新STM32ファームの先頭部です。
EEPROMのREAD()WRITE()ができるようにして、PZEM004Tのライブラリをincludeして、
Wire.h でI2Cが使えるようにします。
Adafruit‗GFXはグラフィック、Adafruit‗SSD1306は”0.96ディスプレイで液晶文字を描画する
ライブラリです。 MsTimer2.hは、ms単位でタイマーを設定して割り込みがかかるライブラリです。
STM32では使えませんのでコメントアウトして、代わりにHardwareTimerというメソッドを使います。
VCal, ICal は測定値の補正係数です。 値が分かっている負荷で校正しますが、とりあえずこのまま。
SelPin, EntPinは、タクトSWの入力用のポートを設定します。空きのPB12、PB13を設定します。
次はPzem004のシリアル通信のポート設定です。
当初設定していたPB7(RX1), PB8(TX1)はSerial1として、USB CDCのシリアル通信に使われている
ので、Serial2をPzemとの通信用に使います。PortはPA3(RX2), PA4(TX2)を指定します。
Arduinoはソフトシリアルですが、STM32はUARTが数本ありますので、ここはHardwareSerialメソッ
ドで、Serial2を生成します。
PZEM004v30クラスライブラリでpzemを生成するときのパラメータとして、Serial2を指定すれば
STM32とPZEM004間で通信ができるようになります。この辺はライブラリのExampleを参照くださ
い。
HardwareTimer timer(TIM1)は、前に言ったようにSTM32割り込みタイマーのオブジェクトです。
STM32はタイマー資源がTIM1,TIM2,TIM3… と沢山ありますが、ここではTIM1を指定してます。
つぎはsetup()です。
Wire() メソッドのSCLとSDAのポートをそれぞれ、PB6とPB7に設定します。
液晶ディスプレイが表示しない現象が発生したので、I2Cクロックを400 → 100kHzに変更しました
が、後述するようにこれは原因ではなかったのでコメントアウトしています。
次のdelay(200)ですが、BluePillのリセットがArduinoより早く、液晶ディスプレイSSD1306のリセットが間に合わないため、SSD1306のセットアップができず液晶が反応しませんでした。
ディレイを100mS以上入れるとOKになりました。(これは液晶を壊したかと、結構焦りました)
つぎはselectボタンとenterボタンの入力設定です。どちらもプルアップして通常”H"です。
BluePillの緑LEDはPC13に接続されていますので、デバッグ用にここも出力ピンに指定しています。
selectボタンを押すと消灯、enterボタンを押すと点灯するようにしました。
最後のuuPinOutputLow()ですが、ラジオペンチさんの配慮で未使用のピンを出力にして”L"で設定するようにしています。
ここはArduinoではなく、STM32なのでピンの名称が違うので、一応コメントアウトしました。
さて、setup()の後半です。
測定間隔はset intervalでtimeTologに設定されます。
次に、measure(), logPrint(), dispInf() はコメントの通りの動作をします。
そのあとのMsTimer2はSTM32で使えないので、HardWareTimer で書き直しています。
クロックが72MHzなので、Prescaler7200 Overflow 1000にして、7200x1000で分周し
1秒周期でTimer割り込み(timer2IRQ) を入れます。
そのあとは、selectピンとenterピンはピン変化(立ち下がり) で割り込みを入れる設定です。
以上のような内容が異なるだけで、他の部分はラジオペンチさんが作られた内容と同じです。
ソフトの説明が終わりましたので、次はハードウェアの説明ですね。
ポートが変わっただけで、ほとんどラジオペンチさんの回路図と変わりません。
まずは、ブレッドボードで動作を確認します。
前回説明しましたように、まずはSTLINK/V2でBluePillへの書き込みを確認しました。
STM32CubeIDEでも、ArduinoIDEでも書き込みができました。
次に、PZEM-004Tとシリアル通信を確認します。
PZEM-004TにTx、RxのLEDがついていますので、1秒毎に点滅すれば接続はOKです。
SSD1306 OELD 液晶ディスプレイを接続します。 I2CポートをPB6,PB7に指定して動作しました!
ノードパソコンの電源をつないで、きちんと測定できているらしいことを確認しました。
TeratermでパソコンがわにUSB経由で測定データも送信できています。
これで動作確認は完了です、次はケースに組込みを行います。
ダイソーとかを探したのですが、適当なケースが見つからず。
仕方がないので、少し小さいですが前に秋月で買ったポリカーボの117-Mというケースに組込みます。
サイズは94x64x22.6mmと小さいですが、なんとかこの中に入れましょう!
PZEM004Tのケースはあきらめます。
こないだコメリで買ったマキタのドライバドリルが活躍します。
穴開けを部屋の中で行うと切りくずゴミの処理が大変です。
3mmネジとスペーサでムリクリ押し込みます。
あとはSSD1306 OELD液晶と、タクトスイッチ2個を付けるだけです。
できました!
なんとか動作しています。
最後は飛ばしましたが、なんとか電力計を作ってSTM32F103 BluePillに移植し、ケースに押し込む所までできました。
あとは内蔵のRTCを動かして、SD Card基板を追加し、FatFsでSDカードに記録する処理を入れる
ことができれば完璧なんですが、なにしろケースが小さいのでムリゲーそうです。
それでは、今日はこの辺で。 皆さんお休みなさい!