Arduino(10) Felica実装をマージ

2021/08/31に公開

はじめに

前回まででFelicaからIDを取得できましたので、この実装を他機器との実装とマージします。
具体的には「Arduino(7)」のコードに「Arduino(9)」のコードをマージします。

実装

今回はコード全文は載せていません。コード全文載せると、それだけで結構な量になるのでやめました。
以下は、変更した箇所だけ抜粋して記載しています。

前回のコードは、SerialにIDmを書き出しているので、これをLCDに表示するように変更。
今の実装ではLCDは年月日時分秒を表示して2行とも使用しているので、年を削って1行の表示として、2行目にIDmを表示とします。
rtc2lcd()関数で月日時分秒の表示位置を決めているので、これを変更しました。

//-----------------------------------------------
//  時刻の表示
//-----------------------------------------------
void rtc2lcd()
{
  char buffer[] = {"0000"};
  int value;

  //年を取得して文字列に代入
//  value = year();
//  itoa(value, buffer, 10);
//  strncpy(str, buffer, 4);

  //月を取得して文字列に代入
  buffer[0] = '0';
  value = month();
  itoa(value, &buffer[1], 10);
  if(value > 9)
  {
    strncpy(&str[0], &buffer[1], 2);
  }else{
    strncpy(&str[0], buffer, 2);
  }
  
  //日を取得して文字列に代入
  value = day();
  itoa(value, &buffer[1], 10);
  if(value > 9)
  {
    strncpy(&str[3], &buffer[1], 2);
  }else{
    strncpy(&str[3], buffer, 2);
  }

  //時を取得して文字列に代入
  value = hour();
  itoa(value, &buffer[1], 10);
  if(value > 9)
  {
    strncpy(&str[6], &buffer[1], 2);
  }else{
    strncpy(&str[6], buffer, 2);
  }

  //分を取得して文字列に代入
  value = minute();
  itoa(value, &buffer[1], 10);
  if(value > 9)
  {
    strncpy(&str[9], &buffer[1], 2);
  }else{
    strncpy(&str[9], buffer, 2);
  }
  
  //秒を取得して文字列に代入
  value = second();
  itoa(value, &buffer[1], 10);
  if(value > 9)
  {
    strncpy(&str[12], &buffer[1], 2);
  }else{
    strncpy(&str[12], buffer, 2);
  }
  lcdWrite(str,0);                      //LCDに反映
}

次に、LCD表示関数が一気に2行の表示となっており、使い勝手が悪いので、引数指定で行数を選べる様に変更。

//-----------------------------------------------
//  文字列の書き出し
//-----------------------------------------------
void lcdWrite(char* str,int row)
{
  int i;

  if(row == 0){
    i2cCmdWrite(0x80);    //1行目の先頭にカーソルを移動
  }else{
    i2cCmdWrite(0xc0);    //2行目の先頭にカーソルを移動
  } 
  delay(5);
  for(i = 0;i < 16;i++)
  {
    if(*str == '\0')break;
    i2cDataWrite(*str++);
    delay(5);
  }
}

「Arduino(9)」のloopの中身をfelica関数として記述。従来のSerialではなくLCDとSDへ書き出す様に変更。String型からchar *への変換時には、全部で16文字必要なのだが、17を指定している。これは最終文字が表示されなかった為ですが、たぶん終端文字を勝手に付けちゃうとかで1文字多めにバッファが必要なのかと推測している。

//-----------------------------------------------
//	Felicaカード読み取り
//-----------------------------------------------
void felica()
{
  int ret;
  String IDm = "";
  char buf[2];
  char IDmBuff[17];
  
  rcs620s.timeout = COMMAND_TIMEOUT;
  //Felica状態の取得
  ret = rcs620s.polling();
  if (ret) {
    //Felicaがタッチされた場合
    for (int i = 0; i < 8; i++) {
      sprintf(buf, "%02X", rcs620s.idm[i]);
      IDm += buf;
      //IDmBuff[i] = rcs620s.idm[i];
    }
    Serial.println(IDm);
    IDm.toCharArray( IDmBuff,17);
    lcdWrite(IDmBuff,1);                      //LCDに反映

    File myFile = SD.open("test.txt", FILE_WRITE);
    if (myFile) {
      Serial.print("Writing to test.txt...");
      myFile.print(str);
      myFile.print("   ");
      myFile.println(IDmBuff);
      myFile.close();
      Serial.println("done.");
    } else {
      Serial.println("error opening test.txt");
    }
  } 
  rcs620s.rfOff();
}

最後にloop関数内で作成したfelica()関数を読み出すようにすれば完成。

void loop() {
  // put your main code here, to run repeatedly:
  rtc2lcd();
  lanRx();
  felica();
  delay(1000);
  Serial.println("Proc...");
}

Felicaカードを接触させることで、IDmをLCDに表示して、時間と一緒にSDカード内にも書き込まれる事が出来ました。

残件

Felicaでタッチした時に音とか出したいな。ブザーは無いので、なんか探し購入しようかな。
Felicaのタッチで時刻とIDが記録されるので、出退管理に使えるのではと、考えている。現状でのSDカードを抜いてPC側でファイルを処理すれば、勤怠管理できるのでは…。次はPC側ソフト実装してみようかな。

Discussion