Arduino-проект с датчиком цвета и rgb-светодиодом
Я хочу использовать датчик цвета для моего проекта Arduino с Arduino Uno, чтобы определять красный, зеленый, синий, оранжевый, желто-фиолетовый цвет листьев бумаги, а затем зажигать светодиод RGB этими цветами. В моем коде нет ошибок, но он почему-то не работает :( Кто-нибудь может мне помочь?
вот код:
#define s0 8
#define s1 9
#define s2 10
#define s3 11
#define sensorOut 12
#define LED_RED 3
#define LED_GREEN 5
#define LED_BLUE 6
// Variabelen voor de kleurwaarden
int red;
int green;
int blue;
const int RED_COLOR = (255, 0, 0);
const int GREEN_COLOR = (0, 255, 0);
const int BLUE_COLOR = (0, 0, 255);
const int ORANGE_COLOR = (255, 165, 0);
const int PINK_COLOR = (255, 105, 180);
const int PURPLE_COLOR = (128, 0, 128);
const int YELLOW_COLOR = (255, 255, 0);
int color = 0;
void setup() {
// Zet de seriële communicatie op
Serial.begin(9600);
// Инициализатор pinmodi
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(sensorOut, INPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
// Zet de frenchie van de kleurensensor op 20% (фильтр роде)
digitalWrite(s0, HIGH);
digitalWrite(s1, LOW);
}
void loop() {
// Лис де клеурварден
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
red = pulseIn(sensorOut, digitalRead(sensorOut) == HIGH ? LOW : HIGH);
delay(20);
digitalWrite(s3, HIGH);
blue = pulseIn(sensorOut, digitalRead(sensorOut) == HIGH ? LOW : HIGH);
delay(20);
digitalWrite(s2, HIGH);
green = pulseIn(sensorOut, digitalRead(sensorOut) == HIGH ? LOW : HIGH);
delay(20);
// Контроллер оп verschillende kleuren
if (red > green && red > blue) {
color = RED_COLOR; // Руд
} else if (green > red && green > blue) {
color = GREEN_COLOR; // Гроен
} else if (blue > red && blue > green) {
color = BLUE_COLOR; // Синий
} else if (red > green && red > blue && green > blue) {
color = YELLOW_COLOR; // Гил
} else if (red > green && red > blue && blue > green) {
color = ORANGE_COLOR; // Апельсин
} else {
color = 0; // Не распознанный цвет
}
// Проверяем разные цвета
if (color == RED_COLOR) {
setColor(255, 0, 0); // Красный
} else if (color == GREEN_COLOR) {
setColor(0, 255, 0); // Зеленый
} else if (color == BLUE_COLOR) {
setColor(0, 0, 255); // Синий
} else if (color == ORANGE_COLOR) {
setColor(255, 165, 0); // Апельсин
} else if (color == PINK_COLOR) {
setColor(255, 105, 180); // Розовый
} else if (color == PURPLE_COLOR) {
setColor(128, 0, 128); // Фиолетовый
} else if (color == YELLOW_COLOR) {
setColor(255, 255, 0); // Желтый
} else {
// Цвет не распознан, выключаем светодиод
setColor(0, 0, 0);
}
delay(500); // Подождем 500 миллисекунд перед проверкой следующего цвета
}
// Вспомогательный метод для установки значений RGB
void setColor(int red, int green, int blue) {
analogWrite(LED_RED, red);
analogWrite(LED_GREEN, green);
analogWrite(LED_BLUE, blue);
}
@user90576, 👍-1
Обсуждение1 ответ
Читая ваш код, я вижу три момента:
- Вашим константам присваиваются не те значения, которые вы думаете.
const int RED_COLOR = (255,0,0);
устанавливает целочисленную константу в значение0
, то есть последнее значение последовательности, разделенной запятыми, см. здесь. Вместо этого перечислите свои цветовые константы, т. е. установите красный = 1, синий = 2 и т. д. Или определите структуру с тремя целочисленными компонентами. - Переменной
color
никогда не будут присвоены значенияORANGE_COLOR
,PURPLE_COLOR
илиYELLOW_COLOR
из-за способа вы структурировали выражения в блоке if-then-else. Есликрасный > зеленый && красный > синий
, программа даже не проверит, является ликрасным > зеленый && красный > синий && синий > зеленый
, потому что он уже вошел в первый блок. ИPURPLE_COLOR
вообще не указан в верхнем блоке if-else. Кроме того, я ожидаю, что какой-нибудьCYAN_COLOR
где-нибудь там перекроет оттенки между зеленым и синим. - Какой точный тип датчика цвета? Мне кажется странным, что он передает свои данные через длину импульса. Если это не так,
pulseIn()
— неправильный метод для использования. Если это действительно так, у вас может быть состояние гонки: я предполагаю, что запись на контактыs2
/s3
запускает датчик для запуска «импульса данных», в в этом случаеdigitalRead(sensorOut)
уже может возвращать "состояние импульса" вместо "предимпульсного состояния" и поэтому ожидает другого импульса, чем должен. Вам нужно сначала прочитатьsensorOut
в переменную, затем установитьs2
/s3
, а затем прочитать ваши данные черезpulseIn
, используя переменную, которую вы установили ранее.
Но без технического описания сенсора/знания протокола сенсора это все очень ненадежные догадки. Пожалуйста, улучшите свой вопрос, добавив тип датчика (и, возможно, схему подключения) вместе с объяснением того, что вы подразумеваете под «он не работает». Как именно это не удается? Какая часть работает, а какая нет?
Вы также можете получить больше информации о состоянии своего скетча, записав измеренные значения в последовательный монитор с помощью Serial.println
.
- Может ли датчик 12 В, быть подключен к выходному сигналу 5 В Arduino Uno
- (Код ультразвукового датчика: такого файла или каталога нет)
- Бесполезная проводка коробки и код
- Несколько неблокирующих таймеров обратного отсчета?
- Датчик HC-SR505 PIR выдает только HIGH уровень
- Отправка данных из ESP8266 в PHP
- Определение уровня заряда с помощью датчика тока (ACS758) с arduino uno
- Использование YS-IRTM с Arduino Uno
Что означает «_это не удается по какой-то причине_»? Каково ожидаемое поведение вашего скетча? Каково фактическое наблюдаемое поведение? Чем именно они отличаются?, @Edgar Bonet