

皆様、お世話になります。
Arduinoでデーターロガーのスケッチを作成しています。
スケッチしてみましたが動くかどうか確認とこう直した方が良いなど改善点が有れば、お願い致します。
2番ピンに変化が有った時(ONかOFF)に時間と2番ピンの状態をSDカードに記録したいのです。
これが、うまくいけば系統を増やしていきたいです。
書いたスケッチ
#include <SD.h>
// この値は使用しているシールドや基板に合わせて変更すること。たとえば、
// イーサーネットシールドは 4
// Adafruit のSDシールドは 10
// Sparkfun のSDシールドは 8
const int chipSelect = 4;
void setup()
{
// シリアルポート初期化
Serial.begin(9600);
while (!Serial) {
; // USBケーブルが接続されるのを待つ。この待ちループは Leonardo のみ必要。
pinMode(2,INPUT) ; //スイッチに接続ピンをデジタル入力に設定A
}
Serial.print(F("Initializing SD card..."));
// SSピン(Unoは10番、Megaは53番)は使わない場合でも出力にする必要があります。
// そうしないと、SPIがスレーブモードに移行し、SDライブラリが動作しなくなります。
pinMode(SS, OUTPUT);
// SDライブラリを初期化
if (!SD.begin(chipSelect)) {
Serial.println(F("Card failed, or not present"));
// 失敗、何もしない
while(1);
}
Serial.println(F("ok."));
// 日付と時刻を返す関数を登録
SdFile::dateTimeCallback( &dateTime );
}
void loop()
{
// ファイルを開く
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// もし2番ピンに変化が有れば書き込む
if (digitalRead(2)==HIGH) {
int value = digitalRead(2);
dataFile.println(value);
dataFile.close();
// シリアルポートにも出力
Serial.println(value);
}
if (digitalRead(2)==LOW) {
int value = digitalRead(2);
dataFile.println(value);
dataFile.close();
// シリアルポートにも出力
Serial.println(value);
}
// ファイルが開けなかったらエラーを出力
else {
Serial.println(F("error opening datalog.txt"));
}
}
void dateTime(uint16_t* date, uint16_t* time)
{
uint16_t year = 2014;
uint8_t month = 7, day = 22, hour = 14, minute = 0, second = 0;
// GPSやRTCから日付と時間を取得
// FAT_DATEマクロでフィールドを埋めて日付を返す
*date = FAT_DATE(year, month, day);
// FAT_TIMEマクロでフィールドを埋めて時間を返す
*time = FAT_TIME(hour, minute, second);
}
よろしくお願い致します。
No.4ベストアンサー
- 回答日時:
なんか切れているようですが…。
> val=digitalRead(2); ここで黄色になり
>下に
>stry '¥'in program
>と、でます。
ですかね。(半角円マークはうまく表示できない場合があるので全角にしてみた)
>明記はしていませんがインデントを「全角空白」であらわしていますので、そのままコピペするとエラーになりますよ。
と回答した通り、その場所に全角空白があるから…でしょう。
「全て選択」してコピー、テキストエディタに貼り付けてみてください。
# できれば全角空白を記号などで表示できるテキストエディタで。(秀丸など。)
# 有名どころのテキストエディタなら記号で表示するオプションがあるでしょう。
テキストエディタの置換機能で全角空白を半角空白2つに置換するか…単純に削除した後で再度arduinoのスケッチにペーストしてください。
# ペーストした後で[ツール][自動整形]すればインデントとか調整してくれるでしょう。
あとは…Valとvalか混じっていたり、ブロック区切りがおかしくなっていたりするようですのでその辺りを見直してくださいな。
No.3
- 回答日時:
>早速、貼り付けてみましたが検証するとエラーに…
どんなエラーだったのか掲示されないと……。
ちなみに、明記はしていませんがインデントを「全角空白」であらわしていますので、そのままコピペするとエラーになりますよ。
記入せず、申し訳ありません。
val=digitalRead(2); ここで黄色になり
下に
stry`in program
と、でます。
自分でも確認していますが、現在発見できていません。
ありがとうございました。
No.2
- 回答日時:
void loop()
{
// 2番ピンの状態を取得
Val=digitalRead(2);
// 前回と変化があったら…
if(old_val != Val) {
// ファイルを開く
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if(dataFile) {
// 書き込む
dataFile.println(Val);
dataFile.close();
}
else {
// ファイルが開けなかったらエラーを出力
Serial.println(F("error opening datalog.txt"));
}
// シリアルポートにも出力
Serial.println(Val);
old_val = Val;
}
}
こんなところでしょうかね?
時刻は書き出していないので追加してくださいな。
ファイルオープンはsetup()でやって、dataFile.close()でクローズしない。
という方法もアリかも知れません。
# dataFileはグローバル変数にする必要があります。
ただし、その場合は途中でSDカード抜いた場合の動作が保証できませんけど。
# dataFile.flush()するとある程度は書き込まれると思われます。が、完全には保証できない点は変わらないかと。
ありがとうございます!
早速、貼り付けてみましたが検証するとエラーに…
もう少し、勉強してみます。
#include <SD.h>
// この値は使用しているシールドや基板に合わせて変更すること。たとえば、
// イーサーネットシールドは 4
// Adafruit のSDシールドは 10
// Sparkfun のSDシールドは 8
const int chipSelect = 4;
const int BUTTON=2;
int val=0;
int old_val=0;
int state=0;
void setup()
{
// シリアルポート初期化
Serial.begin(9600);
while (!Serial) {
; // USBケーブルが接続されるのを待つ。この待ちループは Leonardo のみ必要。
pinMode(2,INPUT) ; //スイッチに接続ピンをデジタル入力に設定
}
Serial.print(F("Initializing SD card..."));
// SSピン(Unoは10番、Megaは53番)は使わない場合でも出力にする必要があります。
// そうしないと、SPIがスレーブモードに移行し、SDライブラリが動作しなくなります。
pinMode(SS, OUTPUT);
// SDライブラリを初期化
if (!SD.begin(chipSelect)) {
Serial.println(F("Card failed, or not present"));
}
Serial.println(F("ok."));
// 日付と時刻を返す関数を登録
SdFile::dateTimeCallback( &dateTime );
}
void loop(){
{
// 2番ピンの状態を取得
val=digitalRead(2);
// 前回と変化があったら…
if(old_val != Val) {
// ファイルを開く
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if(dataFile) {
// 書き込む
dataFile.println(Val);
dataFile.close();
}
else {
// ファイルが開けなかったらエラーを出力
Serial.println(F("error opening datalog.txt"));
}
// シリアルポートにも出力
Serial.println(Val);
old_val = Val;
}
}
void dateTime(uint16_t* date, uint16_t* time)
{
uint16_t year = 2014;
uint8_t month = 7, day = 22, hour = 9, minute = 0, second = 0;
// GPSやRTCから日付と時間を取得
// FAT_DATEマクロでフィールドを埋めて日付を返す
*date = FAT_DATE(year, month, day);
// FAT_TIMEマクロでフィールドを埋めて時間を返す
*time = FAT_TIME(hour, minute, second);
}
}
No.1
- 回答日時:
試していませんが……
>2番ピンに変化が有った時(ONかOFF)に時間と2番ピンの状態を
変化があった時…ではないですし、loop()実行中はガンガン書き出すスケッチになっています。
# ついでに時間は書き出されません。
loop()の中で前回通った時の2番ピンの状態を保持する変数を用意する必要があるでしょう。
その上で、現在の値と変更があったかを確認し、現在の値を書き出す。
ということになるかと。
2番ピンに接続されているモノによってはチャタリング対策とか必要です。
時間も書き出すとしたら、起動時にPCから日時データを受け取れるようにする必要があるかと思われます。
# SDカード使える状態だとどこからか時刻を取ってこれるのなら別ですが。
# SDカード使ったコトありませんのでPC側から取得…でしょうね……。
早速のご回答ありがとうございます。
おっしゃる通り、あれこれ試していたら大量の0と1が・・・・
Val=digitalRead(2);
if((val==HIGH)&&(old_val==LOW)){
state=1-state;
こんな文章にすれば良いのでしょうか。
入力していますが、検証するとエラーに。
もっと勉強します。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Ruby vscode 文字化け 1 2022/05/21 19:17
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) 今日の日付が過ぎたらその行を削除したい 1 2023/04/01 20:06
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) ExcelのVBAでシフト表を作っていますが、バグが出て困っています 2 2022/09/13 11:33
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2つ質問があり、まず1つ目な...
-
IEのリロードボタンを押すとデ...
-
CGI.pmでHTMLのコメントタグを...
-
perlを使ってファイル分割
-
CGI.pmで<button>タグは出力で...
-
大量メールの任意のヘッダだけ...
-
どのようなプログラムをつくれ...
-
perl で作成された文書と知るに...
-
データ項目の並び替えについて
-
フォルダに入っているファイル...
-
番号をつける
-
perlでの三次元配列の作り方
-
正規表現に関して
-
Perlでのforeach文の挙動がわか...
-
ディレクトリー内のリスト出力...
-
レコードの書込み判断
-
cgiでdocument.writeの書き出し
-
パラメーターについて
-
Perl→exe
-
ListBoxのデータを高速でファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
重複するデータを抽出できる秀...
-
awkスクリプトでダブルクォーテ...
-
sprintfについて
-
DOSコマンドで、標準出力を出力...
-
文字コードの変換(Shift-JISか...
-
Perl<->Oracle間での文字化けに...
-
[Perl]ファイル出力のエンコー...
-
エクセルVBAで素数だけを出力す...
-
データの選択
-
apacheの動作について
-
「print関数は出力先のファイル...
-
教えて!perlから.exeファイル...
-
ファイル出力の改行コードをLFに
-
PerlからのCSV出力
-
Active Perlでsleepを使う。
-
[awk]uniq -cで複数ファイルの...
-
バッチファイルで、記号を含む...
-
EUCで出力されるプログラムをS-...
-
htmlから、ファイル、もしくはC...
-
リファレンスについて。
おすすめ情報