Распознавание длительности сигнала от датчика
Добрый день! Я создаю сигнал тревоги о человеческом движении. Я подаю сигнал 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
Обсуждение1 ответ
Я не понимаю, где вы даже пытаетесь обнаружить длинное условие в своем коде.
Прежде всего, вам нужно определить, что представляет собой длинное или короткое обнаружение. Моя рекомендация состоит в том, чтобы написать свой код для выполнения следующих действий:
- Первоначальное обнаружение.
- Дождитесь своего "короткого" интервала. Если обнаружение пропало, значит, вы знаете, что оно было "коротким", и можете воспроизвести свою короткую музыку.
- Если обнаружение все еще присутствует, подождите оставшееся время для вашего "длительного" обнаружения.
- Если обнаружение пропало, вы знаете, что оно было "коротким", так как оно не перешло в "длинное" состояние. Так что сыграйте свою "короткую" песню.
- Воспроизведите свою "длинную" музыку, так как обнаружение продолжалось в течение длительного интервала.
Я оставлю фактическое кодирование этого на ваше усмотрение. Я также добавлю, что делать это таким образом, то есть использовать встроенную функцию delay(), вероятно, не самый лучший подход в целом. Проблема в том, что delay() блокирует вашу функцию loop() и не позволяет вам делать что-либо еще, пока она задерживается.
Лучшим подходом является реализация этого в виде конечного автомата в сочетании с прерыванием, управляемым таймером. Это даст вам гораздо лучший контроль над вашими обнаружениями, а также позволит вам обрабатывать другие входные данные или устанавливать другие выходные данные, пока вы ожидаете появления обнаружений.
В Интернете есть много ресурсов, в которых обсуждается, как настраивать и обрабатывать таймеры AVR и их прерывания, а также много ресурсов, в которых обсуждаются конечные автоматы и их программирование на C.
1. Вам не нужны как “короткий”, так и “длинный” интервал: только одна “пороговая” длительность, чтобы отличить их друг от друга. Если сигнал прекращается до пороговой продолжительности, короткая мелодия, в противном случае длинная мелодия. 2. Здесь нет ничего критичного по времени до такой степени, чтобы вам понадобилось прерывание, управляемое таймером. Синхронизация с помощью millis()
проще и в данном случае совершенно уместна., @Edgar Bonet
все равно я не понимаю, если играет мелодия и есть задержки, то микроконтроллер в это время не смотрит на то, что поступает с датчика. Фактически, после срабатывания датчик все еще остается в высоком состоянии еще 2 секунды, поэтому я считаю 2 отклика (4 секунды) - для воспроизведения короткой мелодии. более двух - длинных. Как это реализовать? прерывает учебу? Две функции короткой и длинной мелодии для записи?, @Антон
Я пытаюсь создавать прерывания, но я не могу установить PIN PD0 (PCINT16) для прерывания, @Антон
@Антон На самом деле не помогает сказать "Я не могу установить вывод ...". Это также не имеет прямого отношения к этому вопросу. Пожалуйста, задайте еще один вопрос, разместите свой код, покажите, как вы подключаете вывод. Тогда кто-нибудь сможет вам помочь., @jwh20
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Разница между print() и println()
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
Какова пороговая длительность между “коротким” и “длинным” сигналом? Какой длины короткие и длинные мелодии? Является ли короткая мелодия префиксом длинной мелодии? Что должна делать программа, если она считывает длинный сигнал при воспроизведении короткой мелодии?, @Edgar Bonet