あなたの説明とコードは、2つの異なることを示しています。私はそれらを補間しようとしていますが、私が間違っていれば教えてください。私は答えを修正しようとします。
このコードを使用すると、ピン5のライトをオン/オフするためのプッシュボタンを使用できます.1回押すとオンになり、もう1回押すとオフになります。ボタンを一方の端をピン2に、もう一方の端をグランドに接続する必要があります(プルアップ抵抗を使用しているため)。
あなたは再びそれをそれを押したときに、ピン5のLEDボタンは、オンになります押したとき、私はまた
byte buttonStatus;
unsigned long lastEqualButtonTime;
#define debounceTimeMs 50
void setup() {
pinMode(5,OUTPUT);
pinMode(2,INPUT_PULLUP);
buttonStatus = digitalRead(2);
lastEqualButtonTime = millis();
}
void loop() {
byte currentButtonStatus = digitalRead(2);
if (currentButtonStatus == buttonStatus)
lastEqualButtonTime = millis();
else if ((millis() - lastEqualButtonTime) > debounceTimeMs)
{
lastEqualButtonTime = millis();
buttonStatus = currentButtonStatus;
// Change only on change, not on value
if (buttonStatus == LOW) {
digitalWrite(5, !digitalRead(5));
}
}
}
を機械的スイッチ(50ミリ秒)のバウンスに対処するための小さなデバウンス遅延を追加しましたオフになります。
これはあなたが求めた動作です。反対側のコードは、ボタンを押すと一連のLEDが点灯します。この場合、プレスでサイクルを開始し、別のプレスでサイクルを停止したい場合は、コードのような単純なステートマシンを使用する必要があります。私はまた、2と地面の間に再び接続する必要があるボタンに小さなデバウンスを加えました。
byte buttonStatus;
unsigned long lastEqualButtonTime;
#define debounceTimeMs 50
// Statuses
#define STATE_LEDSOFF 0
#define STATE_LED5ON 1
#define STATE_LED7ON 2
#define STATE_LED9ON 3
#define STATE_LED11ON 4
#define STATE_LED13ON 5
// How much time should each led be on?
// Expressed in milliseconds
#define TIME_LED5ON 50
#define TIME_LED7ON 50
#define TIME_LED9ON 50
#define TIME_LED11ON 100
#define TIME_LED13ON 100
byte stateMachineStatus;
unsigned long stateMachineTime;
void setup() {
pinMode(5,OUTPUT);
pinMode(7,OUTPUT);
pinMode(9,OUTPUT);
pinMode(11,OUTPUT);
pinMode(13,OUTPUT);
pinMode(2,INPUT_PULLUP);
buttonStatus = digitalRead(2);
lastEqualButtonTime = millis();
stateMachineStatus = STATE_LEDSOFF;
}
void loop() {
byte currentButtonStatus = digitalRead(2);
if (currentButtonStatus == buttonStatus)
lastEqualButtonTime = millis();
else if ((millis() - lastEqualButtonTime) > debounceTimeMs)
{
lastEqualButtonTime = millis();
buttonStatus = currentButtonStatus;
// Change only on change, not on value
if (buttonStatus == LOW) {
// Turn on the LEDs sequence if it was off
if (stateMachineStatus == STATE_LEDSOFF)
{
stateMachineStatus = STATE_LED5ON;
stateMachineTime = millis();
}
else // Turn it off if it was on
stateMachineStatus = STATE_LEDSOFF;
}
}
switch (stateMachineStatus)
{
case STATE_LEDSOFF:
digitalWrite(5,LOW);
break;
case STATE_LED5ON:
digitalWrite(5,HIGH);
if ((millis() > stateMachineTime) > TIME_LED5ON)
{
stateMachineTime += TIME_LED5ON;
digitalWrite(5,LOW);
stateMachineStatus = STATE_LED7ON;
}
break;
case STATE_LED7ON:
digitalWrite(7,HIGH);
if ((millis() > stateMachineTime) > TIME_LED7ON)
{
stateMachineTime += TIME_LED7ON;
digitalWrite(7,LOW);
stateMachineStatus = STATE_LED9ON;
}
break;
case STATE_LED9ON:
digitalWrite(9,HIGH);
if ((millis() > stateMachineTime) > TIME_LED9ON)
{
stateMachineTime += TIME_LED9ON;
digitalWrite(9,LOW);
stateMachineStatus = STATE_LED11ON;
}
break;
case STATE_LED11ON:
digitalWrite(11,HIGH);
if ((millis() > stateMachineTime) > TIME_LED11ON)
{
stateMachineTime += TIME_LED11ON;
digitalWrite(11,LOW);
stateMachineStatus = STATE_LED13ON;
}
break;
case STATE_LED13ON:
digitalWrite(13,HIGH);
if ((millis() > stateMachineTime) > TIME_LED13ON)
{
stateMachineTime += TIME_LED13ON;
digitalWrite(13,LOW);
stateMachineStatus = STATE_LED5ON;
}
break;
default:
stateMachineStatus = STATE_LEDSOFF;
break;
}
}
このように動作します:ボタンを押すとボードがLEDを通ってサイクルを開始します。 5、7、9、11、13、5、7、9、11、13、...ボタンをもう一度押すまで。これを行うと、停止し、次のプレスが5から再開します。
13を停止した後で停止したい場合は、回線105をstateMachineStatus = STATE_LED5ON;
からstateMachineStatus = STATE_LEDSOFF;
に変更します。
ワンノート:あなたのコードで遅延が低すぎます(そして私がここに入れたものと同じです):1つのLEDと他のLEDとの間の50msは気付くことができません。実際にそれらを順番に表示したい場合は、TIME_LEDxON定義に少なくとも250の値を入れてください。
免責事項:現在、arduino ideをインストールしていないため、これらのコードはテストしていません。いくつかのバグがある場合は、単に教えてください。私はそれらを修正します。
両方の場合にライトを消しています... 'digitalWrite(5、HIGH);遅延(50); digitalWrite(5、LOW);は、LEDを素早くオンにした後、LEDを消灯します。 – dda
@ddaそれは私のコードは、次に、別の電源をオンにしてオフに切り替えると私のコードです。 – JulesTheGodOfMC