Skocz do zawartości

Wykrycie pozycji rolety i bramy czujnik HALLA z arduino


Burza22

Pomocna odpowiedź

Dzień dobry jestem na etapie robienia projektu inżynierskiego temat mocno związany z inteligentnym domem , mam zrobić automatyke domową opartą na arduino , mam już kilka rzeczy zrobionych ,  zaprogramowany czujnik ruchu , podłączony moduł bluetooth za pomoca ktorego steruje multiserwami wieloobrotowymi , wyswietlanie temperatury i wilgotnosci na wyswietlaczu , aczkolwiek dziś pojawił się u mnie problem , chciałem zastosować czujniki halla do wykrywania pozycji góra i dół rolety , czujniki podpięte do 12 i 13 wejscia na arduino , na razie mam zrobione tak że  zadziałanie któregokolwiek czujnika zatrzymuje silnik i w tym problem że chciałbym zrobić coś takiego że jeśli roleta osiągnie pozycje otwarcia możliwe jest tylko i wyłącznie przesterowanie jej w dół itp czy miałby ktoś jakiś pomysł albo delikatną podpowiedź?

Komendy którymi steruje w telefonie zapisałem za pomocą case dlatego też nie za bardzo wiem jak warunki dodać do tego programu aby to wszystko płynnie działało, kawałek kodu na dole.

if (bt.available()){
    char komenda=bt.read();
    Serial.print("odebrano= ");
    Serial.println(komenda);//dla sprawdzenia
      switch (komenda){
      case  'W': silnik.writeMicroseconds(1000); break;//przod
      case  'R': silnik.writeMicroseconds(2000); break;  //tyl
      case  'S': silnik.writeMicroseconds(1500); break;  //stop
      case  'P': silnik2.writeMicroseconds(1000); break;  //przod
      case  'T': silnik2.writeMicroseconds(2000); break;  //tyl
      case  'M': silnik2.writeMicroseconds(1500); break;  //stop
   //switch
}
  }  
     if(digitalRead(Zamkniecie) == LOW)
      {
      silnik.writeMicroseconds(1500);
      }
     if(digitalRead(Otwarcie) == LOW)
      {
      silnik.writeMicroseconds(1500);
      }

}

 

Link do komentarza
Share on other sites

7 minut temu, Burza22 napisał:

czy miałby ktoś jakiś pomysł albo delikatną podpowiedź?

Trochę Cię to zaboli, ale jestem zwolennikiem podejścia obiektowego. Robisz obiekt Roleta, dodajesz jej funkcje i dodajesz jej metodę onCommand(char cmd); gdzie w if'ie rozdzielasz komendy na np. OnMoveUpCommand(), OnMoveDownCommand() etc. Wtedy w danej komendzie możesz dać coś w stylu:

if(roleta_otwarta)
{
  OnCommandStop();
  return;
}

Obok tego warunki otwarcia/zamknięcia (czujniki najlepiej też jako osobne obiekty). Nie jest to przyjazne pamięci, ale jest przyjazne łatwości edycji kodu, a raczej RAM'u nie zabraknie... te 2kB to całkiem sporo wbrew pozorom.

Ale to tylko moje fanaberie co do wygody pracy z oprogramowaniem 😄 

Link do komentarza
Share on other sites

(edytowany)

Kurde trochę zagmatwane bo właśnie kombinowałem jakimiś funkcjami ale jak to połączyć z sterowaniem komunikatami na commandzie na telefonie o to jest pytanie hah

 

Edytowano przez Burza22
  • Lubię! 1
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

Przed chwilą, Burza22 napisał:

Kurde trochę zagmatwane bo właśnie kombinowałem jakimiś funkcjami ale jak to połączyć z sterowaniem komunikatami na commandzie na teleffonie o to jest pytanie hah

Podeślij cały projekt, mam chwilę wolnego to wyjątkowo mogę zrobić przykład 😛

Link do komentarza
Share on other sites

1 godzinę temu, Burza22 napisał:

ale narazie i tak nie działa

Całej pracy za Ciebie nie zrobię, masz kod, który bardzo łatwo debugować... Zaczynając od sprawdzenia czy sygnały z czujników są prawidłowe oraz czy są podpięte do właściwych gniazd, kończąc na tym czy właściwy czujnik jest przypisany do właściwego kierunku ruchu.

Link do komentarza
Share on other sites

@Burza22 Jeśli szukasz "delikatnej podpowiedzi" to proponuję zacząć od rozrysowania sobie diagramu stanów pracy Twojego urządzenia.

Przykładowe mogłoby to być coś takiego:

diag01.thumb.png.9e5b2e11ef50fa0bf394b06e26d3a957.png

W programie stany można zdefiniować jako typ wyliczeniowy, a aktualny zmian to po prostu zmienna. Czyli coś w rodzaju:

enum class StanUrzadzenia {
  PRACA,
  OTWARTE,
  ZAMKNIETE
};

StanUrzadzenia aktualny_stan = PRACA;

Kolejnym krokiem byłoby zastanowienie się jak wyglądają przejścia między stanami:

diag02.thumb.png.5c0196b08175593bfdbc9a206fb24dc9.png

Jak widzisz są to te same warunki co wcześniej, ale tym razem zależą o wartości zmiennej aktualny_stan oraz ich spełnienie powoduje zmianę stanu.

Wracając do kodu, pierwszy szkic mógłby wyglądać jak:

switch (aktualny_stan) {
case PRACA:
    if (digitalRead(Zamkniecie) == LOW)
        aktualny_stan = ZAMKNIETE;
    else if (digitalRead(Otwarte) == LOW)
        aktualny_stan = OTWARTE;    
    break;
case ZAMKNIETE:
    if (digitalRead(Zamkniecie) == HIGH)
        aktualny_stan = PRACA;
    break;
case OTWARTE:
    if (digitalRead(Otwarte) == HIGH)
        aktualny_stan = PRACA;
    break;
}

Jak łatwo się domyślić, podczas zmiany stanu z PRACA na OTWARTE lub ZAMKNIETE można dodać zatrzymywanie silnika. Dzięki temu będzie to wywoływane tylko raz, a nie ciągle jak w Twoim programie.

Trzeba będzie również dopisać sterowanie komendami, które będzie uwzględniało aktualny stan, czyli np. nie pozwalało już bardziej otwierać w stanie OTWARTE.

Ale mając zdefiniowany automat stanów napisanie programu to drobnostka. A diagramy bardzo ładnie się prezentują w pracy 🙂

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

To jak maszyna stanów to proponowałbym nie trzy stany a nieco więcej:

  • ZAMKNIETE - roleta w pozycji końcowej, silnik zatrzymany
  • OTWARTE - jw tyle że w drugiej pozycji
  • ZAMYKANIE - ruch rolety w kierunku zamknięcia
  • OTWIERANIE - ruch rolety w kierunku otwarcia
  • CZORTWIENIECO - silnik zatrzymany, roleta gdzieś nie wiadomo gdzie.

W dodatku żeby było czytelniej można podzielić program na bloki, coś w stylu:

char cmd = 0;
if (znak_w_buforze) cmd=pobierz_znak_z_bufora();

switch(stan_rolety) {
    ...
}

switch (stan_bramy) {
  case OTWARTE:
    if (cmd == ZAMKNIJ_BRAME) ...
}

W taki sposób np. w stanie OTWARTE reagujesz wyłącznie na przycisk ZAMKNIJ.

 

Link do komentarza
Share on other sites

@ethanak jutro będę działał z tym bo zaraz do pracy niestety , może coś wyjdzie bo właśnie największy problem w tym że mając to co mam steruje góra i dół ale jak zadziała któryś z czujników to nie przesteruje ani do góry ani na dół i największy problem jest w tym rozpoznaniu czy to góra czy dół żeby roleta czasami za bardzo się nie zamknęła bądź otwarła a sterowanie chce koniecznie zrobić komendami na serial porcie na telefonie 

Link do komentarza
Share on other sites

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

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.