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

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.