小電流電子負荷装置③
前回記事では自作中の電子負荷装置の校正について考えました。
energy-note.hatenablog.com
精度よく測定出来ても、定期的に電圧値・電流値を計測してきて保存する部分が「delay(1000);」でよし!1秒!とかやってました。よくよく考えると処理のタイミングや計測の遅延とかでずれていくに決まっています。色々調べて、
westgate-lab.hatenablog.com
こちらの記事を参考にさせていただきました。大変参考になりました。ありがとうございます!
(全文理解するには時間がかかる)
M5Stackではマルチタスクが使えるんですね。マルチタスクにして、片方で測定して、片方でSDカードに保存します。これまではループの回数で、指定の回数回したら保存しろ、という感じでしたが、かなりスマートに収まりました。
電子負荷装置で消費させた(消費できた)電力量、積算電力量がわかるといいなぁと思ったので、電力量[Wh]も計算して表示します。watt_valueに電力値が入っているとすると、1秒ごとに電力値を測定するとして
watthour_value += watt_value / 3600;
これでいいでしょうか。単位が[Wh]であるので、秒ごとの計算になるため3600で割った数字を積算していきます。これで合っている、はず、です。[Ws]より[Wh]が使い慣れてるのでわかりやすいですし、[Ws]だと桁数が多くなりそうで。
例えばこれを5秒ごとの測定とかにして、電力値が一定ではなく上下していた場合、誤差が出てきてしまいます。あくまで参考値程度の数字にしかなりませんが、今回の測定器では十分かと思っています。この精度を上げるには測定間隔をさらに小さくして積算する必要があるかと思います。
電流指令値の入力部分を手作りしてみました。(たぶん、ネット見た感じ同じ仕様のものはなかったはず・・・)M5Stackのボタンが4つあれば自由度は高そうですが、3つなので操作が限られます。
while(1){ M5.update(); //ボタン部の表示 M5.Lcd.setCursor(60,220); M5.Lcd.printf("<"); M5.Lcd.setCursor(155,220); M5.Lcd.printf(">"); M5.Lcd.setCursor(235,220); M5.Lcd.printf("Set"); //数字の表示 M5.Lcd.setCursor(0,40); M5.Lcd.printf("%d%d%d%d.%d%d%d[mA] exit",current_value[0],current_value[1],current_value[2],current_value[3],current_value[4],current_value[5],current_value[6]); //カーソルの表示 if (set_column>3){ //小数点を飛び越える set_cursor = (set_column+1)*12; }else{ set_cursor = set_column*12; } //exit if (set_column==7)set_cursor=173; M5.Lcd.setCursor(set_cursor,60); M5.Lcd.printf("^"); //左ボタン if (M5.BtnA.wasPressed()){ M5.Lcd.clear(); set_column--; if (set_column<0){ set_column=0; } set_value=current_value[set_column]; } //右ボタン if (M5.BtnB.wasPressed()){ M5.Lcd.clear(); set_column++; if (set_column>7){ set_column=7; } if (set_column!=7)set_value=current_value[set_column]; } //setボタン if (M5.BtnC.wasPressed()){ M5.Lcd.clear(); set_value++; if (set_value>9){ set_value=0; } //各値を保存する switch(set_column){ case 0: current_value[0]=set_value; break; case 1: current_value[1]=set_value; break; case 2: current_value[2]=set_value; break; case 3: current_value[3]=set_value; break; case 4: current_value[4]=set_value; break; case 5: current_value[5]=set_value; break; case 6: current_value[6]=set_value; break; case 7: //値を保存して戻る M5.Lcd.clear(); set_current_value = (current_value[0]*1000)+(current_value[1]*100)+(current_value[2]*10)+current_value[3]+(current_value[4]/10)+(current_value[5]/100)+(current_value[6]/1000); return; } }
0.000mA
^
このようにカーソルが示している桁数をA,Bボタンで移動し、setボタンで変え、exitで確定させます。exitの横にcancelを入れるのもよさそうです。
今回は一桁づつ数字を変えられる仕様にしました。数字を入力するならソフトキーボードが便利そうですが、0.300mA→0.310mAみたいな微妙な変化だとこの方法が便利かな?と思いました。ボタン長押しや複数ボタンの組み合わせとかやると幅が広がりそうです。
あとはハード側をきれいにするのと、M5Stackの固定含めたケース製作です。