Мобильная версия Форум Arduino Документация Гарантийные условия 0 0
UA RU
График работы магазина:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 17.00
Вс: выходной
Каталог
Напиши статью и получи скидку!

Як же без delay()?

2023-02-13

Все статьи →

Інколи хочеться додати до пристрою на Ардуїно якусь озвучку, але є побоювання, що звук буде "тормозити" роботу програми. Так зазвичай буває, якщо використовувати функцію delay(), яка "заморожує" роботу програми. Готових рішень я не знайшов, довелося написати самому. Я не програміст, отже не впевнений, що все оптимально, але працює, отже:

Пропоную скетч для програвання мелодії у фоновому режимі з використанням millis() і tone(). Скетч не використовує delay() та не створює затримок при роботі. На початку скетчу дефайни нот, це не що інше, як присутній в "павутині" заголовковий файл pitches.h Ця таблиця нот була написана Бреттом Хангманом (Brett Hagman), на працях яких і була заснована робота функції tone() Його допустимо використати, як дефайни на початку скетчу, або як файл в папці зі скетчем, тоді в скетчі треба посилання #include "pitches.h" Далі присутня пара одновимірних масивів - один для нот note[], інший для їх тривалості dur[], дуже бажано, щоб кількість елементів масивів була однаковою (жарт), А от щоб не було жартів, є процедура перевірки співпадіння з виводом результатів в послідовний порт.

Далі необхідні змінні:

  • uint32_t myTimer; // Таймер, який спільно з millis() буде забезпечувати тривалість звучання ноти та паузи.
  • int count = 0; // Лічильник нот, інкрементується з програванням чергової ноти.
  • bool f_music = 1; // Прапорець, для активування функції програвання, розміщувати в loop() робочого скетчу.
  • bool flag1 = 0; // Прапорець стану звучання.
  • bool flag2 = 0; // Прапорець стану паузи.
  • #define tonePin 20 // Декларування піну, який буде використатися для підключення п'єзодинаміка. (у мне 20, бо тестування робилось на ATmega3208, використайте будь-який з 2 по 19)

Функція, що забезпечує відтворення мелодії void music(), її ім'я необхідно помістити в loop() ось так: music ();

Більше пояснень в скетчі.

P.S. Створено на основі мелодії


Telex 2023 м. Кременчук.

Ваша оценка статьи:

Отлично
Хорошо
Удовлетворительно
Плохо
Очень плохо

Общая оценка:

Оценка "Як же без delay()?"
4 из 5
сделана на основе 3 оценок 3 клиентских отзывов.

Благодарим Вас за обращение! Ваш отзыв появится после модерации администратором.
Кирилл
16.05.2023 16:39:42
Статья неинтересна - очень много информации выложено в Интернете о том, что описано здесь.
Богдан
28.02.2023 00:10:31
Якщо перевести на micropython то delay() це time.sleep() а millis() це time.tick_ms(), а далі схема подібна
Олександр
24.02.2023 10:59:28
Чудова стаття!
оплата картами Visa и MasterCard