Skocz do zawartości

Arduino sterowanie za pomocą przycisku mostkiem H


Pomocna odpowiedź

Napisano (edytowany)

Witam.

Problem jest zapewne trywialny, ale nie mogę sobie z nim poradzić. Próbuję stworzyć prosty programik do sterowania silnikiem lewo/prawo za pomocą przycisku i mostka H.

Na początek wypociłem kodzik, w którym po naciśnięciu przycisku silnik obraca się w jednym kierunku, a po następnym naciśnięciu silnik obraca się w przeciwnym kierunku. Dodatkowo kręcenie się silnika w jednym z kierunków jest sygnalizowane diodą. To było proste i działa. Kod:

#include <ezButton.h>

const int LED=14;

const int B1A=8;
const int B1B=9;

ezButton button(4);

int stan=LOW;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  button.setDebounceTime(50);

  pinMode(B1A,OUTPUT);
  pinMode(B1B,OUTPUT);
  digitalWrite(B1A,LOW);
  digitalWrite(B1B,LOW);
}

void loop() {
  // put your main code here, to run repeatedly:
  button.loop();
  
  if(button.isPressed())
  {
    Serial.println("The button 1 is pressed");
    stan=!stan;
    digitalWrite(LED, stan);
    Serial.println(stan);
    switch (stan)
    {
      case 0:
      digitalWrite(B1A,HIGH);
      digitalWrite(B1B,LOW);
      break;
    
      case 1:
      digitalWrite(B1A,LOW);
      digitalWrite(B1B,HIGH);
      break;
      break;
    }
    }
}

Następnie chciałem ten kod zmodyfikować tak, aby po naciśnięciu przycisku silnik kręcił się w jednym kierunku przez dwie sekundy po czym zatrzymał, a po kolejnym naciśnięciu kręcił się w przeciwnym kierunku przez dwie sekundy i zatrzymał. Kod:

#include <ezButton.h>

const int LED=14;

const int B1A=8;
const int B1B=9;

ezButton button(4);

int stan=LOW;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  button.setDebounceTime(50);

  pinMode(B1A,OUTPUT);
  pinMode(B1B,OUTPUT);
  digitalWrite(B1A,LOW);
  digitalWrite(B1B,LOW);
}

void loop() {
  // put your main code here, to run repeatedly:
  button.loop();
  
  if(button.isPressed())
  {
    Serial.println("The button 1 is pressed");
    stan=!stan;
    digitalWrite(LED, stan);
    Serial.println(stan);
    switch (stan)
    {
      case 0:
      digitalWrite(B1A,HIGH);
      digitalWrite(B1B,LOW);
      delay(2000);
      digitalWrite(B1A,LOW);
      digitalWrite(B1B,LOW);
      break;
    
      case 1:
      digitalWrite(B1A,LOW);
      digitalWrite(B1B,HIGH);
      delay(2000);
      digitalWrite(B1A,LOW);
      digitalWrite(B1B,LOW);
      break;
      break;
    }
    }
}

Niestety powyższy kod nie działa tak jakbym chciał. Po naciśnięciu przycisku silnik kręci się w jednym kierunku, a po dwóch sekundach w przeciwnym i dopiero zatrzymuje. Na monitorze portu szeregowego zauważyłem, że po dwóch sekundach od naciśnięcia przycisku wykrywane jest kolejne naciśnięcie. Nie mogę dojść dlaczego tak się dzieje. Proszę o jakieś porady jak to rozwiązać.

Edytowano przez Szeldor
Błąd
  • Lubię! 1

Na początek:

1. Niepotrzebna druga instrukcja "break" na samym końcu programu.

2. Jeśli traktujesz zmienną stan jako logiczną (bo ją np. negujesz) to niech konsekwentnie będzie typu boolean.

Dzięki za odpowiedź. Wprowadziłem twoje sugestie, domyślam się, że miały one raczej na celu pokazanie dobrych praktyk podczas pisania programu, a nie rozwiązanie mojego problemu. Wrzucam kod po powyższych zmianach. Nadal śledząc monitor portu szeregowego program po 2 sekundach wykrywane jest naciśnięcie przycisku.

#include <ezButton.h>

const int LED=14;

const int B1A=8;
const int B1B=9;

ezButton button(4);

boolean stan=LOW;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  button.setDebounceTime(50);

  pinMode(B1A,OUTPUT);
  pinMode(B1B,OUTPUT);
  digitalWrite(B1A,LOW);
  digitalWrite(B1B,LOW);
}

void loop() {
  // put your main code here, to run repeatedly:
  button.loop();
  
  if(button.isPressed())
  {
    Serial.println("The button 1 is pressed");
    stan=!stan;
    digitalWrite(LED, stan);
    Serial.println(stan);
    switch (stan)
    {
      case 0:
      digitalWrite(B1A,HIGH);
      digitalWrite(B1B,LOW);
      delay(2000);
      digitalWrite(B1A,LOW);
      digitalWrite(B1B,LOW);
      break;
    
      case 1:
      digitalWrite(B1A,LOW);
      digitalWrite(B1B,HIGH);
      delay(2000);
      digitalWrite(B1A,LOW);
      digitalWrite(B1B,LOW);
      break;
    }
    }
}

 

Spróbuj coś takiego:

#include <ezButton.h>

const int LED = 14;

const int B1A = 8;
const int B1B = 9;

ezButton button(4);

boolean stan = LOW;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  button.setDebounceTime(50);

  pinMode(B1A, OUTPUT);
  pinMode(B1B, OUTPUT);
  digitalWrite(B1A, LOW);
  digitalWrite(B1B, LOW);
}

void loop() {
  // put your main code here, to run repeatedly:
  button.loop();

  if (button.isPressed())
  {
    Serial.println("The button 1 is pressed");
    stan = !stan;
    digitalWrite(LED, stan);
    Serial.println(stan);
    switch (stan)
    {
      case 0:
        digitalWrite(B1A, HIGH);
        digitalWrite(B1B, LOW);
        delay(2000);
        digitalWrite(B1A, LOW);
        digitalWrite(B1B, LOW);
        break;

      case 1:
        digitalWrite(B1A, LOW);
        digitalWrite(B1B, HIGH);
        delay(2000);
        digitalWrite(B1A, LOW);
        digitalWrite(B1B, LOW);
        break;
    }
    while (!button.isReleased()) {
      button.loop();
    }
  }
}

 

Dzięki za pomoc, ale poradziłem sobie wykorzystując funkcję millis(). Załączam kod, może się komuś przyda.

#include <ezButton.h>

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzasLED = 0;

const int LED=7;
const int B1A=3;
const int B1B=4;

ezButton button(6);

boolean stan=LOW;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  button.setDebounceTime(50);

  pinMode(B1A,OUTPUT);
  pinMode(B1B,OUTPUT);
  digitalWrite(B1A,HIGH);
  digitalWrite(B1B,LOW);
}

void loop() {
  // put your main code here, to run repeatedly:
  aktualnyCzas = millis();
  button.loop();
  
  if(button.isPressed())
  {
    Serial.println("The button 1 is pressed");
    stan=!stan;
    digitalWrite(LED, stan);
    zapamietanyCzasLED = aktualnyCzas; //Zapamietaj czas
    Serial.println(stan);
    switch (stan)
    {
      case 0:
      digitalWrite(B1A,HIGH);
      digitalWrite(B1B,LOW);
      break;
    
      case 1:
      digitalWrite(B1A,LOW);
      digitalWrite(B1B,HIGH);
      break;
    }
    }
    if (aktualnyCzas - zapamietanyCzasLED >= 2000UL)
   {
    digitalWrite(B1A,LOW);
    digitalWrite(B1B,LOW);
    }
}

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...