Что не так с моим кодом? 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);
}
И по какой-то причине, когда свет должен менять цвет, как только потенциометр проходит определенное число, свет просто мерцает и меняет цвет на белый только тогда, когда он полностью вверх или вниз. Кроме того, он имеет странный мерцающий желтый цвет. Поскольку я новичок в этом, может ли кто-нибудь из вас, более образованных, помочь мне?
@Harrison, 👍1
Обсуждение3 ответа
Сравнение равенства в 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
Вместо использования ||
в операторах 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);
}
Попробуйте этот код ниже. Это даст вам желаемый результат!
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 (||
, &&
, >
, <
, ==
, >=
, <=
) и т. д.
Я оставлю разработку логики на вас, так как именно она развивает ваши способности кодирования, и поверьте мне, логика — самая важная и увлекательная часть написания кода!
- Есть ли какой-нибудь способ загрузить скетч с ардуино?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Асинхронные вызовы функций в скетче ардуино
- Проблема с загрузкой моего скетча на Ардуино
- Что произойдет, если возникнет ошибка времени выполнения?
- Проблема: "stray '#' in program"
- Двигатель постоянного тока шумит, но не вращается
- Цикл While не прерывается
подумайте об этом.... что будет, если потенциометр установить на 333?, @jsotola