#include #include #include static volatile byte rwbuff[32]; static volatile uint8_t wp, sk; File sdFile; void setup() { Wire.begin(8);// Slave ID #8 Wire.onRequest(requestEvent); Wire.onReceive(receiveEvent); // プルアップを無効 pinMode(SDA, INPUT); pinMode(SCL, INPUT); SD.begin(); // 10ピンSSを使う(デフォルト) wp = 0; sk = 0; } void loop() { } void receiveEvent(int num) { while(Wire.available()) { rwbuff[wp++] = Wire.read(); } wp = 0; if(rwbuff[0] == 0) // バックアップファイル初期化 { if(SD.exists("passmgr.txt")) SD.remove("passmgr.txt"); } else { sdFile = SD.open("passmgr.txt", FILE_WRITE); if(sdFile) { for(int i=0; i<32; i++) { sdFile.print((char)rwbuff[i]); if((i == 15) || (i == 31)) sdFile.println(); // 16文字で改行 } sdFile.close(); } } } void requestEvent() { int ix = 0; uint8_t ch; sdFile = SD.open("passmgr.txt", FILE_READ); rwbuff[0] = 0; if(sdFile) { sdFile.seek((32 + 4) * sk++); // + CR LF while(sdFile.available()) { ch = sdFile.read(); if(ch > 0x1f) // CR LFを除く { rwbuff[ix++] = ch; if(ix == 32) break; } } sdFile.close(); } if(rwbuff[0] == 0) // データなし sk = 0; for(int i=0; i<32; i++) Wire.write(rwbuff[i]); }