• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

скорость отображения на матрице WS2812

medved1977

New member
всем добрый день.
сразу прошу прощения за мой вопрос, но я только начал заниматься arduino и я очень далек от электроники, но могу повторить какой-то проект если все описао как для чайников. вопрос у меня вот в чем.
есть неких скетч, который выводит разную анимацию на матрицу из ws2812 у меня есть arduino nano и wemos d1 r1 mini
arduino я пытаюсь использовать в разных целях и как программатор и как тест плата для чего либо. вот попался под руку красивый скетч, на arduino все воспроизводится все хорошо, но для меня немного быстро, никак не пойму как снизить скорость отображения вывода на матрицу. если кто знает как снизить скорость вывода анимации, то прошу указать "чайнику".
второй вопрос. у меня ест wemos и я решил на нем все сделать, но как только залил прошивку, то оказалось, что изображение выводится рывками.
прошерстив интернет я понял, что в данном случае wemos забирает часть ресурсов на опрос wifi сети и все прочего. на данном сайте по адресу
было сказано как отключить wifi модуль, я попробовал встроить данные строки в код но у меня ничего не получилось.
прошу помочь в решение как отключить wifi модуль, но так что бы при последующей прошивке (например другим скетчем) у меня wifi модуль был активен.
внизу мой скетч с внесенными строками из предыдущей ссылки (есть комментарий). проблемма в том, что я не могу попробовать это реализовать, не компилируется скетч, выдает ошибку. помогите пожалуйста найти ее


// подключаемые библиотеки, ну так на всякий случай
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

// далее идет родной скетч

#include "FastLED.h" // FastLED library.

#if FASTLED_VERSION < 3001000
#error "Requires FastLED 3.1 or later; check github for latest code."
#endif

// Fixed definitions cannot change on the fly.
#define LED_DT 2 // Data pin to connect to the strip.
#define LED_CK 11
#define COLOR_ORDER BGR // It's GRB for WS2812B and BGR for APA102
#define LED_TYPE WS2811 // What kind of strip are you using (WS2801, WS2812B or APA102)?
#define NUM_LEDS 8*16 // Number of LED's.

// Initialize changeable global variables.
uint8_t max_bright = 250; // Overall brightness definition. It can be changed on the fly.

struct CRGB leds[NUM_LEDS]; // Initialize our LED array.

// Initialize global variables for sequences
uint8_t retard = 5; // A delay value for the sequence(s)
uint8_t valeur_teinte_pixels = 0; // Starting hue value.
int8_t rotation = 1; // Hue rotation speed. Includes direction.
uint8_t Changement_teinte_pixels = 1; // Hue change between pixels.
bool variable_direction = 0; // I use a direction variable instead of signed math so I can use it in multiple routines.


void setup()
//далее идет шесть строк по отключение wifi модуля
{
{
WiFi.persistent(false); //disable saving wifi config into SDK flash area
WiFi.forceSleepBegin(); //disable swAP & station by calling "WiFi.mode(WIFI_OFF)" & put modem to sleep
WiFi.softAPdisconnect(false); // отключить access point (AP)
WiFi.disconnect(false); // отключить stations (STA)
WiFi.forceSleepBegin(); //disable swAP & station by calling "WiFi.mode(WIFI_OFF)" & put modem to sleep // физический обесточить радио-модем
}


//Serial.begin(115200); // Initialize serial port for debugging.
//delay(1000); // Soft startup to ease the flow of electrons.

// LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS); // Use this for WS2812B
LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS); // Use this for WS2801 or APA102

FastLED.setBrightness(max_bright);
//set_max_power_in_volts_and_milliamps(5, 500); // FastLED 2.1 Power management set at 5V, 500mA

} // setup()



void loop () {

ChangeMe();

EVERY_N_MILLISECONDS(retard) { // FastLED based non-blocking delay to update/display the sequence.
rainbow_march();
}

FastLED.show();

} // loop()



void rainbow_march() { // The fill_rainbow call doesn't support brightness levels. You would need to change the max_bright value.

if (variable_direction == 0) valeur_teinte_pixels += rotation;
else valeur_teinte_pixels-= rotation; // I could use signed math, but 'variable_direction' works with other routines.
fill_rainbow(leds, NUM_LEDS, valeur_teinte_pixels, Changement_teinte_pixels); // I don't change Changement_teinte_pixels on the fly as it's too fast near the end of the strip.

} // rainbow_march()



void ChangeMe() { // A time (rather than loop) based demo sequencer. This gives us full control over the length of each sequence.

uint8_t secondHand = (millis() / 1000) % 60; // Change '60' to a different value to change length of the loop.
static uint8_t lastSecond = 99; // Static variable, means it's only defined once. This is our 'debounce' variable.

if (lastSecond != secondHand) { // Debounce to make sure we're not repeating an assignment.
lastSecond = secondHand;
switch(secondHand) {
case 0: rotation=1; Changement_teinte_pixels=5; break;
case 1: rotation=3; Changement_teinte_pixels=15; break;
case 2: rotation=6; Changement_teinte_pixels=25; break;
case 3: rotation=9; Changement_teinte_pixels=35; break;
//
case 4: rotation=3; Changement_teinte_pixels=5; break;
case 5: rotation=4; Changement_teinte_pixels=10; break;
case 6: rotation=5; Changement_teinte_pixels=15; break;
case 7: rotation=6; Changement_teinte_pixels=20; break;
//
case 10: rotation=5; break;
case 11: rotation=10; break;
case 12: rotation=15; break;
case 13: rotation=20; break;
//
case 15: rotation=5; variable_direction=-1; Changement_teinte_pixels=10; break;
case 16: rotation=6; variable_direction=-2; Changement_teinte_pixels=15; break;
case 17: rotation=7; variable_direction=-3; Changement_teinte_pixels=20; break;
case 18: rotation=8; variable_direction=-4; Changement_teinte_pixels=25; break;
case 19: rotation=9; variable_direction=-5; Changement_teinte_pixels=30; break;
//
case 20: Changement_teinte_pixels=30; break;
case 21: Changement_teinte_pixels=50; break;
case 22: Changement_teinte_pixels=70; break;
//
case 25: Changement_teinte_pixels=2; rotation=5; break;
case 26: Changement_teinte_pixels=5; rotation=15; break;
case 27: Changement_teinte_pixels=7; rotation=25; break;
case 30: break;
}
}

} // ChangeMe()
 

Юрий Ботов

Moderator
Команда форума
У меня все слету собралось. Ардуино 1.8.12. FastLED 3.3.3. Естественно эффектов не вижу за неимением матрицы.
Да. За скорость "перелива" отвечает переменная retard. Больше - медленнее.
Снизите скорость, оно и под вемосом меньше тормозить будет. А то сейчас каждые 5мс оно дергается.
 

medved1977

New member
У меня все слету собралось. Ардуино 1.8.12. FastLED 3.3.3. Естественно эффектов не вижу за неимением матрицы.
Да. За скорость "перелива" отвечает переменная retard. Больше - медленнее.
Снизите скорость, оно и под вемосом меньше тормозить будет. А то сейчас каждые 5мс оно дергается.
не получается увеличить скорость на wemos какие бы не устанавливал параметры изображение дергается
 

Юрий Ботов

Moderator
Команда форума
Я же тебе на бредборде все расписал. Увеличить скорость на вемосе не получится принципиально. Только снизить, и после достаточно серьезного снижения дерганья должны прекратиться.
 

enjoynering

Well-known member
Можно, но это не для начинающих. В сети сеть примеры использования I2S шины в DMA режиме для передачи данных в WS2812. Ничего не торомозит.
 
Сверху Снизу