Skocz do zawartości

Arduino sterowanie za pomocą przycisku mostkiem H


Szeldor

Pomocna odpowiedź

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
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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;
    }
    }
}

 

Link do komentarza
Share on other sites

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();
    }
  }
}

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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);
    }
}

 

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.