Почему значение светодиодной ленты на потенциометре всегда равно 255?

Я новичок в Arduino, и это мой первый проект, над которым я работаю, и я действительно не понимаю, почему мой код не работает должным образом.

Светодиодная лента должна иметь возможность регулировать цвет с помощью одного потенциометра, который я могу вынуть, поэтому я не использую 3 потенциометра, а просто использую, который может регулировать все цвета. Затем, когда он перейдет в режим 4, он должен сохранить цвет и неоднократно мигать.

Я использую Arduino Uno, но как только мой проект будет завершен, я буду использовать Arduino Nano. Я не знаю, нужно ли мне менять код, но если понадобится, думаю, я смогу сделать это самостоятельно.

Я просто не знаю, почему моя светодиодная лента всегда не горит (255).

// устанавливаем номера контактов:
int ledPinR = 11; // номер контакта R светодиода
int ledPinG = 10; // номер контакта G светодиода
int ledPinB = 9; // номер контакта светодиода B
int buttonPin = 7; // номер контакта кнопки
int mode = 0; //изменить режим
int bluelev = 0; //сохраняем значение синего светодиода
int greenlev = 0; //сохраняем значение зеленого светодиода
int redlev = 0; // сохраняем значение красного светодиода

void setup() {
  // инициализируем вывод светодиода как выход:
  pinMode(ledPinR, OUTPUT);
  pinMode(ledPinG, OUTPUT);
  pinMode(ledPinB, OUTPUT);

  //делаем светодиодную ленту белой при загрузке
  digitalWrite(ledPinR, 0);
  digitalWrite(ledPinG, 0);
  digitalWrite(ledPinB, 0);
}

void loop() {
  // при нажатии кнопки меняет значение режима на единицу
  if (digitalRead(buttonPin) == LOW) {
    ++mode;
    delay(500);
  }

  if (mode == 1) { //красная конфигурация
    int adcValue; // Определить переменную для сохранения значения АЦП
    // Преобразование аналогового порта A0 в цифровой и работа в качестве рабочего цикла ШИМ порта LEDPinR
    adcValue = analogRead(A0);
    analogWrite(ledPinR, map(adcValue, 0, 1023, 0, 255));
    (redlev = ledPinR); // сохраняет уровень красного светодиода
  }

  if (mode == 2) { //зеленая конфигурация
    int adcValue; // Определить переменную для сохранения значения АЦП
    // Преобразование аналогового порта A1 в цифровой и работа в качестве рабочего цикла ШИМ порта LEDPinG
    adcValue = analogRead(A1);
    analogWrite(ledPinG, map(adcValue, 0, 1023, 0, 255));
    (greenlev = ledPinG); // сохраняет уровень зеленого светодиода
  }

  if (mode == 3) { //Синяя конфигурация
    int adcValue; // Определить переменную для сохранения значения АЦП
    // Преобразование аналогового порта A2 в цифровой и работа в качестве рабочего цикла ШИМ порта LEDPinB
    adcValue = analogRead(A2);
    analogWrite(ledPinB, map(adcValue, 0, 1023, 0, 255));
    (bluelev = ledPinB); // сохраняет уровень синего светодиода
  }

  if (mode == 4) {
    digitalWrite(ledPinR, 255); // выключаем светодиод
    digitalWrite(ledPinG, 255); // выключаем светодиод
    digitalWrite(ledPinB, 255); // выключаем светодиод
    digitalWrite(8, 0); // включаем светодиод
    delay(1000); //ждём 1 секунду
    digitalWrite(ledPinR, redlev); // включаем светодиод
    digitalWrite(ledPinG, greenlev); // включаем светодиод
    digitalWrite(ledPinB, bluelev); // включаем светодиод
    digitalWrite(8, 225); // включаем светодиод
    delay(1000); //ждём 1 секунду
  }

  if (mode == 5) {
    mode -= 5; //устанавливает значение режима обратно в 0
  }
}

моя схема

Вот настройка.

Представьте, что светодиод RGB — это светодиодная лента, а потенциометры — это просто слоты, в которые можно вставить один из них, чтобы изменить цвет, когда я захочу. Поэтому, когда я не меняю цвета, я могу использовать потенциометр для других проектов и не тратить 3.

, 👍0


2 ответа


1

В вашем коде есть как минимум эти ошибки:

1. Вы не можете прочитать аналоговое значение, установленное на выводе.

Вы попробуйте это:

    analogWrite(ledPinR, map(adcValue, 0, 1023, 0, 255));
    (redlev = ledPinR); // сохраняет уровень красного светодиода

Вы правильно установили аналоговое значение на выводе красного светодиода. Но затем вы пытаетесь прочитать это обратно. Посмотрите на определение ledPinR: это int с фиксированным значением 11. Таким образом, redlev всегда равен 11.

Примечание 1. Выход на самом деле не аналоговый, а с широтно-импульсной модуляцией.

Примечание 2. Во втором операторе скобки не нужны.

Вместо этого сохраните сопоставленное значение в redlev:

    redlev = map(adcValue, 0, 1023, 0, 255);
    analogWrite(ledPinR, redlev);

Примечание 3. Используйте хорошие имена переменных, например redLevel. Когда-нибудь или позже вы будете путать вещи из-за сокращенных названий.

2. Вы не повторяете аналоговую запись в режиме 4.

Вы написали это, что, видимо, неверно:

  if (mode == 4) {
    digitalWrite(ledPinR, 255); // выключаем светодиод
    // другие утверждения...
    delay(1000); //ждём 1 секунду
    digitalWrite(ledPinR, redlev); // включаем светодиод
    // другие утверждения...
    delay(1000); //ждём 1 секунду
  }

Вместо этого вам нужно следующее (если 255 действительно «выключено»):

  if (mode == 4) {
    analogWrite(ledPinR, 255); // выключаем светодиод
    // другие утверждения...
    delay(1000); //ждём 1 секунду
    analogWrite(ledPinR, redlev); // включаем светодиод
    // другие утверждения...
    delay(1000); //ждём 1 секунду
  }

Есть и другие проблемы, но это сделает вас шагом вперед. Самое главное, сохраняйте стиль отступов, я подчистил ваш исходный код в вопросе, чтобы сделать его читабельным.

,

большое спасибо, @user92341

Пожалуйста! Кстати, вы должны пометить ответ, который вам больше всего подходит, как «принятый», вместо того, чтобы комментировать «спасибо»..., @the busybee


-1

Мой первый проект был таким же: установка цвета полоски с помощью одного потенциометра. Я использовал функцию getColorValue, которая возвращает структуру. Эта структура содержит значения для красного, зеленого и синего. Вот пример кода:

#define PIN_POTENTIOMETER A0

struct RGB
{
    uint8_t red;
    uint8_t green;
    uint8_t blue;
} color;

RGB getColorValue(uint16_t inputValue);

void setup()
{
    Serial.begin(9600);
    pinMode(PIN_POTENTIOMETER, INPUT);
}

void loop()
{
    uint16_t inputValue = analogRead(PIN_POTENTIOMETER);
    color = getColorValue(inputValue);

    Serial.print("R: ");
    Serial.print(color.red);
    Serial.print(" G: ");
    Serial.print(color.green);
    Serial.print(" B: ");
    Serial.println(color.blue);
    delay(100);
}

RGB getColorValue(uint16_t inputValue)
{
    RGB color;
    color.red = 0;
    color.green = 0;
    color.blue = 0;

    map(inputValue, 0, 1023, 0, 255);

    if (inputValue <= 42.5)
    {
        color.red = 255;
        color.green = inputValue * 6;
        color.blue = 0;
    }
    else if (inputValue <= 85)
    {
        color.red = 255 - (inputValue - 43) * 6;
        color.green = 255;
        color.blue = 0;
    }
    else if (inputValue <= 127.5)
    {
        color.red = 0;
        color.green = 255;
        color.blue = (inputValue - 85) * 6;
    }
    else if (inputValue <= 170)
    {
        color.red = 0;
        color.green = 255 - (inputValue - 127.5) * 6;
        color.blue = 255;
    }
    else if (inputValue <= 212.5)
    {
        color.red = (inputValue - 170) * 6;
        color.green = 0;
        color.blue = 255;
    }
    else if (inputValue <= 255)
    {
        color.red = 255;
        color.green = 0;
        color.blue = 255 - (inputValue - 212.5) * 6;
    }

    return color;
}

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

С уважением Дарио

,

analogWrite и analogRead не требуют pinMode., @Juraj

@Юрай Юрай Ты прав, моя вина., @Dario.Casciato

большое спасибо, @user92341