2020/04/24(FRI) 【Nチビ】【M5Stack】メーターを作る(その3)
ちょっとプログラムを整理したので
プログラム解説
基本的にArduinoIDEでC言語で書いてます。
コーディング規約も独自ですw
まず定義
フォト
フォト
5〜6行目:SDカードで使うファイル名を定義しています
9〜11行目:速度計関連の定義です。
14〜15行目:水温計関連の定義です。

続いてグローバル変数
フォト
フォト
特に説明することはないですが
27行目と32行目はそれぞれ線形補間するために
データをためておく配列です。

続いて、関数のプロトタイプ宣言
フォト
フォト
8個の関数を使います。setup()とloop()はお約束の関数なので
名前の変更はできません。

setup()関数です。
起動時のみ呼ばれる関数なので各種設定します。
フォト
フォト
フォト
フォト
68行目:AD変換すると内蔵スピーカーにノイズがのるのでお約束処理
71〜72行目:それぞれセンサーを繋ぐピンアサインを設定します
75行目:速度計用のセンサーに反応あった時の割込み設定をします
78〜79行目:バックライトの設定を読み込んで設定しています
86〜88行目:画面表示します

loop()関数。
定期的に繰り返し呼ばれる関数です。
えっと周期は・・・CPUの周波数となんたらかんたらだった気が・・・
フォト
フォト
フォト
フォト
フォト
103〜119行目:ボタン入力の処理しています
127行目:水温取得および表示関数を呼んでます
 100ms毎に呼びます(ただ表示は5秒毎です)
134行目:速度計の表示関数を呼んでます(1秒毎)

fnDisplayInit()関数です。
画面の初期化表示しています
フォト
フォト
フォト
ロゴの表示とか"km/h"とか"℃"を表示しています
160〜163行目で"℃"を書いてます
"C"と"o"のサイズを変えて組み合わせていますw

fnSpeedDisplay()関数
速度を表示する関数です
フォト
フォト
フォト
フォト
180〜183行目:線形補完でなくて線形補間だった。。。orz
  データ数分平均しているだけです。
191行目:同じ数値を表示するとちらつくので、
  同じ時は表示はスキップ

fnSpeedISR()関数
磁力センサーに磁石が近づいた時にコールされます。
フォト
フォト
フォト
そもそも時速っていうのは
(距離) / (時間) なので
214行目で (時間) を求めています。msecです。
(距離) はタイヤの外周になります。
前輪のサイズは100/90-12なので外周は
((100mm × 90%) × 2 + (12inchi × 24.5mm))×3.1419... ≒ 1523 mm
ということで時速を求めるには
(1523mm / (1000×1000)) km ÷ ( (時間)ms / (1000 × 60 × 60 ) )
この式を整理すると
(速度)km/h = 5482.8 / (時間)ms
となる。
少数で計算させてもいいんだけど
そこまで精度を求めていないので
ざっくり5483を定数として計算。
それが219行目です。

fnTempDisplay()関数
温度センサーを読み取って変換します
フォト
フォト
フォト
フォト
243行目:アナログ値を読みます
246〜251行目:線形補間します
255〜257行目:取得した値を電圧に変換します
261〜262行目:摂氏に変換します
267〜270行目:画面に表示しています

まずアナログ値、3.3VでMAXらしいですが
その時に4095という値をとります。
"4095"は16進数で"FFF"です。
2進数だと"1111 1111 1111"です。
そういう分解能なので255〜256行目で計算しています。
少数でなく整数で計算しようとしています。
で、どうやらM5StackのAD値は補正が必要なようで
それが257行目です。
で、温度センサーはLM60BIZってのを使っているので
0℃の時に 424mVで1℃につき6.25mvだそうで
T℃ = (V - 424)mv / 6.25 (mv/℃)
で求められる。
でも整数で計算するので、
前述のAD値取得の式と混ぜて
261〜262行目のようになります


fnBrightnessPut()関数
バックライトの現在時を保存します
フォト
フォト
フォト
ファイルをオープンして書き込んでクローズしているだけです

fnBrightnessGet()関数
バックライトの設定値読み込みます
フォト
フォト
フォト
ファイルをオープンして読み込んでクローズしているだけです

トリップメータも工夫すれば
SDに書き込む箇所を変更していけば
いけそうな気がするけど
それほど必要性がないからとりあえず保留。

ということで
プログラムはできました。