Копия примера кода Arduino для функции tone() выдает ошибку компиляции: 'tone' is not declared in this scope. Как исправить?

compile error

Это 32-разрядный процессор ядра ARM — SAM3X8E ARM Cortex-M3.

Ошибка:

sketch_nov16b\sketch_nov16b.ino: In function 'void setup()': sketch_nov16b:49:43: error: 'tone' was not declared in this scope tone(8, melody[thisNote], noteDuration); 
^ sketch_nov16b:61:13: error: 'noTone' was not declared in this scope noTone(8); 
^ exit status 1 'tone' was not declared in this scope 

Код:

/*

Мелодия

Играет мелодию

схема:

- Динамик 8 Ом на цифровом контакте 8

создано 21 января 2010 г.

изменено 30 августа 2011 г.

Том Айго

Этот пример кода находится в свободном доступе.

https://www.arduino.cc/en/Tutorial/Tone

*/

#include "pitches.h"

// ноты в мелодии:
int melody[] = {

  NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};

// длительность нот: 4 = четвертная нота, 8 = восьмая нота и т. д.:
int noteDurations[] = {

  4, 8, 8, 4, 4, 4, 4, 4
};

void setup() {

  // перебираем ноты мелодии:

  for (int thisNote = 0; thisNote < 8; thisNote++) {

    // чтобы вычислить длительность ноты, разделите одну секунду на тип ноты.

    //например, четвертная нота = 1000/4, восьмая = 1000/8 и т. д.

    int noteDuration = 1000 / noteDurations[thisNote];

    tone(8, melody[thisNote], noteDuration);

    // чтобы различать ноты, установите минимальное время между ними.

    // продолжительность ноты +30%, кажется, работает хорошо:

    int pauseBetweenNotes = noteDuration * 1.30;

    delay(pauseBetweenNotes);

    // остановить воспроизведение тона:

    noTone(8);

  }
}

void loop() {

  // не нужно повторять мелодию.
}

, 👍0

Обсуждение

Какое ядро вы используете?, @Edgar Bonet

Это 32-битный процессор ядра ARM — процессор SAM3X8E ARM Cortex-M3., @JohnB

Соответствует ли это запросу jsotola?sketch_nov16b\sketch_nov16b.ino: В функции void setup(): Sketch_nov16b:49:43: ошибка: «тон» не был объявлен в этой области тон (8, мелодия [thisNote], noteDuration); ^ Sketch_nov16b:61:13: ошибка: «noTone» не был объявлен в этой области noTone(8); ^ статус выхода 1 «тон» не был объявлен в этой области, @JohnB

@JohnB Я сказал: «не вставлять в комментарий», а вы вставили в комментарий… этот сайт не является форумом… это сайт вопросов и ответов… вся информация должна содержаться в вопросе, @jsotola


1 ответ


3

Короче говоря, они просто никогда не реализовали tone() в ядре Due/SAM. Таким образом, обычная функция tone() у вас не заработает.

  • Заголовокtone.h пустой.
    Вероятно, им следует предпринять ряд действий, которые могли бы дать более четкое предупреждение об этом.

  • Соответствующий файл .cpp был переименован в .cpp.disabled, поэтому попытки его компиляции не предпринимаются, и он полный AVR-кода, который они скопировали в проект для справки с намерением заменить его, но так и не сделали.

Существует проблема с github, отслеживающая это. Но он не обновлялся с 2020 года. Эта проблема ссылается на форум Arduino, очевидно рабочий альтернативный код для создания тонов. Так что, возможно, попробуйте их код.

Я не вижу какой-либо популярной альтернативы в виде библиотеки Arduino для создания простых тонов. Однако в чипе есть ЦАП и аудиобиблиотека. Это немного излишне для создания базовых тонов, но вы можете изменить пример там, чтобы заполнить буфер сигналом тона, а не загружать его из файла SD-карты.

,