<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Урок 19. LED панель + Микрофон. Светомузыка]]></title><description><![CDATA[<h2>Цель урока</h2>
<p dir="auto">Привет! Сегодня мы научимся зажигать многоцветные светодиодные панели (только в M5 FIRE), полагаясь на составляющие частоты звукового сигнала, полученные со встроенного (только в M5 FIRE) микрофона.</p>
<p dir="auto"><img src="https://pp.userapi.com/c848632/v848632099/a9b77/g_X4K5MCSG0.jpg" alt="" class=" img-fluid img-markdown" /></p>
<p dir="auto">Рисунок 1</p>
<p dir="auto">Этот урок научит: подключать и использовать на практике сторонние библиотеки для работы с быстрым преобразованием Фурье (FFT) и светодиодами SK6818.</p>
<h2>Краткая справка</h2>
<p dir="auto">Цветомузыка - вид искусства, основанный на способности человека ассоциировать звуковые ощущения со световыми восприятиями; такое явление в неврологии получило название синестезия. Светомузыка как искусство, представляет собой производную от музыки и является её неотъемлемой частью. Её назначение — раскрытие сущности музыки посредством зрительных восприятий. Основной целью светомузыки как искусства — это изучение способности человека испытывать ощущения, навязываемые световыми образами при сопровождении музыки.</p>
<p dir="auto">Любители музыки уже давно подметили, что музыкальные инструменты звучат намного громче и отчетливее в хорошо освещённом помещении, чем в затемнённом. Поэтому при исполнении серьёзной музыки свет в зале обычно не гасят.</p>
<p dir="auto">Впервые связь между слухом и зрением очень убедительно показал русский физик и русский физиолог академик П. П. Лазарев.</p>
<p dir="auto">Подробно на Wiki: <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D0%B5%D1%82%D0%BE%D0%BC%D1%83%D0%B7%D1%8B%D0%BA%D0%B0" title="https://ru.wikipedia.org/wiki/Светомузыка" target="_blank" rel="noopener noreferrer nofollow ugc">https://ru.wikipedia.org/wiki/Светомузыка</a></p>
<p dir="auto"><strong>Перечень компонентов для урока</strong></p>
<ul>
<li>PC/MAC;</li>
<li>M5STACK FIRE;</li>
<li>кабель USB-C из стандартного набора.</li>
</ul>
<h2>Начнём!</h2>
<h3>Шаг 1. Установка библиотеки для работы с LED BAR</h3>
<p dir="auto">Переходим по ссылке <strong>Библиотека LED BAR</strong> в разделе <strong>Downloads</strong> и скачиваем пример с файлами библиотек (рис. 2).</p>
<p dir="auto"><img src="https://pp.userapi.com/c848632/v848632099/a9bed/gg0WGm4Ocb4.jpg" alt="" class=" img-fluid img-markdown" /></p>
<p dir="auto">Рисунок 2</p>
<p dir="auto">Далее извлекаем архив в новую папку <strong>sketch</strong> и удаляем файл <strong>demo1.ino</strong> (рис. 3).</p>
<p dir="auto"><img src="https://pp.userapi.com/c850236/v850236619/6360a/aBQi_Mwq-dE.jpg" alt="" class=" img-fluid img-markdown" /></p>
<p dir="auto">Рисунок 3</p>
<h3>Шаг 2. Установка библиотеки FFT</h3>
<p dir="auto">Переходим по ссылке <strong>Библиотека Arduino FFT</strong> в разделе <strong>Downloads</strong> и скачиваем пример с файлами библиотек (рис. 4).</p>
<p dir="auto"><img src="https://pp.userapi.com/c851016/v851016266/3d837/kL2jojv9TE4.jpg" alt="" class=" img-fluid img-markdown" /></p>
<p dir="auto">Рисунок 4</p>
<p dir="auto">Далее извлекаем содержимое и копируем папку в <strong>C:\Users\USER_NAME\Documents\Arduino\libraries</strong> с новым именем <strong>arduinoFFT</strong> вместо <strong>arduinoFFT-master</strong> (рис. 5).</p>
<p dir="auto"><img src="https://pp.userapi.com/c851016/v851016266/3d841/sySeWj6WcW4.jpg" alt="https://pp.userapi.com/c851016/v851016266/3d841/sySeWj6WcW4.jpg" class=" img-fluid img-markdown" /></p>
<p dir="auto">Рисунок 5</p>
<p dir="auto">Отлично! С библиотеками всё :)</p>
<h3>Шаг 3. Пишем скетч</h3>
<p dir="auto">Создадим в Arduino IDE новый скетч и сохраним его в той папке, где лежат файлы библиотеки из шага  1 (рис. 6).</p>
<p dir="auto"><img src="https://pp.userapi.com/c851016/v851016670/3b30f/0_e5Sdhubsk.jpg" alt="" class=" img-fluid img-markdown" /></p>
<p dir="auto">Рисунок 6</p>
<p dir="auto">Сразу подключим необходимые библиотеки и создадим необходимые переменные:</p>
<pre><code>#include &lt;M5Stack.h&gt;
#include "arduinoFFT.h"
#include "esp32_digital_led_lib.h"
arduinoFFT FFT = arduinoFFT();

#define SAMPLES 256 //Must be a power of 2
#define SAMPLING_FREQUENCY 10000 //Hz, must be 10000 or less due to ADC conversion time. Determines maximum frequency that can be analysed by the FFT.
#define amplitude 50
unsigned int sampling_period_us;
unsigned long microseconds;
byte peak[] = {0,0,0,0,0,0,0};
double vReal[SAMPLES];
double vImag[SAMPLES];
unsigned long newTime, oldTime;
strand_t m_sLeds = {.rmtChannel = 0, .gpioNum = 15, .ledType = LED_WS2812B_V3, .brightLimit = 32, .numPixels = 10, .pixels = nullptr, ._stateVars = nullptr};
</code></pre>
<p dir="auto">Для упрощенного обращения к LED BAR предлагаю использовать следующую функцию <strong>void ledBar(int R, int G, int B, int M)</strong>. Где <strong>int R</strong>, <strong>int G</strong>, <strong>int B</strong> - яркость КРАСНОГО, ЗЕЛЕНОГО и СИНЕГО - соответственно (от 0 до 255); <strong>int M</strong> - режим: от 0 до 9 - номер светодиода, 10 - все светодиоды из левой панели, 11 - все светодиоды из правой панели, 12 - все светодиоды.</p>
<p dir="auto">Светодиоды расположены по часовой стрелке (рис. 7).</p>
<p dir="auto"><img src="https://pp.userapi.com/c851016/v851016670/3b323/o1rDcZuddWk.jpg" alt="" class=" img-fluid img-markdown" /></p>
<p dir="auto">Рисунок 7</p>
<p dir="auto"><img src="https://pp.userapi.com/c851016/v851016670/3b35d/qKDXIzdVAYY.jpg" alt="" class=" img-fluid img-markdown" /></p>
<p dir="auto">Рисунок 7.1</p>
<pre><code>void ledBar(int R, int G, int B, int M) {
  if ((M &lt; 0) || (M &gt; 13)) return;
  if (M == 11) // right
  {
    for (int i = 0; i &lt; 5; i++)
    {
       m_sLeds.pixels[i] = pixelFromRGBW(R, G, B, 0);
    }
  }
  else if (M == 10) // left
  {
    for (int i = 5; i &lt; 10; i++)
    {
       m_sLeds.pixels[i] = pixelFromRGBW(R, G, B, 0);
    }
  }
  else if (M == 12) // all
  {
    for (int i = 0; i &lt; 10; i++)
    {
       m_sLeds.pixels[i] = pixelFromRGBW(R, G, B, 0);
    }
  }
  else
  {
     m_sLeds.pixels[M] = pixelFromRGBW(R, G, B, 0);
  }
  digitalLeds_updatePixels(&amp;m_sLeds);
}
</code></pre>
<p dir="auto">Основная часть. Не забывайте про <strong>void dacWrite(25, 0);</strong> чтобы динамик не издавал странных звуков и треска.</p>
<pre><code>void setup(){
  M5.begin();
  pinMode(25, OUTPUT);
  pinMode(34, INPUT);
  sampling_period_us = round(1000000 * (1.0 / SAMPLING_FREQUENCY));
  pinMode(15, OUTPUT);
  digitalWrite (15, LOW);
  if (digitalLeds_initStrands(&amp;m_sLeds, 1)) {
    Serial.println("Can't init LED driver().");
  }
  digitalLeds_resetPixels(&amp;m_sLeds);
}
</code></pre>
<p dir="auto">Обратите внимание на <strong>pinMode(34, INPUT)</strong> - это аналоговый вход, к которому подключён встроенный микрофон (рис. 8) через усилитель, поэтому настроим его на INPUT.</p>
<p dir="auto"><img src="https://pp.userapi.com/c851016/v851016670/3b375/Qa97V2tfKkk.jpg" alt="" class=" img-fluid img-markdown" /></p>
<p dir="auto">Рисунок 8</p>
<pre><code>void loop() {
  for (int i = 0; i &lt; SAMPLES; i++) {
    newTime = micros() - oldTime;
    oldTime = newTime;
    vReal[i] = analogRead(34); // A conversion takes about 1mS on an ESP8266
    vImag[i] = 0;
    while (micros() &lt; (newTime + sampling_period_us));  // do nothing to wait
  }
  
  FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
  FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD);
  FFT.ComplexToMagnitude(vReal, vImag, SAMPLES);
  dacWrite(25, 0);
  
  for (int i = 2; i &lt; (SAMPLES/2); i++){ // Don't use sample 0 and only first SAMPLES/2 are usable. Each array eleement represents a frequency and its value the amplitude.
    if (vReal[i] &gt; 200) { // Add a crude noise filter, 4 x amplitude or more
      if (i&lt;=5 )             displayBand(0,(int)vReal[i]/amplitude); // 125Hz
      if (i &gt;5   &amp;&amp; i&lt;=12 )  displayBand(1,(int)vReal[i]/amplitude); // 250Hz
      if (i &gt;12  &amp;&amp; i&lt;=32 )  displayBand(2,(int)vReal[i]/amplitude); // 500Hz
      if (i &gt;32  &amp;&amp; i&lt;=62 )  displayBand(3,(int)vReal[i]/amplitude); // 1000Hz
      if (i &gt;62  &amp;&amp; i&lt;=105 ) displayBand(4,(int)vReal[i]/amplitude); // 2000Hz
      if (i &gt;105 &amp;&amp; i&lt;=120 ) displayBand(5,(int)vReal[i]/amplitude); // 4000Hz
      if (i &gt;120 &amp;&amp; i&lt;=146 ) displayBand(6,(int)vReal[i]/amplitude); // 8000Hz
    }
  }
}
</code></pre>
<p dir="auto">Зажигать светодиоды будем с помощью функции <strong>void displayBand(int band, int dsize)</strong>. Где <strong>band</strong> - частота в сигнале; <strong>dsize</strong> - количество частоты в сигнале. Можете смело тут экспериментировать и добиваться лучших вспышек.</p>
<pre><code>void displayBand(int band, int dsize){
  if (band &gt; 1) dsize += 100;
  if (dsize &gt;= 150)
  {
    ledBar(0, 0, 0, 12);
    if (band == 0)
    {
      if (dsize &gt;= 300)
      {
        ledBar(255, 0, 0, 0);
        ledBar(255, 0, 0, 1);
      }
    }
    else if (band == 1)
    {
      if (dsize &gt;= 180)
      {
        ledBar(255, 255, 0, 3);
        ledBar(255, 255, 0, 4);
      }
    }
    else if (band == 2)
    {
      if (dsize &gt;= 170)
      {
        ledBar(0, 255, 0, 5);
        ledBar(0, 255, 0, 6);
      }
    }
    else
    {
      ledBar(0, 0, 255, 8);
      ledBar(0, 0, 255, 9);
    }
  }
}
</code></pre>
<h3>Завершающий шаг</h3>
<p dir="auto">На этом всё :)</p>
<h2>Downloads</h2>
<ul>
<li>Библиотека LED BAR (GitHub): <a href="https://github.com/MartyMacGyver/ESP32-Digital-RGB-LED-Drivers/tree/master/arduino-esp32/demo1" title="https://github.com/MartyMacGyver/ESP32-Digital-RGB-LED-Drivers/tree/master/arduino-esp32/demo1" target="_blank" rel="noopener noreferrer nofollow ugc">https://github.com/MartyMacGyver/ESP32-Digital-RGB-LED-Drivers/tree/master/arduino-esp32/demo1</a></li>
<li>Библиотека Arduino FFT (GitHub): <a href="https://github.com/kosme/arduinoFFT" title="https://github.com/kosme/arduinoFFT" target="_blank" rel="noopener noreferrer nofollow ugc">https://github.com/kosme/arduinoFFT</a></li>
</ul>
]]></description><link>https://community.m5stack.com/topic/401/урок-19-led-панель-микрофон-светомузыка</link><generator>RSS for Node</generator><lastBuildDate>Mon, 20 Apr 2026 10:00:41 GMT</lastBuildDate><atom:link href="https://community.m5stack.com/topic/401.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 07 Nov 2018 14:52:32 GMT</pubDate><ttl>60</ttl></channel></rss>