Skocz do zawartości

Wykrycie pozycji rolety i bramy czujnik HALLA z arduino


Burza22

Pomocna odpowiedź

@Burza22 Pamiętaj, żeby nie komplikować niepotrzebnie programu, proste rozwiązania są najlepsze.

Problem z Twoim programem polega na tym, że nie rozróżniasz momentu pojawienia się sygnału otwarte/zamknięte od jego trwania. Bo zatrzymywać silniki należy tylko gdy sygnał się pojawia, a nie cały czas gdy trwa - dlatego sterowanie nie działa. Zaproponowałem implementację maszyny stanowej bo wydawało mi się to prostą opcją. Ale mnożenie stanów ponad potrzebę na pewno nie jest tym co wypadałoby zrobić.

Bo w rzeczywistości najprostsze rozwiązanie problemu to:

static bool prev_closed = false;
static bool prev_open = false;

bool is_closed = (digitalRead(Zamkniecie) == LOW);
bool is_open = (digitalRead(Otwarcie) == LOW);

if (!prev_closed && is_closed)
      {
      silnik.writeMicroseconds(1500);
      }

if (!prev_open && is_open)
      {
      silnik.writeMicroseconds(1500);
      }

prev_closed = is_closed;
prev_open = is_open;

Ale automat skończony wydawał mi się ładniejszy, no i dobrze prezentuje się w pracy inż. 🙂 

  • Lubię! 1
Link do komentarza
Share on other sites

@Burza22 Skoro masz dwa silniki i oba są sterowane dokładnie tak samo, to nie ma sensu duplikować kodu, ani tym bardziej stanów. Jeśli programujesz w C++ to jest to dobre miejsce na użycie obiektowości i utworzenie klasy np. SterownikSilnika. W programie będziesz miał po prostu dwie instancje tego sterownika - pierwszą do sterowania roletą, drugą bramą. Kod nie będzie duplikowany, a jak kiedyś będziesz chciał sterować np. dwoma roletami i bramą, program będzie wymagał minimalnych zmian.

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

1 minutę temu, Burza22 napisał:

zostawię narazie tego case

Ależ cały problem polega na tym, że robisz switcha zależnego od wydanej komendy, zamiast od stanu bramy/rolety. W ten sposób raz że pogubisz się w końcu w ifach, dwa że i tak nie będzie to działać jak trzeba.

Zrób na razie sterowanie pojedynczym silnikiem.

Link do komentarza
Share on other sites

Jeśli zatrzymywanie silnika będzie wykonywane tylko przy zboczu sygnału, tzn. w momencie zadziałania czujnika krańcowego, główny switch/case realizujący komendy może zostać prawie bez zmian. Ten program jest tak banalny że nie trzeba go na siłę komplikować ani duplikować tego samego kodu.

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.