見出し画像

【Arduino】クラスを作ってみる2

 前回「【Arduino】クラスを作ってみる1」では、時間を計測するクラスを作成しました。
今回は「ラップタイムを記録」ができるクラスを作っていきます!

製作環境

・Visual Studio Code
・Windows10
・Arduino Nano or Nano Every
※Visual Studio CodeでArduino環境構築は割愛させていただきます。

1.ラップタイムに行く前に

 前回の終わりに、出力結果の小数点以下が「.00」になってしまうことが
ありましたが、クラスメンバーの変数の型を変更することで解決しました!

#define Timer_h 

//時間管理クラス
class Timer
{
  public:
      Timer();
      ~Timer();
      void        Start(void);
      float       Stop(void);

  private:
      float    m_startTime; //uint32_t型からfloat型
      float    m_stopTime; //uint32_t型からfloat型
};
#endif

2.ラップタイムクラスを作る

 今回作ったクラスはラップタイムを3つ記録でき、
4つ目以降の記録は最初から更新していくようにしてみました。
Timerクラスは前回の「【Arduino】クラスを作ってみる1」を参照してください
stopwatch.ino ↓

#include "Timer.h"
#include "SaveRapTime.h"
#include <SoftwareSerial.h>

Timer time; //Timerクラスのインスタンスを作成
SaveRapTime srap;


void setup() {
 Serial.begin(115200);   //通信速度を初期化
 Serial.println("USING Timer class");
}

void loop() {
 char key = '\0';
 float measurval = 0, raptime = 0;
 
 //データがあった時だけ、処理を行う
 if (Serial.available()) { //受信データはあるか?
   key = Serial.read();    //1文字だけ読み込む
   Serial.write(key);      //1文字だけ送信。受信データをそのまま送り返す。
   Serial.print("\n");     //改行
 }

 //keyの中身で条件分岐
 switch (key)
 {
 case '1':
   time.Start(); //スタート
   srap.resetSaveTime();
   break;
 case '2':
   measurval = time.Stop();  //ストップ
   Serial.print(measurval);  //計測時間をコンソール出力
   Serial.println("s");
   srap.viewTimes();
   break;
 case '3':
   raptime = time.getRaptime();  //ラップタイムの取得
   if(srap.saveTime(raptime))
     Serial.print("Save");
   else
     Serial.print("UpDate");
   Serial.print(raptime);  //途中(ラップ)の時間をコンソール出力
   Serial.println("s");
   break;
 default:
   break;
 }
 key = 0;  //格納した1文字を削除

}

SaveRapTime.h ↓

#ifndef SaveRapTime_h
#define SaveRapTime_h

   #define ARRAY_LENGTH(array) (sizeof(array) / sizeof(array[0]))
   #include <stdio.h>
   #include <Arduino.h>
   //構造体
   typedef struct {
       float raptime[3];
   }savememory;

   class SaveRapTime
   {
       public:
       SaveRapTime();
       ~SaveRapTime();
       bool    saveTime(float sourcetime); //ラップタイムの記録
       void    resetSaveTime(void);        //ラップタイムのリセット
       void    viewTimes(void);            //記録した分だけ表示

       private:
           savememory      m_memory;
   };
#endif

SaveRapTime.cpp ↓

#include    "SaveRapTime.h"

SaveRapTime::SaveRapTime()
{
   m_memory = {0, 0, 0};
}

SaveRapTime::~SaveRapTime(){}

//ラップタイムの記録
bool SaveRapTime::saveTime(float sourcetime)
{   
   bool res = false;
   int max_arry = ARRAY_LENGTH(m_memory.raptime);
   int i = 0;
   for (;i < max_arry; i++) {
       if (m_memory.raptime[i] == 0){
           m_memory.raptime[i] = sourcetime;
           res = true;
           break;
       }
   }

   if (!res){
       for (int j = 0; j < max_arry; j++) {
           if (m_memory.raptime[j] < m_memory.raptime[max_arry-1]){
               m_memory.raptime[j] = sourcetime;
               break;
           }
           else if (j == (max_arry-1)){
               m_memory.raptime[j] = sourcetime;
           }
       }
  }
   return res;
}

//ラップタイムのリセット
void SaveRapTime::resetSaveTime()
{
   for (uint8_t i = 0; i < ARRAY_LENGTH(m_memory.raptime); i++){
       if (m_memory.raptime[i] != 0)
           m_memory.raptime[i] = 0;
   }
}

//記録した分だけ表示
void SaveRapTime::viewTimes()
{
   String showstr = "";
   
   for (uint8_t i = 0; i < ARRAY_LENGTH(m_memory.raptime); i++){
       //何も記録されていなかったら戻る
       if (m_memory.raptime[i] == 0)
           return;
       //表示内容を統合
       showstr = "RapTime[" + String(i+1) + "]: " + String(m_memory.raptime[i]) + "ms";
       Serial.println(showstr);
   }
}

3.出力結果

USING Timer class
1
start :4630.00ms
2
stop :7796.00ms
3.17s
1
start :10660.00ms
3
Save1.50s
3
Save1.98s
3
Save2.49s
2
stop :14692.00ms
4.03s
RapTime[1]: 1.50ms
RapTime[2]: 1.98ms
RapTime[3]: 2.49ms

4.まとめ

今回、「ラップタイムの記録」のクラスを作りました。
今後は、記録できる数を任意で変更できるようにしていきたいですね。
シリアルモニタで表示させていますが、ハードを使って表示させたい!
(せっかくArduinoを使っているわけですし...)
なので、次回は表示系のマイコン部品と既存のライブラリを使ってタイムを表示させていきたいと思います!
最後まで見ていただき、誠にありがとうございました。

それでは!('ω')ノシ

この記事が気に入ったらサポートをしてみませんか?