Как запустить 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);
    } 
}

, 👍0

Обсуждение

переопределение int ena1 ... это все сообщение об ошибке, которое вы получаете? ... больше ничего не показывают?, @jsotola

извините.. Я скопировал файл в отдельную папку и скомпилировал его снова, и вдруг я не получил никаких ошибок. Но я не уверен, сработает это или нет!, @Praveen


2 ответа


0

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

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


0

Это не ответ.

Это самый простой способ включить код в комментарий.

Ваш код слишком сложен и длинен.

Первый раздел 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
,