Skocz do zawartości

Wykrycie pozycji rolety i bramy czujnik HALLA z arduino


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

@ethanak  @Elvis ostatnie pytanko , to teraz zrobić osobnego switcha do stanu bramy i rolety i może zostać ten switch do sterowania roleta i brama tak jak mam ta? Czy poprostu wywalić to co mam i kombinować z innym switchem? Bo już się trochę zmieszalem z tym wszystkim 😅

@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.

@Elvisjutro spróbuję tego najprostszego rozwiązania zostawię narazie tego case i dodam te ify co tu napisałeś gdyby to działało to spróbuję może faktycznie jakoś to z tymi stanami żeby ładniej było i przejrzyściej 

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.

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.

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...