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に書き込む箇所を変更していけば いけそうな気がするけど それほど必要性がないからとりあえず保留。 ということで プログラムはできました。 |