Написал тут код для подсветки дисков в машине. Лента светодиодная, RGB. В зависимости от ситуации она светит разными цветами. 6 выходов для управления лентой, 3 входа для считывания стоп-сигнала и 2х поворотников(буду брать 5 в с реле или как-то там..). Подключил пока РГБ светодиоды, для проверки. В начале, где тест, цвета переключаются нормально и быстро, а в самом теле цикла вообще беда. Как тест проходит, один диод почему-то горит красным, а другой зеленым(желтым, у меня вместо желтого зеленый пока задан), потом через какие-то переходы цвета устанавливается штатный режим(синий). Как только подаю 5в на какой-нибудь вход цвет меняется быстро, но вот как 5в пропадает - возвращается в штатный режим не сразу, секунд через 5. Как сделать чтоб этой задержки не было? там где видно пульсацию, я так понимаю, да и видно, цвет не чистый. ШИМ работает получается, а не должен же? Код (Text): // соответствие цветов выходам // 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); } void loop() { digitalWrite(L, LOW); // подтягивающие резисторы digitalWrite(R, LOW); digitalWrite(S, LOW); 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); }
Код (Text): digitalWrite(L, LOW); // подтягивающие резисторы digitalWrite(R, LOW); digitalWrite(S, LOW); это как? и зачем каждый раз подключать их?а лучше вообще от них отказаться и использовать внешнее резисторы.
вот такая схема, пусть я уберу внутренние подтягивающие резисторы. Входы у меня 7,8,12. куда мне подключить внешние резисторы и какого номинала?
1pinMode(L, INPUT_PULLUP); 2pinMode(R, INPUT_PULLUP); 3pinMode(S, INPUT_PULLUP); плюс всю логику наоборот. как-то так.. вроде нормально работает
Вот как на картинке у mantiss работать как раз не будет. Излучатель оптопары работает в ИК с малым Vf, меньше, чем у светодиодов видимого диапазона. Напряжение на светодиоде/лампе перед оптопарой не будет больше Vf оптопары. Это грабли, не наступайте на них.
А если попробовать вот так: Код (Text): // соответствие цветов выходам // left side #define rl 3 #define yl 5 #define bl 6 // right side #define rr 9 #define yr 10 #define br 11 // задаем входы #define L 7 // левый поворотник #define R 8 // правый поворотник #define S 12 // стоп int RGBb[2]; int RGBr[2]; int RGBy[2]; void setup() { pinMode(L, INPUT); pinMode(R, INPUT); pinMode(S, INPUT); pinMode(rl, OUTPUT); pinMode(yl, OUTPUT); pinMode(bl, OUTPUT); pinMode(rr, OUTPUT); pinMode(yl, OUTPUT); pinMode(br, OUTPUT); digitalWrite(bl, 0); digitalWrite(br, 0); digitalWrite(rl, 0); digitalWrite(rr, 0); digitalWrite(yl, 0); digitalWrite(yr, 0); //типа тест digitalWrite(bl, 1); digitalWrite(br, 1); delay(500); digitalWrite(bl, 0); digitalWrite(br, 0); digitalWrite(rl, 1); digitalWrite(rr, 1); delay(500); digitalWrite(rl, 0); digitalWrite(rr, 0); digitalWrite(yl, 1); digitalWrite(yr, 1); delay(500); digitalWrite(yl, 0); digitalWrite(yr, 0); } void loop() { bool LS = digitalRead(L); bool RS = digitalRead(R); bool SS = digitalRead(S); // По умолчанию "Штатный" режим RGBb[1] = 1; RGBb[2] = 1; RGBr[1] = 0; RGBr[2] = 0; RGBy[1] = 0; RGBy[2] = 0; if (SS==HIGH) {// "Стоп" RGBb[1] = 0; RGBb[2] = 0; RGBr[1] = 1; RGBr[2] = 1; }; if (LS==HIGH) {// "Левый поворот" RGBb[1] = 0; RGBr[1] = 0; RGBy[1] = 1; }; if (RS==HIGH) {// "Правый поворот" RGBb[2] = 0; RGBr[2] = 0; RGBy[2] = 1; }; digitalWrite(bl, RGBb[1]); digitalWrite(br, RGBb[2]); digitalWrite(rl, RGBr[1]); digitalWrite(rr, RGBr[2]); digitalWrite(yl, RGBy[1]); digitalWrite(yr, RGBy[2]); }