Arduinoで温度測定してUSB通してデータをPCに送るのはできるけど、単独の状態で使えるようにするのはSDカードなどに記録したいので。
ということで、SDカード書込みの実験
まずは「Micro SD TFカードメモリシールドモジュール」をアマゾンでポチリました。
並行輸入品 3個セットで550円 ボードにはHW-125の表記がありました。
接続や使い方のスケッチについては geotechlab-workshop さんのサイトを参照させてもらいました。
接続はこんな感じです
(Arduino側)―(SDカードシールド側)
13 CLK (SCK)
12 MISO
11 MOSI
10 CS
5V VCC
GND GND
最初3.3Vだと思ってVCC3.3V側に接続したのですがエラーでした。これは5V用に変換回路入ってました。なにせアマゾンからの送付は箱に3個ポロっと入ってるだけで説明書も何もないもので。せめてネットでサンプル接続図でも入れてあればよかったのにね
ネットで調べて実験してみるしかないって感じでやってみました。
使用したSDカードは東芝のSDHC16GBのマイクロSDカードです 「あきばおー」にClass4のが\250で見切り品で安く売ってたの書込みスピードも関係ないので。
フォーマットは標準のFAT32です
SDカードは途中で抜いても今のところ問題なし。ただしSDカード差し込んだ後はリセットボタンで再起動しないと記録されません。またファイルは追記なので初期化したい場合はPCでファイル消すだけです。
書き込まれたデータはこんな感じ
----Start----
time,temp,hum,T,Bright
2409,24,42,5.30,676
32516,24,42,5.49,675
62622,24,42,5.49,675
Excelで読込むと

こんな感じでA列に時間が入っているので、SDカード取り外した時刻さえわかれば逆算して
それぞれの時刻を取得できるということで F列に時刻を入れてみました
F3510セル: [=F3511-(A3511-A3510)/1000/86400]

スケッチはこちら
--------------------------------------------------------------
/*
* Author: URK Labo
* IDE V1.8.13
* 温湿度計、照度とをLCD AE-AQ1602Aに表示してSD_Cardに書込み
*/
#include <dht11.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#define LCD_ADRS 0x3E //SCL:A5 SDA:A4
const String SD_FileName ="datalog.csv" ;
const int chipSelect = 10; // Arduino UNO:10 MEGA:53
String LCD_STRING;
char s[16];
double SET;
unsigned long time;
dht11 DHT; //Note:DHT on behalf of the temperature and humidity sensor
const int dht11_data = 6; //DHT11 pin
int photocellPin =A1; //光センサー pin
double Vout; //サーミスタ電圧(Vout)
double Rt; //サーミスタ抵抗値(R1)
double B=3950; //補正係数(B)
double T; //サーミスタ温度(T)
double R1=9750; //バランス抵抗(Ω)
double A0c; //analogRead(0)
int temp=0; //DHT11 温度
int hum=0; //DHT11 湿度
//初期化
void setup() {
Serial.begin(9600); //Set serial baud rate to 9600 bps
Wire.begin(LCD_ADRS);
init_LCD();
init_SD();
}
//Main
void loop() {
time = millis();
//サミスタ温度
A0c=analogRead(0);
Rt=(1024/A0c-1)*R1; //サーミスタ抵抗値(Rt)を計算
T=1/(1/B*log(Rt/10000)+1/298.15)-273.15; //サーミスタ温度(T)を計算
// Photocell
int Bright=analogRead(photocellPin);
//温度湿度計
DHT.read(dht11_data);
temp=DHT.temperature;
hum=DHT.humidity;
LCD_STRING="T= "+String(T,2)+" B="+String(Bright);
LCD_DISP_16_1();//LCD一行目に変数を出力する
LCD_STRING ="T="+String(temp) + " H="+String(hum) +" URK";
LCD_DISP_16_2(); //LCD二行目に変数を出力する
//SDに書込み
File dataFile = SD.open("datalog.csv", FILE_WRITE);
if (dataFile)
{
dataFile.println(String(temp)+","+String(hum)+","+String(T)+","+String(Bright));
}
dataFile.close();
//Com Portに出力
Serial.println(String(temp)+","+String(hum)+","+String(T)+","+String(Bright));
delay(5000);
}
//AE-AQ1602コマンド書き込み
void writeCommand(byte command){
Wire.beginTransmission(0x3E);
Wire.write(0x00);
Wire.write(command);
Wire.endTransmission();delay(10);}
//AE-AQ1602データ書き込み
void writeData(byte data){
Wire.beginTransmission(0x3E);
Wire.write(0x40);
Wire.write(data);
Wire.endTransmission();delay(1);
}
//AE-AQ1602の1行目にデータ書き込み
void LCD_DISP_16_1(void){
writeCommand(0x80); //DDRAMアドレスを1行目先頭にセット
for(int i = 0; i < 16; i++){writeData(LCD_STRING[i]);}
}
//AE-AQ1602の2行目にデータ書き込み
void LCD_DISP_16_2(void){
writeCommand(0x40+0x80); //DDRAMアドレスを2行目先頭にセット
for(int i = 0; i < 16; i++){writeData(LCD_STRING[i]);}}
//AE-AQ1602 初期化
void init_LCD(){
int intDelay=1; //Originalは20 仕様は<26.3us
delay(50); //Wait time >40ms
writeCommand(0x38); //Function set
delay(intDelay);
writeCommand(0x39); //Function Set
delay(intDelay);
writeCommand(0x14); //Internal OSC frequency
delay(intDelay);
writeCommand(0x7A); //Contrust set 3.3V=0x73, 5V=0x7A(74~ )
delay(intDelay);
writeCommand(0x54); //Power/ICON/Conttlust Control 3.3V=0x56, 5V=0x54
delay(intDelay);
writeCommand(0x6C); //Follower control
delay(200); //ここだけは wait time>200ms
writeCommand(0x38); //Function set
delay(intDelay);
writeCommand(0x01); //Clear Display
delay(intDelay);
writeCommand(0x0C); //Display ON/OFF control
delay(intDelay);
}
//SD Card TFカードメモリシールド(HW-125) 初期化
void init_SD(){
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
/* ----- Initialisation of SD card ------ */
Serial.print("Initializing SD card...");
//see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
LCD_STRING ="Card failed ";
LCD_DISP_16_2(); //LCD二行目に変数を出力する
delay(5000);
return; // don't do anything more:
}
Serial.println("card initialized. OK");
LCD_STRING ="Card OK ";
LCD_DISP_16_2(); //LCD二行目に変数を出力する
/* SDカードに書き込み */
File dataFile = SD.open(SD_FileName, FILE_WRITE);
if (dataFile)
{
dataFile.println("----Start----");
dataFile.println("time,temp,hum,T,Bright");
}
dataFile.close();
delay(2000);
}