お世話になります。
このスケッチを見ると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で質問しましょう!
似たような質問が見つかりました
- Ruby vscode 文字化け 1 2022/05/21 19:17
- Excel(エクセル) フォルダ内の全ブックのシート名を変更したい 7 2022/09/22 21:34
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- 英語 できるだけ直訳で英語の翻訳をお願いします。(英語→日本語) 1 2022/10/15 20:59
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- 英語 下記はなんていってますか? こんにちは以降、訳していただけたら助かります。 Hello, We’re 1 2023/01/14 00:09
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインターに関する警告
-
[JAVA]try 内の変数を外で!?
-
JSPやサーブレットでSystem.out...
-
JAVA 文字色変更
-
JAVAでの占い
-
JAVAのDouble型の小数点以下の...
-
JAVAのエラーの意味が分かりま...
-
有効数字以下を四捨五入(Java)
-
構文解析中にファイルの終わり...
-
vb6 オブジェクトライブラリは...
-
NaNではなく、0と表示させたい
-
文字列の引き算
-
文字列の置換について。
-
javaで画像をランダムに表示さ...
-
EclipseでJava
-
コマンドプロンプトに不正な文...
-
改行の判定方法
-
Javaについて質問です Javaで 1...
-
並行サーバの導入
-
LC発振回路-ループ利得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインターに関する警告
-
[JAVA]try 内の変数を外で!?
-
JSPやサーブレットでSystem.out...
-
JAVAのDouble型の小数点以下の...
-
EclipseでJava
-
「続行するには何かキーを押し...
-
文字列の引き算
-
java シンボルが見つかりません...
-
JAVA 文字色変更
-
改行の判定方法
-
JAVAのエラーの意味が分かりま...
-
Javaのコマンドライン引数を使...
-
java教えてください。
-
曜日の取得方法を教えて下さい!
-
JavaにはなぜGO TO ...
-
Javaでカレントディレクトリを...
-
構文解析中にファイルの終わり...
-
JAVA 三角形の判定
-
複数行キーボード入力した後に...
-
printfの%fにおいて教本どおり...
おすすめ情報