2017-02-22 34 views
-3

Я пытаюсь создать программу, которая будет случайным образом выбирать значение PWM для светодиода RGB из заданного массива. Он отлично работает с первым цветом, синим. Бу, тогда я гнезду второго цвета, зеленый, я теряю синий от отображения и только зеленые дисплеи.Arduino RGB LED random PWM Level

void loop() { 
    // put your main code here, to run repeatedly: 

    int x[9] = {0, 32, 64, 96, 128, 160, 192, 224, 256}; //setup Array X for brightness options 
    int blueVariable = 0;         //Blue LED 
    int greenVariable = 0;        //Green LED 
    for (int blueLed = 0; blueLed > -1;) {    //for loop to choose PWM option 
    analogWrite(11, x[blueVariable]);     //Initilize the PWM function on pin 11 to brightness of blueVariable 
    // if (blueLed == 255) blueLed = 0;     // 
    blueVariable = random(0,8);       //Random function to decide on blueVariable value 
    delay(500); 


    for (int greenLed = 0; greenLed > -1;) { 
     analogWrite(10, x[greenVariable]); 
     // if (g == 255) g = 0;    // switch direction at peak 
     greenVariable = random(0,255); 
    delay(500); 
    } 
    } 

} 
+1

Форматирование кода правильно будет огромная помощь для всех (включая вас). –

+4

Почему 'greenVariable = random (0,255)', у вас есть только 9 значений яркости. Кроме того, ваши петли бесконечны, условия выхода нет. – Michael

+0

Также я не вижу ** PWM **, возможно, это то, что для функции 'analogWrite', но без контекста мы не знаем, что он делает. Что такое операнды? Как ваш светодиод подключен к MCU? Какой MCU у вас есть? Что вы используете для PWM (SW, Timer/Counter, PWMA module)? Arduino - не волшебное слово, это просто фреймворк, поэтому вы не видите/не понимаете, что вы делаете ... Где этот код размещен/вызван (основной поток, ISR, ...)? – Spektre

ответ

1

У вас есть две проблем:

Сначала вы подключили свой «цикл» для зеленого цвета в петлю для голубого цвета для (!). Основываясь на том, что циклы, бегущие бесконечно, вы только прокручиваете второй цикл.

Вторая проблема (возможно, не проблема, но причина, по которой вы не видите синий) - это ваша инициализация blueVariable как 0. Если вы запускаете первый раз, вы записываете значение 0 в PWM Pin , После этого вы меняете переменную, но не пишите в PWM Pin, потому что вы застреваете в своей «бесконечной зеленой петле».

Кстати, как сказано в комментариях Майкла, вы должны изменить 255 на 8 И в вашем массиве вы должны изменить последнее значение (256) на 255, потому что 8-битная ШИМ означает 256 значений от 0 до 255.

Пример:

int x[9] = {0, 32, 64, 96, 128, 160, 192, 224, 255}; // Changed Value 

void loop() { 
    int blueVariable = 0;         //Blue LED 
    int greenVariable = 0;        //Green LED 

    while(1) {           // Because it was infinite already i changed it to while(1) 
    blueVariable = random(0,8);       //Put in front of analogWrite() 
    analogWrite(11, x[blueVariable]);     
    delay(500); 

    // Deleted the scond loop 
    greenVariable = random(0,8);      // Value changed from 255 to 8; Also put in front of analogWrite 
    analogWrite(10, x[greenVariable]); 
    delay(500); 
    }   
} 
+0

Спасибо, H. Puc. некоторые из ошибок заключались в изменении кода с возрастающей и уменьшающейся бильности (следовательно, цикла for), я должен был начать каждую попытку с нуля, не изменив существующий код. Прочитав ваши правки и применив их, я вижу, где была моя ошибка. Фактически, я смог правильно добавить красную часть моего RGB в правильный рабочий режим. –