Как запустить 3 режима работы, для каждой операции есть отдельная кнопка для выбора режима в Arduino?
Мне нужно запустить 3 режима работы, если в arduino нажаты 3 кнопки. Я сделал логику кода инициализации для одной кнопки и одной операции, но получил сообщение об ошибке "переопределение int ena1".
например:
если нажата кнопка 1, то двигатель должен вращаться на низкой скорости , если нажата кнопка 2, то двигатель должен вращаться на средней скорости , если нажата кнопка 3, то двигатель должен вращаться на высокой скорости
Если бы у меня было какое-то предложение о том, как определить блок кода для приведенной выше логики, мне было бы очень полезно получить решение.
Пожалуйста, помогите мне исправить код.
//modeselectiion
const int buttonPin=22;
int buttonState = 0;
int flag=0;
//pinout setup for L298N motors
#define trigpin 4
#define echopin 3
int ena1 = 5;
int enb1 = 6;
int in1A = 7;
int in2A = 8;
int in3A = 9;
int in4A = 10;
int ena2 = 11;
int enb2 = 12;
int in1B = 13;
int in2B = 44;
int in3B = 45;
int in4B = 46;
int led1 = 54;
int led2 = 55;
int led3 = 56;
int led4 = 57;
int led5 = 58;
float distancem;
void setup()
{
pinMode(buttonPin, INPUT_PULLUP)
}
void loop()
{
//Read button state
buttonState = digitalRead(buttonPin);
//if pressed
if (buttonState == LOW) {
if (flag == 0){
Mode_A();
flag=1;
}
}
}
void Mode_A()
{
Serial.begin(9600);
pinMode(trigpin, OUTPUT);
pinMode(echopin, INPUT);
pinMode(ena1, OUTPUT);
pinMode(enb1, OUTPUT);
pinMode(ena2, OUTPUT);
pinMode(enb2, OUTPUT);
pinMode(in1A, OUTPUT);
pinMode(in2A, OUTPUT);
pinMode(in3A, OUTPUT);
pinMode(in4A, OUTPUT);
pinMode(in1B, OUTPUT);
pinMode(in2B, OUTPUT);
pinMode(in3B, OUTPUT);
pinMode(in4B, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
analogWrite(ena1, 0);
analogWrite(enb1, 0);
analogWrite(ena2, 0);
analogWrite(enb2, 0);
delay(1000);
int duration, distance;
digitalWrite(trigpin, HIGH);
delayMicroseconds(1000);
digitalWrite(trigpin, LOW);
duration = pulseIn(echopin,HIGH);
distance = ( duration / 2) / 29.1;
Serial.println("inches:");
Serial.println(distance);
distance = map(distance, 0 , 197, 0 , 255 );
if ((distance < 0)) {
distance = 0;
} else if ((distance >= 0) && (distance <= 40)) {
//motor 1 set
analogWrite(ena1, 0);
analogWrite(enb1, 0);
digitalWrite(in1A, LOW);
digitalWrite(in2A, LOW);
digitalWrite(in3A, LOW);
digitalWrite(in4A, LOW);
//motor 2 set
analogWrite(ena2, 0);
analogWrite(enb2, 0);
digitalWrite(in1B, LOW);
digitalWrite(in2B, LOW);
digitalWrite(in3B, LOW);
digitalWrite(in4B, LOW);
//led light
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
} else if ((distance > 40) && (distance <= 57)) {
//motor 1 set
analogWrite(ena1, distance);
analogWrite(enb1, distance);
digitalWrite(in1A, HIGH);
digitalWrite(in2A, LOW);
digitalWrite(in3A, LOW);
digitalWrite(in4A, HIGH);
//motor 2 set
analogWrite(ena2, distance);
analogWrite(enb2, distance);
digitalWrite(in1B, HIGH);
digitalWrite(in2B, LOW);
digitalWrite(in3B, LOW);
digitalWrite(in4B, HIGH);
//led light
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
} else if((distance > 57) && (distance <= 74)) {
//motor 1 set
analogWrite(ena1, distance);
analogWrite(enb1, distance);
digitalWrite(in1A, HIGH);
digitalWrite(in2A, LOW);
digitalWrite(in3A, LOW);
digitalWrite(in4A, HIGH);
//motor 2 set
analogWrite(ena2, distance);
analogWrite(enb2, distance);
digitalWrite(in1B, HIGH);
digitalWrite(in2B, LOW);
digitalWrite(in3B, LOW);
digitalWrite(in4B, HIGH);
//led light
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
} else if ((distance > 70) && (distance <= 91)) {
//motor 1 set
analogWrite(ena1, distance);
analogWrite(enb1, distance);
digitalWrite(in1A, HIGH);
digitalWrite(in2A, LOW);
digitalWrite(in3A, LOW);
digitalWrite(in4A, HIGH);
//motor 2 set
analogWrite(ena2, distance);
analogWrite(enb2, distance);
digitalWrite(in1B, HIGH);
digitalWrite(in2B, LOW);
digitalWrite(in3B, LOW);
digitalWrite(in4B, HIGH);
//led light
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
} else if ((distance > 91) && (distance <= 108)) {
//motor 1 set
analogWrite(ena1, distance);
analogWrite(enb1, distance);
digitalWrite(in1A, HIGH);
digitalWrite(in2A, LOW);
digitalWrite(in3A, LOW);
digitalWrite(in4A, HIGH);
//motor 2 set
analogWrite(ena2, distance);
analogWrite(enb2, distance);
digitalWrite(in1B, HIGH);
digitalWrite(in2B, LOW);
digitalWrite(in3B, LOW);
digitalWrite(in4B, HIGH);
//led light
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, LOW);
} else if ((distance > 108) && (distance <= 127)) {
//motor 1 set
analogWrite(ena1, distance);
analogWrite(enb1, distance);
digitalWrite(in1A, HIGH);
digitalWrite(in2A, LOW);
digitalWrite(in3A, LOW);
digitalWrite(in4A, HIGH);
//motor 2 set
analogWrite(ena2, distance);
analogWrite(enb2, distance);
digitalWrite(in1B, HIGH);
digitalWrite(in2B, LOW);
digitalWrite(in3B, LOW);
digitalWrite(in4B, HIGH);
//led light
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, HIGH);
} else if (distance > 127) {
//motor 1 set
analogWrite(ena1, distance);
analogWrite(enb1, distance);
digitalWrite(in1A, HIGH);
digitalWrite(in2A, LOW);
digitalWrite(in3A, LOW);
digitalWrite(in4A, HIGH);
//motor 2 set
analogWrite(ena2, distance);
analogWrite(enb2, distance);
digitalWrite(in1B, HIGH);
digitalWrite(in2B, LOW);
digitalWrite(in3B, LOW);
digitalWrite(in4B, HIGH);
//led light
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, HIGH);
}
}
@Praveen , 👍0
Обсуждение2 ответа
Код, который вы опубликовали, кажется немного не связанным с вопросом, который вы задаете. Чтобы ответить только на этот вопрос, я бы использовал следующий подход:
uint8_t speed = LOW_SPEED;
void loop()
{
if (digitalRead(BUTTON_SLOW) == LOW)
speed = SLOW_SPEED;
else if (digitalRead(BUTTON_MEDIUM) == LOW)
speed = MEDIUM_SPEED;
else if (digitalRead(BUTTON_FAST) == LOW)
speed = FAST_SPEED;
analogWrite(EN_PIN, speed);
}
Обратите внимание, что это одна из тех простых ситуаций, когда вам даже не нужно отказываться от кнопок.
Большое спасибо за предложение _/\_ . Код, который размещен, имеет 2 драйвера двигателя L3298N для управления 4 двигателями радиоуправляемого автомобиля. В зависимости от расстояния от ультразвукового расстояния контролируется скорость вращения двигателя. Проблема в том, что мне нужно установить двигатель на 200 об / мин для режима 1 и 300 об / мин для режима 2 с помощью кнопки. Я очень смущен пустым циклом и определением структуры кодирования. Если я смогу получить обзор хотя бы для одного режима, я соответствующим образом обновлю код другого режима., @Praveen
Это не ответ.
Это самый простой способ включить код в комментарий.
Ваш код слишком сложен и длинен.
Первый раздел void Mode_A()
должен быть в setup ()
, потому что он должен выполняться только один раз.
Последняя серия блоков if содержит идентичный код управления двигателем.
Переместите код управления двигателем и код управления светодиодом в отдельные блоки if-else
, чтобы получить что-то вроде следующего фрагмента кода.
Кроме того, уберите комментарии из кода, чтобы код выглядел менее загроможденным.
distance = map(distance, 0 , 197, 0 , 255 );
if (distance < 0) distance = 0;
if (distance <= 40) {
analogWrite(ena1, 0); // turn off motor 1
analogWrite(enb1, 0);
digitalWrite(in1A, LOW);
digitalWrite(in2A, LOW);
digitalWrite(in3A, LOW);
digitalWrite(in4A, LOW);
analogWrite(ena2, 0); // turn off motor 2
analogWrite(enb2, 0);
digitalWrite(in1B, LOW);
digitalWrite(in2B, LOW);
digitalWrite(in3B, LOW);
digitalWrite(in4B, LOW);
digitalWrite(led1, LOW); // turn off LEDs
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
}
else {
analogWrite(ena1, distance); // motor 1 set
analogWrite(enb1, distance);
digitalWrite(in1A, HIGH);
digitalWrite(in2A, LOW);
digitalWrite(in3A, LOW);
digitalWrite(in4A, HIGH);
analogWrite(ena2, distance); // motor 2 set
analogWrite(enb2, distance);
digitalWrite(in1B, HIGH);
digitalWrite(in2B, LOW);
digitalWrite(in3B, LOW);
digitalWrite(in4B, HIGH);
digitalWrite(led1, HIGH); // turn on first LED, the following lines turn on other LEDs
}
if (distance > 57) {
digitalWrite(led2, HIGH); // led light
}
else {
digitalWrite(led2, LOW);
}
if (distance > 70) {
digitalWrite(led3, HIGH); // led light
}
else {
digitalWrite(led3, LOW);
}
// following two "if-else" blocks are shown with reduced number of code lines as an example only
// it is meant to show how to reduce the number of code lines
// feel free to format them same as above
if (distance > 91) { digitalWrite(led4, HIGH); } // compacted "if-else" block
else { digitalWrite(led4, LOW ); }
if (distance > 108) { digitalWrite(led5, HIGH); } else { digitalWrite(led5, LOW); } // single line "if-else" block
- Нужна помощь в создании кода, который перемещает двигатель постоянного тока CW или CCW с помощью двух разных кнопок
- Rasberry Pi, управляющий Arduino - считывает "призрачный" вход - не завершает логический цикл
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как управлять 4 двигателями постоянного тока с помощью Arduino?
- Измерение скорости двигателя постоянного тока с помощью поворотного энкодера
- Почему Arduino сбрасывается во время управления двигателями?
- Наилучший метод проектирования схемы с 20 кнопками
- Возникла проблема с переобъявлением символа другого типа
переопределение int ena1
... это все сообщение об ошибке, которое вы получаете? ... больше ничего не показывают?, @jsotolaизвините.. Я скопировал файл в отдельную папку и скомпилировал его снова, и вдруг я не получил никаких ошибок. Но я не уверен, сработает это или нет!, @Praveen