Что не так с моим кодом? RGB-потенциометр

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

int redpin = 6;
int greenpin = 3;
int bluepin = 5;
int potPin = 0;


void setup() {
  // put your setup code here, to run once:
  pinMode(redpin, OUTPUT);
  pinMode(bluepin, OUTPUT);
  pinMode(greenpin, OUTPUT);
  pinMode(potPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  int wavecolor = analogRead(potPin);
  Serial.print(wavecolor);
  {
    if (wavecolor = 0) {
      setColor(255, 0, 0);  // red
    }
    if (wavecolor > 0 or wavecolor < 333) {
      setColor(0, 255, 0);  // green
    }
    if (wavecolor > 333 or wavecolor < 667) {
      setColor(0, 0, 255);  // blue
    }
    if (wavecolor > 667 or wavecolor < 1022) {
      setColor(255, 255, 0);  // yellow
    }
    if (wavecolor = 1023) {
      setColor(80, 0, 80);  // purple
    }
  }
}

void setColor(int red, int green, int blue)
{
#ifdef COMMON_ANODE
  red = 255 - red;
  green = 255 - green;
  blue = 255 - blue;
#endif
  analogWrite(redpin, red);
  analogWrite(greenpin, green);
  analogWrite(bluepin, blue);
}

И по какой-то причине, когда свет должен менять цвет, как только потенциометр проходит определенное число, свет просто мерцает и меняет цвет на белый только тогда, когда он полностью вверх или вниз. Кроме того, он имеет странный мерцающий желтый цвет. Поскольку я новичок в этом, может ли кто-нибудь из вас, более образованных, помочь мне?

, 👍1

Обсуждение

подумайте об этом.... что будет, если потенциометр установить на 333?, @jsotola


3 ответа


6
  • Сравнение равенства в C и C++ выражается оператором ==. ==, а не =. Это

    if (wavecolor = 0) {
    

    фактически присваивает ноль вашей переменной wavecolor, уничтожая только что прочитанное значение.

  • Здравый смысл подсказывает, что в ваших условиях вам действительно нужны и, а не или

    if (wavecolor > 0 and wavecolor < 333) {
    

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

  • Это допустимый синтаксис

    wavecolor > 0 or wavecolor < 333
    wavecolor > 0 and wavecolor < 333
    

    но вы можете попробовать использовать более "канонические" формы

    wavecolor > 0 || wavecolor < 333
    wavecolor > 0 && wavecolor < 333
    

    или и и — это «альтернативные» формы операторов || и &&, представленные давным-давно по причинам, которые сегодня почти устарели.

  • Предполагая, что вы имели в виду и вместо или, в ваших условиях вам удалось "исключить" такие значения, как 333, 667 и 1022 — они не будут соответствовать ни одному из условий и. Может быть уместно изменить некоторые строгие сравнения на нестрогие.

  • Кроме того, в программе с одним файлом все переменные области файла должны быть либо const, либо static. В вашем случае

    const int redpin = 6;
    const int greenpin = 3;
    const int bluepin = 5;
    const int potPin = 0;
    
,

«должно быть либо константным, либо статическим», также экономит несколько байтов SRAM, может пригодиться в больших программах с большим количеством переменных данных., @CrossRoads

Стилистический момент: я предпочитаю писать свои условия так, чтобы они выглядели как диапазоны (в языках, в которых нет встроенных диапазонов), поэтому 0 < wavecolor и wavecolor < 333, а не wavecolor > 0 и wavecolor < 333, @Alexander

@Александр: Это имеет формальный смысл. Но на практике это не всегда работает так хорошо, как можно было бы ожидать. Это противоречит другому естественному принципу: выражать сравнения как «переменная против предела» в определенном порядке, поскольку именно так мы обычно выражаем их на естественном языке. Какой подход в конечном итоге победит – вопрос личных предпочтений., @AnT

@AnT Да, это, конечно, спорно, но у меня есть 3 причины, по которым я предпочитаю его: 1) Он «выглядит» как диапазон, 2) Операнды упорядочены от наименьшего слева до наибольшего справа (обычно так и происходит). упорядоченный, например ось X на графике), @Alexander


0

Вместо использования || в операторах if вы можете попробовать &&.

int redpin = 6;
int greenpin = 3;
int bluepin = 5;
int potPin = 0;


void setup() {
  // поместите сюда код установки для однократного запуска:
  pinMode(redpin, OUTPUT);
  pinMode(bluepin, OUTPUT);
  pinMode(greenpin, OUTPUT);
  pinMode(potPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  // поместите сюда ваш основной код для многократного запуска:
  int wavecolor = analogRead(potPin);
  Serial.print(wavecolor);
  {
    if (wavecolor == 0) {
      setColor(255, 0, 0);  // красный
    }
    if (wavecolor > 0 && wavecolor < 333) {
      setColor(0, 255, 0);  // зеленый
    }
    if (wavecolor >= 333 && wavecolor < 667) {
      setColor(0, 0, 255);  // синий
    }
    if (wavecolor >= 667 && wavecolor <= 1022) {
      setColor(255, 255, 0);  // желтый
    }
    if (wavecolor == 1023) {
      setColor(80, 0, 80);  // фиолетовый
    }
  }
}

void setColor(int red, int green, int blue)
{
#ifdef COMMON_ANODE
  red = 255 - red;
  green = 255 - green;
  blue = 255 - blue;
#endif
  analogWrite(redpin, red);
  analogWrite(greenpin, green);
  analogWrite(bluepin, blue);
}
,

0

Попробуйте этот код ниже. Это даст вам желаемый результат!

int redpin = 6;
int greenpin = 3;
int bluepin = 5;
int potPin = 0;


void setup() {
  // поместите сюда код установки для однократного запуска:
  pinMode(redpin, OUTPUT);
  pinMode(bluepin, OUTPUT);
  pinMode(greenpin, OUTPUT);
  pinMode(potPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  // поместите сюда ваш основной код для многократного запуска:
  int wavecolor = analogRead(potPin);
  Serial.print(wavecolor);
  {
    if (wavecolor == 0) {
      setColor(255, 0, 0);  // красный
    }
    else if (wavecolor > 0 && wavecolor < 333) {
      setColor(0, 255, 0);  // зеленый
    }
    else if (wavecolor >= 333 && wavecolor < 667) {
      setColor(0, 0, 255);  // синий
    }
    else if (wavecolor >= 667 && wavecolor < 1022) {
      setColor(255, 255, 0);  // желтый
    }
    else if (wavecolor >= 1022) {
      setColor(80, 0, 80);  // фиолетовый
    }
  }
}

void setColor(int red, int green, int blue)
{
#ifdef COMMON_ANODE
  red = 255 - red;
  green = 255 - green;
  blue = 255 - blue;
#endif
  analogWrite(redpin, red);
  analogWrite(greenpin, green);
  analogWrite(bluepin, blue);
}

Познакомьтесь с логическими и реляционными операторами в Arduino (||, &&, >, < , ==, >=, <=) и т. д.
Я оставлю разработку логики на вас, так как именно она развивает ваши способности кодирования, и поверьте мне, логика — самая важная и увлекательная часть написания кода!

,