Помогите с мерзким пианино.

Тема в разделе "Arduino & Shields", создана пользователем prohor-nastya, 6 окт 2017.

  1. ostrov

    ostrov Гуру

    Вы правы, в первом варианте звук отрубается постоянно по любой ненажатой кнопке. Но я бы еще и включал один раз а не каждую итерацию loop, то есть добавил триггер таки.
     
  2. prohor-nastya

    prohor-nastya Нерд

    Переделал так:

    И все ЗАРАБОТАЛО!!!

    Код (C++):
    #define BUZZER_PIN    13 // пин с пищалкой (англ. «buzzer»)
    #define FIRST_KEY_PIN 4 // первый пин с клавишей (англ. «key»)
    #define LAST_KEY_PIN 10
    #define KEY_COUNT     7  // общее количество клавиш


    void setup()
    {
    for (int pin = FIRST_KEY_PIN; pin <= LAST_KEY_PIN; ++pin)
    pinMode(pin, INPUT);
    pinMode(BUZZER_PIN, OUTPUT);
    }

    void loop() {
     
       if(digitalRead(4)== LOW)//если кнопка нажата ...
    {
    tone(BUZZER_PIN, 2300, 20);
    }
    else if(digitalRead(5)== LOW)//если не нажата...
    {
    tone(BUZZER_PIN,2500, 20);
    }
    else if(digitalRead(6)== LOW)//если кнопка нажата ...
    {
    tone(BUZZER_PIN, 2650, 20);
    }
      else if(digitalRead(7)== LOW)//если кнопка нажата ...
    {
    tone(BUZZER_PIN, 2850, 20);
    }
      else if(digitalRead(8)== LOW)//если кнопка нажата ...
    {
    tone(BUZZER_PIN, 3050, 20);
    }
      else if(digitalRead(9)== LOW)//если кнопка нажата ...
    {
    tone(BUZZER_PIN, 3250, 20);
    }
      else if(digitalRead(10)== LOW)//если кнопка нажата ...
    {
    tone(BUZZER_PIN, 3350, 20);
    }
    else//если не нажата...
    {
    noTone(BUZZER_PIN);
    }
    }


     
     
  3. prohor-nastya

    prohor-nastya Нерд

    кстати, триггер все таки интересует... если есть возможность скиньте как он выглядит...
    пожалуйста.
     
  4. ostrov

    ostrov Гуру

    Если из академического интереса разве. Для данной программы разницы не заметите. А вот по уму, не надо бы запускать процесс сотни раз в секунду, так как это тормозит работу всего остального и вообще неправильно.
     
  5. ostrov

    ostrov Гуру

    Вот так попробуйте. Не проверял, может что упустил.

    Код (C++):
    #define BUZZER_PIN    13 // пин с пищалкой (англ. «buzzer»)

    byte keyPin[7] = {4, 5, 6, 7, 8, 9, 10}; // пины кнопок
    unsigned int buzHz[7] = {2300, 2500, 2650, 2850, 3050, 3250, 3350}; // частоты
    bool butPress = 0;
    bool buz = 0;

    void setup() {
      for (byte i = 0; i < 7; i++) pinMode(keyPin[i], INPUT);
      pinMode(BUZZER_PIN, OUTPUT);
    }

    void loop() {
      butPress = 0;
      for (byte i = 0; i < 7; i++) {
        if (!digitalRead(keyPin[i])) {
          if (!buz) {
            tone(BUZZER_PIN, buzHz[i]);
            buz = 1;
          }
          butPress = 1;
        }
      }
      if (!butPress) {
        noTone(BUZZER_PIN);
        buz = 0;
      }
      delay(50);
    }
     
     
    Последнее редактирование: 10 окт 2017
  6. prohor-nastya

    prohor-nastya Нерд

    byte keyPin[7]={4, 5, 6, 7, 8, 9, 10};// пины кнопок
    byte buzHz[7]={2300, 2500, 2650, 2850, 3050, 3250, 3350};// частоты

    я так понял, это так массив объявляется ?
    boolean и bool это логические переменные? чем они отличаются?
     
  7. ostrov

    ostrov Гуру

    Массивы.
    Отличается размерностью.
     
  8. rkit

    rkit Гуру

    Что слева от знака равенства — объявление.
    Что справа — инициализация.
    Ничем не отличаются. это синонимы.
     
  9. ostrov

    ostrov Гуру

    Не уточнили вопрос чем отличаются bool от чего? От других типов?
     
  10. prohor-nastya

    prohor-nastya Нерд

    друг от друга,
     
  11. prohor-nastya

    prohor-nastya Нерд

    можно писать boolean, а можно bool и разницы не будет, комп поймет одинакого?
     
  12. ostrov

    ostrov Гуру

    Друг от друга ничем, написали же. А вообще все равно занимает в памяти 1 байт, хоть и нужен всего 1 бит.
     
  13. prohor-nastya

    prohor-nastya Нерд

    объявлять массив можно любыми словами, или обязательно byte?
     
  14. prohor-nastya

    prohor-nastya Нерд

    Спасибо!
     
  15. rkit

    rkit Гуру

    Объявлять массив нужно так, чтобы он соответствовал задаче. Прочитайте учебник по C. Без теоретической подготовки вы далеко не уедете.
     
  16. prohor-nastya

    prohor-nastya Нерд

    так точно!
     
  17. prohor-nastya

    prohor-nastya Нерд

    Вот значит Здравствовать всем и всегда!
    Начал я изучение курса по С++, и мучает меня теперь один вопрос, а где же функция майн() в ардуино, без которой программа не может работать?? :eek: :confused:
     
  18. rkit

    rkit Гуру

    БАРМАТОГРАФ нравится это.
  19. qwone

    qwone Гик

    Что бы слабые мозги ардуинциков не делали так.
    Код (C++):
    /**/
    unsigned long mill; // переменная под millis()
    //--------------------------------
    //---Компоновка-----------------------------
    //---main-----------------------------
    int main() {
      init();
      //setup()
      for (;;) {
        //loop()
        mill = millis();
      }
      return 0;
    }
    /*Скетч использует 470 байт (1%) памяти устройства. Всего доступно 30720 байт.
      Глобальные переменные используют 13 байт (0%) динамической памяти, оставляя 2035 байт для локальных переменных. Максимум: 2048 байт.
    */
     
    БАРМАТОГРАФ нравится это.
  20. prohor-nastya

    prohor-nastya Нерд

    спасибо, я кстати так и подумал... Но получается она для всех одинаковая...