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);
}

, 👍-1

Обсуждение

Что означает «_это не удается по какой-то причине_»? Каково ожидаемое поведение вашего скетча? Каково фактическое наблюдаемое поведение? Чем именно они отличаются?, @Edgar Bonet


1 ответ


1

Читая ваш код, я вижу три момента:

  1. Вашим константам присваиваются не те значения, которые вы думаете. const int RED_COLOR = (255,0,0); устанавливает целочисленную константу в значение 0, то есть последнее значение последовательности, разделенной запятыми, см. здесь. Вместо этого перечислите свои цветовые константы, т. е. установите красный = 1, синий = 2 и т. д. Или определите структуру с тремя целочисленными компонентами.
  2. Переменной color никогда не будут присвоены значения ORANGE_COLOR, PURPLE_COLOR или YELLOW_COLOR из-за способа вы структурировали выражения в блоке if-then-else. Если красный > зеленый && красный > синий, программа даже не проверит, является ли красным > зеленый && красный > синий && синий > зеленый, потому что он уже вошел в первый блок. И PURPLE_COLOR вообще не указан в верхнем блоке if-else. Кроме того, я ожидаю, что какой-нибудь CYAN_COLOR где-нибудь там перекроет оттенки между зеленым и синим.
  3. Какой точный тип датчика цвета? Мне кажется странным, что он передает свои данные через длину импульса. Если это не так, pulseIn() — неправильный метод для использования. Если это действительно так, у вас может быть состояние гонки: я предполагаю, что запись на контакты s2/s3 запускает датчик для запуска «импульса данных», в в этом случае digitalRead(sensorOut) уже может возвращать "состояние импульса" вместо "предимпульсного состояния" и поэтому ожидает другого импульса, чем должен. Вам нужно сначала прочитать sensorOut в переменную, затем установить s2/s3, а затем прочитать ваши данные через pulseIn, используя переменную, которую вы установили ранее.

Но без технического описания сенсора/знания протокола сенсора это все очень ненадежные догадки. Пожалуйста, улучшите свой вопрос, добавив тип датчика (и, возможно, схему подключения) вместе с объяснением того, что вы подразумеваете под «он не работает». Как именно это не удается? Какая часть работает, а какая нет?

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

,