Отказ от delay()

RustG
Offline
Зарегистрирован: 25.11.2017

arduino328 пишет:

RustG пишет:

Направьте, плиз, в нужном направлении.

void BlinkRed() {
  for (int i = 0; i < Quant ; i++) {
    setPixel(i, 0, 0, 0);  // Выключен
  }
  FastLED.show();
  delay(200);

  for (int i = 0; i < Quant ; i++) {
    setPixel(i, 255, 0, 0);  // Красный
  }
  FastLED.show();
  delay(150);
)

 

Это уже есть в моем скетче... Только с поправкой на фильтр по матрице... Не то...

RustG
Offline
Зарегистрирован: 25.11.2017

kalapanga пишет:

Вы, код-то напишите, сюда его выложите. И опишите поведение Ваших светодиодов с этим кодом, что получилось и что не устраивает. Без этого сложно что-то советовать, не видя результат.

Так в 45 посте вроде выложил....

arduino328
Offline
Зарегистрирован: 01.09.2016

RustG пишет:

Это уже есть в моем скетче... Только с поправкой на фильтр по матрице... Не то...

В твоём коде FastLED.show(); вызывается в цикле после установки цвета каждого светодиода.
Если не понимаешь как работает лента и библиотеки к ней, то тогда не мучайся и выброси её.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Я имел ввиду код без delay. Но кстати, если это и вся Ваша задача, то и фиг с ним с делаем-то. Вариант arduino328 попробуйте, ну с проверкой красного конечно. Он отличается тем, что и я писал. show делается не после каждого светодиода, а один раз после цикла. Если что-то не так - опишите что.

RustG
Offline
Зарегистрирован: 25.11.2017

arduino328 пишет:

В твоём коде FastLED.show(); вызывается в цикле после установки цвета каждого светодиода.

В моем коде шоу вызывается первый раз в конце установки цветов в цикле сетап, а потом уже при моргании только для красных(включил красный - show, выключил - снова show)/ Если поставить его один раз в конце цикла, то установится только последнее значение и никакого моргания не происходит.

arduino328 пишет:

Если не понимаешь как работает лента и библиотеки к ней, то тогда не мучайся и выброси её.

Выбросить всегда можно, а вот учиться использовать никогда не поздно. Учусь на своих (да и чужих) ошибках, набиваю шишки. Но когда надо, буду мучить тему, пока не познаю. Поэтому и не прошу написать скетч, а подсказать и посоветовать. Дайте удочку, а уж рыбу попробуем сами поймать...

RustG
Offline
Зарегистрирован: 25.11.2017

kalapanga пишет:

Если что-то не так - опишите что.

Без делая красный горит постоянно...

unsigned long currentMillis = millis(); // текущее время в миллисекундах

    if ((PointMap[i] == 0) && (currentMillis - previousMillis >= OnTime)) {
      previousMillis = currentMillis; // запоминаем момент времени
      setPixel(i, 255, 0, 0);//Включен
    }
    else {
      if ((PointMap[i] == 0) && (currentMillis - previousMillis >= OffTime)) {
      previousMillis = currentMillis; // запоминаем момент времени
      setPixel(i, 0, 0, 0);//Выключен
  
    }
  }
 FastLED.show(); 
  
 }

Вот такой кусок на Blink

dizzel
Offline
Зарегистрирован: 21.03.2016

А как вам такой вариант?

void timer(uint16_t period) {
  uint32_t timer = 0;
  timer = millis();
  do {
    .....
  } while (millis() - timer < period);
}

 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

а это шо должно быть?  замена delay на другой delay?

RustG
Offline
Зарегистрирован: 25.11.2017

dizzel пишет:

А как вам такой вариант?

Попробую его вечером дома. На работе только в IDE могу проверить компиляцию, а реальное подключение вечером...

kalapanga
Offline
Зарегистрирован: 23.10.2016

Цитата:

Вот такой кусок на Blink

Ну уж совсем кусок. Хотя бы функцию-то уж целиком вставили, чтобы со скобками всё понятно было. А не работает потому, что Вам нужно запоминать состояние включены или выключены. В зависимости от состояния проверять либо то либо другое время, ну и когда пора то менять состояние и запоминать его.

И Вы не написали, попробовали ли вариант с delay от arduino328. Он должен работать. Если работает как-то не так, то интересно, а как?

И да, красные у Вас вроде единички были, а не нули?

RustG
Offline
Зарегистрирован: 25.11.2017

DetSimen пишет:

а это шо должно быть?  замена delay на другой delay?

Делэй в работе с WS28** очень нежелателен, так как он подразумевает поочередное выполнение программы, а это соответственно неодновременное мигание модулей.

RustG
Offline
Зарегистрирован: 25.11.2017

kalapanga пишет:

И Вы не написали, попробовали ли вариант с delay от arduino328. Он должен работать.

Пробовал, с учетом цвета , мигают поочередно, а надо чтоб так : Горят все своими цветами, а красные в это время синхронно моргают..

В дальнейшем должны будут реализовываться различные режимы мигания (1 раз в секунду, 2 раза, три раза...)

kalapanga пишет:

И да, красные у Вас вроде единички были, а не нули?

Это пока пробные скетчи для отработки режима, так что какие цвета на какую цифру - пока не актуально...

 

RustG
Offline
Зарегистрирован: 25.11.2017

kalapanga пишет:

Ну уж совсем кусок. Хотя бы функцию-то уж целиком вставили, чтобы со скобками всё понятно было.

На работу ноут не взял, поэтому полного скетча нет, чтоб показать его весь... Вечером выложу, но по работе - красные просто горят постоянно..

RustG
Offline
Зарегистрирован: 25.11.2017

arduino328 пишет:

RustG пишет:

Направьте, плиз, в нужном направлении.

void BlinkRed() {
  for (int i = 0; i < Quant ; i++) {
    setPixel(i, 0, 0, 0);  // Выключен
  }
  FastLED.show();
  delay(200);

  for (int i = 0; i < Quant ; i++) {
    setPixel(i, 255, 0, 0);  // Красный
  }
  FastLED.show();
  delay(150);
)

 

Прошу прощения, не разглядел ночером... Получается цикл зажигания прошел - фастлед, потом цикл гашения всех прошел - фаст лед... Сорри, должно получиться... Чуток ступил...

kalapanga
Offline
Зарегистрирован: 23.10.2016

RustG пишет:

Прошу прощения, не разглядел ночером... Получается цикл зажигания прошел - фастлед, потом цикл гашения всех прошел - фаст лед... Сорри, должно получиться... Чуток ступил...

Вот-вот именно это и проверьте. Не должно в этом случае видимого рассинхрона возникать. А уж заменять delay на millis или нет это потом решите по необходимости.

RustG
Offline
Зарегистрирован: 25.11.2017

Спасибо))) Все попробую, отпишусь.

arduino328
Offline
Зарегистрирован: 01.09.2016

RustG пишет:

Прошу прощения, не разглядел ночером... Получается цикл зажигания прошел - фастлед, потом цикл гашения всех прошел - фаст лед... Сорри, должно получиться... Чуток ступил...

С лентами стандартно только так и работают: сначала выставляются все значения светодиодов, затем показ всего всего массива ленты.

RustG
Offline
Зарегистрирован: 25.11.2017
#include "FastLED.h"          // библиотека для работы с лентой

#define Quant 50 // число светодиодов в ленте
#define PIN 6 // назначаем управляющий лентой пин.
struct CRGB leds[Quant];
int PointMap[] = {0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 1, 4, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 1, 4, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 1};

void setup()
{
  Serial.begin(9600);              // открыть порт для связи

  FastLED.addLeds<WS2812B, PIN, RGB>(leds, Quant);  // настройки для нашей ленты (ленты на WS2811, WS2812, WS2812B)
  FastLED.show();                     // отослать команду
  delay(1000);

  for (int i = 0; i < Quant; i++) {
    if (PointMap[i] == 1) {
      setPixel(i, 255, 0, 0); //Красный
    }
    else {
      if (PointMap[i] == 2) {
        setPixel(i, 0, 0, 255); //синий
      }
      else {
        if (PointMap[i] == 3) {
          setPixel(i, 255, 255, 0); //желтый
        }
        else {
          if (PointMap[i] == 4) {
            setPixel(i, 255, 0, 255); //Фиолетовый
          }
          else {
            if (PointMap[i] == 5) {
              setPixel(i, 255, 255, 255); //Белый
            }
            else {
              if (PointMap[i] == 0) {
                setPixel(i, 0, 255, 0);//Зеленый
              }
            }
          }
        }
      }
    }
  }

  FastLED.show();                     // отослать команду
}
void loop() {

  for (int i = 0; i < Quant ; i++) {
    if (PointMap[i] == 1) {
      setPixel(i, 0, 0, 0);//Выключен
    }
  }
  FastLED.show();
  delay(200);
  for (int i = 0; i < Quant ; i++) {
    if (PointMap[i] == 1) {
      setPixel(i, 255, 0, 0);//Включен
    }
  }
  FastLED.show();
  delay(200);
}
//----------------------------setPixel-------------------------------------//
void setPixel(int i, byte red, byte green, byte blue) {
  leds[i].r = red;
  leds[i].g = green;
  leds[i].b = blue;
}

Да!!! Оказывается просто тупил и зажигал ленту рано... Спасибо всем большое. Теперь пока на этом этапе и millis() не нужно мучить.... Еще раз всем огромное спасибо за помощь. Извиняйте, если сильно тупил)))))