Arduino(アルドゥイーノ)のプログラムで困っています。
「圧力センサーに加わる圧力に応じて3段階にLEDが光り、各段階の内一つの段階を5秒間維持することで圧電スピーカーからtone関数で音が鳴る」
というプログラムです。
プログラムで困っている部分は「各段階の内一つの段階を5秒間維持することで音が鳴る」です。
現段階では、「圧力センサーに加わる圧力に応じて3段階にLEDが光り、各段階ごとにtone関数で異なる音を出す」までプログラムを行いました。以下にプログラムを載せます。
//LED・スピーカーのピンに名前をつけます
const int greenPin = 9;
const int bluePin = 10;
const int redPin = 11;
const int speaker =12;
void setup() {
//通信速度(ボーレート)9600で通信をはじめる
Serial.begin(9600);
//LEDをつないだピンは全て「OUTPUT(出力)」に設定
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(redPin, OUTPUT);
}
void loop() {
//圧電センサーをつないだピン(A0)の値を「sensorValue」
int sensorValue = analogRead(A0);
//「sensorValue」に入っている値をシリアルモニターに表示
Serial.println(sensorValue);
//1秒(1000ミリ秒)待ちます
delay(100);
if(100>sensorValue){
digitalWrite(greenPin, LOW);
digitalWrite(redPin, LOW);
digitalWrite(bluePin, LOW);
}
//もし「sensorValue」に入っている値が200以上なら、赤いLEDを光らせます
if(sensorValue> 200){
digitalWrite(redPin, HIGH);
digitalWrite(bluePin, LOW);
digitalWrite(greenPin, LOW);
}
//もし「sensorValue」に入っている値が500以上なら、赤・青のLEDを光らせます
if(sensorValue> 400){
digitalWrite(bluePin, HIGH);
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
}
//もし「sensorValue」に入っている値が700以上なら、赤・青・緑のLEDを光らせます
if(sensorValue> 600){
digitalWrite(greenPin, HIGH);
digitalWrite(redPin, LOW);
digitalWrite(bluePin, LOW);
}
if(sensorValue> 200){
tone(speaker,262,500);//ド
}
if(sensorValue> 400){
tone(speaker,294,500);レ
}
if(sensorValue> 600){
tone(speaker,330,500);ミ
}
}
試行錯誤したのですがどうしてもわかりませんでした。
お願いいたします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
ざっくりと。
sensorValue の条件分岐で、digitalWrite() を呼んでいる部分
(1) 前回の状態を表す変数を作る (中身はsensorValueの段階に応じて0, 1, 2とか… 初期値に注意)
(2) (1)の状態を保存した時の時間を表す変数を作る。
(3) 状態が変化した場合((1)の値と一致しない場合)は、(1)、(2)の値を保存しなおす
(4) 状態が変化せずに(2)で保存した時間から5秒以上経過した場合は、tone()側の条件分岐に落とす
(1), (2) の変数はloop() の外に置く。(おそらく、この辺りではまっているのでは?)
時間は millis() など適当に。
http://www.musashinodenpa.com/arduino/ref/index. …
あと、条件分岐にelse を付けた方が良いような気がします。
tone() も、同じピンのdigitalWrite() も、1ループ内で何回も呼ばれているような…
No.2
- 回答日時:
delay(100)は1秒じゃない。
>> //もし「sensorValue」に入っている値が700以上なら、赤・青・緑のLEDを光らせます
緑を点灯して他を消してる
sensorValue > 600が成立するなら、> 400も > 200も同時に成立する。
やり直し!
No.1
- 回答日時:
段階を表す変数を作りましょう。
同じ段階が続いている場合はカウントしましょう。5秒分カウントが溜まれば音を出しましょう。
段階が変わった時にはLEDを操作しましょう。カウントを0に戻しましょう。
これを、一定時間(変化タイミングと消費電力の関係で決めてください)ごとに
繰り返すようにすればOKです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 コードを書いたのですが上手く実行出来なかったです。どこが間違ってますか? 【作成したいもの】 1 2022/05/04 11:36
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- Microsoft ASP LEDで電光掲示板に「A B C D E」と表示したいのですが・・・ 1 2023/07/04 07:37
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 exitの使い方
-
Excel-vba 文字列と変数を...
-
フォームを開くときに、コンボ...
-
数字の位ごとの値を表示するプ...
-
VBAで配列のNULL判定
-
VB6.0-整数と余りを求める
-
足して100になるような乱数のア...
-
VBAでC列が入力済みならそのま...
-
1つ前の値を変数に保存する方法
-
Nullってどういう意味ですか?
-
c++ 二体問題のソースコードを...
-
VBAのチェックボックス結果を集...
-
VBAの定数の使い方で、計算値を...
-
C言語でCLAMP(a,b,c)
-
C#の問題で2つの整数a,bの...
-
C言語 乱数を階級分け
-
VBAで72時間タイマーがオーバー...
-
世界のナベアツ
-
ラジオボタンの値の取得につい...
-
c言語で乱数を扱うときの
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 exitの使い方
-
フォームを開くときに、コンボ...
-
Excel-vba 文字列と変数を...
-
数字の位ごとの値を表示するプ...
-
VB6.0-整数と余りを求める
-
VBAで配列のNULL判定
-
足して100になるような乱数のア...
-
フリーランタイマーの時間差分...
-
DataGridView 複数行同時変更...
-
相関係数p値の出し方
-
世界のナベアツ
-
10進数をアスキーコードに変換
-
C#で動的にコントロールを取得...
-
ラジオボタンの値の取得につい...
-
DWORDって
-
バッチファイルで正規表現を使...
-
4択問題のプログラムでランダム...
-
1つ前の値を変数に保存する方法
-
VBAの定数の使い方で、計算値を...
-
コンボボックスの名前を変数に...
おすすめ情報