機能はされていません。Arduinoのライトが一度表示されますが、連続したシーケンスで
ユーザーが赤いドームボタン赤ドームボタンを押下し、buttonStateがHIGHとシリアルモニターであることを知らせるために仮定され、 100msごとに "1"を出力し、5秒後にLEDが点灯します。LEDライトは約10秒間点灯するHIGH状態になり、LEDライトはLEDライトを意味するLOW状態に切り替わりますオフになります。
したがって流量:
正しい挙動:
初期状態 - >シリアルモニタ表示 "0" ユーザ押しボタン - >シリアルモニタ表示 "1" で100msごとに10秒後にLEDの状態がHIGHになります。
及び10Sの遅延の後にLEDの状態がLOWになり、シリアルモニタ表示は、赤色ドームボタンのbuttonstateがHIGH
のままであることを知らせるために100ms毎に「1」のままであります問題:
現在の行動: 初期状態 - >シリアルモニタディスプレイ「0」 ユーザーは、ボタンを押したときに - >シリアルモニターは、単一の「1」を表示し、Dではありません連続した "1"を表示しますが、10秒後にLEDの状態がHIGHになります。
遅延が10秒後にLEDの状態がLOWになります。この時点で、LEDは再びHIGHになるはずはありませんが、10秒後にLEDが10秒後にHIGHとLOWになります。その後、ループになります。 赤いドームボタンのボタンステートがまだHIGHであることを知らせるために、シリアルモニタディスプレイは "1"のままです
したがって、ボタンを一度押すと、連続した "1 10秒遅れ、LEDはHIGH状態になり、さらに10秒遅れ、LED状態はLOWになります。そしてLEDその後もかかわらず、LOWの状態のまま、buttonstateはHIGH
であるコード:あなたはdelay(10000)
、その後delay(2000);
を持っているとき
const int buttonPin = 2; //the number of the pushbutton pin
const int Relay = 4; //the number of the LED relay pin
uint8_t stateLED = LOW;
uint8_t btnCnt = 1;
int buttonState = 0; //variable for reading the pushbutton status
int buttonLastState = 0;
int outputState = 0;
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT);
pinMode(Relay, OUTPUT);
digitalWrite(Relay, LOW);
}
void loop() {
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// Check if there is a change from LOW to HIGH
if (buttonLastState == LOW && buttonState == HIGH)
{
outputState = !outputState; // Change outputState
}
buttonLastState = buttonState; //Set the button's last state
// Print the output
if (outputState)
{
switch (btnCnt++) {
case 100:
stateLED = LOW;
digitalWrite(Relay, HIGH); // after 5s turn on
break;
case 200:
digitalWrite(Relay, LOW); // after 10s turn off
break;
case 102: // small loop at the end, to do not repeat the cycle
btnCnt--;
break;
}
Serial.println("1");
}else{
Serial.println("0");
if (btnCnt > 0) {
// disable all:
stateLED = LOW;
digitalWrite(Relay, LOW);
}
btnCnt = 0;
}
delay(100);
}
uint8_t何ですか?私はまだ(57600)の代わりにSerial.begin(9600)を使用していますか?それは問題ですか?ケース0でstateLED = HIGHを開始する必要はないので、ケース0全体を削除できますか? – Luke
私はテストして、コードも編集しました。私はSerial.begin(57600)をSerial.beign(9600)に変更しました。これによりSerial.printIn( "0")または( "1")が可能になりました。私はあなたの提案がボタンを連続的に押さなければならないときだけLEDを状態HIGHにすることができるので、次のコードを変更しました。そうでなければそれはLOwになります。私が変更したコードでは、ボタンを一度押し下げることができ、「1」は連続したボタンを押さなくても続きます。私のボタンは2つの状態ボタンではないので、トグル状態を作成する必要があります。 – Luke