LoginSignup
4
3

More than 5 years have passed since last update.

SDカードを取り付ける

Last updated at Posted at 2015-10-22

参考ページ

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リクエストで「発行」する

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3