アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。

スケッチで質問が有ります。

これだと、1個のピンしか見ていないと思うのですが、複数のピンもしくは全部のピンをチェックして変化があるか判断したいのです。

void loop()
{
DateTime now = RTC.now();
val = digitalRead();
if(val != old_val)
{



よろしくお願い致します。

A 回答 (5件)

>変数iの宣言は


>old_val = [i];
>こんな感じでしょうか?

普通に
int i;
です。
ChgFlagも同様です。

>>というか…掲示されたコードだとloop()の中身は
>>>DateTime now = RTC.now();
>>だけですが、よろしいので?
>File dataFile = SD.open("datalog.txt", FILE_WRITE);
>これが、要らないのでしょうか・・・

「{」と「}」の対応がヘンだから、loop()の内容がそのコード「しか」ないですよ。
という指摘だったんですが…。

>これは、書き込むフォーム(形)と認識していますが、合っていますでしょうか。

一応合っていますが、空白の位置が最初の想定と違います。
まぁ、動かせば判ると思いますが。
# コンパイルエラーを直した上で。

>このスケッチは変化が有った時に状態を書き込むスケッチと認識していますが如何でしょう。

変化を検出して、書き込み用の判定をしています。


とりあえず、別の掲示板に移動したみたいなので私の回答はここまでですかね。
あちらにIDとか持っていませんし。
# あと、あちらの掲示板の書き込みルールには従いましょうね。
# 常連さんから指摘されると思いますが。

参考URL:http://dixq.net/forum/viewtopic.php?f=3&t=15753
    • good
    • 0
この回答へのお礼

ありがとうございます。

いや、移動したというわけでは。
今日の夕方、valの宣言の方法を探していたら別サイトを初めて見つけて、別の方の意見も聞いて見たいと思いまして。
Wr5様にはものすごく感謝しています。
しかし、凄いですね。夕方投稿したばかりなのに発見したのですか。あの掲示板は有名なのでしょうか。
書き込みのルールしっかり読んでいませんでした。間違えていました・・・・



コンパイルエラーを直して実際に動かせそうな気がしてきました。
「{」と「}」
int i;
int ChgFlag;

修正して結果報告させていただきます。
本当にありがとうございます。

お礼日時:2014/09/29 22:02

>void loop()内の


>for(i=0;i<DPINMAX;i++) {
>ここで
>error: expected unqualified-id before 'for'
>error: expected constructor, destructor, or type conversion before '<' token
>error: expected constructor, destructor, or type conversion before '++' token
>この3種類のエラーが発生します。

変数iが宣言されていません。
ってことで適当な場所で宣言してください。

というか…掲示されたコードだとloop()の中身は
>DateTime now = RTC.now();
だけですが、よろしいので?

>for(i=0;i<(sizeof(old_val)/sizeof(int));i++) {
>dataFile.print(old_val[0]);
>if((i % 4) == 0)
>dataFile.print(" ");
>dataFile.print(); /* 最後に改行追加 */
>dataFile.close();
>}

「{」と「}」の対応は意図したとおりになっていますか?
今の状態だと、i=1の時の
dataFile.print(old_val[0]);
で死ぬかも知れませんけど。
クローズされていますからね。
あと、[0]だとD0ピンの状態「しか」書き込まれませんよ。


スケッチがどうとかより、C言語としてもおかしな状態になっているので注意してください。
# C言語の基礎、できていますか?
    • good
    • 0
この回答へのお礼

ありがとうございます。

>スケッチがどうとかより、C言語としてもおかしな状態になっているので注意してください。
># C言語の基礎、できていますか?
申し訳ありません。基礎から勉強していますが、まだまだ出来ていません。

いろいろ、いじくっているうちに「わけがわからなく」なってしまいました。
「{」と「}」も意図した通りにはなっていません。


変数iの宣言は
old_val = [i];
こんな感じでしょうか?


>というか…掲示されたコードだとloop()の中身は
>>DateTime now = RTC.now();
>だけですが、よろしいので?

File dataFile = SD.open("datalog.txt", FILE_WRITE);
これが、要らないのでしょうか・・・



前回、おしえていただいた
for(i=0;i<(sizeof(old_val)/sizeof(int));i++) {
 dataFile.print(old_val[i]);
 if((i % 4) == 0)
  dataFile.print(" ");

これは、書き込むフォーム(形)と認識していますが、合っていますでしょうか。


それと
ChgFlag = 0; /* 変化あったか確認するためのフラグをクリア */
for(i=0;i<DPINMAX;i++) {
 val = digitalRead(DigitalPins[i]);
 if(val != old_val[i]) {
  ChgFlag = 1; /* 前回から変化あったよ~ん */
  old_val[i] = val; /* 今回の値に更新しまちゅ */
 }
}
if(ChgFlag != 0) {
 /* 変化あったらからSDに書き出すよ~ */
}

このスケッチは変化が有った時に状態を書き込むスケッチと認識していますが如何でしょう。



今、抱えているエラーは
1・変数 i の宣言
2・ ChgFlag = 0;/* 変化あったか確認するためのフラグをクリア */
ここで宣言していないようなエラーが発生します。
error: 'ChgFlag' was not declared in this scope
3・「{」と「}」の対応(場所)
です。

もっともっと勉強します。
本当に、ありがとうございました。

お礼日時:2014/09/29 18:43

>int DigitalPins[DPINMAX] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 14, 15, 16, 17, 18, 19};


>で、analogpinsを無くしてしまっても良いのでしょうか。

OKと思われます。
ただ、
>アナログピンをデジタルに変更する場合、14~19を使うと書いて有ったので変更してみました。
A0やA1でもOKっぽいです。

>SDカードに変化が有った時にこのデータを記録していきたいのです。
>2014/09/19 20:18:10 0000 0000 0100 0000 0000

ならば、println()使うのは間違っていますよね?
改行込みの出力になりますし。

>スペースをいれて4ピン分のブロックを4個出来るようになっています。

for(i=0;i<(sizeof(old_val)/sizeof(int));i++) {
 dataFile.print(old_val[i]);
 if((i % 4) == 0)
  dataFile.print(" ");
}
dataFile.println(); /* 最後に改行追加 */
って感じで回せばよいかと。
# まぁこれだと…"0 0000 0000"みたいになるので…
# (i % 4) == 3 かな?

dataFile.print(old_val[i]);
で"0"か"1"になる…という保証もない…のかなぁ。
まぁその辺りは実際にやってみてくださいな。
ダメだったら……
dataFile.print(old_val[i]);

if(old_val[i] == LOW) {
 dataFile.print("0");
} else {
 dataFile.print("1");
}
とか。
三項演算子使って、
dataFile.print((old_val[i] == LOW) ? "0" : "1");
とかも行けるかな?


>今回のNo.1のスケッチ内に
>if(val != old_val[0]) {
>  /* 前回から変化あったら */
>  old_val[0] = val; /* 今回の値に更新する */
>が、有りましたがこれは「変化が有った時」ではないのでしょうか。

「変化があったときにold_valの該当の箇所を書き換える」だけです。


ChgFlag = 0; /* 変化あったか確認するためのフラグをクリア */
for(i=0;i<DPINMAX;i++) {
 val = digitalRead(DigitalPins[i]);
 if(val != old_val[i]) {
  ChgFlag = 1; /* 前回から変化あったよ~ん */
  old_val[i] = val; /* 今回の値に更新しまちゅ */
 }
}
if(ChgFlag != 0) {
 /* 変化あったらからSDに書き出すよ~ */
}

みたいに処理してください。
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございます。

SDに書き込みの所で質問ですが
dataFile.print(0);
dataFile.print(1);
dataFile.print(2);
dataFile.print(3);
    :
    :
このブロックのスケッチを消してしまいましたが大丈夫でしょうか



何度も読み直して、訂正に訂正して1か所だけのエラーになりました。
void loop()内の
for(i=0;i<DPINMAX;i++) {
ここで
error: expected unqualified-id before 'for'
error: expected constructor, destructor, or type conversion before '<' token
error: expected constructor, destructor, or type conversion before '++' token
この3種類のエラーが発生します。


全体を張り付けるので、見て戴けることは可能でしょうか。
よろしくお願い致します。



#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <RTClib.h> // Credit: Adafruit
RTC_DS1307 RTC;
#define DPINMAX 16

int DigitalPins [DPINMAX] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 14, 15, 16, 17, 18, 19};
int val = 0; // 入力ピンの状態がこの変数(val)に記憶される
int old_val = 0; // valの前の値を保存しておく変数
const int chipSelect = 10;

void setup(){
// see if the card is present and can be initialized:
if (!SD.begin(10, 11, 12, 13)) {//データロガーシールド用スケッチ
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");
Serial.begin(9600); // Open serial communications and wait for port to open:
// Instantiate the RTC
Wire.begin();
RTC.begin();

// Check if the RTC is running.
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running");
}
// This section grabs the current datetime and compares it to
// the compilation time. If necessary, the RTC is updated.
DateTime now = RTC.now();
DateTime compiled = DateTime(__DATE__, __TIME__);
if (now.unixtime() < compiled.unixtime()) {
Serial.println("RTC is older than compile time! Updating");
RTC.adjust(DateTime(__DATE__, __TIME__));
}

Serial.println("Setup complete.");
}
void loop()
{DateTime now = RTC.now();
}
File dataFile = SD.open("datalog.txt", FILE_WRITE);
for(i=0;i<DPINMAX;i++) {
val = digitalRead(DigitalPins[i]);
if(val != old_val[0]) {
ChgFlag = 1; /* 前回から変化あったよ */
old_val[0] = val; /* 今回の値に更新 */
}
if(ChgFlag != 0) /* 変化あったらからSDに書き出すよ */
}

for(i=0;i<(sizeof(old_val)/sizeof(int));i++) {
dataFile.print(old_val[0]);
if((i % 4) == 0)
dataFile.print(" ");
dataFile.print(); /* 最後に改行追加 */
dataFile.close();
}

お礼日時:2014/09/26 18:28

>質問ですがanalogpinをDigitalに変更する事も可能なのでしょうか。



意図が不明です。
Analogピンに対して、digitalRead()が使えるのか?
ということですか?

http://arduino.cc/en/pmwiki.php?n=Reference/digi …

>The analog input pins can be used as digital pins, referred to as A0, A1, etc.
と書かれていますが…。

>ただ、setup()内のold_val[]が良くわかりません。setupの中にold_valを入れるのでしょうか。
>理解できず申し訳ありません。

値が設定されていない(不定)から、setup()内でold_val[]に初期値として代入してください。
ってコトです。
# アナログのスペル間違っていたので修正すると…

/* loop()に入る前に以前の値として現在の状況をセットするぜぇ */
for(i=0;i<DPINMAX;i++) {
 old_val[i] = digitalRead(DigitalPins[i]);
}
for(i=0;i<APINMAX;i++) {
 old_val[DPINMAX+i] = analogRead(AnalogPins[i]):
}

みたいな感じですね。
まぁ、普通のC言語ならグローバル変数は全Bitが0になっていた…はずですが、Arduinoでもそうなるのかは不明…ですしねぇ。

>dataFile.println(DigitalPins 0);
>dataFile.println(DigitalPins 1);

この書き方って通りましたか???
DigitalPinsとだけ書くと、DigitalPins[]の先頭要素のアドレス…になるかと思われますが……。
とりあえず、old_val[]に現在の状態が入っている…ハズですけど……。
# あと、上記の書き方だと区切りがなくてファイルを見た時に読みづらいんじゃないですか?
# 特にアナログピンの値の出力とか。2364とか出力されていたとして区切りはどこになります?

さらに、「変化があったときに記録」ではなく「常に記録」なので、ちょっと悲惨なことになりそうですけど…。


>old_val = val;

ここでもエラーになりそうですねぇ…。
    • good
    • 0
この回答へのお礼

ありがとうございます。

>Analogピンに対して、digitalRead()が使えるのか?
説明不足スミマセン
その通りです、アナログだと0か1023になるのですがデジタル表示で0か1に指定したいのです。
アナログピンをデジタルに変更する場合、14~19を使うと書いて有ったので変更してみました。
この場合
元 int analogpins[APINMAX] = {0, 1, 2, 3, 4, 5};
変更後 
int analogpins[APINMAX] = {14, 15, 16, 17, 18, 19};
にしましたが、
int DigitalPins[DPINMAX] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 14, 15, 16, 17, 18, 19};
で、analogpinsを無くしてしまっても良いのでしょうか。

そうすると下の方のスケッチも変わってくると思うのですが。



old_valはいろんなスケッチを見ますが、0がほとんどです。
入力します。



>dataFile.println(DigitalPins 0);
>dataFile.println(DigitalPins 1);

エラーリストを確認するとエラーになっています。数字だけにしてみました。
スペースをいれて4ピン分のブロックを4個出来るようになっています。
dataFile.println(" ");//スペースを入れてあります。

SDカードに変化が有った時にこのデータを記録していきたいのです。
2014/09/19 20:18:10 0000 0000 0100 0000 0000


「常に記録」ではなく「変化があったときに記録」にしたいのですが。

今回のNo.1のスケッチ内に
if(val != old_val[0]) {
  /* 前回から変化あったら */
  old_val[0] = val; /* 今回の値に更新する */
が、有りましたがこれは「変化が有った時」ではないのでしょうか。


もしくは
if((val == HIGH) && (old_val== LOW))
これが、必要になるのですか。


質問ばかりで申し訳ありません。
本当にありがとうございます。

お礼日時:2014/09/25 17:11

配列って知ってますかね?



#define DPINMAX 14
#define APINMAX 6
int DigitalPins[DPINMAX] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int AnaloguePins[APINMAX] = {0, 1, 2, 3, 4, 5};
int old_val[DPINMAX+APINMAX];

setup()内でold_val[]は適当(適切)に初期値入れてください。
# そこら辺は以前回答したと思いますが。
こっから実際の取得。

for(i=0;i<DPINMAX;i++) {
 val = digitalRead(DigitalPins[i]);
 if(val != old_val[i]) {
  /* 前回から変化あったです */
  old_val[i] = val; /* 今回の値に更新しまちゅ */
 }
}
for(i=0;i<APINMAX;i++) {
 val = analogRead(AnaloguePins[i]):
 if(val != old_val[DPINMAX+i]) {
  /* 前回から変化あったみたいでしゅ */
  old_val[DPINMAX+i] = val; /* 今回の値に更新するなり */
 }
}

こんな感じですかね。
ただし、各ピンが他の用途に使用されていたら動作は保証しかねますが。
RTCつないでいるピンに対してdigitalRead()やanalogRead()しちゃって問題ないのか?
とか、そういうところは。
# 読み込みだけなら平気なんかなぁ…わからんけど。
    • good
    • 0
この回答へのお礼

Wr5様 おせわになっております。
お礼、遅くなり申し訳ありませんでした。


「配列」大まかな流れは理解していますが、確実に理解はしていないです。
何度も参考書を読んだりやインターネットで調べて勉強しています。


現在「Leonardo」+「Adafruit Data Logger Shield」を使っています。
この組み合わせだと専用のSD.hが必要になりデジタルピンの10, 11, 12, 13がSDカードで使用するそうです。
その他のピンはまだ検証中で分かりません。
とりあえずMAXでは有りませんがスケッチを下記のように変更してみましたがいかがでしょう。
int DigitalPins[DPINMAX] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};



質問ですがanalogpinをDigitalに変更する事も可能なのでしょうか。





Wr5様の教えていただいたスケッチを組み合わせてみました。
ただ、setup()内のold_val[]が良くわかりません。setupの中にold_valを入れるのでしょうか。
理解できず申し訳ありません。



反則かも知れませんが現時点でのスケッチを張り付けてみました。
本当にありがとうございました。



#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <RTClib.h> // Credit: Adafruit
RTC_DS1307 RTC;
#define DPINMAX 10
#define APINMAX 6

int DigitalPins[DPINMAX] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int analogpins[APINMAX] = {0, 1, 2, 3, 4, 5};
int old_val[DPINMAX+APINMAX];


const int chipSelect = 10;

void setup(){
// see if the card is present and can be initialized:
if (!SD.begin(10, 11, 12, 13)) {//データロガーシールド用スケッチ
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");


{
// Open serial communications and wait for port to open:
Serial.begin(9600);
// Instantiate the RTC
Wire.begin();
RTC.begin();

// Check if the RTC is running.
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running");
}

// This section grabs the current datetime and compares it to
// the compilation time. If necessary, the RTC is updated.
DateTime now = RTC.now();
DateTime compiled = DateTime(__DATE__, __TIME__);
if (now.unixtime() < compiled.unixtime()) {
Serial.println("RTC is older than compile time! Updating");
RTC.adjust(DateTime(__DATE__, __TIME__));
}

Serial.println("Setup complete.");
}
}
void loop()
{
DateTime now = RTC.now();

for(i=0;i<DPINMAX;i++) {
 val = digitalRead(DigitalPins[i]);
 if(val != old_val[i]) {
  /* 前回から変化あったら */
  old_val[i] = val; /* 今回の値に更新する */
 }
}
for(i=0;i<APINMAX;i++) {
 val = analogRead(AnalogPins[i]):
 if(val != old_val[DPINMAX+i]) {
  /* 前回から変化あったら */
  old_val[DPINMAX+i] = val; /* 今回の値に更新する */
 }
}
{
File dataFile = SD.open("datalog.txt", FILE_WRITE);
dataFile.print(" ");
dataFile.println(now.year);
dataFile.println("/");
dataFile.println(now.month);
dataFile.println("/");
dataFile.println(now.day);
dataFile.print(" ");
dataFile.println(now.hour);
dataFile.println(":");
dataFile.println(now.minute);
dataFile.println(":");
dataFile.println(now.second);
dataFile.println(" ");
dataFile.println(DigitalPins 0);
dataFile.println(DigitalPins 1);
dataFile.println(DigitalPins 2);
dataFile.println(DigitalPins 3);
dataFile.println(" ");
dataFile.println(DigitalPins 4);
dataFile.println(DigitalPins 5);
dataFile.println(DigitalPins 6);
dataFile.println(DigitalPins 7);
dataFile.println(" ");
dataFile.println(DigitalPins 8);
dataFile.println(DigitalPins 9);
dataFile.println(AnaloguePins 0);
dataFile.println(AnaloguePins 1);
dataFile.println(" ");
dataFile.println(AnaloguePins 2);
dataFile.println(AnaloguePins 3);
dataFile.println(AnaloguePins 4);
dataFile.println(AnaloguePins 5);
dataFile.close();
old_val = val;
}
}

お礼日時:2014/09/24 17:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!