Светодиод RGB и кнопка в TinkerCAD

Я работаю в TinkerCAD и хочу спроектировать и смоделировать схему, в которой есть следующие компоненты. 1. 1 светодиод RGB 2. 1 кнопка 3. 3 фоторезистора. 4. 1 плата Ардуино. Так что свет должен быть выключен на старте. Когда кнопка нажата в первый раз, светодиод должен загореться красным цветом, а затем яркость красного цвета должна контролироваться одним из трех используемых фоторезисторов. кнопка нажата, светодиод должен загореться зеленым, и зеленый цвет на этот раз должен контролироваться другим фоторезистором.. когда кнопка нажата в третий раз, светодиод должен изменить цвет на синий, а третий фоторезистор должен иметь возможность управлять яркостью синего цвета. И этот цикл должен продолжаться при нажатии кнопки Push.

пожалуйста, скажите мне, что не так.

Код выглядит так

int button_state = 0;//объявление переменной
int counter;//объявление другой переменной, будет считать, какой цвет будет подсвечиваться
const int pRed = A2; //назначаем контакт A2 как pRed
const int pBlue = A1; //.............A1....pСиний
const int pGreen = A0; //............A0.....pЗеленый
int inputRed;//будет сохранено настроенное значение яркости светодиода
int inputGreen;
int inputBlue;
const int ledRed = 9;
const int ledGreen = 11;
const int ledBlue = 10;

void setup()
{
  pinMode(2,INPUT);
  pinMode(ledRed,OUTPUT);
  pinMode(ledGreen,OUTPUT);
  pinMode(ledBlue,OUTPUT);
  pinMode(pRed,INPUT);
  pinMode(pGreen,INPUT);
  pinMode(pBlue,INPUT);
}

void loop()
{
  button_state = digitalRead(2);// чтение состояния кнопки
  inputRed = analogRead(pRed);//Чтение значения с вывода A2
  inputRed = map(inputRed,0,1023,0,255);//значение с вывода A2 с поправкой на яркость светодиода
  if (button_state == HIGH) {
    counter = 0; // Объявление счетчика снова равным 0
    analogWrite(ledRed,inputRed);
    analogWrite(ledGreen, 0);
    analogWrite(ledBlue, 0);
    delay(10);// ждем 10 миллисекунд(ы)
    green();// Переходим к зеленому
  }
}
void green()
{
  while (counter == 0){//counter был объявлен 0 в функции цикла, поэтому код не будет выполняться, пока он не станет только 0
  button_state = digitalRead(2);//для повторного чтения состояния кнопки
  inputGreen = analogRead(pGreen);//считываем сигнал с A0, так как это вход для фоторезистора для зеленого света
  inputGreen = map(inputGreen,0,1023,0,255);  //сопоставлено значение с вывода A0
  if (button_state == HIGH) {
    counter++; // Увеличение счетчика на 1, чтобы теперь он стал 1.
    analogWrite(ledRed,0); 
    analogWrite(ledGreen,inputGreen);
    analogWrite(ledBlue,0);
    delay(10);// ждем 10 миллисекунд(ы)
    blue(); // переходим к функции синего светодиода
  }
}
}
void blue()
{
  while (counter == 1)//используем while, чтобы код не выполнялся, если counter=1, как это сделано в функции для зеленого света
  {
  button_state = digitalRead(2);
  inputBlue = analogRead(pBlue);//чтение значения с вывода A1
  inputBlue = map(inputBlue,0,1023,0,255);//сопоставлено значение с вывода A1
  if (button_state == HIGH) {//
    counter++;
    analogWrite(ledRed,0);
    analogWrite(ledGreen,0);
    analogWrite(ledBlue,inputBlue);
    delay(10);// ждем 10 миллисекунд(ы)
  }
  }
}


, 👍0


2 ответа


1

пожалуйста, скажите мне, что не так.

Извините, но почти все. Вам нужно переосмыслить ход программы с нуля.

Отделите кнопку от действий светодиода. Кнопка должна управлять только счетчиком. Затем счетчик принимает решение, что делать со светодиодами.

Также вы должны узнать о концепции изменения с помощью кнопки. Вы не хотите что-то делать, если кнопка находится на высоком уровне, так как это будет делаться все время, пока кнопка нажата. Вместо этого вам нужно научиться делать что-то только в тот момент, когда кнопка переключается с низкого уровня на высокий.

В качестве примерного наброска того, как может выглядеть ваша программа, вот псевдолистинг:

  • Установите счетчик на 0
  • Если кнопка меняется с НИЗКОГО на ВЫСОКИЙ
    • Увеличить счетчик
  • Если счетчик больше 3
    • Установите счетчик на 1

Это даст вам последовательность 0-1-2-3-1-2-3-1-2-3 для счетчика при нажатии кнопки.

Далее в вашем цикле есть отдельный раздел, посвященный счетчику.

  • Если счетчик равен 0
    • Выключите все светодиоды.
  • Если счетчик равен 1
    • Управляйте красным светодиодом и выключайте остальные.
  • Если счетчик равен 2
    • Управляйте зеленым светодиодом и выключайте остальные.
  • Если счетчик равен 3
    • Управляйте синим светодиодом и выключайте остальные.

Если вы правильно это реализуете, вы создадите конечный автомат.

,

Хорошо, не могли бы вы дать мне примерное описание команд, которые можно использовать, когда кнопка переключается с LOW на HIGH, я действительно перепробовал все, что знаю. Примера чего-то подобного также будет достаточно., @Mahima Pareek

digitalRead(), if() и запоминание состояния кнопки *было*., @Majenko

Кроме того, вам нужно будет устранить дребезг нажатий кнопок. (Когда вы обнаружите изменение кнопки с низкого уровня на высокий, запишите значение в миллисекундах и игнорируйте дальнейшие изменения в течение 20–100 мс.), @Duncan C

@DuncanC Зависит от того, сколько задержек вы в конечном итоге засоряете вокруг ... Но да, достойное устранение дребезга всегда хорошо., @Majenko

Как насчет **НИКАКИХ** задержек?, @Duncan C

@DuncanC Затем добавьте к кнопке сеть RC: P Или используйте одну из множества библиотек для устранения дребезга., @Majenko

Не очень сложно написать код кнопки с отключенным дребезгом. Смотрите мой ответ, чтобы узнать, как это сделать., @Duncan C

@DuncanC Я знаю, но это не то, что ты хочешь делать каждый раз. Вот почему я написал свою собственную библиотеку, чтобы сделать это. Напиши один раз, используй много. Зачем каждый раз писать один и тот же код?, @Majenko


0

Ваш код может выглядеть примерно так

#define debounceTime 50   //Измените это значение, чтобы настроить уровень устранения дребезга
unsigned long lastButtonMillis = 0;
uInt8 switchState = 0;
uInt8 oldButtonState = LOW;

void setup() {
   //Ваш код установки
}

void handleSwitchChange(uInt8 switchState) {
   switch switchState {
      case 0:
         // код для красного
         break;

      case 1:
         //код для зеленого
         break;

      case 1:
         // код для синего
         break;

   }
}

void loop() {
    //Если прошло достаточно времени, проверяем нажатия кнопок
    if (millis() - lastButtonMillis >= debounceTime) {
        lastButtonMillis = millis();
        if (oldButtonState == LOW && digitalRead(switchPin) == HIGH) {
            oldButtonState = HIGH;
            switchState = (switchState + 1) % 3; //значение будет циклически повторяться 0,1,2,0,1,2
            handleSwitchChange(switchState);
        }
    } else { 
        oldButtonState = digitalRead(switchPin);
    }
}
,