Пытаюсь понять, как заставить программу делать три вещи нажатием кнопки
Я пытаюсь написать код, который едва понимаю, но он продвигается! Но я думаю, что наткнулся на стену, которую мне нужно было бы преодолеть...
Я не прошу вас исправить мой код — я знаю, что я буду учиться не так, возможно, объясните, почему мой код не делает то, что я хочу, и/или какие-то ресурсы, которые я могу использовать для этого. узнать об этом.
Я думаю, это как-то связано с тем, что я пытаюсь использовать одни и те же контакты в части инициализации, поскольку ошибка связана с конфликтующим объявлением..
Вот мой макет, если это тоже поможет:
//О ПРОГРАММЕ. Цель этой программы — заставить кнопку переключаться между тремя различными «режимами».
//Режим 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 loop(); — думаю, у меня может быть только один цикл 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;
}
}
@John Gawler, 👍0
Обсуждение3 ответа
Есть две вещи, которые я считаю неправильными:
- У вас есть два набора одинаковых определений контактов. Вам нужен только один комплект. Оба набора идентичны: как только он определен, вы не можете снова определить его как одно и то же.
- Похоже, у вас есть функция, определённая в середине вашей функции цикла(). Это не может сработать — функции должны быть отдельными вещами. (также вам не нужен
;
в определении вашей функции...)
Вы использовали синюю нижнюю шину для заземления, а красную нижнюю шину (обычно используемую для +5 В) использовали в качестве простой точки подключения. Это не неправильно, но достаточно необычно, чтобы сбить с толку читателей. Выбор красного сигнального провода кнопки на красной шине также настоятельно предполагает подключение к +5 В, хотя в данном случае это не так.
Кнопки, «тактовые» переключатели, сбивают с толку своей конструкцией (см. рисунок ниже). Каждая пара контактов, изогнутых друг к другу (я отметил один красной стрелкой), физически является одним и тем же контактом и всегда соединена друг с другом. Пары соединяются друг с другом только при нажатии кнопки. Это действительно легко пропустить и вставить кнопку на 90 градусов в любую сторону от того, что вы планировали. Значок кнопки Fritzing также не показывает ориентацию. Возможно, вы правы: это просто ловушка, о которой следует знать.
void Fade(uint8_t pin);
не определяет функцию — он объявляет, что она существует где-то еще. Я думаю, вы имели в виду void Fade(uint8_t pin){ ...
(обратите внимание на отсутствие точки с запятой), который определял бы функцию, если бы это было подходящее место для этого. Но в C и C++ функции не могут быть определены внутри других функций (в данном случае цикла()). Исправьте определение «затухания» и переместите его выше «setup()». Это позволит правильно определить его и сделать его пригодным для использования внутри функции цикла().
Кобочные скобки {}, в которых вы пытались определить вторую функцию цикла, не нужны (и вы правы, вы не можете определить более одной функции с одним и тем же именем и сигнатурой (количество и типы параметров, и тип возвращаемого значения). Но вам не нужен еще один loop()
; код, содержащийся в {} - три вызова функции постепенного затухания - остается частью case 2:
.
Я думаю, что вам не хватает понижающего резистора для кнопки. Проще говоря, понижающий резистор — это резистор, понижающий входное показание до 0, когда кнопка не нажата. Без подтягивающего резистора значение, считанное в digitalRead
, будет плавать, давая неточные результаты.
Выше приведена схема, показывающая, как следует подключить понижающий резистор к кнопке.
Если вы хотите узнать больше о резисторах понижения напряжения, обратитесь к этой странице с описанием кнопок на веб-сайте Arduino.
Это всего лишь аппаратная проблема, которую я заметил; Надеемся, это поможет вам в дополнение к другим рекомендациям.
Кроме того, можно также использовать подтягивающий резистор, и в этом случае значение будет равно 1, когда кнопка не нажата.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Измените заголовок на более конкретный вопрос. Что именно в коде вам не понятно?, @MichaelT