Управление звуком

Тема в разделе "Arduino & Shields", создана пользователем Nikita_mv, 23 апр 2020.

  1. Nikita_mv

    Nikita_mv Нерд

    Доброго времени суток. Помогите настроить работу таймера по следующей логике:
    При появлении сигнала частотой 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;
    }
    }
     
     
  2. b707

    b707 Гуру

    во-первых. этот код банально не компилируется. потому что вы даже элементарный синтаксиси оператора if не знаете.
    А во-вторых, в вашей задачке самое интересное - это измерение частоты. Откуда берется значение hz в коде?
     
    Daniil, parovoZZ и NikitOS нравится это.
  3. parovoZZ

    parovoZZ Гуру

    @Nikita_mv
    изучай таймеры и их способность захвата сигнала (capture). Без понимания работы данного блока разговаривать не о чем.
    Это если частота детерминирована и представляет из себя тупой меандр. Если это спектр, среди которого есть синус искомой частоты, то на младших ардуинах это задача не разрешима. Необходимо брать быстрые ARM с быстрым АЦП на борту.
     
  4. Nikita_mv

    Nikita_mv Нерд


    сейчас код выглядит вот так

    Код (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);

       

      }
    }
     
     
  5. parovoZZ

    parovoZZ Гуру

    к чему этот ламерский код с кучей delay, если таймер способен всё сам замерять АВТОМАТОМ, а мы в прерывании от таймера забираем значение? Также, в составе таймера присутствует антидребезговый фильтр, который способен убрать из сигнала иголки.
     
  6. b707

    b707 Гуру

    плохо
    Никита, вас не смущает что ваш код будет замерять сигнал примерно раз в 20 секунд?
     
  7. Nikita_mv

    Nikita_mv Нерд

    Почему?
     
  8. b707

    b707 Гуру

    как почему? - потому что у вас так код написан.
    В вашей программе пока МК проигрывает мелодию - он ничего более делать не может.
    А длительность мелодии как раз порядка 20 секунд...
     
  9. Nikita_mv

    Nikita_mv Нерд

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