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/

リアルタイムクロック(RTC)モジュール

(時刻の取得はあとでもいいかな...)
モジュール:
http://akizukidenshi.com/catalog/g/gI-00233/
arduino RTCその1:
http://blog.goo.ne.jp/mikotolv5/e/3bafe6928a4abaa870e48bb2d6937d65?fm=entry_awp_sleep

ソース

#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カードが未挿入のとき、挿入されているときの動作の違いを確認できた。
時刻を取得しないといけない課題はあるが、リアルタイムクロック(RTC)モジュールを買わないといけないし、ひとまず「書く」ことが出来たのだから次にいこう。

つぎは?

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