Долго думает Arduino UNO

mantiss
Offline
Зарегистрирован: 18.10.2014

Написал тут код для подсветки дисков в машине. Лента светодиодная, RGB. В зависимости от ситуации она светит разными цветами. 6 выходов для управления лентой, 3 входа для считывания стоп-сигнала и 2х поворотников(буду брать 5 в с реле или как-то там..).

Подключил пока РГБ светодиоды, для проверки. В начале, где тест, цвета переключаются нормально и быстро, а в самом теле цикла вообще беда. Как тест проходит, один диод почему-то горит красным, а другой зеленым(желтым, у меня вместо желтого зеленый пока задан), потом через какие-то переходы цвета устанавливается штатный режим(синий). Как только подаю 5в на какой-нибудь вход цвет меняется быстро, но вот как 5в пропадает - возвращается в штатный режим не сразу, секунд через 5. Как сделать чтоб этой задержки не было?

// соответствие цветов выходам
// left side
#define rl 3
#define gl 5
#define bl 6
// right side
#define rr 9
#define gr 10
#define br 11
// задаем входы
#define L 7    // левый поворотник
#define R 8    // правый поворотник
#define S 12   // стоп

void setup()
{
  pinMode(L, INPUT);
  pinMode(R, INPUT);
  pinMode(S, INPUT);
  pinMode(rl, OUTPUT);
  pinMode(gl, OUTPUT);
  pinMode(bl, OUTPUT);
  pinMode(rr, OUTPUT);
  pinMode(gr, OUTPUT);
  pinMode(br, OUTPUT);
  //типа тест
  redLeft();
  redRight();
  delay(500);
  digitalWrite(rl, 0);
  digitalWrite(rr, 0);
  yellowLeft();
  yellowRight();
  delay(500);
  digitalWrite(gl, 0);
  digitalWrite(gr, 0);
  blueLeft();
  blueRight();
  delay(500);
  digitalWrite(bl, 0);
  digitalWrite(br, 0);
  delay(500);
  /*digitalWrite(L, LOW); // подтягивающие резисторы
  digitalWrite(R, LOW);
  digitalWrite(S, LOW);*/
}
void loop()
{
  bool LS=digitalRead(L);
  bool RS=digitalRead(R);
  bool SS=digitalRead(S);
 // blueRight(); // штатный режим
 //  blueLeft();
  if (LS==HIGH&&RS==LOW&&SS==LOW) {// режим 1
  purge();
    yellowLeft();
    blueRight();
  } 
 else if (LS==LOW&&RS==HIGH&&SS==LOW) {// режим 2
 purge();
    yellowRight();
    blueLeft();
  }
 else if ((LS==HIGH&&RS==HIGH&&SS==LOW)||(LS==HIGH&&RS==HIGH&&SS==HIGH)) {
   purge();
    yellowRight();  //режим 3
    yellowLeft();
  }
 else if (LS==LOW&&RS==LOW&&SS==HIGH) { //режим 4
 purge();
  redRight();
  redLeft();
  }
 else if (LS==LOW&&RS==HIGH&&SS==HIGH) { // режим 5
 purge();
  yellowRight();
  redLeft();
  }
 else if(LS==HIGH&&RS==LOW&&SS==HIGH) { //режим 6
 purge();
  redRight();
  yellowLeft();
  }
  else {
    purge();
    blueRight();
    blueLeft();
  }

}

// синий правый включить
void blueRight()
{
    digitalWrite(rr, 0);
    digitalWrite(gr, 0);
    digitalWrite(br, 1); 
}
// синий левый включить
void blueLeft()
{
    digitalWrite(rl, 0);
    digitalWrite(gl, 0);
    digitalWrite(bl, 1);
}
// желтый правый включить
void yellowRight()
{
    digitalWrite(rr, 0);
    digitalWrite(gr, 1);
    digitalWrite(br, 0);
}
// желтый левый включить
void yellowLeft()
{
    digitalWrite(rl, 0);
    digitalWrite(gl, 1);
    digitalWrite(bl, 0);
}
// красный правый включить
void redRight()
{
    digitalWrite(rr, 1);
    digitalWrite(gr, 0);
    digitalWrite(br, 0);
}
// красный левый включить
void redLeft()
{
    digitalWrite(rl, 1);
    digitalWrite(gl, 0);
    digitalWrite(bl, 0);
}
void purge()
{
    digitalWrite(rl, 0);
    digitalWrite(gl, 0);
    digitalWrite(bl, 0);
    digitalWrite(rl, 0);
    digitalWrite(gl, 0);
    digitalWrite(bl, 0);
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а что на входах висит? случаем не конденсатор?

mantiss
Offline
Зарегистрирован: 18.10.2014

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

от блока питания? сколько вольт у блока питания? нельзя проводком с 5В ардуины тыкаться?

mantiss
Offline
Зарегистрирован: 18.10.2014

Сейчас с 5в ардуины попробовал - тоже самое. БП компьютерный +5в. Ща видео попробую снять

mantiss
Offline
Зарегистрирован: 18.10.2014

https://www.youtube.com/watch?v=3YrkbQIi6X4&list=UU9rjakYMq2aW-QUribhC9kQ

там где видно пульсацию, я так понимаю, да и видно, цвет не чистый. ШИМ работает получается, а не должен же?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

сделай просто. подтяни вход к питанию и управляй по минусу

mantiss
Offline
Зарегистрирован: 18.10.2014

для тех кто в танке можно поподробнее? картинку там или что, а то в этом не силен..

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

замени

  pinMode(L, INPUT);
  pinMode(R, INPUT);
  pinMode(S, INPUT);

на

  pinMode(L, INPUT_PULLUP);
  pinMode(R, INPUT_PULLUP);
  pinMode(S, INPUT_PULLUP);

 

mantiss
Offline
Зарегистрирован: 18.10.2014

а что значит управляй по минусу? У меня просто управляющий сигнал - питание с поворотника автомобиля. Свет есть - зажигаем светодиод, света нет - гасим.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

0 - зажечь светодиод, 1 -  потушить. легко исправить программно. ты проверь сначала, а потом уже дальше думать будешь

уровень сигнала на поворотнике 12В грубо, напрямую все равно нельзя подключать. даже делитель нежелательно

лучше опторазвязку на оптопаре. PC817 как самая дешевая и распрастраненная

mantiss
Offline
Зарегистрирован: 18.10.2014

ДА! Спасибо! все работает. Я так понимаю, что дальнейшая схема будет такая

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

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

mantiss
Offline
Зарегистрирован: 18.10.2014

Вот так? 

Сейчас попробую еще через analogWrite цвета поменять, ленты пока нет, а мои светодиоды отказываются светить желтым.

Еще бы плавное включение сделать, с нарастанием яркости. 

Вот еще немного непонятно, тут если поворотник мигает, то на входе то 0 то 1, это значит, что будет переход через синий, а хотелось бы чтобы именно только желтый мигал. Никак не могу придумать как это организовать.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да так

какой еще переход через синий. нифига не понял

mantiss
Offline
Зарегистрирован: 18.10.2014

ну хотелось бы так:

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

а по данной логике вместо того, чтобы тухнуть будет загораться синий. Тут или всю логику надо как-то менять или брать сигнал не с поворотника, а с самого переключателя поворотов(вкл/выкл)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

при чем тут синий если желтый получается красный + зеленый. снова тебя не понял

а логику надо менять. но делов то

хотя можешь управлять по плюсу. и делать подтяжку к земле через резистор. дело твое

mantiss
Offline
Зарегистрирован: 18.10.2014

сейчас видео сниму))

mantiss
Offline
Зарегистрирован: 18.10.2014
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

перепиши условия и все. а точнее то что внутри условий: 0 замени на 1, а 1 на 0 и все

mantiss
Offline
Зарегистрирован: 18.10.2014

Так я уже все переделал

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

а код сейчас такой

// соответствие цветов выходам
// left side
#define rl 3
#define gl 5
#define bl 6
// right side
#define rr 9
#define gr 10
#define br 11
// задаем входы
#define L 7    // левый поворотник
#define R 8    // правый поворотник
#define S 12   // стоп

void setup()
{
  pinMode(L, INPUT_PULLUP); // подтягивающие резисторы к +5
  pinMode(R, INPUT_PULLUP);
  pinMode(S, INPUT_PULLUP);
  pinMode(rl, OUTPUT);
  pinMode(gl, OUTPUT);
  pinMode(bl, OUTPUT);
  pinMode(rr, OUTPUT);
  pinMode(gr, OUTPUT);
  pinMode(br, OUTPUT);
  //типа тест
  redLeft();
  redRight();
  delay(500);
  digitalWrite(rl, 0);
  digitalWrite(rr, 0);
  yellowLeft();
  yellowRight();
  delay(500);
  digitalWrite(gl, 0);
  digitalWrite(gr, 0);
  blueLeft();
  blueRight();
  delay(500);
  digitalWrite(bl, 0);
  digitalWrite(br, 0);
  delay(500);
  
}
void loop()
{

  bool LS=digitalRead(L);
  bool RS=digitalRead(R);
  bool SS=digitalRead(S);
  
   if (LS==LOW&&RS==HIGH&&SS==HIGH) {// режим 1
  //purge();
    yellowLeft();
    blueRight();
  } 
 else if (LS==HIGH&&RS==LOW&&SS==HIGH) {// режим 2
 //purge();
    yellowRight();
    blueLeft();
  }
 else if ((LS==LOW&&RS==LOW&&SS==HIGH)||(LS==LOW&&RS==LOW&&SS==LOW)) {
  // purge();
    yellowRight();  //режим 3
    yellowLeft();
  }
 else if (LS==HIGH&&RS==HIGH&&SS==LOW) { //режим 4
// purge();
  redRight();
  redLeft();
  }
 else if (LS==HIGH&&RS==LOW&&SS==LOW) { // режим 5
 //purge();
  yellowRight();
  redLeft();
  }
 else if(LS==LOW&&RS==HIGH&&SS==LOW) { //режим 6
// purge();
  redRight();
  yellowLeft();
  }
  else {
  //  purge();
    blueRight();
    blueLeft();
  }

}
// функции
// синий правый включить
void blueRight()
{
    digitalWrite(rr, 0);
    digitalWrite(gr, 0);
    digitalWrite(br, 1); 
}
// синий левый включить
void blueLeft()
{
    digitalWrite(rl, 0);
    digitalWrite(gl, 0);
    digitalWrite(bl, 1);
}
// желтый правый включить
void yellowRight()
{
    digitalWrite(rr, 1);
    digitalWrite(gr, 1);
    digitalWrite(br, 0);
}
// желтый левый включить
void yellowLeft()
{
    digitalWrite(rl, 1);
    digitalWrite(gl, 1);
    digitalWrite(bl, 0);
}
// красный правый включить
void redRight()
{
    digitalWrite(rr, 1);
    digitalWrite(gr, 0);
    digitalWrite(br, 0);
}
// красный левый включить
void redLeft()
{
    digitalWrite(rl, 1);
    digitalWrite(gl, 0);
    digitalWrite(bl, 0);
}
// все выключить
void purge()
{
    digitalWrite(rl, 0);
    digitalWrite(gl, 0);
    digitalWrite(bl, 0);
    digitalWrite(rl, 0);
    digitalWrite(gl, 0);
    digitalWrite(bl, 0);
}

 

mantiss
Offline
Зарегистрирован: 18.10.2014

https://www.youtube.com/watch?v=Fp3EmGW3kFk&list=WL

вот так должно быть

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

так в чем проблема делай