Пьезо динамик и кнопка.

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Mon1k66, 7 июл 2017.

  1. Mon1k66

    Mon1k66 Нуб

    Доброго времени суток!
    Возник такой вопрос по упражнению №8(Мерзкое пианино)
    Как переделать данный код, чтобы была всего одна кнопка, при том чтобы с нажатием на кнопку издавалось бы разная нота( и всего было бы пять разных звучаний), пять раз нажал, пять разных звуков издал динамик,а потом заново те же ноты:
    #define BUZZER_PIN 13
    #define FIRST_KEY_PIN 7
    #define KEY_COUNT 3
    void setup()
    {
    pinMode(BUZZER_PIN,OUTPUT);
    }
    void loop()
    {
    for (int i = 0; i<KEY_COUNT; ++i)
    {
    int keyPin = i + FIRST_KEY_PIN;
    boolean keyUp = digitalRead(keyPin);
    if (!keyUp){
    int frequency = 3500 + i*500;
    tone (BUZZER_PIN, frequency, 20);
    }
    }
    }


    Пробовал по-разному переделать код, но у меня так и не вышло ничего, с каждым нажатием один и тот же звук
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    #define KEY_COUNT   1
    Код (C++):
    static int frequency += 3500 + i*500;
    if(frequency > 5*3500) frequency=0;
     
     
    Последнее редактирование: 7 июл 2017
  3. Mon1k66

    Mon1k66 Нуб

    Добавил эти две строчки, но всё равно не работает, пьезо динамик пищит, когда запускаю плату и при нажатии перестаёт пищать,а после с каждым нажатием издаёт один и тот же звук
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    Стоп, а он вообще умеет пищать с разной частотой? А то вдруг он уже с генератором?
     
  5. Mon1k66

    Mon1k66 Нуб

    Да умеет, когда три кнопки подключаешь пищит с разным звучанием
     
  6. mcureenab

    mcureenab Гуру

    Ваш код контролирует не нажатие, а удержание кнопки. Пока кнопка нажата он очень быстро крутит частоты.
    Нужно или delay воткнуть, чтобы нота прозвучала и вы успели отпустить кнопку. Или переделать так, чтобы код фиксировал нажатие, а не удержание кнопки.
     
  7. Tomasina

    Tomasina Сушитель лампочек Модератор

    а почему 13-й пин? Он не поддерживает ШИМ.
    Код (C++):
    #define BUZZER_PIN 13
     
  8. Mon1k66

    Mon1k66 Нуб

    дак, по упражнению к нему подключена пьезо динамик стандартно
     
  9. Tomasina

    Tomasina Сушитель лампочек Модератор

    где-то так, проверить не на чем:
    Код (C++):
    #define BUZZER_PIN  9
    #define KEY_PIN     7     //  кнопка между пином и GND
    #define TONES_COUNT 5     // количество тональностей
    #define BOUNCE_TIME 100   // псевдозащита от дребезга кнопки
    const unsigned int freq[TONES_COUNT] = {220, 440, 880, 1760, 3520}; // список частот

    void setup()
    {
      pinMode(KEY_PIN, INPUT_PULLUP); // используется внутренний подтягивающий резистор
      pinMode(BUZZER_PIN, OUTPUT);
    }

    void loop()
    {
      static byte counter = 0;    // счетчик нажатий
      if (!digitalRead(KEY_PIN))  // нажата кнопка
      {
        counter++;                // увеличиваем счетчик
        if (counter >= TONES_COUNT - 1) counter = 0; // возврат в начало по достижении последнего элемента в списке
        tone (BUZZER_PIN, freq[counter]);
        delay(BOUNCE_TIME);
      }
    }
     
  10. Mon1k66

    Mon1k66 Нуб

    Спасибо!
    Оно работает, но поёт:D Оно должно просто издавать звук при нажатии.
     
  11. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    void loop()
    {
      static byte counter = 0;    // счетчик нажатий
      if (!digitalRead(KEY_PIN))  // нажата кнопка
      {
        counter++;                // увеличиваем счетчик
        if (counter >= TONES_COUNT - 1) counter = 0; // возврат в начало по достижении последнего элемента в списке
      }
     
      while(!digitalRead(KEY_PIN))  // пока нажата кнопка
      {
        tone (BUZZER_PIN, freq[counter]);
        delay(BOUNCE_TIME);  
      }
      noTone(BUZZER_PIN);
    }
     
    Mon1k66 нравится это.