Jump to content
Dan Smith

Нужна помощь в скетче к адресной ленте SK6812

Recommended Posts

Всем доброго времени суток. Нуждаюсь в помощи со скетчем к адресной ленте SK6812. Проект был собран на коленке временно, установлен на авто и работает уже несколько месяцев. Есть небольшой баг, который своими силами исправить не могу. На сегодняшний день этот проект перенесен на печатную плату, поправлены аппаратные неточности. А вот со скетчем беда. Проблема в том, что при опросе пинов, нужно установить задержки на исполнение тех или иных циклов программы. Всю необходимую информацию и скетч готов предоставить в личку, с подробным описанием проблемы.. Прошу откликнуться энтузиастов, понимающих и просто хороших людей. Сам не вывезу к сожалению..(

Share this post


Link to post
Share on other sites
45 минут назад, Dan Smith сказал:

в личку

Секретная инфа? Сюда выкладывай.


Я не раздаю удочки. Я продаю рыбу.

Share this post


Link to post
Share on other sites
38 минут назад, солар сказал:

Секретная инфа? Сюда выкладывай.

Да не секретная :)) Просто как показывает опыт, похейтят и дальше пойдут. А помочь никто не поможет)

/===========ИНИЦИАЛИЗИРУЕМ БИБЛИОТЕКИ=========================================================================
#include <Adafruit_NeoPixel.h>
#include <Adafruit_ADXL345_U.h>
//===========НАЗНАЧАЕМ ПИН ВЫХОДА НА ЛЕНТУ=====================================================================
const int PinLS = 12;
//===========НАЗНАЧАЕМ ПИНЫ ВХОДОВ=============================================================================
const int buttonPinD = 2;
const int buttonPinR = 4;
const int buttonPinL = 3;
const int buttonPinS = 5;

int buttonStateS = HIGH;
int buttonStateD = HIGH;
int buttonStateL = HIGH;
int buttonStateR = HIGH;
//===========ЗАДАЕМ ТАЙМИНГИ (НАСТРАИВАЮТСЯ ПО МЕСТУ МЕТОДОМ ПОДБОРА)==========================================
int pause_pov1 = 17;
int pause_pov2 = 175;
int ix;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(44, PinLS, NEO_GRB + NEO_KHZ800);
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);

void setup() {
//===========ИНИЦИАЛИЗИРУЕМ ВХОДЫ, ПОДТЯГИВАЕМ К ПЛЮСУ=========================================================
  pinMode(buttonPinS, INPUT_PULLUP);
  pinMode(buttonPinD, INPUT_PULLUP);
  pinMode(buttonPinL, INPUT_PULLUP);
  pinMode(buttonPinR, INPUT_PULLUP);
  strip.begin();
//===========ГАСИМ ЛЕНТУ=======================================================================================
  for (int i=0; i<44; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
  strip.show();
  accel.begin(); 
//===========ОГРАНИЧИВАЕМ ДИАПАЗОН ИЗМЕРЕНИЙ 4G================================================================
  accel.setRange(ADXL345_RANGE_4_G);
  accel.setDataRate(ADXL345_DATARATE_100_HZ);
}

void loop() {
  buttonStateS = digitalRead(buttonPinS);
  buttonStateL = digitalRead(buttonPinL);
  buttonStateR = digitalRead(buttonPinR);
  buttonStateD = digitalRead(buttonPinD);
//===========ЭКСТРЕННОЕ ТОРМОЖЕНИЕ=============================================================================
sensors_event_t event;
  accel.getEvent(&event);
  ix = event.acceleration.x;
if (buttonStateS == LOW && ix < 6){ //значение от 1 до 9 (чем выше цифра тем чувствительней датчик)
for (int is=0; is<15; is++ ) {
      for (int i=0; i<44; i++ ) strip.setPixelColor(i, strip.Color(240,0,0));
      strip.show();
      delay(10 + is*10);
      for (int i=0; i<44; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
      strip.show();
      delay(10 + is*3);
}}
//===========ОБЫЧНОЕ ТОРМОЖЕНИЕ================================================================================
else if (buttonStateS == LOW && buttonStateL == HIGH && buttonStateR == HIGH && buttonStateD == HIGH){
for (int i=0; i<44; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
    strip.show();
}
//===========ТОРМОЗ+ЗАДНИЙ ХОД=================================================================================
else if (buttonStateS == LOW && buttonStateL == HIGH && buttonStateR == HIGH && buttonStateD == LOW){
delay(50);
for (int i=0; i<10; i++ ) strip.setPixelColor(i, strip.Color(250,250,250));
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
for (int i=34; i<44; i++ ) strip.setPixelColor(i, strip.Color(250,250,250));
    strip.show();
    while(buttonStateS == LOW && buttonStateL == HIGH && buttonStateR == HIGH && buttonStateD == LOW){
        buttonStateS = digitalRead(buttonPinS);
        buttonStateL = digitalRead(buttonPinL);
        buttonStateR = digitalRead(buttonPinR);
        buttonStateD = digitalRead(buttonPinD);
      delay(50);}
}
//===========ТОРМОЗ+АВАРИЙКА+ЗАДНИЙ ХОД========================================================================
else if (buttonStateS == LOW && buttonStateL == LOW && buttonStateR == LOW && buttonStateD == LOW){
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
for (int il=0; il<10;  il++ ) {
       strip.setPixelColor(9-il, strip.Color(250,80,0));
       strip.setPixelColor(il+34, strip.Color(250,80,0));
       strip.show();
       delay(pause_pov1);
      }
      for (int il=0; il<11; il++ ) {
       strip.setPixelColor(9-il, strip.Color(0,0,0));
       strip.setPixelColor(il+34, strip.Color(0,0,0));
       strip.show();
       delay(pause_pov1);
      }
    delay(pause_pov2);
}
//===========ТОРМОЗ+ПРАВЫЙ+ЗАДНИЙ ХОД==========================================================================
else if (buttonStateS == LOW && buttonStateL == HIGH && buttonStateR == LOW && buttonStateD == LOW){
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
for (int i=34; i<44; i++ ) strip.setPixelColor(i, strip.Color(250,250,250));
for (int il=0; il<10; il++ ) {
        strip.setPixelColor(9-il, strip.Color(250,80,0));
        strip.show();
        delay(pause_pov1);
      }
     for (int il=0; il<11; il++ ) {
       strip.setPixelColor(9-il, strip.Color(0,0,0));
       strip.show();
       delay(pause_pov1);
     }
     delay(pause_pov2);
}
//===========ТОРМОЗ+ЛЕВЫЙ+ЗАДНИЙ ХОД===========================================================================
else if (buttonStateS == LOW && buttonStateL == LOW && buttonStateR == HIGH && buttonStateD == LOW){
for (int i=0; i<10; i++ ) strip.setPixelColor(i, strip.Color(250,250,250));
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
for (int il=0; il<10; il++ ) {
        strip.setPixelColor(il+34, strip.Color(250,80,0));
        strip.show();
        delay(pause_pov1);
       }
       for (int il=0; il<11; il++ ) {
        strip.setPixelColor(il+34, strip.Color(0,0,0));
        strip.show();
        delay(pause_pov1);
      }
      delay(pause_pov2);
}
//===========ЗАДНИЙ ХОД========================================================================================
else if (buttonStateS == HIGH && buttonStateL == HIGH && buttonStateR == HIGH && buttonStateD == LOW){  
for (int i=0; i<10; i++ ) strip.setPixelColor(i, strip.Color(250,250,250));
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
for (int i=34; i<44; i++ ) strip.setPixelColor(i, strip.Color(250,250,250));
    strip.show();
    while(buttonStateS == HIGH && buttonStateL == HIGH && buttonStateR == HIGH && buttonStateD == LOW){
        buttonStateS = digitalRead(buttonPinS);
        buttonStateL = digitalRead(buttonPinL);
        buttonStateR = digitalRead(buttonPinR);
        buttonStateD = digitalRead(buttonPinD);
      delay(50);}
}
//===========ТОРМОЗ+ЛЕВЫЙ======================================================================================
else if (buttonStateS == LOW && buttonStateL == LOW && buttonStateR == HIGH){
for (int i=0; i<34; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
for (int il=0; il<11; il++ ) {
        strip.setPixelColor(il+34, strip.Color(250,80,0));
        strip.show();
        delay(pause_pov1);
       }
       for (int il=0; il<11; il++ ) {
        strip.setPixelColor(il+34, strip.Color(0,0,0));
        strip.show();
        delay(pause_pov1);
      }
      delay(pause_pov2);
}
//===========ТОРМОЗ+ПРАВЫЙ=====================================================================================
else if (buttonStateS == LOW && buttonStateL == HIGH && buttonStateR == LOW){
for (int i=11; i<44; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
for (int il=0; il<11; il++ ) {
        strip.setPixelColor(9-il, strip.Color(250,80,0));
        strip.show();
        delay(pause_pov1);
      }
     for (int il=0; il<11; il++ ) {
       strip.setPixelColor(9-il, strip.Color(0,0,0));
       strip.show();
       delay(pause_pov1);
     }
     delay(pause_pov2);
}
//===========ПРАВЫЙ============================================================================================
else if (buttonStateS == HIGH && buttonStateL == HIGH && buttonStateR == LOW && buttonStateD == HIGH){
for (int i=11; i<44; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
for (int il=0; il<11; il++ ) {
        strip.setPixelColor(9-il, strip.Color(250,80,0));
        strip.show();
        delay(pause_pov1);
      }
     for (int il=0; il<11; il++ ) {
       strip.setPixelColor(9-il, strip.Color(0,0,0));
       strip.show();
       delay(pause_pov1);
     }
     delay(pause_pov2);
}
//===========ЛЕВЫЙ=============================================================================================
else if (buttonStateS == HIGH && buttonStateL == LOW && buttonStateR == HIGH && buttonStateD == HIGH){
for (int i=0; i<34; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
for (int il=0; il<11; il++ ) {
        strip.setPixelColor(il+34, strip.Color(250,80,0));
        strip.show();
        delay(pause_pov1);
       }
       for (int il=0; il<11; il++ ) {
        strip.setPixelColor(il+34, strip.Color(0,0,0));
        strip.show();
        delay(pause_pov1);
      }
      delay(pause_pov2);
}
//===========ЛЕВЫЙ+ЗАДНИЙ ХОД==================================================================================
else if (buttonStateS == HIGH && buttonStateL == HIGH && buttonStateR == LOW && buttonStateD == LOW){
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
for (int i=34; i<44; i++ ) strip.setPixelColor(i, strip.Color(250,250,250));
for (int il=0; il<11; il++ ) {
        strip.setPixelColor(9-il, strip.Color(250,80,0));
        strip.show();
        delay(pause_pov1);
       }
       for (int il=0; il<10; il++ ) {
        strip.setPixelColor(9-il, strip.Color(0,0,0));
        strip.show();
        delay(pause_pov1);
      }
      delay(pause_pov2);
}
//===========ПРАВЫЙ+ЗАДНИЙ ХОД=================================================================================
else if (buttonStateS == HIGH && buttonStateL == LOW && buttonStateR == HIGH && buttonStateD == LOW){
for (int i=0; i<10; i++ ) strip.setPixelColor(i, strip.Color(250,250,250));
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
for (int il=0; il<10; il++ ) {
        strip.setPixelColor(il+34, strip.Color(250,80,0));
        strip.show();
        delay(pause_pov1);
      }
     for (int il=0; il<11; il++ ) {
       strip.setPixelColor(il+34, strip.Color(0,0,0));
       strip.show();
       delay(pause_pov1);
     }
     delay(pause_pov2);
}
//===========АВАРИЙКА==========================================================================================
else if (buttonStateS == HIGH && buttonStateL == LOW && buttonStateR == LOW){
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
for (int il=0; il<10;  il++ ) {
       strip.setPixelColor(9-il, strip.Color(250,80,0));
       strip.setPixelColor(il+34, strip.Color(250,80,0));
       strip.show();
       delay(pause_pov1);
      }
      for (int il=0; il<11; il++ ) {
       strip.setPixelColor(9-il, strip.Color(0,0,0));
       strip.setPixelColor(il+34, strip.Color(0,0,0));
       strip.show();
       delay(pause_pov1);
      }
    delay(pause_pov2);
}
//===========АВАРИЙКА+ТОРМОЗ================+==================================================================
else if (buttonStateS == LOW && buttonStateL == LOW && buttonStateR == LOW){
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
for (int il=0; il<10;  il++ ) {
       strip.setPixelColor(9-il, strip.Color(250,80,0));
       strip.setPixelColor(il+34, strip.Color(250,80,0));
       strip.show();
       delay(pause_pov1);
      }
      for (int il=0; il<11; il++ ) {
       strip.setPixelColor(9-il, strip.Color(0,0,0));
       strip.setPixelColor(il+34, strip.Color(0,0,0));
       strip.show();
       delay(pause_pov1);
      }
    delay(pause_pov2);
}
//===========ГАСИМ ЛЕНТУ=======================================================================================
else
{
    for (int i=0; i<44; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
    strip.show();
    delay(10);
}
}

В общем проблема такая. При работе аварийки, поворотники очень часто "перемаргиваются" (т.е. вместо нормально бегущих огней в разные стороны, начинаются симофоры то влево то вправо ) Это объясняется тем, что сигналы к штатным лампам (с которых берется сигнал на ардуино) во время работы аварийки приходят несинхронно. Следственно скетч выполняет команду от того поворотника, с которого сигнал приходит первым. Не могу понять как в опрос поворотников запилить задержку таким образом, чтобы скетч какое-то время ждал сигнал от "неуспевшего дать импульс" поворотника и выполнял программу аварийки. 

Edited by Falconist

Share this post


Link to post
Share on other sites

Wolfspeed раскрывает секреты прорывных технологий в силовой электронике

Компания Wolfspeed предлагает разработчикам стать частью новой истории и проверить самостоятельно все преимущества компонентов с широкой запрещённой зоной. Представляем вашему вниманию подборку материалов по теме SiC MOSFET, SiC-диодов и их применениям.

Подробнее

38 минут назад, Dan Smith сказал:

//===========ЗАДАЕМ ТАЙМИНГИ (НАСТРАИВАЮТСЯ ПО МЕСТУ МЕТОДОМ ПОДБОРА)==========================================

int pause_pov1 = 17;

int pause_pov2 = 175;

Попробуйте изменить эти переменные в сторону увеличения или уменьшения. 

Share this post


Link to post
Share on other sites

Пружинные клеммники Degson - высокое качество соединения по оптимальной цене!

Пружинные клеммные блоки Degson для монтажа на печатную плату – это простое и надежное соединение, которое позволяет легко решать задачи для различных приложений за счет обширного ассортимента. Клеммники Degson доступны в двух конструктивных исполнениях (торцевой контакт и зажимная клеть), имеют различные направления ввода проводника (45°, 90°, 180°) и обладают широким диапазоном поперечных сечений (0,2…2,5 мм2).

Подробнее

4 минуты назад, Виталий Белый сказал:

Попробуйте изменить эти переменные в сторону увеличения или уменьшения.

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

Edited by Dan Smith

Share this post


Link to post
Share on other sites

BlueNRG-LP для передачи данных в диапазоне 2,4 ГГц без BLE

В статье представлен набор базовых примеров основных аспектов работы радиотракта в проприетарном режиме, что позволяет создавать на их основе собственные более сложные проекты. Описан режим обновления и типичный сценарий прошивки «по воздуху» OTA для проприетарного режима. Примеры приведены для сред разработки IAR Embedded Workbench for ARM и KEIL uVision 5 for ARM.

Подробнее

По простецки видится так
 

if ( buttonStateR == HIGH || buttonStateL == HIGH ) {
Delay(XXX);
buttonStateL = digitalRead(buttonPinL);  
buttonStateR = digitalRead(buttonPinR);
}

Всавить перед  //===========ЭКСТРЕННОЕ ТОРМОЖЕНИЕ=====
ХХХ подобрать экспериментально от меньшего к большему
Не оптимизировано!!!! Вносит задержку!!!!! Ну и т.д.

Share this post


Link to post
Share on other sites

Пилюлькин, большущее спасибо, выручил. Подправил код, все теперь работает как надо. Сразу не ответил, так как получил банан на сутки))) Теперь внимательнее буду читать правила)

Edited by Dan Smith

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • @maverick5334 Кто-то жаловался на нагрев при зараядке, а так идеальный вариант если 5в 1а хватит.
    • Попробуй. Линейный плох тем, что при снижении питания ниже "запаса" - перестаёт стабилизировать ток и может или "закрыться", или просто будет "отъедать" те-же пару Вольт по питанию...  Нелинейно уменьшая яркость...
    • Так я и хотел на 317 сделать, добавив резистор 2 Ом. - те 60 мА и будет.
    • @IMXO Мы же за все платим. За удобство, набор функций, отмытые платы, гарантии, схемные решения которые в случае гибели прибора не унесут его целиком в могилу, за термостабильность, за стабильность параметров во времени, надежность, ударопрочность, угол обзора, размер цифр на экране, разрядность и много чего еще. Каждый выбирает, то что ему по карману и обеспечивает потребности. Например, для меня оттереть плату не самое страшное... Закупился галошей и тру все что запачкано. А вот платить за термопару которую я потеряю через месяц, платить не хочу. 
    • Самому стало интересно. Я не поленился и привёз из гаража свою старую стрелочную "Цэшку". На разных пределах измерений показания немного отличаются из-за разных входных сопротивлений. На пределе ~60В показало чуть больше 40В, а на пределе измерения тока ~0,6мА показало прим. 0,4мА. Один щуп цеплялся к винту корпуса ЭВМ, другой на краник батареи центрального отопления.    Относителььно ТВ-кабельной земли то-же самое. Ничего опасного и страшного, но БП бывают разные...
    • Если при питании в 14 - ограничишь ток до 60 мА, получишь на нагрузке те-же 12...  А, если ставить линейный стабилизатор тока (на той-же LM-ке), то по питанию нужен будет "запас" минимум в пару Вольт... 
×
×
  • Create New...