みなさんこんにちは。 トドお父さんです。
PZEM-004Tを使った電力計 前回でBluePill対応での作成完了しましたが、宿題が残っていました。
>あとは内蔵のRTCを動かして、SD Card基板を追加し、FatFsでSDカードに記録する処理を入れる
>ことができれば完璧なんですが、なにしろケースが小さいのでムリゲーそうです。
今回、なんとかSTM32F103 BuePillでの対応が終わりましたので報告しますね。
今回はPart1ということで、ブレッドボードで作成したプログラムの説明をします。
前回説明したプログラムから、今回 RTCとSDカード対応で変更した部分の説明をしますね。
まずはRTC対応から始めましょう。
STM32F103にはRTC機能が入っていて、BluePill基板には32.768kHzの水晶も実装されています。
SDカードでのログ書き込み機能を実装するなら、RTCでタイムスタンプも入れたいですよね。
まぁ、BAT端子に3V電源が必要ですから、CR2032ボタン電池などを付ける必要がありますが。
てなわけで、バッテリバックアップがついたRTC機能の検討です。
STM32duno対応のRTCライブラリとサンプルプログラムはここから持って来ました。
Simple RTCサンプルの先頭部です。
頭にあるのは、PCからコンパイル時に年月と時間情報をゲットするマクロです。
// RTC Initial data from PC
static const char* mydate = __DATE__;
static const char* mytime = __TIME__;
RTCにこの時間を設定するための関数を作ります。 initDateTime()で下記設定を行います。
void initDateTime(void) {
// コンパイル時のPC日時を解析して設定 (2000年基準)
year = conv2d(mydate + 9); // 年
// Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
switch (mydate[0]) {
case 'J': month = (mydate[1] == 'a') ? 1 : ((mydate[2] == 'n') ? 6 : 7); break;
case 'F': month = 2; break;
case 'A': month = mydate[2] == 'r' ? 4 : 8; break;
case 'M': month = mydate[2] == 'r' ? 3 : 5; break;
case 'S': month = 9; break;
case 'O': month = 10; break;
case 'N': month = 11; break;
case 'D': month = 12; break;
}
day = conv2d(mydate + 4); // 日
hours = conv2d(mytime); // 時
minutes = conv2d(mytime + 3); // 分
seconds = conv2d(mytime + 6); // 秒
}
オシロで見ると発振が不安定
でも、SPI Started... から先に進みません。
STM32coreでの対応に何か問題がありそうです。
仕方がないので、SD.hの利用を考えます。
ArduinoのSD.hと違いSTM32での使用を考えて、SPIのピンはこちらのピン配置で設定しています。
MISO(SDI)はPA6
SDカードの情報を読み取って、serialで流すだけのプログラムです。
これがOKなら、読み書きもOKになると思います。
SDカードの情報が読み取れるようになりましたね。
こちらのライブラリでSDカードの読み書きを実装することにします。
実装する仕様は下記です。
SDカード基板はAdafruitのMicroSD card breakout boardを使います。
5V-3.3V 電圧レベル変換ICも入っていてちょっと大きいので、内蔵するにはこちらの基板を使います。
今回SPIを使うのでSDIOは使わないのですが、大きさがほどほどです。
新仕様として、下記を追加します。
① 起動時にENTキーを押していたら、パラメータ設定モードに入る
② 起動時にSELキーを押していたら、RTC設定モードに入る
③ PZEM004T測定データ表示中にSELキーを押すと、SDカードにログデータ記録を開始する
(画面右上に小さくRECと表示)
④ PZEM004T測定データ表示中にENTキーを押すと、ログデータ記録を停止する
ファイル名は、setting.txtにファイル名を入れていればその名前をBaseとして後ろに
月、日と、01から始まる番号を追加する。ファイル名がなければLO030201.csvになる
一旦記録を停止して、新たに記録を開始した場合、番号を+1したLO030202.csvを作り
そのファイルにログを記録する。(8.3形式ファイル命名規則から、ファイル名は8文字とする)
⓹ 記録中でない時に、ENTキーを3秒以上長押しすると積算電力の値がが0クリアされる
⓺ sleep時間経過後に、焼き付き防止でsleep画面になった時は画面にランダムにドットが表示される
SELキーまたはENTキーを押すとSleepが解除され通常表示モードに戻る
(キーによる記録開始/停止は通常表示中でしか有効にならない)
コンパイルすると、Flashが73kB、RAMが7KB 強なので、実行速度も相まってArduino Nano等
では実装が困難だと思われます。(STM32F103C8 (128kB)でないとコンパイルエラーになります)
プログラムの説明ですが、今回は初めての試みとしてプログラム作成にChatGPTとXのGrokを
使いましたので、そのログを添付して手抜きの説明とさせていただきます。
ChatGPT
Grok
https://x.com/i/grok/share/mSsfThX3ekpRZBV12Ppy9OQS4
便利な世の中になったもんですね。
このソフトのコンソールでのログとCSVファイル名、それとCSVファイルの中身です。
ログのCSVファイルの中身です。 Date Timeがちゃんと記録されています。
それでは、皆さんおやすみなさい
関連記事














