Принудительное состояние выходного сигнала

у меня есть один вход и выход зуммера и кнопка сброса если вход высокий то зуммер будет включен и я хочу выключить зуммер с помощью кнопки даже если вход все еще высокий

в моем коде зуммер вообще не работает

int in1 =     2; //вход
int in26 =   8;// для кнопки сброса
int BUZZER_PIN = 52   ; // выход на зуммер из 25
int buttonState1 =  0;  //состояние на вход 1
int buttonState26 =  0; //для кнопки сброса
bool buzzer_is_on;  // переменная состояния
void setup() {
  pinMode(in1 , INPUT);
  pinMode(in26 , INPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  digitalWrite(BUZZER_PIN, LOW); // buzzer LOW

}

void loop() {

  buttonState1 = digitalRead(in1);
  buttonState26 = digitalRead(in26);


  bool input_rises = (buttonState1 == HIGH);
  bool reset_pressed = (buttonState26 == HIGH);


  if (buzzer_is_on) {
    if (reset_pressed) {
      digitalWrite(BUZZER_PIN, LOW);
      buzzer_is_on = false;
    }
   
  }
  else {  // buzzer is off
    if (input_rises) {
      digitalWrite(BUZZER_PIN, HIGH);
      buzzer_is_on = true;
    }
  }
}



, 👍0

Обсуждение

поместите слой разделения между нажатием кнопки и активацией зуммера ... используйте переменную флага ... прямо сейчас у вас есть "кнопка нажата ==> зуммер"... это очень негибко ... вместо этого сделайте " нажата кнопка ==> поднять флаг ... флаг поднят ==> гудение".... тогда легко сделать "кнопка 2 нажата ==>> очистить флаг".... если вы решите использовать таймер "таймер истек ==>>> очистить флаг"... флаг может быть поднят или сброшен любым количеством действий, @jsotola

как использовать флаги, @eng.hamza

это просто любая переменная, которую можно использовать как true/false или hogh/low или 1/0 ... buttonState1 - это один, @jsotola

посмотрите на running на этой странице https://www.arduino.cc/reference/en/language/variables/data-types/bool/ ... вот еще кое-какая информация ... https://www.arduino.cc/reference/en/language/structure/boolean-operators/logicalnot/, @jsotola

вы можете помочь мне с кодом, @eng.hamza

Re bool input_rises = (buttonState1 == HIGH);: это неверно, buttonState1 == HIGH обнаруживает **уровень**, тогда как input_rises предназначен для представления **ребра**, то есть изменения уровня. Найдите здесь “обнаружение краев” или “обнаружение изменений состояния”., @Edgar Bonet


1 ответ


1

У меня может быть личное предубеждение к концепции конечной машины. Я нахожу, что некоторые многие проблемы становятся настолько легкими, когда мы подходим с этой точки зрения...

Позвольте мне перефразировать ваши требования, просто чтобы убедиться, что я правильно понял:

  • Если зуммер ВЫКЛЮЧЕН:
    • он должен включиться, если входной сигнал повышается (переходит от НИЗКОГО уровня к ВЫСОКОМУ).
  • Если зуммер включен:
    • он должен отключиться, если входной сигнал падает (переходит от ВЫСОКОГО уровня к НИЗКОМУ).
    • он также должен выключиться при нажатии кнопки сброса

Или, как диаграмма состояний:

state diagram

Или, как код:

bool buzzer_is_on;  // переменная состояния

void loop() {
    bool input_rises = ...:
    bool input_falls = ...;
    bool reset_pressed = ...;
    if (buzzer_is_on) {
        if (input_falls || reset_pressed) {
            digitalWrite(BUZZER_PIN, LOW);
            buzzer_is_on = false;
        }
    } else {  // buzzer is off
        if (input_rises) {
            digitalWrite(BUZZER_PIN, HIGH);
            buzzer_is_on = true;
        }
    }
}

Теперь фокус (который я оставляю в качестве упражнения) заключается в том, чтобы правильно определить , когда входной сигнал повышается. Это не то же самое, что высокий входной сигнал: если пользователь нажимает кнопку reset, зуммер должен выключиться, но он также должен быть выключен. оставайтесьВ СТОРОНЕ , даже если вход остается ВЫСОКИМ. Подсказка: вы должны не только прочитать ввод, но и запомнить состояние, которое вы видели в прошлый раз, когда читали его. Или вы можете поискать “обнаружение краев”.

Обратите внимание, что для других переходов не требуется обнаружение ребер: вы можете отключить зуммер, когда вход НИЗКИЙ, но вы также можете отключить его, когда вход НИЗКИЙ. Это не должно иметь значения.

,

я хочу чтобы зуммер оставался включенным даже если вход выключится и сбросьте его с помощью кнопки, @eng.hamza

и второе условие-если вход высокий, зуммер будет включен, и я могу отключить его с помощью кнопки, @eng.hamza

@eng.hamza: ХОРОШО, извините, но описание желаемого поведения было не очень ясно из вашего первоначального вопроса. Если теперь можно более четко сформулировать условия для переходов, то можно адаптировать этот код и заставить его работать. Важно то, что я хочу показать вам не код: это подход, который идет от спецификации (на каких условиях должны быть сделаны переходы) к коду., @Edgar Bonet

я ценю ваш ответ поставить им новичок в arduino и не могу понять шаги, которые вы написали выше я буду рад, если вы можете редактировать исходный код в посте, @eng.hamza

@eng.hamza: Возьмите раздел, который я написал в пули (из “• Если зуммер ВЫКЛЮЧЕН”), исправьте его так, чтобы он соответствовал вашим требованиям, и добавьте его к вопросу. Для каждого возможного состояния вы должны указать, при каких условиях система переходит в другое состояние. Как только это будет сделано, преобразование в код станет почти тривиальным, и я могу сделать это за вас., @Edgar Bonet

этот код работает нормально для меня положить там что-то отсутствует ,в то время как вход высокий и я нажал кнопку сброса зуммер все еще включен, и он должен быть выключен, @eng.hamza

Пожалуйста, отредактируйте вопрос, чтобы включить вашу текущую реализацию, включая обнаружение ребер., @Edgar Bonet

я редактирую пост, @eng.hamza

я делаю много поиска положить я не могу сделать это если вы могли бы помочь мне с кодом это будет нормально, @eng.hamza