Sterowanie roletami / przekaźnikami - Arduino Mega

furia
Posty: 33
Rejestracja: ndz maja 08, 2016 5:59 pm

Oto mój projekt nad którym siedzę od zeszłego roku. Proszę o wyrozumiałość... :)

Jak działają rolety elektryczne większość wie. (po krótce wytłumaczę) Mają dwa wyłączniki krańcowe (kiedy są maksymalnie podniesione i kiedy są maksymalnie opuszczone - oczywiście można to regulować) Wystarczy podłączyć zasilanie i roleta się zamyka lub otwiera. Prąd może płynąć w obwodzie a roleta sama i tak na końcu się zatrzyma.

Teraz mój pomysł…
Opiszę jak za pomocą dwóch przekaźników sterować jedną roletą ( jeden przekaźnik otwiera drugi zamyka roletę). (w moim przypadku będę miał 7 rolet więc potrzebuję 14 przekaźników)
Do całości potrzebne będą :
- Arduino (w moim przypadku MEGA)
- Przekaźniki
-Trochę przewodów
-Przyciski naścienne (na razie są zwykłe tactswitche zapięte w panel)

Opis działania programu:
Gdy nacisnę przycisk pierwszy raz => roleta zjeżdża w dół (chyba że nacisnę go drugi raz wtedy się zatrzyma w dowolnym momencie)
Gdy nacisnę przycisk trzeci => raz roleta się unosi (chyba, że nacisnę go czwarty raz roleta się zatrzyma w dowolnym momencie)
Program jest tak napisany, że po upływie pewnego czasu (dowolnie można go ustawić) przekaźnik się wyłączy i roleta się zatrzyma (bo po co ma być załączony cały czas gdy np. roleta się uniosła? I tak krańcówka ją zatrzymała). Tak samo jest przy opuszczaniu.
Jak to zrobić:

Zdjęcie 1: Tak należy podłączyć przewody rolet do przekaźników
Obrazek

Zdjęcie 1: MEGA :)
Obrazek

Zdjęcie 2: Moduły przekaźników
Obrazek

Zdjęcie 3: do tych pinów podłączamy piny modułu przekaźników (na razie nie podłączyłem VCC i GND)
Obrazek

Zdjęcie 4: do tych pinów podłączamy piny modułu przycisków. Oczywiście można zrobić sobie przyciski na płytce prototypowej.
Obrazek

Zdjęcie 5: moduł przycisków (z prowizoryczną wiązką)
Obrazek

Zdjęcie 6: tak wygląda podłączony moduł przycisków.
Obrazek

A teraz efekt końcowy: Podłączamy VCC i GND do modułów i lecimy (na razie na surowo ale dzięki ledom widać, ze moduł może zamykać i otwierać roletę)
https://www.youtube.com/embed/cy_SalCuqn4


Żaden ze mnie programista...
W szkicu Bardzo pomogli mi Koledzy z innego forum. Ja go tylko rozbudowałem
Do całości przydało by się jeszcze aby była możliwość np:
- Gdy przycisnę dowolny przycisk dłuższy czas to wszystki rolety się otworzą lub zamkną
- jeden dodatkowy przycisk który sterował by wszystkimi przyciskami (taki przycisk przydaje się w garażu - gdy wyjeżdżamy to go nasikamy i wszystko zjeżdża w dół / podnosi się)
Ale przede wszystkim projekt ten ma jedną wielką wadę... NIESTETY NIE MA NIC WSPÓLNEGO Z SUPLĄ :( - nad czym bardzo ubolewam... Może ktoś pomógł by mi zrobić coś takiego żeby działało z suplą????

Piszcie jak Wam się to podoba...

Szkic dla Arduino:

Kod: Zaznacz cały

uint8_t przekaznik1 = 23;
uint8_t przekaznik2 = 25;
uint8_t przekaznik3 = 27;
uint8_t przekaznik4 = 29;
uint8_t przekaznik5 = 31;
uint8_t przekaznik6 = 33;
uint8_t przekaznik7 = 35;
uint8_t przekaznik8 = 37;
uint8_t przekaznik9 = 39;
uint8_t przekaznik10 = 41;
uint8_t przekaznik11 = 43;
uint8_t przekaznik12 = 45;
uint8_t przekaznik13 = 47;
uint8_t przekaznik14 = 49;

uint8_t przycisk = 40;
uint8_t przycisk1 = 42;
uint8_t przycisk2 = 44;
uint8_t przycisk3 = 46;
uint8_t przycisk4 = 48;
uint8_t przycisk5 = 50;
uint8_t przycisk6 = 52;

byte ilosc_wcisniec = 0;
byte ilosc_wcisniec1 = 0;
byte ilosc_wcisniec2 = 0;
byte ilosc_wcisniec3 = 0;
byte ilosc_wcisniec4 = 0;
byte ilosc_wcisniec5 = 0;
byte ilosc_wcisniec6 = 0;

uint8_t blokada;
uint8_t blokada1;
uint8_t blokada2;
uint8_t blokada3;
uint8_t blokada4;
uint8_t blokada5;
uint8_t blokada6;

boolean start1 = 0, start2 = 0, start3 = 0, start4 = 0, start5 = 0, start6 = 0, start7 = 0, start8 = 0, start9 = 0, start10 = 0, start11 = 0, start12 = 0, start13 = 0, start14 = 0;
long czas1 = 0, czas2 = 0, czas3 = 0, czas4 = 0, czas5 = 0, czas6 = 0, czas7 = 0, czas8 = 0, czas9 = 0, czas10 = 0, czas11 = 0, czas12 = 0, czas13 = 0, czas14 = 0;
boolean x = 0, x1 = 0, x2 = 0, x3 = 0, x4 = 0, x5 = 0, x6 = 0;


void setup()
{
  pinMode(przekaznik1, OUTPUT);
  pinMode(przekaznik2, OUTPUT);
  pinMode(przekaznik3, OUTPUT);
  pinMode(przekaznik4, OUTPUT);
  pinMode(przekaznik5, OUTPUT);
  pinMode(przekaznik6, OUTPUT);
  pinMode(przekaznik7, OUTPUT);
  pinMode(przekaznik8, OUTPUT);
  pinMode(przekaznik9, OUTPUT);
  pinMode(przekaznik10, OUTPUT);
  pinMode(przekaznik11, OUTPUT);
  pinMode(przekaznik12, OUTPUT);
  pinMode(przekaznik13, OUTPUT);
  pinMode(przekaznik14, OUTPUT);
  
  pinMode(przycisk,INPUT_PULLUP);
  pinMode(przycisk1,INPUT_PULLUP);
  pinMode(przycisk2,INPUT_PULLUP);
  pinMode(przycisk3,INPUT_PULLUP);
  pinMode(przycisk4,INPUT_PULLUP);
  pinMode(przycisk5,INPUT_PULLUP);
  pinMode(przycisk6,INPUT_PULLUP);
  
  digitalWrite(przekaznik1, HIGH);
  digitalWrite(przekaznik2, HIGH);
  digitalWrite(przekaznik3, HIGH);
  digitalWrite(przekaznik4, HIGH);
  digitalWrite(przekaznik5, HIGH);
  digitalWrite(przekaznik6, HIGH);
  digitalWrite(przekaznik7, HIGH);
  digitalWrite(przekaznik8, HIGH);
  digitalWrite(przekaznik9, HIGH);
  digitalWrite(przekaznik10, HIGH);
  digitalWrite(przekaznik11, HIGH);
  digitalWrite(przekaznik12, HIGH);
  digitalWrite(przekaznik13, HIGH);
  digitalWrite(przekaznik14, HIGH);
}


void loop()
{
   
  if ( !blokada && ( digitalRead(przycisk) == LOW ))

  {   
    blokada = 1;
    ilosc_wcisniec++;
    x = 1;
  } 
  
  else if ( blokada && (digitalRead(przycisk) == HIGH)) blokada++;

  if (x == 1 && ilosc_wcisniec == 1)       
  
  { 
    digitalWrite(przekaznik1, LOW);
    start1 = 1;
    czas1 = millis();
    x = 0;
  }
  else if((ilosc_wcisniec == 2) || (start1 && (millis() - czas1 > 10000)))
  {
    digitalWrite(przekaznik1, HIGH);
    start1 = 0;
    if((ilosc_wcisniec == 1) && (millis() - czas1 > 300)) ilosc_wcisniec = 2;
  }
  
  else if(x == 1 && ilosc_wcisniec == 3)

  {
    digitalWrite(przekaznik2,LOW);
    start2 = 1;
    czas2 = millis();
    x = 0;
  }
  else if((ilosc_wcisniec == 4) || (start2 && (millis() - czas2 > 10000)))    
  
  {
    digitalWrite(przekaznik2, HIGH);
    start2 = 0;
    if((ilosc_wcisniec == 3) && (millis() - czas1 > 300)) ilosc_wcisniec = 4;
  }
  if ( ilosc_wcisniec > 4 ) ilosc_wcisniec = 1; 
  
  // GRUGI PRZYCISK____________________________________________________(((((((********&&&&&&&
 {
   if ( !blokada1 && ( digitalRead(przycisk1) == LOW ))

  {   
    blokada1 = 1;
    ilosc_wcisniec1++;
    x1 = 1;
  } 
  
  else if ( blokada1 && (digitalRead(przycisk1) == HIGH)) blokada1++;

  if (x1 == 1 && ilosc_wcisniec1 == 1)       
  
  { 
    digitalWrite(przekaznik3, LOW);
    start3 = 1;
    czas3 = millis();
    x1 = 0;
  }
  else if((ilosc_wcisniec1 == 2) || (start3 && (millis() - czas3 > 10000)))
  {
    digitalWrite(przekaznik3, HIGH);
    start3 = 0;
    if((ilosc_wcisniec1 == 1) && (millis() - czas3 > 300)) ilosc_wcisniec1 = 2;
  }
  
  else if(x1 == 1 && ilosc_wcisniec1 == 3)

  {
    digitalWrite(przekaznik4,LOW);
    start4 = 1;
    czas4 = millis();
    x1 = 0;
  }
  else if((ilosc_wcisniec1 == 4) || (start4 && (millis() - czas4 > 10000)))
  {
    digitalWrite(przekaznik4, HIGH);
    start4 = 0;
    if((ilosc_wcisniec1 == 3) && (millis() - czas4 > 300)) ilosc_wcisniec1 = 4;
  }

  if ( ilosc_wcisniec1 > 4 ) ilosc_wcisniec1 = 1;
 }
  // Trzeci PRZYCISK____________________________________________________(((((((********&&&&&&&
  {
    if ( !blokada2 && ( digitalRead(przycisk2) == LOW ))

  {   
    blokada2 = 1;
    ilosc_wcisniec2++;
    x2 = 1;
  } 
  
  else if ( blokada2 && (digitalRead(przycisk2) == HIGH)) blokada2++;

  if (x2 == 1 && ilosc_wcisniec2 == 1)       
  
  { 
    digitalWrite(przekaznik5, LOW);
    start5 = 1;
    czas5 = millis();
    x2 = 0;
  }
  else if((ilosc_wcisniec2 == 2) || (start5 && (millis() - czas5 > 10000)))
  {
    digitalWrite(przekaznik5, HIGH);
    start5 = 0;
    if((ilosc_wcisniec2 == 1) && (millis() - czas5 > 300)) ilosc_wcisniec2 = 2;
  }
  
  else if(x2 == 1 && ilosc_wcisniec2 == 3)

  {
    digitalWrite(przekaznik6,LOW);
    start6 = 1;
    czas6 = millis();
    x2 = 0;
  }
  else if((ilosc_wcisniec2 == 4) || (start6 && (millis() - czas6 > 10000)))
  {
    digitalWrite(przekaznik6, HIGH);
    start6 = 0;
    if((ilosc_wcisniec2 == 3) && (millis() - czas6 > 300)) ilosc_wcisniec2 = 4;
  }

  if ( ilosc_wcisniec2 > 4 ) ilosc_wcisniec2 = 1;
    
 }
// Przycisk 4 ____________________________________________________(((((((********&&&&&&&
 
   {
    if ( !blokada3 && ( digitalRead(przycisk3) == LOW ))

  {   
    blokada3 = 1;
    ilosc_wcisniec3++;
    x3 = 1;
  } 
  
  else if ( blokada3 && (digitalRead(przycisk3) == HIGH)) blokada3++;

  if (x3 == 1 && ilosc_wcisniec3 == 1)       
  
  { 
    digitalWrite(przekaznik7, LOW);
    start7 = 1;
    czas7 = millis();
    x3 = 0;
  }
  else if((ilosc_wcisniec3 == 2) || (start7 && (millis() - czas7 > 10000)))
  {
    digitalWrite(przekaznik7, HIGH);
    start7 = 0;
    if((ilosc_wcisniec3 == 1) && (millis() - czas7 > 300)) ilosc_wcisniec3 = 2;
  }
  
  else if(x3 == 1 && ilosc_wcisniec3 == 3)

  {
    digitalWrite(przekaznik8,LOW);
    start8 = 1;
    czas8 = millis();
    x3 = 0;
  }
  else if((ilosc_wcisniec3 == 4) || (start8 && (millis() - czas8 > 10000)))
  {
    digitalWrite(przekaznik8, HIGH);
    start8 = 0;
    if((ilosc_wcisniec3 == 3) && (millis() - czas8 > 300)) ilosc_wcisniec3 = 4;
  }

  if ( ilosc_wcisniec3 > 4 ) ilosc_wcisniec3 = 1;
    
 }
 // PRZYCISK 5 ____________________________________________________(((((((********&&&&&&&
 
  
   {
    if ( !blokada4 && ( digitalRead(przycisk4) == LOW ))

  {   
    blokada4 = 1;
    ilosc_wcisniec4++;
    x4 = 1;
  } 
  
  else if ( blokada4 && (digitalRead(przycisk4) == HIGH)) blokada4++;

  if (x4 == 1 && ilosc_wcisniec4 == 1)       
  
  { 
    digitalWrite(przekaznik9, LOW);
    start9 = 1;
    czas9 = millis();
    x4 = 0;
  }
  else if((ilosc_wcisniec4 == 2) || (start9 && (millis() - czas9 > 10000)))
  {
    digitalWrite(przekaznik9, HIGH);
    start9 = 0;
    if((ilosc_wcisniec4 == 1) && (millis() - czas9 > 300)) ilosc_wcisniec4 = 2;
  }
  
  else if(x4 == 1 && ilosc_wcisniec4 == 3)

  {
    digitalWrite(przekaznik10,LOW);
    start10 = 1;
    czas10 = millis();
    x4 = 0;
  }
  else if((ilosc_wcisniec4 == 4) || (start10 && (millis() - czas10 > 10000)))
  {
    digitalWrite(przekaznik10, HIGH);
    start10 = 0;
    if((ilosc_wcisniec4 == 3) && (millis() - czas10 > 300)) ilosc_wcisniec4 = 4;
  }

  if ( ilosc_wcisniec4 > 4 ) ilosc_wcisniec4 = 1;
    
 }
 // Przycisk 6 ____________________________________________________(((((((********&&&&&&&
 
 
   {
    if ( !blokada5 && ( digitalRead(przycisk5) == LOW ))

  {   
    blokada5 = 1;
    ilosc_wcisniec5++;
    x5 = 1;
  } 
  
  else if ( blokada5 && (digitalRead(przycisk5) == HIGH)) blokada5++;

  if (x5 == 1 && ilosc_wcisniec5 == 1)       
  
  { 
    digitalWrite(przekaznik11, LOW);
    start11 = 1;
    czas11 = millis();
    x5 = 0;
  }
  else if((ilosc_wcisniec5 == 2) || (start11 && (millis() - czas11 > 10000)))
  {
    digitalWrite(przekaznik11, HIGH);
    start11 = 0;
    if((ilosc_wcisniec5 == 1) && (millis() - czas11 > 300)) ilosc_wcisniec5 = 2;
  }
  
  else if(x5 == 1 && ilosc_wcisniec5 == 3)

  {
    digitalWrite(przekaznik12,LOW);
    start12 = 1;
    czas12 = millis();
    x5 = 0;
  }
  else if((ilosc_wcisniec5 == 4) || (start12 && (millis() - czas12 > 10000)))
  {
    digitalWrite(przekaznik12, HIGH);
    start12 = 0;
    if((ilosc_wcisniec5 == 3) && (millis() - czas12 > 300)) ilosc_wcisniec5 = 4;
  }

  if ( ilosc_wcisniec5 > 4 ) ilosc_wcisniec5 = 1;
    
 }
 // Przycisk 6 ____________________________________________________(((((((********&&&&&&&
  
 
   {
    if ( !blokada6 && ( digitalRead(przycisk6) == LOW ))

  {   
    blokada6 = 1;
    ilosc_wcisniec6++;
    x6 = 1;
  } 
  
  else if ( blokada6 && (digitalRead(przycisk6) == HIGH)) blokada6++;

  if (x6 == 1 && ilosc_wcisniec6 == 1)       
  
  { 
    digitalWrite(przekaznik13, LOW);
    start13 = 1;
    czas13 = millis();
    x6 = 0;
  }
  else if((ilosc_wcisniec6 == 2) || (start13 && (millis() - czas13 > 10000)))
  {
    digitalWrite(przekaznik13, HIGH);
    start13 = 0;
    if((ilosc_wcisniec6 == 1) && (millis() - czas13 > 300)) ilosc_wcisniec6 = 2;
  }
  
  else if(x6 == 1 && ilosc_wcisniec6 == 3)

  {
    digitalWrite(przekaznik14,LOW);
    start14 = 1;
    czas14 = millis();
    x6 = 0;
  }
  else if((ilosc_wcisniec6 == 4) || (start14 && (millis() - czas14 > 10000)))
  {
    digitalWrite(przekaznik14, HIGH);
    start14 = 0;
    if((ilosc_wcisniec6 == 3) && (millis() - czas14 > 300)) ilosc_wcisniec6 = 4;
  }

  if ( ilosc_wcisniec6 > 4 ) ilosc_wcisniec6 = 1;
    
 }
 
}
Awatar użytkownika
pzygmunt
Posty: 18325
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Nie jestem pewien czy nie utworzyć osobnego działu "Projekty uzytkowników" i przenieść to tam.
PLF10T
Posty: 233
Rejestracja: ndz maja 22, 2016 6:24 pm

pzygmunt pisze:Nie jestem pewien czy nie utworzyć osobnego działu "Projekty uzytkowników" i przenieść to tam.
Popieram, tak będzie czytelniej. W dziale FAQ raczej wszyscy będą szukać znanych problemów i ich rozwiązań.
furia
Posty: 33
Rejestracja: ndz maja 08, 2016 5:59 pm

W sumie racja ...
jak Wam się to podoba??:)
Awatar użytkownika
pzygmunt
Posty: 18325
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Szkoda, że tego nie zrobiłeś na Supli w szczególności, że biblioteka dla Arduino to obsługuje.

https://github.com/SUPLA/arduino/blob/m ... ice.h#L118
https://github.com/SUPLA/arduino/blob/m ... ice.h#L119

Jak uruchomisz z użyciem Supli i nagrasz jakieś demo to się wypowiem ;)
furia
Posty: 33
Rejestracja: ndz maja 08, 2016 5:59 pm

pzygmunt pisze:Szkoda, że tego nie zrobiłeś na Supli w szczególności, że biblioteka dla Arduino to obsługuje.

https://github.com/SUPLA/arduino/blob/m ... ice.h#L118
https://github.com/SUPLA/arduino/blob/m ... ice.h#L119

Jak uruchomisz z użyciem Supli i nagrasz jakieś demo to się wypowiem ;)
bardzo bym chciał to uruchomić na supli...
tylko nie zabardzo wiem jak...

Powiedz mi proszę co jest do tego potrzebne i jak to podpiąć to w tym tygodniu to zrobię...
Awatar użytkownika
pzygmunt
Posty: 18325
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Ściągasz bibliotekę z działu download.
Otwierasz dowolny przykład np SuplaEthernetShield.

Z kodu wywalasz wszystko od:
https://github.com/SUPLA/arduino/blob/m ... ld.ino#L32

do:
https://github.com/SUPLA/arduino/blob/m ... ld.ino#L51

I wstawiasz tam wielokrotność wywołania funkcji (tyle ile rolet tyle wywołań funkcji):
SuplaDevice.addRollerShutterRelays(46, 47);

gdzie 46 i 47 to numery pinów gdzie są podłączone przekaźniki - jeden do otwierania, a drugi do zamykania.
Jeżeli moduły chodzą w odwrotnej logice to dodatkowo dodajesz "true"
SuplaDevice.addRollerShutterRelays(46, 47, true);


To wszystko
furia
Posty: 33
Rejestracja: ndz maja 08, 2016 5:59 pm

pzygmunt pisze:Ściągasz bibliotekę z działu download.
Otwierasz dowolny przykład np SuplaEthernetShield.

Z kodu wywalasz wszystko od:
https://github.com/SUPLA/arduino/blob/m ... ld.ino#L32

do:
https://github.com/SUPLA/arduino/blob/m ... ld.ino#L51

I wstawiasz tam wielokrotność wywołania funkcji (tyle ile rolet tyle wywołań funkcji):
SuplaDevice.addRollerShutterRelays(46, 47);

gdzie 46 i 47 to numery pinów gdzie są podłączone przekaźniki - jeden do otwierania, a drugi do zamykania.
Jeżeli moduły chodzą w odwrotnej logice to dodatkowo dodajesz "true"
SuplaDevice.addRollerShutterRelays(46, 47, true);


To wszystko
Rozumiem ze do tego potrzebny jest ethernet shield? I podpiąć to razem?
Jutro zabieram się do roboty :)
Awatar użytkownika
pzygmunt
Posty: 18325
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

EthernetShield lub ENC28J60
furia
Posty: 33
Rejestracja: ndz maja 08, 2016 5:59 pm

We wtorek przyjedzie EthernetShield :) i działam :)
ODPOWIEDZ

Wróć do „Projekty użytkowników”