Принудительное состояние выходного сигнала
у меня есть один вход и выход зуммера и кнопка сброса если вход высокий то зуммер будет включен и я хочу выключить зуммер с помощью кнопки даже если вход все еще высокий
в моем коде зуммер вообще не работает
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;
}
}
}
@eng.hamza, 👍0
Обсуждение1 ответ
У меня может быть личное предубеждение к концепции конечной машины. Я нахожу, что некоторые многие проблемы становятся настолько легкими, когда мы подходим с этой точки зрения...
Позвольте мне перефразировать ваши требования, просто чтобы убедиться, что я правильно понял:
- Если зуммер ВЫКЛЮЧЕН:
- он должен включиться, если входной сигнал повышается (переходит от НИЗКОГО уровня к ВЫСОКОМУ).
- Если зуммер включен:
- он должен отключиться, если входной сигнал падает (переходит от ВЫСОКОГО уровня к НИЗКОМУ).
- он также должен выключиться при нажатии кнопки сброса
Или, как диаграмма состояний:
Или, как код:
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
- Как преобразовать мгновенную кнопку в сенсорный датчик TTP223?
- Определение того, была ли нажата и отпущена кнопка
- Хорошая кнопка debouncing/Библиотека StateChange
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Нужен ли подтягивающий/понижающий резистор для цепи светодиода кнопки?
- Как прервать функцию цикла и перезапустить ее?
поместите слой разделения между нажатием кнопки и активацией зуммера ... используйте переменную флага ... прямо сейчас у вас есть "кнопка нажата ==> зуммер"... это очень негибко ... вместо этого сделайте " нажата кнопка ==> поднять флаг
...
флаг поднят ==> гудение".... тогда легко сделать "кнопка 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