Светодиод 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 миллисекунд(ы)
}
}
}
@Mahima Pareek, 👍0
2 ответа
пожалуйста, скажите мне, что не так.
Извините, но почти все. Вам нужно переосмыслить ход программы с нуля.
Отделите кнопку от действий светодиода. Кнопка должна управлять только счетчиком. Затем счетчик принимает решение, что делать со светодиодами.
Также вы должны узнать о концепции изменения с помощью кнопки. Вы не хотите что-то делать, если кнопка находится на высоком уровне, так как это будет делаться все время, пока кнопка нажата. Вместо этого вам нужно научиться делать что-то только в тот момент, когда кнопка переключается с низкого уровня на высокий.
В качестве примерного наброска того, как может выглядеть ваша программа, вот псевдолистинг:
- Установите счетчик на 0
- Если кнопка меняется с НИЗКОГО на ВЫСОКИЙ
- Увеличить счетчик
- Если счетчик больше 3
- Установите счетчик на 1
Это даст вам последовательность 0-1-2-3-1-2-3-1-2-3 для счетчика при нажатии кнопки.
Далее в вашем цикле есть отдельный раздел, посвященный счетчику.
- Если счетчик равен 0
- Выключите все светодиоды.
- Если счетчик равен 1
- Управляйте красным светодиодом и выключайте остальные.
- Если счетчик равен 2
- Управляйте зеленым светодиодом и выключайте остальные.
- Если счетчик равен 3
- Управляйте синим светодиодом и выключайте остальные.
Если вы правильно это реализуете, вы создадите конечный автомат.
Ваш код может выглядеть примерно так
#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);
}
}
- Управление цифровой адресной светодиодной лентой RGB 12 В с помощью Arduino
- Как изменить яркость светодиодного освещения?
- Чтение характеристического значения BLE в Arduino Uno
- Странное поведение со светодиодной лентой WS2812B RGB
- Быстродействующий массив fill_solid
- Как подключить светодиодную RGB-матрицу 8x8 к Uno?
- RGB светодиодная лента 100м.
- Как подключить две светодиодные ленты (APA102/SK9822) к Arduino UNO?
Хорошо, не могли бы вы дать мне примерное описание команд, которые можно использовать, когда кнопка переключается с LOW на HIGH, я действительно перепробовал все, что знаю. Примера чего-то подобного также будет достаточно., @Mahima Pareek
digitalRead()
,if()
и запоминание состояния кнопки *было*., @MajenkoКроме того, вам нужно будет устранить дребезг нажатий кнопок. (Когда вы обнаружите изменение кнопки с низкого уровня на высокий, запишите значение в миллисекундах и игнорируйте дальнейшие изменения в течение 20–100 мс.), @Duncan C
@DuncanC Зависит от того, сколько задержек вы в конечном итоге засоряете вокруг ... Но да, достойное устранение дребезга всегда хорошо., @Majenko
Как насчет **НИКАКИХ** задержек?, @Duncan C
@DuncanC Затем добавьте к кнопке сеть RC: P Или используйте одну из множества библиотек для устранения дребезга., @Majenko
Не очень сложно написать код кнопки с отключенным дребезгом. Смотрите мой ответ, чтобы узнать, как это сделать., @Duncan C
@DuncanC Я знаю, но это не то, что ты хочешь делать каждый раз. Вот почему я написал свою собственную библиотеку, чтобы сделать это. Напиши один раз, используй много. Зачем каждый раз писать один и тот же код?, @Majenko