Пытаюсь понять, как заставить программу делать три вещи нажатием кнопки

Я пытаюсь написать код, который едва понимаю, но он продвигается! Но я думаю, что наткнулся на стену, которую мне нужно было бы преодолеть...

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

Я думаю, это как-то связано с тем, что я пытаюсь использовать одни и те же контакты в части инициализации, поскольку ошибка связана с конфликтующим объявлением..

Вот мой макет, если это тоже поможет:

Мой макет

//О ПРОГРАММЕ. Цель этой программы — заставить кнопку переключаться между тремя различными «режимами».
//Режим 1 - циклически переключает цвета светодиода RGB
//Режим 2 — сделать один и тот же цикл затухания светодиода RGB через его цвета
//Режим 3 - заставить мигать один и тот же светодиод RGB всеми тремя цветами одновременно
//Могут последовать и дополнительные режимы, но это только начало.

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

//Цикл кнопок — это первая часть моего кода, предназначенная для того, чтобы научить меня, как сделать так, чтобы кнопка переключалась между различными частями кода.

int counter = 0;
int switchPin = 13;
int LEDB = 11;
int LEDG = 10;
int LEDR = 9;

// Цепь светодиода RGB — режим 1
const int redLED=3; //красный светодиод подключается к цифровому контакту 8
const int blueLED=5; //синий светодиод подключен к цифровому контакту 7
const int greenLED=6; //зеленый светодиод, подключенный к контакту 6

//Цепь затухания светодиода RGB — режим 2
const uint8_t redLED = 3;  // контакт, подключенный к красному светодиоду — я не понимаю, почему в этом коде написано const uint8_t —
const uint8_t blueLED = 5;  // вывод, подключенный к зеленому светодиоду
const uint8_t greenLED = 6; // вывод, подключенный к желтому светодиоду

void setup()
{
  Serial.begin(9600); //Я добавил это, чтобы узнать, что делает счетчик
  pinMode(switchPin, INPUT);
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
}

void loop() {
  //Обработка ввода
  int switchVal = digitalRead(switchPin);
  if(switchVal == LOW) // изменено с HIGH, из-за чего режимы меняются случайным образом - может пригодиться позже, но не то, что я хочу изначально
  {
    delay(500);  
    counter ++;
    Serial.println(counter); //выводит значение счетчика на последовательный монитор, чтобы я мог понять, почему оно оказалось случайным
    //Я узнал, что когда переключательVal == HIGH установлен, счетчик будет работать непрерывно. Изготовление каждой кнопки
    //нажимаем, появляются случайным образом. Изменение этого значения на LOW заставило счетчик ждать события LOW перед подсчетом. Увеличение
    //задержка до половины секунды дает время отпустить кнопку, прежде чем счетчик продолжится.

    //Сбрасываем счетчик, если номер режима превышает максимальное
    if(counter > 3)
    {
      counter = 1; //в последовательном мониторе вы увидите, что счетчик достигает 4, но этот код сообщает программе, что 4 = 1, поэтому она работает в правильном режиме
    }
  }
  else
    //Изменить режим 1
    switch (counter) {
    case 1:
      analogWrite(LEDB, 000);
      analogWrite(LEDG, 000);
      analogWrite(LEDR, 255);

      //запуск цикла светодиодов - это просто вставлено из программы цикла светодиодов - кажется, работает нормально

      digitalWrite(redLED,HIGH);//включает светодиод
      delay(100);//ждёт 3 секунды
      digitalWrite(redLED,LOW);//выключает светодиод
      digitalWrite(greenLED,HIGH);//включает светодиод
      delay(100);//ждёт 3 секунды
      digitalWrite(greenLED,LOW);//выключает светодиод
      digitalWrite(blueLED,HIGH);//включаем светодиод
      delay(100);//ждёт 3 секунды
      digitalWrite(blueLED,LOW);//выключает светодиод
      break;

    //код режима 2
    case 2:
      analogWrite(LEDR, 000);
      analogWrite(LEDB, 000);
      analogWrite(LEDG, 255);

      //Цикл затухания светодиода
      // Плавное изменение аналогового вывода вверх и вниз.
      void fade(uint8_t pin);
      {
        for (int i = 1; i <= 255; i=i+5) {
          delay(10);  
        }
        for (int i = 254; i >= 0; i=i-5) {              
          delay(10);
        }     
      }
      //недействительный цикл(); — думаю, у меня может быть только один цикл void, поэтому я пока это комментирую..
      {
        //Serial.println(F("Затухание ЗЕЛЕНОГО."));
        fade(redLED);
        //Serial.println(F("Затухание СИНЕГО."));
        fade(blueLED);
        //Serial.println(F("Затухание ЖЕЛТОГО."));
        fade(greenLED);
      }
      break;

    //режим 3 еще не закодирован — ждём, чтобы режим 2 заработал
    case 3:
      analogWrite(LEDG, 000);
      analogWrite(LEDR, 000);
      analogWrite(LEDB, 255);
      break;
    }
}

, 👍0


3 ответа


2

Есть две вещи, которые я считаю неправильными:

  1. У вас есть два набора одинаковых определений контактов. Вам нужен только один комплект. Оба набора идентичны: как только он определен, вы не можете снова определить его как одно и то же.
  2. Похоже, у вас есть функция, определённая в середине вашей функции цикла(). Это не может сработать — функции должны быть отдельными вещами. (также вам не нужен ; в определении вашей функции...)
,

0

Вы использовали синюю нижнюю шину для заземления, а красную нижнюю шину (обычно используемую для +5 В) использовали в качестве простой точки подключения. Это не неправильно, но достаточно необычно, чтобы сбить с толку читателей. Выбор красного сигнального провода кнопки на красной шине также настоятельно предполагает подключение к +5 В, хотя в данном случае это не так.

Кнопки, «тактовые» переключатели, сбивают с толку своей конструкцией (см. рисунок ниже). Каждая пара контактов, изогнутых друг к другу (я отметил один красной стрелкой), физически является одним и тем же контактом и всегда соединена друг с другом. Пары соединяются друг с другом только при нажатии кнопки. Это действительно легко пропустить и вставить кнопку на 90 градусов в любую сторону от того, что вы планировали. Значок кнопки Fritzing также не показывает ориентацию. Возможно, вы правы: это просто ловушка, о которой следует знать.

Типичный переключатель "Tact"

void Fade(uint8_t pin); не определяет функцию — он объявляет, что она существует где-то еще. Я думаю, вы имели в виду void Fade(uint8_t pin){ ... (обратите внимание на отсутствие точки с запятой), который определял бы функцию, если бы это было подходящее место для этого. Но в C и C++ функции не могут быть определены внутри других функций (в данном случае цикла()). Исправьте определение «затухания» и переместите его выше «setup()». Это позволит правильно определить его и сделать его пригодным для использования внутри функции цикла().

Кобочные скобки {}, в которых вы пытались определить вторую функцию цикла, не нужны (и вы правы, вы не можете определить более одной функции с одним и тем же именем и сигнатурой (количество и типы параметров, и тип возвращаемого значения). Но вам не нужен еще один loop(); код, содержащийся в {} - три вызова функции постепенного затухания - остается частью case 2:.

,

0

Я думаю, что вам не хватает понижающего резистора для кнопки. Проще говоря, понижающий резистор — это резистор, понижающий входное показание до 0, когда кнопка не нажата. Без подтягивающего резистора значение, считанное в digitalRead, будет плавать, давая неточные результаты.

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

Если вы хотите узнать больше о резисторах понижения напряжения, обратитесь к этой странице с описанием кнопок на веб-сайте Arduino.

Это всего лишь аппаратная проблема, которую я заметил; Надеемся, это поможет вам в дополнение к другим рекомендациям.

Кроме того, можно также использовать подтягивающий резистор, и в этом случае значение будет равно 1, когда кнопка не нажата.

,