бегущий поворотник на ленте ws2812

umaksq
Offline
Зарегистрирован: 07.08.2018

Здравствуйте, может кто знает как сменить направление загорания светодиодов и их плавное тушение в библиотеке neopixel? Есть часть скетча с работой поворотника, что здесь необходимо изменить?if (digitalRead(5) == LOW and digitalRead(6) == HIGH)
{
// включается один поворотник
for(int k = 0; k < 3; k++)
{
// цикл до трех - сигнал "перестроения" , при кратковременном включении мигает 3 раза,
for(int i = 0; i < count+1; i++)
{
for(int j = 0; j < i; j++)
{
if ((digitalRead(5) == LOW) and (digitalRead(6) == HIGH))
{
k = 0;
}
strip.setPixelColor(j, strip.Color(255, 69, 0)); // R=255, G=0, B=0 — цвет светодиода
}
delay(60);
strip.show();
}
for(int i = 0; i < count+3; i++)
{
for(int j = 0; j < i; j++)
{
// в этом цикле плавно тушим предыдущий светодиод, делаем его наполовину тусклее, чтобы движение было плавнее
strip.setPixelColor(j-2, strip.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
strip.setPixelColor(j-1, strip.Color(63, 17, 0)); // R=255, G=0, B=0 — цвет светодиода
strip.setPixelColor(j, strip.Color(127, 34, 0)); // R=255, G=0, B=0 — цвет светодиода
}
delay(60);
strip.show();
}

}
}

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

umaksq пишет:
что здесь необходимо изменить?
Необходимо изенить подход к делу. Например, прежде, чем постить на форум, хоть немного с ним ознакомиться.

Пока Вы не сделаете вот это, вероятность того, что в теме будет что-нибудь, кроме глума и флуда, конечно, не нулевая, но крайне мала.

umaksq
Offline
Зарегистрирован: 07.08.2018
if (digitalRead(5) == LOW and digitalRead(6) == HIGH) 
    { 
      // включается один поворотник 
      for(int k = 0; k < 3; k++)
      {  
        // цикл до трех - сигнал "перестроения" , при кратковременном включении мигает 3 раза,
        for(int i = 0; i < count+1; i++)
        {
          for(int j = 0; j < i; j++)  
          {
            if ((digitalRead(5) == LOW) and (digitalRead(6) == HIGH)) 
              {
                k = 0;
              }
              strip.setPixelColor(j, strip.Color(255, 69, 0)); // R=255, G=0, B=0 — цвет светодиода
          }
          delay(60);
          strip.show();
        }
        for(int i = 0; i < count+3; i++)
        {
          for(int j = 0; j < i; j++)
          { 
            // в этом цикле плавно тушим предыдущий светодиод, делаем его наполовину тусклее, чтобы движение было плавнее
            strip.setPixelColor(j-2, strip.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
            strip.setPixelColor(j-1, strip.Color(63, 17, 0)); // R=255, G=0, B=0 — цвет светодиода
            strip.setPixelColor(j, strip.Color(127, 34, 0)); // R=255, G=0, B=0 — цвет светодиода
          }
          delay(60);
          strip.show();
        }
          
      }
    }

Тысяча слов прощения!!! С смартфона по другому-не отправляется.

mixail844
Offline
Зарегистрирован: 30.04.2012

if (digitalRead(5) == HIGH and digitalRead(6) == LOW)  // исправление 1 : если это контакты поворота
    { 
      // включается один поворотник 
      for(int k = 0; k < 3; k++)
      {  
        // цикл до трех - сигнал "перестроения" , при кратковременном включении мигает 3 раза,
        for(int i = 0; i < count+1; i++)
        {
          for(int j = i; j > 0 ; j--)   // исправление 3 : нисходящий цикл
          {
            if ((digitalRead(5) == HIGH) and (digitalRead(6) == LOW)) // исправление 2 : если это контакты поворота
              {
                k = 0;
              }
              strip.setPixelColor(j, strip.Color(255, 69, 0)); // R=255, G=0, B=0 — цвет светодиода
          }
          delay(60);
          strip.show();
        }
        for(int i = 0; i < count+3; i++) //исправление 4 : нисходящий цикл
        {
          for(int j = i; j > 0; j--)
          { 
            // в этом цикле плавно тушим предыдущий светодиод, делаем его наполовину тусклее, чтобы движение было плавнее
            strip.setPixelColor(j-2, strip.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
            strip.setPixelColor(j-1, strip.Color(63, 17, 0)); // R=255, G=0, B=0 — цвет светодиода
            strip.setPixelColor(j, strip.Color(127, 34, 0)); // R=255, G=0, B=0 — цвет светодиода
          }
          delay(60);
          strip.show();
        }
          
      }
    }

всего скетча не видно ,поэтому гарантировать ничего не буду . 

да и схему подключения тоже вы не выложили

umaksq
Offline
Зарегистрирован: 07.08.2018

Спасибо большое, попробую таким образом.

umaksq
Offline
Зарегистрирован: 07.08.2018
#include <Adafruit_NeoPixel.h>             // подключаем библиотеку
int count=72; // количество диодов на одной фаре 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(count, 7, NEO_GRB + NEO_KHZ800); //Инициализируем первый поворотник на 7 цифровом выходе
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(count, 8, NEO_GRB + NEO_KHZ800);//Инициализируем второй поворотник на 8 цифровом выходе
void setup() 
{
  pinMode(3, INPUT); 
  pinMode(4, INPUT);
  pinMode(5, INPUT); 
  pinMode(6, INPUT);
  strip.begin();
  strip.show(); 
  strip2.begin();
  strip2.show();
}
void loop() 
{
   {
    if ((digitalRead(5) == HIGH) and (digitalRead(6) == HIGH)) 
    { 
      //Режим аварийной сигнализации, если на 5 и 6 пин приходит плюс
      for(int k = 0; k < 3; k++)
      {  
        // цикл до трех - сигнал "перестроения" , при кратковременном включении мигает 3 раза,
        for(int i = 0; i < count+1; i++)
        {
          for(int j = 0; j < i; j++)
          {
            if ((digitalRead(5) == HIGH) and (digitalRead(6) == HIGH)) 
            {
              k = 0; // если во время мигания поворотника получаем еще плюcовой сигнал, то обнуяем счетчик, чтобы поворотник мигал еще как минимум 3 раза
            } 
            strip.setPixelColor(j, strip.Color(255, 69, 0)); // R=255, G=0, B=0 — цвет светодиода
            strip2.setPixelColor(j, strip2.Color(255, 69, 0)); // R=255, G=0, B=0 — цвет светодиода
          }
          delay(60);
          strip.show();
          strip2.show();
        }
        for(int i = 0; i < count+3; i++)
        {
          for(int j = 0; j < i; j++)
          {
            // в этом цикле плавно тушим предыдущий светодиод, делаем его наполовину тусклее, чтобы движение было плавнее
            strip.setPixelColor(j-2, strip.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
            strip.setPixelColor(j-1, strip.Color(63, 17, 0)); // R=255, G=0, B=0 — цвет светодиода
            strip.setPixelColor(j, strip.Color(127, 34, 0)); // R=255, G=0, B=0 — цвет светодиода
            strip2.setPixelColor(j-2, strip2.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
            strip2.setPixelColor(j-1, strip2.Color(63, 17, 0)); // R=255, G=0, B=0 — цвет светодиода
            strip2.setPixelColor(j, strip2.Color(127, 34, 0)); // R=255, G=0, B=0 — цвет светодиода
          }
          delay(60);
          strip.show();
          strip2.show();
        }
      }
    }
              
    if (digitalRead(5) == LOW and digitalRead(6) == HIGH) 
    { 
      // включается один поворотник 
      for(int k = 0; k < 3; k++)
      {  
        // цикл до трех - сигнал "перестроения" , при кратковременном включении мигает 3 раза,
        for(int i = 0; i < count+1; i++)
        {
          for(int j = 0; j < i; j++)  
          {
            if ((digitalRead(5) == LOW) and (digitalRead(6) == HIGH)) 
              {
                k = 0;
              }
              strip.setPixelColor(j, strip.Color(255, 69, 0)); // R=255, G=0, B=0 — цвет светодиода
          }
          delay(60);
          strip.show();
        }
        for(int i = 0; i < count+3; i++)
        {
          for(int j = 0; j < i; j++)
          { 
            // в этом цикле плавно тушим предыдущий светодиод, делаем его наполовину тусклее, чтобы движение было плавнее
            strip.setPixelColor(j-2, strip.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
            strip.setPixelColor(j-1, strip.Color(63, 17, 0)); // R=255, G=0, B=0 — цвет светодиода
            strip.setPixelColor(j, strip.Color(127, 34, 0)); // R=255, G=0, B=0 — цвет светодиода
          }
          delay(60);
          strip.show();
        }
          
      }
    }
    if (digitalRead(5) == HIGH and digitalRead(6) == LOW) 
    { // включаем второй поворотник
      for(int k = 0; k < 3; k++)
      {  
        // цикл до трех - сигнал "перестроения" , при кратковременном включении мигает 3 раза,  
        for(int i = 0; i < count+1; i++)
        {
          for(int j = 0; j < i; j++)
          {
            if ((digitalRead(5) == HIGH) and (digitalRead(6) == LOW)) 
            {
              k = 0;
            }
            strip2.setPixelColor(j, strip2.Color(255, 69, 0)); // R=255, G=0, B=0 — цвет светодиода
          }
          delay(60);
          strip2.show();
        }
        for(int i = 0; i < count+3; i++)
        {
          for(int j = 0; j < i; j++)
          { 
            // в этом цикле плавно тушим предыдущий светодиод, делаем его наполовину тусклее, чтобы движение было плавнее
            strip2.setPixelColor(j-2, strip2.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
            strip2.setPixelColor(j-1, strip2.Color(63, 17, 0)); // R=255, G=0, B=0 — цвет светодиода
            strip2.setPixelColor(j, strip2.Color(127, 34, 0)); // R=255, G=0, B=0 — цвет светодиода
          }
          delay(60);
          strip2.show();
        }
      }
    }
    if (digitalRead(3) == HIGH) 
    { 
      // режим спецсигналов, если на 3 пин подаем плюс
      for(int j = 0; j < 16; j++) 
      {
        for(int i = 0; i < count; i++) 
        {
          strip.setPixelColor(i, strip.Color(255, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
          strip2.setPixelColor(i, strip2.Color(0, 0, 255)); // R=255, G=0, B=0 — цвет светодиода
        }
        strip.show();
        strip2.show();
        delay(20);
        for(int i = 0; i < count; i++)
        {
          strip.setPixelColor(i, strip.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
          strip2.setPixelColor(i, strip2.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
        }
        strip.show();
        strip2.show();
        delay(20);
      }
      for(int j = 0; j < 16; j++) 
      {
        for(int i = 0; i < count; i++) 
        {
        strip.setPixelColor(i, strip.Color(0, 0, 255)); // R=255, G=0, B=0 — цвет светодиода
        strip2.setPixelColor(i, strip2.Color(255, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
        }
        strip.show();
        strip2.show();
        delay(20);
        for(int i = 0; i < count; i++)
        {
          strip.setPixelColor(i, strip.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
          strip2.setPixelColor(i, strip2.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
        }
        strip.show();
        strip2.show();
        delay(20);
      }
    }
    if (digitalRead(4) == HIGH) 
    { 
      // Режим стробоскова, если на 4 пин подаем питание
      for(int j = 0; j < 24; j++) 
      {
        for(int i = 0; i < count; i++) 
        {
        strip.setPixelColor(i, strip.Color(255, 255, 255)); // R=255, G=0, B=0 — цвет светодиода
        strip2.setPixelColor(i, strip2.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
        }
        strip.show();
        strip2.show();
        delay(15);
        for(int i = 0; i < count; i++)
        {
          strip.setPixelColor(i, strip.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
          strip2.setPixelColor(i, strip2.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
        }
        strip.show();
        strip2.show();
        delay(15);
      }
      for(int j = 0; j < 24; j++) 
      {
        for(int i = 0; i < count; i++) 
        {
          strip.setPixelColor(i, strip.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
          strip2.setPixelColor(i, strip2.Color(255, 255, 255)); // R=255, G=0, B=0 — цвет светодиода
        }
        strip.show();
        strip2.show();
        delay(15);
        for(int i = 0; i < count; i++)
        {
          strip.setPixelColor(i, strip.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
          strip2.setPixelColor(i, strip2.Color(0, 0, 0)); // R=255, G=0, B=0 — цвет светодиода
        }
        strip.show();
        strip2.show();
        delay(15);
      }
    }
    if( digitalRead(3) == LOW and digitalRead(5) == LOW and digitalRead(6) == LOW and digitalRead(9) == LOW) 
    { 
      for(int i = 0; i < count+1; i++)
      { 
        // Зажигаем ходовые огни, если нетниодного сигнала
        strip.setPixelColor(i, strip.Color(255, 255, 255));
        strip2.setPixelColor(i, strip2.Color(255, 255, 255));
      }
      strip.show();
      strip2.show();
    }
  }
}

К сожалению, направление зажигания светодиодов не изменилось, выкладываю полный исходный скетч.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, пустите в строке #111 итератор не от нуля до максимума, например, а от максимума до нуля.

igorS85
Offline
Зарегистрирован: 09.11.2020

Добрый день. Прошу не судить строго за мой вопрос. У меня собраны поворотники по точно такой же схеме, как у автора, с теми же номиналами сопротивлений. При подключении от блока питания в 12в, всё работает отлично. При подключении в цепь автомобиля сгорает ардуинка. Питание ардуино через понижающий DC-DC до 5В, питание лент отдельно от таких же понижаек. В чем может быть подвох? Может сопротивления не справляются и нужно добавить стабилитроны в цепи входящих +12в?

b707
Offline
Зарегистрирован: 26.05.2017

igorS85 пишет:

В чем может быть подвох? Может сопротивления не справляются и нужно добавить стабилитроны в цепи входящих +12в?

Резисторы 47 К и 100К на схеме перепутаны местами.

Вы считать-то умееете? Не пробовали прикинуть, какое напряжение приходит на пины ардуино, например, с кнопки стробоскопа по такой схеме?

 

А еще лучше - переделать схему, чтобы кнопки замыкались не на +12в, а на массу.

 

igorS85
Offline
Зарегистрирован: 09.11.2020

По резисторам наоборот тоже пробовал, все-равно ардуинка мрет и все тут, уже 3 платы умерли. Кнопок у меня вообще нет, 2 плюса входящих от поворотов и 1 плюс от замка зажигания на управление включением ходовых огней.

b707
Offline
Зарегистрирован: 26.05.2017

igorS85 пишет:

По резисторам наоборот тоже пробовал

вместо того чтоб тупо "пробывать" - посчитать не судьба?

Цитата:
все-равно ардуинка мрет и все тут

значит надо делать развязку на оптопарах,  в бортовой сети авто могут гулять импульсы в десятки вольт

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

igorS85 пишет:

мрет и все тут

Думаю, что вот это поможет - https://techno-mind.ru/elektronika-i-soft/pitanie-chuvstvitelnoj-elektroniki-ot-bortovoj-seti-legkovogo-avtomobilya.html

igorS85
Offline
Зарегистрирован: 09.11.2020

Извиняйте, если что не так, просто я не очень силен в электронике, поэтому и решил спросить у специалистов. Спасибо большое всем за советы, обязательно ими воспользуюсь)

MaksVV
Offline
Зарегистрирован: 06.08.2015

5В по схеме подаете на Vin ардуины. Тоже неверно. Это нужно подавать на контакт 5V ардуины. 

apg_777
Offline
Зарегистрирован: 22.09.2020

igorS85 пишет:

Может сопротивления не справляются и нужно добавить стабилитроны в цепи входящих +12в?

Не в цепи 12в, а вместо резисторов на 100к. На 3.9 вольта должно хватить.