2017-01-02 14 views
0

Я пытаюсь сделать кнопку работать как переключатель. Код работает, чтобы включить свет, но код не хочет отключать их.Я использую кнопку в качестве переключателя, она включается, но не выключается (Arduino)

Мой код работает следующим образом:

  1. Если кнопка нажата, и свет выключен, включите свет.
  2. Если кнопка нажата, а индикаторы горит, выключите свет.

Но номер 2 не работает.

int buttonStatus = 0; 
int check = 1; 
int Status = 0; 

void setup() { 
    pinMode(5,OUTPUT); 
    pinMode(7,OUTPUT); 
    pinMode(9,OUTPUT); 
    pinMode(11,OUTPUT); 
    pinMode(13,OUTPUT); 
    pinMode(2,INPUT); 
} 

void loop() { 
    if (check = 1) { 
    buttonStatus = digitalRead(2); 
    if (buttonStatus == HIGH && Status == 0) { 
     Status = 1; 
     buttonStatus = 0; 
    } else if (buttonStatus == HIGH && Status == 1) { 
     Status = 0; 
     buttonStatus = 0; 
    } 
    } 

    if (Status == 1) { 
    digitalWrite(5,HIGH); 
    delay(50); 
    digitalWrite(5,LOW); 
    digitalWrite(7,HIGH); 
    delay(50); 
    digitalWrite(7,LOW); 
    digitalWrite(9,HIGH); 
    delay(50); 
    digitalWrite(9,LOW); 
    digitalWrite(11,HIGH); 
    delay(100); 
    digitalWrite(11,LOW); 
    digitalWrite(13,HIGH); 
    delay(100); 
    digitalWrite(13,LOW); 
    } else { 
    digitalWrite(5,LOW); 
    digitalWrite(7,LOW); 
    digitalWrite(9,LOW); 
    digitalWrite(11,LOW); 
    digitalWrite(13,LOW); 
    } 
} 
+0

Вы выключаете свет в обоих случаях ... 'digitalWrite (5, HIGH); задержка (50); digitalWrite (5, LOW); 'выключит светодиод после его быстрого включения. – dda

+0

@dda Да, это мой код, который он включает, затем поворачивает, затем другой включается и выключается. – JulesTheGodOfMC

ответ

0

Хорошо, ваше описание и ваш код сказать две разные вещи. Я пытаюсь их интерпретировать, но если я ошибаюсь, просто скажите мне, и я попытаюсь исправить ответ.

Этот код позволяет использовать кнопку, чтобы включать и выключать свет на контакте 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. Если есть какие-то ошибки, просто скажите мне, и я их исправлю.

+0

Эй, спасибо, несколько ошибок, но все в порядке. Есть ли способ поговорить? – JulesTheGodOfMC

+0

Ну, я могу создать чат-комнату, но вам понадобится 20 человек, чтобы ответить там. В любом случае, просто спросите здесь, я постараюсь ответить ... Какой был «правильный» для вас? Первая или вторая? – frarugi87

+0

Я имел в виду скайп, whatsapp что-нибудь – JulesTheGodOfMC

0

Попробуйте добавить задержку дебюта. Это обычная проблема с коммутаторами. https://www.arduino.cc/en/Tutorial/Debounce

+0

Я не вижу, как это вообще поможет или заблокирует его. – JulesTheGodOfMC

+0

Нажав переключатель без задержки отладки, можно прочитать как несколько нажатий и привести к сбоям в работе. Существует пример кода, который показывает хороший способ обработки переключателей на одной кнопке состояния. – bnss

0

Возможно, это из-за плавающего штыря. Вы построили резистор подтягивания или выталкивания?

Это обычное дело ...

+0

lemme восстановить его и отправить сообщение. где я его отправлю? – JulesTheGodOfMC

+0

Я не понимаю, что вы имеете в виду – JulesTheGodOfMC

+0

Поиск плавающих булавок в сети :) – Chris8447