С помощью цветового датчика я сопоставляю пластиковые образцы цветов с заранее определенной палитрой цветов в массиве, используя подход Евклидово расстояние (ближайшее расстояние).Когда цвет идентифицирован, линейный привод перемещается.Это хорошо работает, даже для довольно похожих пастельных цветов.
Однако, как мне кодировать те ситуации, когда 1. образец цвета не находится перед датчиком или 2. цвет отсутствует в массиве?Мне нужно сгенерировать сообщение «Нет образца» (1.) или «Не найдено совпадений» (2.), и привод не должен двигаться в обоих случаях.
Как и сейчас, когда образец не закончилсяДатчик, код находит ближайший эквивалент из окружающего освещения, и привод перемещается (1.), когда несоответствующий образец находится над датчиком, код находит ближайший эквивалент, и привод перемещается (2.).В обоих случаях ничего не должно происходить, кроме вывода сообщений, упомянутых выше.
Спасибо за некоторые подсказки!
const int SAMPLES[12][5] = { // Values from colour "training" (averaged raw r, g and b; averaged raw c; actuator movement)
{8771, 6557, 3427, 19408, 10},
{7013, 2766, 1563, 11552, 20},
{4092, 1118, 1142, 6213, 30},
{4488, 1302, 1657, 7357, 40},
{3009, 1846, 2235, 7099, 50},
{2650, 3139, 4116, 10078, 60},
{ 857, 965, 1113, 2974, 70},
{ 964, 2014, 2418, 5476, 80},
{1260, 2200, 1459, 5043, 90},
{4784, 5898, 3138, 14301, 100},
{5505, 5242, 2409, 13642, 110},
{5406, 3893, 1912, 11457, 120}, // When adding more samples no particular order is required
};
byte findColour(int r, int g, int b) {
int distance = 10000; // Raw distance from white to black (change depending on selected integration time and gain)
byte foundColour;
for (byte i = 0; i < samplesCount; i++) {
int temp = sqrt(pow(r - SAMPLES[i][0], 2) + pow(g - SAMPLES[i][1], 2) + pow(b - SAMPLES[i][2], 2)); // Calculate Euclidean distance
if (temp < distance) {
distance = temp;
foundColour = i + 1;
}
}
return foundColour;
}