Sterowanie rolet

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
0sromocon
Młodszy majsterkowicz
Posty: 9
Rejestracja: 30 cze 2015, 12:23

Sterowanie rolet

Post autor: 0sromocon » 30 cze 2015, 12:36

Witam.
Szukam i szukam i rozwiązania w 100% odpowiadającego mojemu nie znalazłem.
Mam w budynku 11 rolet zewnętrznych. Do każdej jest doprowadzone napięcie 230V (własciwie do puszki przy oknie). Przewody 230V są od puszki do puszki (w puszkach są spinane razem, żeby przejść do nastepnej). W puszkach są również wyłączniki klawiszowe żaluzjowe. Do każdej puszki jest pociągnięta skrętka z centrali.
Moja koncepcja:
Wszystko ma być sterowane z tego:
Arduino Mega 2560 Rev3
Do każdej puszki chcę włożyć 2 przekaźniki:
Przekaźnik HLS8L-DC5V-S-C - cewka 5V, styki 2x 15A/120VAC
I zasada działania.
Z puszki przy oknie naciskam 1x przycisk góra - silnik rolety zostaje załączony na np. 15s (zależnie od długości rolety). Wciskam ponownie ten sam przycisk - roleta stop.
Wciskam drugi przycisk roleta się zamyka. Wciskam ponownie ten sam przycisk - roleta stop.
Wciskam przycisk 2x - zamykają/otwierają się wszystkie rolety w pomieszczeniu.
Dodatkowo z dodatkowego przycisku/telefonu zamykają/otwierają się rolety w całym budynku.
Mam nadzieję, że nie zamąciłem zbytnio.
Czy elementy, które wybrałem pozwolą zrealizować to zadanie

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


bicker
Majsterkowicz
Posty: 71
Rejestracja: 9 gru 2013, 09:53

Re: Sterowanie rolet

Post autor: bicker » 1 lip 2015, 13:08

Witaj zamiast 2 kliknięć zrobiłbym dłuższe kliknięcie i wykrywanie, że trzymam przycisk dłużej, jeśli chcesz sterować z telefonu nie ma problemu dodajesz moduł BT HC-05 i prosta aplikacja na androida i masz sterowanie.

zamiast czekać 15 s. aż roleta dojdzie do końca, sterownik (mostek h) ma wykrywanie przeciążenia i w ten sposób to zrobisz, zamiast przekaźników dałbym triaki, cichsze i stabilniejsze,

znalazłem coś takiego:
http://www.elektroda.pl/rtvforum/topic1 ... ml#9327066
może Ci pomoże
0sromocon
Młodszy majsterkowicz
Posty: 9
Rejestracja: 30 cze 2015, 12:23

Re: Sterowanie rolet

Post autor: 0sromocon » 1 lip 2015, 13:13

Dzięki za odpowiedź i podpowiedź.
Triaka jakoś się boję. Może niesłusznie. Czy gdybym nadal się upierał przy przekaźnikach to ten wymieniony przeze mnie spełni swoje zadanie?

Wysłane z mojego HTC One_M8 przy użyciu Tapatalka
bicker
Majsterkowicz
Posty: 71
Rejestracja: 9 gru 2013, 09:53

Re: Sterowanie rolet

Post autor: bicker » 1 lip 2015, 13:21

w zupełności się nadaje

możesz również wykorzystać taki
http://www.ebay.pl/itm/121158975004?_tr ... EBIDX%3AIT
już komplet tylko podłączyć
a co do triaka
http://mirley.firlej.org/wykonawczy_triak

mam nadzieję, że autor się nie obrazi :)

co do przycisku to wykorzystaj bibliotekę
https://code.google.com/p/clickbutton/
0sromocon
Młodszy majsterkowicz
Posty: 9
Rejestracja: 30 cze 2015, 12:23

Re: Sterowanie rolet

Post autor: 0sromocon » 1 lip 2015, 13:26

Znów dzięki za błyskawiczną odpowiedź. Nad takimi zespołami przekaźników się zastanawiałem tylko się obawiam, czy mi się to zmieści do puszki podtynkowej.
O triaku poczytam później

Wysłane z mojego HTC One_M8 przy użyciu Tapatalka
0sromocon
Młodszy majsterkowicz
Posty: 9
Rejestracja: 30 cze 2015, 12:23

Re: Sterowanie rolet

Post autor: 0sromocon » 13 sie 2015, 12:19

Ponieważ temat jest cały czas ten sam, nie zakładam nowego wątku.
Sprzęt mam.
Usiadłem do pisania kodu i...
...stanąłem.
W zasadzie tylko przypisałem wejścia/wyjścia i nie wiem co dalej.
Wyjaśnię czego oczekuję od sterownika.
1. Załączam przycisk nr 1 -> roleta zaczyna się opuszczać
2. Załączam ten przycisk po raz drugi lub przycisk nr 2 (roleta góra) - roleta się zatrzymuje
3. Załączam przycisk nr 1 lub 2 roleta się podnosi lub opuszcza do końca lub do ponownego wciśnięcia przycisku 1 lub 2.
Realizując to przy pomocy polecenia delay(), podczas tej operacji wszystkie inne wejścia/wyjścia są zajęte do czasu zakończenia wykonywania polecenia delay(), więc w tym czasie nie mogę sterować innymi roletami. Jak zrealizować to aby w czasie działania silnika/przekaźnika rolety nr 1, można było sterować pozostałymi roletami?
Mam nadzieję, że jasno opisałem problem.
0sromocon
Młodszy majsterkowicz
Posty: 9
Rejestracja: 30 cze 2015, 12:23

Re: Sterowanie rolet

Post autor: 0sromocon » 20 sie 2015, 22:00

Sam sobie odpowiadam.
Kluczowym poleceniem jest "millis()".
Coś tam wyskrobałem, ale nie zawsze to działa tak jak powinno.

Kod: Zaznacz cały

  unsigned long interval = 6000;
  unsigned long loweringStart;
  

void setup() {
  pinMode(5, OUTPUT); //red LED
  pinMode(11, INPUT_PULLUP);
  Serial.begin(9600); 
}

void loop() {
  if (digitalRead(11) == LOW) 
     {
      digitalWrite(5, HIGH); 
      loweringStart = millis ();
      Serial.println("1st if");
      Serial.println(loweringStart);
      delay(500);
     }
  if (millis () - loweringStart >= interval)
    {
      digitalWrite(5, LOW); 
      Serial.println(loweringStart);
      Serial.println("2nd if");
      delay(500);
    }
  else
    {
      if (digitalRead(11) == LOW)
        {
        digitalWrite(5, LOW); 
        Serial.println("3rd if");
        delay(500);
        }//if digitalRead
    }//if millis
}//end of all
Czy ktoś wie jak to poprawić?
razorxx100
Starszy majsterkowicz
Posty: 329
Rejestracja: 1 sie 2014, 22:57

Re: Sterowanie rolet

Post autor: razorxx100 » 20 sie 2015, 23:09

Warto napisac co jest nie tak, bo napisanie ze cos jest nie tak to nic nie mowi.
No z tego co widze to odrazu po zmianie pinu 11, stan na pinie 5 skoczy na LOW.
Drugi if nie jest spelniony, wiec leci else ktore daje na low, czyli ten drugi if praktycznie wykona sie po 6s, ale nic nie zrobi bo juz i tak jest LOW. Zapewne chodzi ci o to ze po kliknieciu przycisku silnik bedzie pracowal jeszcze przez 6s?
Jezeli tak to wez wywal poprostu to else.
0sromocon
Młodszy majsterkowicz
Posty: 9
Rejestracja: 30 cze 2015, 12:23

Re: Sterowanie rolet

Post autor: 0sromocon » 3 wrz 2015, 08:06

Nic nie pisałem, bo ciężko było opisać zachowanie programu, gdyż nie było powtarzalne.
Pozmieniałem kod:

Kod: Zaznacz cały

    
unsigned long DeklarowanyCzasOpuszczaniaRoletyNr01 = 5000;
  unsigned long DeklarowanyCzasPodnoszeniaRoletyNr01 = 5000;
  unsigned long StartOpuszczaniaRoletyNr01;
  unsigned long StartPodnoszeniaRoletyNr01;
  unsigned long MomentNacisnieciaWlacznikDolRoletaNr01;
  unsigned long MomentPuszczeniaWlacznikDolRoletaNr01;
  
  int WskaznikOpuszczaniaRoletyNr01 = 0;
  int WskaznikPodnoszeniaRoletyNr01 = 0;
  int JakDlugoTrwaloOpuszczanieRoletyNr01;
  int JakDlugoTrwaloPodnoszeniaRoletyNr01;
  

void setup() {
  pinMode(PrzekaznikGoraRoletaNr01, OUTPUT); //red LED
  pinMode(PrzekaznikDolRoletaNr01, OUTPUT); //red LED
  pinMode(WlacznikGoraRoletaNr01, INPUT_PULLUP);
  pinMode(WlacznikDolRoletaNr01, INPUT_PULLUP);
  digitalWrite(PrzekaznikDolRoletaNr01, HIGH);//tzn kotwica podniesiona (nie styka)
  digitalWrite(PrzekaznikGoraRoletaNr01, HIGH);//tzn kotwica podniesiona (nie styka)
}

void loop() {


  if (digitalRead(WlacznikDolRoletaNr01) == LOW && WskaznikOpuszczaniaRoletyNr01 == 0 && WskaznikPodnoszeniaRoletyNr01 == 0) //1A
     {
      digitalWrite(PrzekaznikDolRoletaNr01, LOW); //zacznij opuszczać roletę nr 01
      StartOpuszczaniaRoletyNr01 = millis ();
      WskaznikOpuszczaniaRoletyNr01 = 1;
      delay(500);
     }

  if (digitalRead(WlacznikGoraRoletaNr01) == LOW && WskaznikPodnoszeniaRoletyNr01 == 0 && WskaznikOpuszczaniaRoletyNr01 == 0) //1B
     {
      digitalWrite(PrzekaznikGoraRoletaNr01, LOW); //zacznij podnosic roletę nr 01
      StartPodnoszeniaRoletyNr01 = millis ();
      WskaznikPodnoszeniaRoletyNr01 = 1;
      delay(500);
     }

	 
	 
   if (WskaznikPodnoszeniaRoletyNr01 == 1 && (digitalRead(WlacznikDolRoletaNr01) == LOW) || (digitalRead(WlacznikGoraRoletaNr01) == LOW)) //3A
    { //Jesli roleta nr 01 jest w trakcie podnoszenia i zostanie wcisniety przycisk WlacznikDolRoletaNr01 to przestan opuszczac
      digitalWrite(PrzekaznikGoraRoletaNr01, HIGH); //przestan opuszczac
      JakDlugoTrwaloPodnoszeniaRoletyNr01 = (millis () - StartPodnoszeniaRoletyNr01);
      WskaznikPodnoszeniaRoletyNr01 = 0;
      delay(500);
    }//if digitalRead


	if (WskaznikOpuszczaniaRoletyNr01 == 1 && (digitalRead(WlacznikDolRoletaNr01) == LOW)|| (digitalRead(WlacznikGoraRoletaNr01) == LOW) ) //3B
    { //Jesli roleta nr 01 jest w trakcie opuszczania i zostanie wcisniety przycisk WlacznikDolRoletaNr01 lub to przestan opuszczac
      digitalWrite(PrzekaznikDolRoletaNr01, HIGH); //przestan opuszczac
      JakDlugoTrwaloOpuszczanieRoletyNr01 = (millis () - StartOpuszczaniaRoletyNr01);
      WskaznikOpuszczaniaRoletyNr01 = 0;
      delay(500);
    }//if digitalRead

	
	
	if (millis () - StartOpuszczaniaRoletyNr01 >= DeklarowanyCzasOpuszczaniaRoletyNr01 && WskaznikOpuszczaniaRoletyNr01 == 1) //2A
		{ //Jesli minie DeklarowanyCzasOpuszczaniaRoletyNr01 to przestan opuszczac
		  digitalWrite(PrzekaznikDolRoletaNr01, HIGH); //Zakoncz opuszczanie rolety nr 01
		  WskaznikOpuszczaniaRoletyNr01 = 0;
		  delay(500);
		}

      if (millis () - StartPodnoszeniaRoletyNr01 >= DeklarowanyCzasPodnoszeniaRoletyNr01 && WskaznikPodnoszeniaRoletyNr01 == 1) //2B
		{ //Jesli minie DeklarowanyCzasPodnoszeniaRoletyNr01 to przestan opuszczac
		  digitalWrite(PrzekaznikGoraRoletaNr01, HIGH); //Zakoncz opuszczanie rolety nr 01
		  WskaznikPodnoszeniaRoletyNr01 = 0;
		  delay(500);
		}


}//end of all
Ale oczywiście znów nie działa tak jak trzeba.
Zadanie jest takie, że po zapuszczeniu rolet w którymkolwiek kierunku, ponowne naciśnięcie dowolnego przycisku ma ją zatrzymać.
Teraz gdy np. włączę opuszczanie i przycisnę przycisk 'góra' to NIE ZAWSZE roleta jest zatrzymywana.
Sprawdziłem, taki schemat:
Wciskam przycisk "dół" (sekcja 1A)
Po 2 sekundach wciskam przycisk "góra". Program powinien przejść do sekcji 3B jednak najpierw przechodzi do 3A. Jakim cudem?
Pomoże ktoś?
stiven
Złota rączka
Posty: 1644
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Sterowanie rolet

Post autor: stiven » 3 wrz 2015, 09:56

Dlaczego po ifie oznaczonym 1A, wykonuje się if 3A? Bo może, tak samo jak 3B, warunki w jednym i w drugim będą spełnione. A że program nie stoi w miejscu, działa cały czas w kółko (pętla loop), no to wykona się przypadkowy, jeden z nich, na który akurat trafi się przyciskając przycisk. Trzeba tak napisać program, żeby tylko jeden if był możliwy do spełnienia. Wystarczy, że w ifie 1A wpiszesz WskaznikPodnoszeniaRoletyNr01 = 0, to już tylko if 3B będzie mógł być wykonany jako następny.
0sromocon
Młodszy majsterkowicz
Posty: 9
Rejestracja: 30 cze 2015, 12:23

Re: Sterowanie rolet

Post autor: 0sromocon » 3 wrz 2015, 10:02

Pewnie to jest to.
Ciężko jest przyzwyczaić się do tej pętli loop().
Dam znać wieczorem.
Dziękuję.

Jednak nie.
Problemem okazał się brak nawiasów.
było:

Kod: Zaznacz cały

   if (WskaznikPodnoszeniaRoletyNr01 == 1 && (digitalRead(WlacznikDolRoletaNr01) == LOW) || (digitalRead(WlacznikGoraRoletaNr01) == LOW))
powinno być:

Kod: Zaznacz cały

   if (WskaznikPodnoszeniaRoletyNr01 == 1 && ((digitalRead(WlacznikDolRoletaNr01) == LOW) || (digitalRead(WlacznikGoraRoletaNr01) == LOW)))
0sromocon
Młodszy majsterkowicz
Posty: 9
Rejestracja: 30 cze 2015, 12:23

Re: Sterowanie rolet

Post autor: 0sromocon » 11 wrz 2015, 07:57

I znowu jaja.
Wszystko niby działa - rolety chodzą jak trzeba ale...
Zdarza się, że gdy jedna roleta dojeżdża do końca, to druga jakby wzbudza się i też się zamyka/otwiera?!
Dzisiaj zdarzyło mi się włączyć roletę przy włączaniu światła w pokoju! Nawet przyciskałem kilka razy włącznik i nie dość, że ta jedna zamykała się/ otwierała, to jeszcze wydaje mi się, że słyszałem inne przekaźniki.
Moduł 2 przekaźnikowy, jeśli się nie mylę, posiada optotriak, który separuje styki przekaźnika od niskonapięciowych.
Kiedyś zdarzyło mi się wzbudzić przekaźnik przez zwarcie jego styków (tych do 230V). Jak to możliwe?
Co zrobić, żeby to wszystko działało jak trzeba?
Awatar użytkownika
matti
Młodszy majsterkowicz
Posty: 10
Rejestracja: 29 kwie 2017, 13:43

Re: Sterowanie rolet

Post autor: matti » 3 maja 2017, 16:49

dobre pytanie. ktoś zna odpowiedź i się podzieli?
0sromocon
Młodszy majsterkowicz
Posty: 9
Rejestracja: 30 cze 2015, 12:23

Re: Sterowanie rolet

Post autor: 0sromocon » 4 maja 2017, 08:33

Ja mam.
Kluczowym terminem jest tu "Edge detection". Ten opto cośtam w module to podobno na niewiele się zda. W programie trzeba dać warunek, że naciśnięcie przycisku musi trwać więcej niż kilka (kilkanaście) milisekund. Jeszcze nie testowałem ale myślę, że to rozwiąże problem.
ODPOWIEDZ

Strony partnerskie: