Шановні друзі!
26 та 31 грудня магазин працюватиме до 16 години. 1 та 2 січня магазин працювати не буде.
Вітаємо всіх з Різдвом та Новим Роком!
Мобільна версія Форум 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