Как включить и выключить зуммер

У меня есть проект, который требует от меня использования магнитного контактного датчика. Поставлю датчик на дверь. Итак, идея в том, что я хочу, чтобы каждый раз, когда кто-то открывает дверь, зуммер издавал звук, но только в течение 3 секунд. Когда дверь закрыта, зуммер ничего не делает, а когда кто-то снова открывает дверь, зуммер снова издает звук в течение 3 секунд. Это петля. Вот мой код. Извините, это грязно. Я менял его несколько раз, и он все еще не работает так, как я хочу.

const int buzzer = 13; 
const int sensor = 4;

int state; // 0 закрыть - 1 открыть переключатель

void setup()
{
  pinMode(sensor, INPUT_PULLUP);
}

void loop()
{
  state = digitalRead(sensor);

  if (state == HIGH){
    tone(buzzer,1000);
    delay(3000);
    noTone(buzzer);
  }

  else{
    noTone(buzzer);
  }

}

, 👍-2

Обсуждение

Вы должны сделать свое требование более ясным... что после последних 3 секунд?, @Michel Keijzers

Вы можете изменить задержки «delay (1000)» и «delay (5000)» на «delay (3000)»? Нет? Или в чем именно заключается проблема, с которой вы столкнулись?, @Duck Dodgers

Я все еще здесь новичок, поэтому не знаю, как написать длиннее по моему вопросу или хотя бы рассказать подробности. Я использую магнитный контактный датчик, чтобы поместить его в дверь. Поэтому я хочу, чтобы мой зуммер издавал звук каждый раз, когда кто-то открывает дверь. Но звук останется только на 3 секунды. Затем, когда я закрою дверь и открою ее, она снова издаст звук., @Hanim

то, что вы здесь новичок, не является причиной для того, чтобы четко не описывать, что именно вы хотите, чтобы произошло?, @jsotola

Вы попытались втиснуть весь свой вопрос в строку темы. Это не все, что полезно. Попробуйте прочитать [как задать хороший вопрос](https://arduino.meta.stackexchange.com/questions/2523/how-to-ask-a-good-question-for-arduino-stack-exchange). Код приятно видеть, но было бы также полезно, если бы вы описали, что происходит, по сравнению с тем, что вы ожидаете., @Nick Gammon

Если вам нужна задержка в 3 секунды, почему ваш код имеет задержку в 1000 мс? Это одна секунда. Кажется, это очевидная проблема, которую нужно исправить., @Nick Gammon

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


1 ответ


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

2

Когда у меня возникает такая проблема с конечным автоматом, как эта, я сначала рисую ее. Вот моя схема, основанная на том, как я понимаю ваши требования:

Диаграмма состояний

Большинство конечных автоматов активируются только тогда, когда происходит внешнее событие, поэтому внутри блоков состояний мало что происходит. Но поскольку ваше приложение выполняет только одну эту функцию, вы можете проводить тестирование внутри состояний. В этом разница между блокирующим и неблокирующим программированием — мы можем позволить себе блокировку (отсрочку до тех пор, пока что-то не произойдет), потому что в это время нам больше нечего делать.

И мой код для конечного автомата (который я не тестировал, но он компилируется без ошибок):

const int buzzer = 13; 
const int sensor = 4;

int state; // 0 закрыть - 1 открыть переключатель

void setup()
{
   pinMode(sensor, INPUT_PULLUP);
}

void loop()
{
   // Ждем высокого уровня датчика
   while( digitalRead(sensor) == LOW )
      ;

   // Датчик ВЫСОКИЙ - тревога
   tone(buzzer, 0.52);
   delay(3000);

   // Ждем НИЗКИЙ уровень датчика
   noTone(buzzer);
   while( digitalRead(sensor) == HIGH )
      ;

   // (переход к ожиданию высокого уровня датчика)
}
,

«Сначала нарисуй схему» — действительно лучший совет., @Edgar Bonet

Извините за поздний ответ. Я новичок здесь, поэтому я не очень понимаю концепцию. я думал, что ваш код принадлежит другому человеку, поэтому я отвечаю ему. Я попробовал ваш код. Это работает, но я не хочу никакого звука, когда датчик НИЗКИЙ. Ваш код включает зуммер на 3 секунды, когда датчик НИЗКИЙ и ВЫСОКИЙ. Я просто хочу, чтобы зуммер включался, когда датчик HIGH. Но ваш код действительно полезен. Спасибо., @Hanim

Я немного редактирую ваш код, и он работает! Спасибо. Serial.println ("датчик: " + датчик); в то время как ( digitalRead (датчик) == LOW ); noTone (зуммер); // Датчик ВЫСОКИЙ - тревога тон (зуммер, 400); задержка(3000); // Ждем НИЗКИЙ уровень датчика noTone (зуммер); в то время как (digitalRead (датчик) == ВЫСОКИЙ) ; // (переход к ожиданию высокого уровня датчика), @Hanim