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;
}
}
@Daniel, 👍3
Обсуждение2 ответа
Лучший ответ:
Arduino останавливает цикл случайным образом при нажатии кнопки
ваша кнопка замыкает подачу?
10-омный резистор при подключении к земле может привести к падению напряжения питания ниже рабочего напряжения Arduino. Если вы хотите использовать подтягивающий резистор к земле, используйте вместо него значение 10 кОм.
Обратите внимание, что резистор сопротивлением 10 Ом при напряжении питания 5 В потребляет ток силой 0,5 А.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Как подключена кнопка?, @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