Доброго времени суток. Помогите настроить работу таймера по следующей логике: При появлении сигнала частотой 2000 Гц через 1 сек запускаем таймер на 2 сек. Если приходит сигнал частотой 3000 Гц то переключаем состояние пина, а если не пришел то обновляем таймер и ждём сигнала включения Я пробовал написать вот так но что-то этот код не очень хочет работать. Код (C++): If ( hz==2000){ delay(1000); for (int i = 0; i < 100; i++) { If (hz==3000){ digitaWrite (pin, LOW); i=0; } }
во-первых. этот код банально не компилируется. потому что вы даже элементарный синтаксиси оператора if не знаете. А во-вторых, в вашей задачке самое интересное - это измерение частоты. Откуда берется значение hz в коде?
@Nikita_mv изучай таймеры и их способность захвата сигнала (capture). Без понимания работы данного блока разговаривать не о чем. Это если частота детерминирована и представляет из себя тупой меандр. Если это спектр, среди которого есть синус искомой частоты, то на младших ардуинах это задача не разрешима. Необходимо брать быстрые ARM с быстрым АЦП на борту.
сейчас код выглядит вот так Код (C++): int Htime; // целочисленная переменная для хранения времени высокого логического уровня int Ltime; // целочисленная переменная для хранения времени низкого логического уровня float Ttime; // переменная для хранения общей длительности периода float frequency; // переменная для хранения частоты void setup() { Serial.begin(9600); // инициализация послед. порта pinMode(9, OUTPUT); } void loop() { Htime=pulseIn(8,HIGH); // прочитать время высокого логического уровня Ltime=pulseIn(8,LOW); // прочитать время низкого логического уровня Ttime = Htime+Ltime; frequency=1000000/Ttime; Serial.println(frequency); if (frequency>1000&&frequency<1500){ Serial.println(frequency); tone(9, 700, 300); delay(600); tone(9, 700, 300); delay(600); tone(9, 780, 150); delay(300); tone(9, 700, 150); delay(300); tone(9, 625, 450); delay(600); tone(9, 590, 150); delay(300); tone(9, 520, 150); delay(300); tone(9, 460, 450); delay(600); tone(9, 350, 450); delay(600); delay(600); tone(9, 350, 450); delay(600); tone(9, 460, 450); delay(600); tone(9, 520, 150); delay(300); tone(9, 590, 150); delay(300); tone(9, 625, 450); delay(600); tone(9, 590, 150); delay(300); tone(9, 520, 150); delay(300); tone(9, 700, 1350); delay(1800); tone(9, 700, 300); delay(600); tone(9, 700, 300); delay(600); tone(9, 780, 150); delay(300); tone(9, 700, 150); delay(300); tone(9, 625, 450); delay(600); tone(9, 590, 150); delay(300); tone(9, 520, 150); delay(300); tone(9, 460, 450); delay(600); tone(9, 350, 450); delay(600); delay(600); tone(9, 350, 450); delay(600); tone(9, 625, 450); delay(600); tone(9, 590, 150); delay(300); tone(9, 520, 150); delay(300); tone(9, 700, 450); delay(600); tone(9, 590, 150); delay(300); tone(9, 520, 150); delay(300); tone(9, 460, 1350); delay(5000); noTone(9); } }
к чему этот ламерский код с кучей delay, если таймер способен всё сам замерять АВТОМАТОМ, а мы в прерывании от таймера забираем значение? Также, в составе таймера присутствует антидребезговый фильтр, который способен убрать из сигнала иголки.
как почему? - потому что у вас так код написан. В вашей программе пока МК проигрывает мелодию - он ничего более делать не может. А длительность мелодии как раз порядка 20 секунд...
ну так все правильно. пока музыка играет мерить ничего не надо. Мерить надо что бы включить музыку, а что бы избежать ложного срабатывания я хочу сделать так что бы звук разных частот фиксировался в промежутки ограниченного времени.