RGB светодиод должен менять цвет в зависимости от расстояния

anonim9900
Offline
Зарегистрирован: 26.11.2021

Решил в tinkercad создать цепь. Есть Arduino Uno3, ультразвуковой датчик расстояния и RGB светодиод.

Вопрос такой: как менять яркость RGB светодиода в зависимости от расстояния? Если нужно, фото подключения и попытки написания кода могу выслать

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Если светодиод RGB, то яркость вообще вряд ли стоит менять.

anonim9900
Offline
Зарегистрирован: 26.11.2021

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

Green
Offline
Зарегистрирован: 01.10.2015

"Алгоритм непрерывного спектра." Было дело...

// algorithm of continuous spectrum
void ColorRight() {
  while (true) {
    if (scena == 0) if (color[G] < 255) { color[G] += COLOR_STEP; break; } else scena++;
    if (scena == 1) if (color[R])       { color[R] -= COLOR_STEP; break; } else scena++;
    if (scena == 2) if (color[B] < 255) { color[B] += COLOR_STEP; break; } else scena++;
    if (scena == 3) if (color[G])       { color[G] -= COLOR_STEP; break; } else scena++;
    if (scena == 4) if (color[R] < 255) { color[R] += COLOR_STEP; break; } else scena++;
    if (scena == 5) if (color[B])       { color[B] -= COLOR_STEP; break; } else scena = 0;
  }
}

void ColorLeft() {
  while (true) {
    if (scena == 5) if (color[B] < 255) { color[B] += COLOR_STEP; break; } else scena--;
    if (scena == 4) if (color[R])       { color[R] -= COLOR_STEP; break; } else scena--;
    if (scena == 3) if (color[G] < 255) { color[G] += COLOR_STEP; break; } else scena--;
    if (scena == 2) if (color[B])       { color[B] -= COLOR_STEP; break; } else scena--;
    if (scena == 1) if (color[R] < 255) { color[R] += COLOR_STEP; break; } else scena--;
    if (scena == 0) if (color[G])       { color[G] -= COLOR_STEP; break; } else scena = 5;
  }
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Попробуйте описать формулу зависимости R, G и B от расстояния.

b707
Offline
Зарегистрирован: 26.05.2017

и в чем проблема? - составьте табличку с парами значений  "расстояние - цвет".

Расстояние               Цвет
=============================
20                       красный
40                       Желтый
60                      Зеленый
80                      Синий

И дальше простейший каскад условий IF - если расстояние до 20см - цвет красный. если более 20, но менее 40 - желтый.....

anonim9900
Offline
Зарегистрирован: 26.11.2021

Благодарю всех за советы. Я почти в этом всём разобрался, но осталось понять, почему диод через короткое время тухнет? Я хочу чтоб он горел постоянно. Как я понял менять значение delay нет смысла или я не прав?

sadman41
Offline
Зарегистрирован: 19.10.2016

Почему нет? Меняй...

anonim9900
Offline
Зарегистрирован: 26.11.2021

Хороший вопрос! Надо подумать!!! :)

b707
Offline
Зарегистрирован: 26.05.2017

anonim9900 пишет:

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

это тонкий троллинг такой - спрашивать, стоит ли менять делей в коде, которого мы не видели?

anonim9900
Offline
Зарегистрирован: 26.11.2021

Я просто интересуюсь

b707
Offline
Зарегистрирован: 26.05.2017

anonim9900 пишет:

Я просто интересуюсь

хочешь - меняй, а хочешь не меняй...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

"Алгоритм непрерывного спектра." Было дело...

// algorithm of continuous spectrum
void ColorRight() {
  while (true) {
    if (scena == 0) if (color[G] < 255) { color[G] += COLOR_STEP; break; } else scena++;
    if (scena == 1) if (color[R])       { color[R] -= COLOR_STEP; break; } else scena++;
    if (scena == 2) if (color[B] < 255) { color[B] += COLOR_STEP; break; } else scena++;
    if (scena == 3) if (color[G])       { color[G] -= COLOR_STEP; break; } else scena++;
    if (scena == 4) if (color[R] < 255) { color[R] += COLOR_STEP; break; } else scena++;
    if (scena == 5) if (color[B])       { color[B] -= COLOR_STEP; break; } else scena = 0;
  }
}

void ColorLeft() {
  while (true) {
    if (scena == 5) if (color[B] < 255) { color[B] += COLOR_STEP; break; } else scena--;
    if (scena == 4) if (color[R])       { color[R] -= COLOR_STEP; break; } else scena--;
    if (scena == 3) if (color[G] < 255) { color[G] += COLOR_STEP; break; } else scena--;
    if (scena == 2) if (color[B])       { color[B] -= COLOR_STEP; break; } else scena--;
    if (scena == 1) if (color[R] < 255) { color[R] += COLOR_STEP; break; } else scena--;
    if (scena == 0) if (color[G])       { color[G] -= COLOR_STEP; break; } else scena = 5;
  }
}

смешиванием цветов?

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Та, не, надо менять, стопудоф! Спроси у Рабиновича!

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

Green
Offline
Зарегистрирован: 01.10.2015

ua6em пишет:

смешиванием цветов?

Популярно.