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