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

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件)

ざっくりと。



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ループ内で何回も呼ばれているような…
    • good
    • 0

delay(100)は1秒じゃない。



>> //もし「sensorValue」に入っている値が700以上なら、赤・青・緑のLEDを光らせます
緑を点灯して他を消してる

sensorValue > 600が成立するなら、> 400も > 200も同時に成立する。

やり直し!
    • good
    • 0

段階を表す変数を作りましょう。


同じ段階が続いている場合はカウントしましょう。5秒分カウントが溜まれば音を出しましょう。
段階が変わった時にはLEDを操作しましょう。カウントを0に戻しましょう。

これを、一定時間(変化タイミングと消費電力の関係で決めてください)ごとに
繰り返すようにすればOKです。
    • good
    • 0

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