Arduino останавливает цикл случайным образом при каждом нажатии кнопки

У меня проблема с этим кодом Arduino.

Поэтому всякий раз, когда я нажимаю «кнопку» в порту 11, которая должна либо сбросить охранную сигнализацию, либо остановить ее, вся программа останавливается (функция voidloop() останавливается). Проблема, скорее всего, не в проводке, потому что я проверял ее несколько раз с разными кодами. Кнопка тоже прекрасно работает как кнопка с разными кодами.

В последовательном порту он продолжает печатать «78005», как и должно быть до нажатия кнопки, до тех пор, пока я не нажму кнопку, после чего печать случайным образом прекращается (в результате получается 78, 780, 7, 7800 или 78005 в качестве последней напечатанной строки).

Может ли кто-нибудь объяснить, почему Arduino ведет себя таким образом?

Большое спасибо.

int button = 11;
int receiver = 12;
int buzzer = 13;
int frequency = 1000; // частота зуммера

bool keepAlerting = false; // переключает сигнал тревоги независимо от обнаруженного заряда
int receiverVal = LOW; // значение из порта 12
int buttonVal = LOW; // значение из кнопки
int oldButtonVal = LOW;

int setupTime = 5000; // время, когда пользователь должен закрыть окно после переключения будильника

bool alarmOn;
int buttonMode = 0;
const int resetButton = 1;
const int stopButton = 2;
int buttonModeDecider = 0;

void setup() {
  // поместите сюда свой код установки для однократного запуска:
  pinMode(buzzer, OUTPUT);
  pinMode(receiver, INPUT);
  pinMode(button, INPUT);
  Serial.begin(9600);

  noTone(buzzer);
}

void loop() {  
  // поместите сюда свой основной код для повторного запуска:
  Serial.print("7");
  receiverVal = digitalRead(receiver);
  buttonVal = digitalRead(button);
  Serial.print("8");

  if(alarmOn == true){
    Serial.print("6");
    setAlarm();
  }

  Serial.print(buttonVal);
  Serial.print(oldButtonVal);

  if(buttonVal == HIGH && oldButtonVal == LOW){
    buttonModeDecider = 1 - buttonModeDecider;
    Serial.print("Toggled");

    if(buttonModeDecider == 1){
      buttonMode = resetButton;
      Serial.print("1");
    } else {
      buttonMode = stopButton;
      Serial.print("2");
    }

    switch(buttonMode) {
      case resetButton:
      {
        delay(setupTime);
        alarmOn = true;
        break;
        Serial.print("3");
      }
      case stopButton:
      {
        alarmOn = false;
        Serial.print("4");
      }
    }
  }
  Serial.println("5");
  oldButtonVal = buttonVal;
}

void setAlarm() {
  if(receiverVal == LOW || keepAlerting == true) {
    tone(buzzer, frequency);
    keepAlerting = true;
  }
}

, 👍3

Обсуждение

Как подключена кнопка?, @Majenko

Вы утверждаете, что «функция voidloop() останавливается», а затем говорите «или 78005 в качестве последней напечатанной строки». Можете ли вы действительно подтвердить, что это последняя строка, напечатанная ОДИН РАЗ, а затем ничего, или последняя строка, перепечатываемая навсегда, что тогда сильно отличалось бы от «остановки цикла()»., @jfpoilpret

Для ваших входов вы используете режим «INPUT», а не «INPUT_PULLUP», это означает, что вы добавили подтягивающий или понижающий резистор «между» вашей кнопкой и входным контактом. Можете ли вы подтвердить эту проводку? Затем противоположная сторона кнопки подключается к GND (если вы используете повышающий резистор) или +5 В (если вы используете понижающий резистор). Плохая проводка здесь может привести к неожиданному сбою вашей программы., @jfpoilpret

Добавьте устранение дребезга для вашей механической кнопки. Вероятно, ваше нажатие и отпускание кнопки ложное обнаружение вызвано подпрыгиванием. https://www.arduino.cc/en/Tutorial/Debounce, @Andre Courchesne

jfpoilpret: Да, я могу подтвердить, что последняя напечатанная строка определенно является последней. Оно не переиздается. Кроме того, я могу подтвердить, что между моей кнопкой и входным контактом существует резистор сопротивлением 10 Ом и что противоположная сторона кнопки подключена к GND. Схема, вероятно, не является проблемой, потому что, если я использую другой код с той же структурой для выполнения других подобных действий, он все равно будет работать., @Daniel

У меня точно такая же проблема. Мой друг просто посоветовал мне установить диод, так как это видимо решило его проблему. Мы работаем над проектом от пары дней и потеряли около 3 дней исключительно из-за этого. У меня 20 строчек кода, так как всё переставало работать, как только подключали ещё устройства. Он словно просто перестает работать, ломается, а потом внезапно возвращается к жизни. Ага. Мы знаем, что происходит. Я могу опубликовать обновленную информацию об этом диоде, как только установлю его на свою установку., @Luke Lozowski


2 ответа


Лучший ответ:

0

Arduino останавливает цикл случайным образом при нажатии кнопки

ваша кнопка замыкает подачу?

,

2

10-омный резистор при подключении к земле может привести к падению напряжения питания ниже рабочего напряжения Arduino. Если вы хотите использовать подтягивающий резистор к земле, используйте вместо него значение 10 кОм.

Обратите внимание, что резистор сопротивлением 10 Ом при напряжении питания 5 В потребляет ток силой 0,5 А.

,