Долго думает Arduino UNO
- Войдите на сайт для отправки комментариев
Написал тут код для подсветки дисков в машине. Лента светодиодная, 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);
}
а что на входах висит? случаем не конденсатор?
на входах ничего не висит. голые разъемы платы, я в них проводком от блока питания тыкаю.
от блока питания? сколько вольт у блока питания? нельзя проводком с 5В ардуины тыкаться?
Сейчас с 5в ардуины попробовал - тоже самое. БП компьютерный +5в. Ща видео попробую снять
https://www.youtube.com/watch?v=3YrkbQIi6X4&list=UU9rjakYMq2aW-QUribhC9kQ
там где видно пульсацию, я так понимаю, да и видно, цвет не чистый. ШИМ работает получается, а не должен же?
сделай просто. подтяни вход к питанию и управляй по минусу
для тех кто в танке можно поподробнее? картинку там или что, а то в этом не силен..
замени
на
а что значит управляй по минусу? У меня просто управляющий сигнал - питание с поворотника автомобиля. Свет есть - зажигаем светодиод, света нет - гасим.
0 - зажечь светодиод, 1 - потушить. легко исправить программно. ты проверь сначала, а потом уже дальше думать будешь
уровень сигнала на поворотнике 12В грубо, напрямую все равно нельзя подключать. даже делитель нежелательно
лучше опторазвязку на оптопаре. PC817 как самая дешевая и распрастраненная
ДА! Спасибо! все работает. Я так понимаю, что дальнейшая схема будет такая
почти. только резистор добавь для светодиода в оптопаре, иначе сгорит сразу
и еще бы параллельно лампочке поворотника поставить керамический конденсатор возле оптопары. хоть и не обязательно
Вот так?
Сейчас попробую еще через analogWrite цвета поменять, ленты пока нет, а мои светодиоды отказываются светить желтым.
Еще бы плавное включение сделать, с нарастанием яркости.
Вот еще немного непонятно, тут если поворотник мигает, то на входе то 0 то 1, это значит, что будет переход через синий, а хотелось бы чтобы именно только желтый мигал. Никак не могу придумать как это организовать.
да так
какой еще переход через синий. нифига не понял
ну хотелось бы так:
когда мигает поворотник, то загорается желтый, горит пока есть сигнал(ну то есть замкнут на землю), потом тухнет(сигнал пропал), потом опять загорается и т.д.
а по данной логике вместо того, чтобы тухнуть будет загораться синий. Тут или всю логику надо как-то менять или брать сигнал не с поворотника, а с самого переключателя поворотов(вкл/выкл)
при чем тут синий если желтый получается красный + зеленый. снова тебя не понял
а логику надо менять. но делов то
хотя можешь управлять по плюсу. и делать подтяжку к земле через резистор. дело твое
сейчас видео сниму))
https://www.youtube.com/watch?v=QnhWbdMc5mg&list=UU9rjakYMq2aW-QUribhC9kQ
перепиши условия и все. а точнее то что внутри условий: 0 замени на 1, а 1 на 0 и все
Так я уже все переделал
просто в данной ситуации нельзя определить, что именно поворотник включен. То есть сколько именно нужно раз мигать. Можно конечно после того, как включается желтый ставить задержку и выключать весь свет. Точно, так и сделаю.
а код сейчас такой
// соответствие цветов выходам // 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); }https://www.youtube.com/watch?v=Fp3EmGW3kFk&list=WL
вот так должно быть
так в чем проблема делай