Хорошо, ваше описание и ваш код сказать две разные вещи. Я пытаюсь их интерпретировать, но если я ошибаюсь, просто скажите мне, и я попытаюсь исправить ответ.
Этот код позволяет использовать кнопку, чтобы включать и выключать свет на контакте 5. Одно нажатие включает его, а другое отключит его. Вы должны подключить кнопку с одним концом к контакту 2, а другой - к земле (поскольку мы используем подтягивающее сопротивление).
Я также добавил небольшую задержку дребезга, чтобы справиться с отскока механического переключателя (50ms)
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));
}
}
}
При нажатии на кнопку светодиод на выводе 5 включается, при нажатии на кнопку еще раз его выключится.
Это поведение, которое вы задали. Ваш код, с другой стороны, подсвечивает последовательность светодиодов, когда вы нажимаете кнопку. В этом случае, если вы хотите запустить цикл нажатием, а затем остановить его другим нажатием, вам нужно использовать какой-то простой конечный автомат, как тот, который содержится в коде. Я также добавил небольшое отклонение к кнопке, которая снова должна быть подключена между 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;
}
}
Это работает следующим образом: вы нажимаете кнопку, и плата начинает движение по светодиодам. 5, 7, 9, 11, 13, 5, 7, 9, 11, 13, ... Пока вы не нажмете снова кнопку. Когда вы это сделаете, он остановится, затем на следующем прессе перезагрузится с 5.
Если вы хотите, чтобы после 13 остановок, измените линию 105 с stateMachineStatus = STATE_LED5ON;
на stateMachineStatus = STATE_LEDSOFF;
.
Одно примечание: в вашем коде слишком низкая задержка (и это то же самое, что я здесь): 50 мс между одним светодиодом и другим не могут быть замечены. Если вы хотите увидеть их последовательно, введите значения не менее 250 в TIME_LEDxON.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не тестировал эти коды, так как в настоящее время у меня нет arduino ide. Если есть какие-то ошибки, просто скажите мне, и я их исправлю.
Вы выключаете свет в обоих случаях ... 'digitalWrite (5, HIGH); задержка (50); digitalWrite (5, LOW); 'выключит светодиод после его быстрого включения. – dda
@dda Да, это мой код, который он включает, затем поворачивает, затем другой включается и выключается. – JulesTheGodOfMC