みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Arduinoのスケッチで「変化が有った時」に変更

お世話になります。

このスケッチを見るとHIGHの時に記録するようになっていると考えていますが、HIGHかLOWの変化の有った時に記録したいのですが、どのように変更すれば良いか教えて下さい。
また、記録上の0000 0000 0000のようにスペースを開けて記録する場合のスケッチも教えていただけますか。

参考にしたHP
http://www.mauroalfieri.it/en/elettronica/data-logging-con-arduino.html

元のスケッチのチャンネル数はアナログ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);
}

投稿日時 - 2014-08-28 16:48:43

QNo.8733753

すぐに回答ほしいです

質問者が選んだベストアンサー

>char buffer[40];これをchar buffer[64];に変更しました。

実際に64文字で足りるかはちゃんと検証してくださいな。
%d指定だとint型の最大桁数まで入る可能性があると思っておいた方が。

>if ( now != old ) {
>の所で「 'old' was not declared in this scope」というエラーが発生します。
>スケッチの最初に設定をしないといけないのでしょうか。

初期値がないよ。
と怒られたのでしょう。
setup()辺りで初期値を設定すればよいでしょう。
スイッチなどが接続されているのであればスイッチの状態で固定値にしてもいいでしょうし、
setup()内でdigitalRead()した値でも突っ込んでおけばよいかと。

投稿日時 - 2014-08-30 15:45:04

お礼

ありがとうございます。

64文字は実際に検証して変更していきます。

初期値が無く怒られた件ですが、
setup()のスケッチを

pinMode(0,INPUT) ;
pinMode(1,INPUT) ;
pinMode(2,INPUT) ;
pinMode(3,INPUT) ;
   ・
   ・
これを16系統入力してみましたがエラーでした。

nowに対しての初期値でしょうか。

またdigitalReadとanalogReadが必要になるのですよね。
この場合、nowが2個必要になるのでしょうか。


質問ばかりで申し訳ありません。

投稿日時 - 2014-09-02 18:04:53

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

Wr5

>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);
で、改行込みで出力しているようではありますが。

投稿日時 - 2014-08-29 01:14:05

お礼

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);
}





スペースを開けるスケッチは後程、試します。

ありがとうございました。

投稿日時 - 2014-08-29 18:08:00

あなたにオススメの質問