前回、リクエストの中身を解説しましたけど、今度はスケジューラーのところを解説します。取得したいデータの性質を考えると、水温なんて頑張っても数秒に一回しか変わりません。また、エンジン回転数は数ms毎に変化する値なので、なるべく速く取得したい数値です。ただ、人間はそんなに早く数値読むことができません。(今回は手抜きで数字表示だし。)
ということで、今回は50msで周期を作り、回転数は200msに一回、水温は1秒に一回取得することにします。なので、回転数は50msでカウントアップされるタイマーの4回に一回で送れば良いということになり、カウンタを4で割って、4かけて元の数と一致するときに送信要求を送ることにしました。(4で割って余りが0の時でもよかったかもしれない。)
で、水温は0から始まって、20回目の19になったときに、送信要求を送っています。(ついでにカウンタをクリア)
if ((prev_time-millis())> 50) {
prev_time=millis();
if (loop_counter == ((loop_counter/4)*4)) { // if counter value is even
/* ここに回転数の取得メッセージの送信処理が入る */
} else if (loop_counter == 19) { // 1sec expired
/* ここに水温の取得メッセージの送信処理が入る */
}
if (loop_counter >= 19) {
loop_counter = 0;
} else {
loop_counter++;
}
}
}
実際、水温は最初100msくらいで更新したときは、数値が戻ることもあったのですが、これで問題なくゆっくり変化するようになりました。
また、エンジン回転数は人間の読み取りもそうなんですが、実際にはLCDもさほど速くないので、200msで更新してもさっぱり読み取れないことが分かったので、0.3秒とか、0.5秒でもよかったかもしれない。
表示するときに、グラフ表示などでグラフィカルに表示するのであれば、100msなどに早めるのも手ですが、CANバスはいつも混み合っていて、そこにこの読み出し要求とその応答が混ざると混み具合が激しくなり、車両の重要な通信が妨げられて、遅延する可能性があります。これは、車両のエラー表示の原因になりかねないので、10msに一回とかの高速で要求することはやめてください。(どうせ人間読めないから。)
まあ、反省点ですが、頑張って外字機能とか使えば、この液晶でも棒グラフは出せると思います。この液晶は1文字が5x7ドットなので、500rpmで一文字、100rpmで1ドットなので、1,2,3,4幅の縦ドットをそれぞれ外字登録してあげれば、横棒グラフ表示できると思います。(とはいえ、どうせATなので自分で変速できないから、回転数を正確に見れてもあまり意味はないですが・・・) 見栄えをよくしたい人はチャレンジしてもいいのかも。
参照情報URLに外字登録のやり方を解説しているところを貼り付けておきました。ヤフオクで売ってるハイブリットモニターのように、自作のアイコン的なものを表示したいときは、これ使えばできます。(このブログ全部読むと、自分で2000円くらいであのモニタは作れると思います。ただ、そこに至るまでの労力を考えると、あの値段は妥当だな(むしろ安い?)というのも理解できると思います。)
ブログ一覧 | 日記
Posted at
2020/11/22 09:26:58