Распознавание длительности сигнала от датчика

Добрый день! Я создаю сигнал тревоги о человеческом движении. Я подаю сигнал atmega328. Я получаю сигнал от датчика, и если есть сигнал, то с помощью "тона" я генерирую звук. Я использую датчик движения. Я хочу, чтобы, если одно движение было замечено в течение короткого времени, то включали короткую мелодию, а если движение продолжается дольше определенного времени, то проигрывали длинную мелодию.

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

unsigned long timing; // Переменная для хранения начальной точки
int T = 15; // Время воспроизведения сигнала!
int S0 = PIND0; // С доплеровским зондом

int S1 = PIND1; // Питание
int S2 = PIND2; // Аудио

void setup ()
{

  // Управление портами через регистры:
  DDRD = B00000110; // Установите выходной вывод (первый и второй выводы регистра D в качестве выходных выводов, остальные (0,3-7) устанавливаются в качестве входных выводов)
  // 76543210
  pinMode (PIND0, INPUT);
  pinMode (PIND1, OUTPUT); // Мощность для усилителя
  pinMode (PIND2, OUTPUT); // Аудио
}
void loop ()
{
  if (digitalRead (PIND0))
  {
    sendSignal ();
  }

  if (digitalRead (PIND0) == 0)
  {
    digitalWrite (PIND1, LOW); // Питание
    digitalWrite (PIND2, LOW); // Звук
  }
}


void sendSignal ()
{
  digitalWrite (PIND1, HIGH); // Питание
  for (int n = 0; n <4; n ++)
  {
    for (int i = 4800; i <5800; i ++)
    {
      tone (PIND2, i, 10); // тон (порт, частота в Гц, длительность в мс) 600 - 6 сек.
    }
  }
}

И да, если мой код можно оптимизировать, скажите мне, как это сделать!

, 👍1

Обсуждение

Какова пороговая длительность между “коротким” и “длинным” сигналом? Какой длины короткие и длинные мелодии? Является ли короткая мелодия префиксом длинной мелодии? Что должна делать программа, если она считывает длинный сигнал при воспроизведении короткой мелодии?, @Edgar Bonet


1 ответ


1

Я не понимаю, где вы даже пытаетесь обнаружить длинное условие в своем коде.

Прежде всего, вам нужно определить, что представляет собой длинное или короткое обнаружение. Моя рекомендация состоит в том, чтобы написать свой код для выполнения следующих действий:

  1. Первоначальное обнаружение.
  2. Дождитесь своего "короткого" интервала. Если обнаружение пропало, значит, вы знаете, что оно было "коротким", и можете воспроизвести свою короткую музыку.
  3. Если обнаружение все еще присутствует, подождите оставшееся время для вашего "длительного" обнаружения.
  4. Если обнаружение пропало, вы знаете, что оно было "коротким", так как оно не перешло в "длинное" состояние. Так что сыграйте свою "короткую" песню.
  5. Воспроизведите свою "длинную" музыку, так как обнаружение продолжалось в течение длительного интервала.

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

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

В Интернете есть много ресурсов, в которых обсуждается, как настраивать и обрабатывать таймеры AVR и их прерывания, а также много ресурсов, в которых обсуждаются конечные автоматы и их программирование на C.

,

1. Вам не нужны как “короткий”, так и “длинный” интервал: только одна “пороговая” длительность, чтобы отличить их друг от друга. Если сигнал прекращается до пороговой продолжительности, короткая мелодия, в противном случае длинная мелодия. 2. Здесь нет ничего критичного по времени до такой степени, чтобы вам понадобилось прерывание, управляемое таймером. Синхронизация с помощью millis() проще и в данном случае совершенно уместна., @Edgar Bonet

все равно я не понимаю, если играет мелодия и есть задержки, то микроконтроллер в это время не смотрит на то, что поступает с датчика. Фактически, после срабатывания датчик все еще остается в высоком состоянии еще 2 секунды, поэтому я считаю 2 отклика (4 секунды) - для воспроизведения короткой мелодии. более двух - длинных. Как это реализовать? прерывает учебу? Две функции короткой и длинной мелодии для записи?, @Антон

Я пытаюсь создавать прерывания, но я не могу установить PIN PD0 (PCINT16) для прерывания, @Антон

@Антон На самом деле не помогает сказать "Я не могу установить вывод ...". Это также не имеет прямого отношения к этому вопросу. Пожалуйста, задайте еще один вопрос, разместите свой код, покажите, как вы подключаете вывод. Тогда кто-нибудь сможет вам помочь., @jwh20