SDカードを取り付ける

#参考ページ
SDカードモジュール仕様書
http://boruit.com/JAPANESE/SDcard_jp.htm

ArduinoでSDメモリカードを読み書きする
http://arms22.blog91.fc2.com/blog-entry-502.html

SDカードスロットを使って，SDカードにアクセスする
（※「とにかくSDカードに書き込めた」のあとに見るのをおすすめ）
・ファイルを作成した瞬間のタイムスタンプはいつなのか
・ファイルのタイムスタンプの切り替え方
・dateTime関数を作る意味　などが書いてある
http://garretlab.web.fc2.com/arduino/lab/sd_card/index.html

#最初SDカードモジュールを買ってきたが挫折してシールドを買った
最初はこれをかってハードウェア結線しようと試みたんだが挫折。
http://akizukidenshi.com/catalog/g/gK-05818/
モチベーションがもたない。いまはお金でショートカットできるものはして先を目指すべき。
ハード面に近いことはあとでもできるということでシールドを買ってきた。
http://akizukidenshi.com/catalog/g/gM-09696/

#リアルタイムクロック（ＲＴＣ）モジュール
（時刻の取得はあとでもいいかな...）
モジュール：
http://akizukidenshi.com/catalog/g/gI-00233/
arduino RTCその1：
http://blog.goo.ne.jp/mikotolv5/e/3bafe6928a4abaa870e48bb2d6937d65?fm=entry_awp_sleep

#ソース
```text
#include <SPI.h>
#include <SD.h>

#include <Wire.h>
#include <rgb_lcd.h>

// ◆1：土壌センサー dry[0-300], normal[300-700], wet[700-950]
int buf;

// ◆2：LCD
const int COLOR_R = 0;
const int COLOR_G = 0;
const int COLOR_B = 255;
rgb_lcd lcd;

// ◆3：SD Card（SPI.hとSD.hが必要）
const int chipSelect = 4;

// ◆debug
int value;

void setup() 
{    

    // ◆1：LED
    pinMode(0,OUTPUT);

    // ◆1：リレー・ポンプ行きのピン
    pinMode(1,OUTPUT);

    // ◆1：土壌センサー
    pinMode(A0,OUTPUT);

    // ◆2：LCD
    lcd.begin(16, 2);                       // 画面表示LCD（LCDは16文字2行です）  
    lcd.setRGB(COLOR_R, COLOR_G, COLOR_B);  // LCDのカラーを決定します
    
    // ◆3：SD Card
    pinMode(10, OUTPUT);
    if (!SD.begin(chipSelect)) {
      while(1){
        // SD Card未挿入時に突入（USB差し直さないかぎり無限LOOP）
        lcd.clear();
        lcd.print("SD card is Empty");
        lcd.setCursor(0, 1);
        lcd.print("Please Restart.");
        delay(100);
      }
    }

    // ◆コールバック関数の定義（日付と時刻を返す関数を登録）
    SdFile::dateTimeCallback( &dateTime );
    
}

void loop() 
{
  
    // SD Cardのファイルを開けたら値を書き込む
    File dataFile = SD.open("datalog.txt", FILE_WRITE);
    if (dataFile) {
      dataFile.println(value++);
      dataFile.close();
      
      // 画面表示 
      lcd.clear();
      lcd.print("SDCard is");
      lcd.setCursor(0, 1);
      lcd.print(value);
      delay(100);
      
    }
    delay(1000);

    /*●●●
    // 土壌センサー 値取得
    buf = analogRead(0);

    // 乾いている時の挙動
    if(buf < 400){

      // ポンプを動かす
      digitalWrite(1,HIGH);

      // ***************
      // 「A」
      looop:

      // パトランプ
      digitalWrite(0,HIGH);
      delay(10);
      digitalWrite(0,LOW);
      
      // 値を見る
      buf = analogRead(0);

      // 画面表示 
      lcd.clear();
      lcd.print("sensor value is");
      lcd.setCursor(0, 1);
      lcd.print(buf);
      delay(100);

      // 判断：値を見て、まだ乾いているなら 「A」 に戻る
      if(buf < 400){
        goto looop; 
      }
      // ***************
      
      digitalWrite(1,LOW);
      
    }
    
    // 画面表示 
    lcd.clear();
    lcd.print("sensor value is");
    lcd.setCursor(0, 1);                // Note：行は0base、第2引数で1を指定すると2行目の意
    lcd.print(buf);
    delay(100);
    ●●●*/
    
}

// 新規にファイルを作成した場合，そのファイルの作成日時は「2000年1月1日1時0分0秒」となります。
// ファイルの作成日時を変更したい場合は，void dateTime(uint16_t* date, uint16_t* time)という関数を定義する必要があります。
// この関数はファイルを作成したときと，ファイルをフラッシュしたとき(File::flush()もしくはFile::close()が呼ばれたとき)に呼ばれます。
void dateTime(uint16_t* date, uint16_t* time)
{
  uint16_t year = 2015;
  uint8_t month = 2, day = 3, hour = 9, minute = 0, second = 0;

  // GPSやRTCから日付と時間を取得
  // FAT_DATEマクロでフィールドを埋めて日付を返す
  *date = FAT_DATE(year, month, day);

  // FAT_TIMEマクロでフィールドを埋めて時間を返す
  *time = FAT_TIME(hour, minute, second);
}
```

#動作確認
SDカードが未挿入のとき、挿入されているときの動作の違いを確認できた。
時刻を取得しないといけない課題はあるが、リアルタイムクロック（ＲＴＣ）モジュールを買わないといけないし、ひとまず「書く」ことが出来たのだから次にいこう。

#つぎは？
SDカードの値をHTTPリクエストで「発行」する