
お世話になります。
このスケッチを見るとHIGHの時に記録するようになっていると考えていますが、HIGHかLOWの変化の有った時に記録したいのですが、どのように変更すれば良いか教えて下さい。
また、記録上の0000 0000 0000のようにスペースを開けて記録する場合のスケッチも教えていただけますか。
参考にしたHP
http://www.mauroalfieri.it/en/elettronica/data-l …
元のスケッチのチャンネル数はアナログ4chですがこれにデジタル12chを加え合計16chにしてみました。
実機では、まだ検証していませんがソフト上ではエラーは発生していません。
その他、改善点なども有りましたら、ご教授お願い致します。
皆様、よろしくお願い致します。
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"
#include <SD.h>
#define readButton 16
#define CS 10
RTC_DS1307 RTC;
char buffer[40];
File myFile;
void setup () {
Serial.begin(57600);
Serial.print("Initializing SD card...");
pinMode(CS, OUTPUT);
pinMode(readButton, INPUT);
if (!SD.begin(CS)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
Wire.begin();
RTC.begin();
RTC.sqw(1); //0 Led off - 1 Freq 1Hz - 2 Freq 4096kHz - 3 Freq 8192kHz - 4 Freq 32768kHz
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(__DATE__, __TIME__));
}
}
void loop () {
DateTime now = RTC.now();
sprintf(buffer, "%02d/d/%d d:%02d:%02d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second(), digitalRead( A1 ), digitalRead( A2 ), digitalRead( A3 ),digitalRead( A4 ), digitalRead( A5 ), digitalRead( A6 ), digitalRead( A7 ),digitalRead( A8 ), digitalRead( A9 ), digitalRead( A10 ), digitalRead( A11 ),analogRead( A0 ), analogRead( A1 ), analogRead( A2 ), analogRead( A3 ));
Serial.println( buffer );
myFile = SD.open("dati.log", FILE_WRITE);
if (myFile) {
myFile.println(buffer);
myFile.close();
} else {
Serial.println("error opening dati.log");
}
if ( digitalRead( readButton ) == HIGH ) {
Serial.println(" ");
Serial.println("Log Reading Saved ----------- ");
Serial.println(" ");
myFile = SD.open("dati.log");
if (myFile) {
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
delay( 5000 );
}
delay(1000);
}
No.2ベストアンサー
- 回答日時:
>char buffer[40];これをchar buffer[64];に変更しました。
実際に64文字で足りるかはちゃんと検証してくださいな。
%d指定だとint型の最大桁数まで入る可能性があると思っておいた方が。
>if ( now != old ) {
>の所で「 'old' was not declared in this scope」というエラーが発生します。
>スケッチの最初に設定をしないといけないのでしょうか。
初期値がないよ。
と怒られたのでしょう。
setup()辺りで初期値を設定すればよいでしょう。
スイッチなどが接続されているのであればスイッチの状態で固定値にしてもいいでしょうし、
setup()内でdigitalRead()した値でも突っ込んでおけばよいかと。
ありがとうございます。
64文字は実際に検証して変更していきます。
初期値が無く怒られた件ですが、
setup()のスケッチを
pinMode(0,INPUT) ;
pinMode(1,INPUT) ;
pinMode(2,INPUT) ;
pinMode(3,INPUT) ;
・
・
これを16系統入力してみましたがエラーでした。
nowに対しての初期値でしょうか。
またdigitalReadとanalogReadが必要になるのですよね。
この場合、nowが2個必要になるのでしょうか。
質問ばかりで申し訳ありません。
No.1
- 回答日時:
>char buffer[40];
まず、40文字で足りますか?
>sprintf(buffer, "%02d/d/%d d:%02d:%02d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second(), digitalRead( A1 ), digitalRead( A2 ), digitalRead( A3 ),digitalRead( A4 ), digitalRead( A5 ), digitalRead( A6 ), digitalRead( A7 ),digitalRead( A8 ), digitalRead( A9 ), digitalRead( A10 ), digitalRead( A11 ),analogRead( A0 ), analogRead( A1 ), analogRead( A2 ), analogRead( A3 ));
の変換結果が40文字で収まるとは思えませんが。
analogRead()は10ビットの結果を返すようなので、%d指定で最大4桁。
最初の方の/d/は/%d/の書き間違いでしょう。
HIGHが具合的にいくつになったかちょっと覚えていませんが、1だったとしても…
"01/12/2014 12:00:00 1 1 1 1 1 1 1 1 1 1 1 1 1023 1023 1023 1023
"で、64文字くらいはバッファが必要そうです。
>HIGHかLOWの変化の有った時に記録したいのですが、どのように変更すれば良いか教えて下さい。
前回の状態を変数に記録しておいて、それと変化があった場合に処理すればよいでしょう。
delay()でそれなりの間を開けているようですしチャタリングは考慮しなくてもいい…でしょうかねぇ……。
if ( digitalRead( readButton ) == HIGH ) {
:
}
を
now = digitalRead( readButton );
if ( now != old ) {
:
old = now;
}
みたいな。
>記録上の0000 0000 0000のようにスペースを開けて記録する場合のスケッチも教えていただけますか。
オープンしたファイルにはき出せばよいかと。
>myFile.println(buffer);
で、改行込みで出力しているようではありますが。
Wr5様
いつもありがとうございます。
まず、
char buffer[40];これをchar buffer[64];に変更しました。
そして、
変化が有った時のスケッチですが下記のように変更してみましたが、
if ( now != old ) {
の所で「 'old' was not declared in this scope」というエラーが発生します。
スケッチの最初に設定をしないといけないのでしょうか。
now = digitalRead( readButton );
if (now !=old) {
Serial.println(" ");
Serial.println("Log Reading Saved ----------- ");
Serial.println(" ");
myFile = SD.open("dati.log");
if (myFile) {
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
delay( 5000 );
old = now;
}
delay(1000);
}
スペースを開けるスケッチは後程、試します。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
cookie使用サイトへのJAVAによ...
-
JavaにはなぜGO TO ...
-
改行の判定方法
-
System.err. printlnとSystem.o...
-
JavaScriptの変数をjavaのメソ...
-
ORA-01858: 数値を指定する箇所...
-
VBAで配列の計算
-
javaで質問です。 文字列2023/2...
-
JScrollPaneで、表示がおかしく...
-
JavaScriptを使ってロト6の当...
-
streamで送信されたArrayListを...
-
JavaScriptとVBScriptに関して
-
IF関数でEmpty値を設定する方法。
-
動的配列が存在(要素が有る)か...
-
ループ処理の際、最後だけ","を...
-
オブジェクトの中のプロパティ...
-
1~100までの数字を表示したい
-
matchesを否定文として使う方法...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
[JAVA]try 内の変数を外で!?
-
EclipseでJava
-
JAVAのDouble型の小数点以下の...
-
文字列の引き算
-
JAVA 文字色変更
-
「続行するには何かキーを押し...
-
nullcline
-
"add"とは?f
-
JavaにはなぜGO TO ...
-
java int integer
-
JAVAのエラーの意味が分かりま...
-
LC発振回路-ループ利得
-
vb6 オブジェクトライブラリは...
-
String#matchesメソッドが環境(...
-
java教えてください。
-
javaで判別式のプログラミング...
-
エクセルマクロ文で、赤文字セ...
-
DOMで要素の値がNULL
おすすめ情報