Arduino(10) Felica実装をマージ
はじめに
前回までで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