• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Sterowanie roletami
#1
Witam wszystkich forum.
Jestem nowym użytkownikiem dlatego z góry przepraszam jeśli moje pytania są niefachowe, błędnie sformułowane lub niepoprawne.
Od pewnego czasu uczę się języka cpp przez zabawę z arduino.
Ostatnio chcę zrobić sterowanie roletami, przez bluetooth i włącznik czasowy.
Mój problem polega na tym że działa albo jedno albo drugie, prawdopodobnie jest to spowodowane źle zapisaną pętlą while.
Moje drugie pytanie w jaki sposób zapisać żeby stan wysoki na wyjściu był tylko przez określony czas w sekundach (sterowanie czasem podnoszenie - opuszczania rolety).
Z góry dziękuję za wszelką pomoc w rozwiązaniu tego problemu.

void loop() {
    
    while( Serial.available() )
         delay( 3 );
    
    char c = Serial.read();
    readString += c;
    
    dt = clock.getDateTime();
    
    Serial.print( dt.hour ); Serial.print( ":" );
    Serial.print( dt.minute ); Serial.print( ":" );
    Serial.print( dt.second ); Serial.println( "" );
    
    
    if( readString.length() > 0 ) {
        Serial.println( readString );
        
        // .........................................................
        if( readString == "podnies1" )
        { digitalWrite( rol1up, HIGH ); }
        
        if(( dt.hour == 7 ) &&( dt.minute == 00 ) &&( dt.second == 00 ) )
        { digitalWrite( rol1up, HIGH ); }
        
        if(( dt.hour == 7 ) &&( dt.minute == 5 ) &&( dt.second == 00 ) )
        { digitalWrite( rol1up, LOW ); }
        
        if( readString == "opusc1" )
        {
            digitalWrite( rol1down, HIGH );
        }
        if(( dt.hour == 17 ) &&( dt.minute == 00 ) &&( dt.second == 00 ) )
        { digitalWrite( rol1up, HIGH ); }
        
        if(( dt.hour == 17 ) &&( dt.minute == 5 ) &&( dt.second == 00 ) )
        { digitalWrite( rol1up, LOW ); }
        
        if( readString == "stop1" )
        { digitalWrite( rol1up, LOW );
            digitalWrite( rol1down, LOW );
        }
 
Odpowiedź
#2
Witam
Proponuję na wstępie zamieszczać cały kod, łatwiej potem wywnioskować co autor ma na myśli :-)
Moje spostrzeżenia:
- Twoja pętla while nie ma sensu...bo robi tylko tyle:
Jeśli jest dostępna komunikacja to wprowadź opóźnienie 3 ms. Jeśli nie to nic nie rób. Bez sensu. Wykonuje tylko jedną instrukcję.
Pętla while jeśli ma robić coś więcej to musi zaczynać się i kończyć { } zaś w środku umieszczasz wszystko co chcesz zrobić.
- Odpowiedzią na Twoje drugie pytanie jest funkcja delay właśnie. Jej argument to ilość ms. Czyli robisz:
po digitalWrite(Pin, Stan); dajesz delay(opóźnienie); Jednak w przypadku sterowania silnikami to nie jest dobry pomysł - bo albo roletka nie dojedzie tam gdzie się spodziewasz albo spalisz silnik. W tym przypadku albo wyłącznik krańcowy albo bariera opto. 
Pozdrawiam
 
Odpowiedź
#3
Dziękuję za odpowiedź i poświęcenie czasu nad moim pytaniem.
Z programowaniem czasu uporałem się choć nie mam możliwości zatrzymania rolety (czyli jeśli zegar załączy roletę nie mam możliwości zatrzymania tego przez telefon, musi się skończyć zaprogramowany czas.  
Co do silników to mają ustawione krańcówki więc nic się nie stanie. Będę teraz próbował z funkcją delay
A poniżej przedstawiam poprawiony kod.
Uwagi w dalszym ciągu mile widziane.

Kod:
int lamp = 2;
int rol1up = 3;
int rol1down = 4;
int rol2up = 5;
int rol2down = 6;
int rol3up = 7;
int rol3down = 8;
int rol4up = 9;
int rol4down = 10;
int wejup = 11;
int wejdown = 12;
String readString;
#include <DS1307.h>
DS1307 clock;
RTCDateTime dt;

void setup() {
Serial.begin(9600);
pinMode(lamp, OUTPUT);
pinMode(rol1up, OUTPUT);
pinMode(rol1down, OUTPUT);
pinMode(rol2up, OUTPUT);
pinMode(rol2down, OUTPUT);
pinMode(rol3up, OUTPUT);
pinMode(rol3down, OUTPUT);
pinMode(rol4up, OUTPUT);
pinMode(rol4down, OUTPUT);
pinMode(wejup, OUTPUT);
pinMode(wejdown, OUTPUT);
Serial.println("Initialize DS1307");;
clock.begin();
if (!clock.isReady())
     clock.setDateTime(__DATE__, __TIME__);
}

void loop() {

  dt = clock.getDateTime();

Serial.print(dt.hour);   Serial.print(":");
Serial.print(dt.minute); Serial.print(":");
Serial.print(dt.second); Serial.println("");
 if ((dt.hour == 19 ) && (dt.minute ==41)&&(dt.second == 00))
 digitalWrite(rol1up, HIGH);
 digitalWrite(rol2up, HIGH);
 digitalWrite(rol3up, HIGH);
 digitalWrite(rol4up, HIGH);
 digitalWrite(wejup, HIGH);
 if ((dt.hour == 19) && (dt.minute == 41)&&(dt.second == 15))
digitalWrite(rol1up, LOW);
digitalWrite(rol2up, LOW);
digitalWrite(rol3up, LOW);
digitalWrite(rol4up, LOW);
digitalWrite(wejup, LOW);

while (Serial.available()) {
  delay(3);
  char c = Serial.read();
  readString += c;
}


if (readString.length() > 0) {
  Serial.println(readString);
// .........................................................
     
   if (readString == "podnies1")
   {
    digitalWrite(rol1up, HIGH);
  }
  if (readString == "opusc1")
 
  {
    digitalWrite(rol1down, HIGH);
  }if
  (readString == "stop1")
  { digitalWrite(rol1up, LOW);
    digitalWrite(rol1down, LOW);
  }
//.......................................................

if (readString == "podnies2")
  {
    digitalWrite(rol2up, HIGH);
  }
  if (readString == "opusc2")
  {
    digitalWrite(rol2down, HIGH);
  }if
  (readString == "stop2")
  { digitalWrite(rol2up, LOW);
    digitalWrite(rol2down, LOW);
  }
//..............................................................
if (readString == "podnies3")
  {
    digitalWrite(rol3up, HIGH);
  }
  if (readString == "opusc3")
  {
    digitalWrite(rol3down, HIGH);
  }if
  (readString == "stop3")
  { digitalWrite(rol3up, LOW);
    digitalWrite(rol3down, LOW);
  }
//.............................................................
if (readString == "podnies4")
  {
    digitalWrite(rol4up, HIGH);
  }
  if (readString == "opusc4")
  {
    digitalWrite(rol4down, HIGH);
  }if
  (readString == "stop4")
  { digitalWrite(rol4up, LOW);
    digitalWrite(rol4down, LOW);
  }
//...........................................................
if (readString == "ON")
  {
    digitalWrite(lamp, HIGH);
  }
  if (readString == "OFF")
  {
    digitalWrite(lamp, LOW);
 
  }
//.............................................................
if (readString == "podnieswej")
  {
    digitalWrite(wejup, HIGH);
  }
  if (readString == "opuscwej")
  {
    digitalWrite(wejdown, HIGH);
  }if
  (readString == "stopwej")
  { digitalWrite(wejup, LOW);
    digitalWrite(wejdown, LOW);
  }

  readString = "";
}
}
 
Odpowiedź
#4
Podnosi opada zatrzymuje dodaj sobie tylko zegar osobiście korzystam z biblioteki ds1307new

Kod:
String readString;

long pm1, pm2, pm3, pm4, pm5 = 0;
long cm = 0;
int czas1,czas2,czas3,czas4,czas5 = 0;
int pin;

void setup() {
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);

}

void loop() {
 
cm = millis()/1000;

while (Serial.available()) {
 delay(3);
 char c = Serial.read();
 readString += c;
}


if (readString.length() > 0) {
 if (readString == "ON"){digitalWrite(2,1);}
 if (readString == "OFF"){digitalWrite(2,0);}
 
 if (readString == "podnies1"){  // odczyt z portu zainicjowanie funkji
 pm1 = cm;                            // wyzerowanie czasu
 czas1 = 15;                           // ustawienie czau podniesienia rolety 1
 digitalWrite(4,LOW);               // jeżeli roleta wcześniej szła w dół zatrzymaj
 digitalWrite(3,HIGH);              // załącz pin podniesienia rolety
}  
 if (readString == "opusc1"){pm1 = cm; czas1 = 5;digitalWrite(3,LOW);digitalWrite(4,HIGH);}
 if (readString == "stop1"){ pm1 = cm; czas1 = 0; digitalWrite(3,0);digitalWrite(4,0);}
 if (readString == "podnies2"){pm2 = cm;czas2 = 15;digitalWrite(6,LOW);digitalWrite(5,HIGH);}
 if (readString == "opusc2"){pm2=cm;czas2 = 15;digitalWrite(5,LOW);digitalWrite(6,HIGH);}
 if (readString == "stop2"){ pm2 = cm; czas2 = 0; digitalWrite(5,0);digitalWrite(6,0);}
 if (readString == "podnies3"){pm3=cm;czas3 = 15;digitalWrite(8,LOW);digitalWrite(7,HIGH);}
 if (readString == "opusc3"){pm3=cm;czas3 = 15;digitalWrite(7,LOW);digitalWrite(8,HIGH);}
 if (readString == "stop3"){ pm3 = cm; czas3 = 0; digitalWrite(7,0);digitalWrite(8,0);}
 if (readString == "podnies4"){pm4=cm;czas4 = 15;digitalWrite(10,LOW);digitalWrite(9,HIGH);}
 if (readString == "opusc4"){pm4=cm;czas4 = 15;digitalWrite(9,LOW);digitalWrite(10,HIGH);}
 if (readString == "stop4"){ pm4 = cm; czas4 = 0; digitalWrite(9,0);digitalWrite(10,0);}
 if (readString == "podnieswej"){pm5=cm;czas5 = 15;digitalWrite(12,LOW);digitalWrite(11,HIGH);}
 if (readString == "opuscwej"){pm5=cm;czas5 = 15;digitalWrite(11,LOW);digitalWrite(12,HIGH);}
 if (readString == "stopwej"){ pm5 = cm; czas5 = 0; digitalWrite(11,0);digitalWrite(12,0);}
 }
   
   readString = "";
 
 if ((cm - pm1) >= czas1 ){digitalWrite(3,0);digitalWrite(4,0);} // odmierzanie czasu dla podniesienia i opadania rolety nr1
 if ((cm - pm2) >= czas2 ){digitalWrite(5,0);digitalWrite(6,0);}
 if ((cm - pm3) >= czas3 ){digitalWrite(7,0);digitalWrite(8,0);}
 if ((cm - pm4) >= czas4 ){digitalWrite(9,0);digitalWrite(10,0);}
 if ((cm - pm5) >= czas5 ){digitalWrite(11,0);digitalWrite(12,0);}

 
 
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#5
Sad 
Dziękuję bardzo za tak fachowe podejście nie spodziewałem czegoś takiego, a sam bym tego nie napisał. Niestety przez moje ciągłe przekładanie tego samego modułu bluetooth w kilku urządzeniach  coś się z nim stało i muszę kupić nowy, bo z tym mam problem się połączyć.
Niestety więc moje testowanie musi poczekać do połowy tygodnia[Obrazek: sad.png]
Jeszcze raz dziękuję za pomoc i poświęcony czas.

Wszystko podpięte pracuje tak jak należy (poza modułem bluetooth który prawdopodobnie jest uszkodzony bo ma dziwne objawy).
Z racji tego że podoba mi się sterowanie roletami przez telefon oraz możliwość zaprogramowania czasu, chciałbym zrobić coś takiego w całym domu, telefonem łączyć się tylko z jednym modułem i sterować bezprzewodowo pozostałymi z uwagi na duży dom ok 3 szt.
Jak uważacie czy lepiej będzie skonfigurować je w sieć wi-fi wszystkie, czy może ten który mam teraz sterowany przez bluetooth do niego założyć jakiś moduł nadajnik odbiornik radiowy, a może jeszcze coś innego.
A i jeszcze jedno myślałem, że moje poprzednie przełączniki do rolet będę musiał wyrzucić, ale podłączyłem je do przekaźnika za pomocą diody prostowniczej w taki sposób aby działa zaporowo w kierunku wyjścia arduino, a prąd wziąłem z vcc, mam nadzieje że takie rozwiązanie nie ma wpływu na żywotność i poprawne działanie arduino?
 
Odpowiedź
#6
Muszę odświeżyć trochę wątek sterowania roletami, mianowicie chciałem poprzez arduino uno z modułem bluetooth oraz nadajnikiem RF sterować dwoma lub więcej arduino nano z  odbiornikami RF dzięki czemu poprzez jeden moduł bluetooth mógłbym sterować większą ilością rolet (względy ekonomiczne oraz praktyczne).
Niestety gdy podpinam wszystko w ten sposób i robię testy (wysyłam msg="on" do wszystkich odbiorników to czasem działa ale przeważnie działa jeden lub naprzemiennie, nie wiem od czego to zależy).
Pytanie czy to co chcę zrobić ma szanse działać poprawnie a może macie jakieś inny lepszy sposób??

Druga sprawa nad którą się męczę od jakiegoś czasu to "mikro uchył". czyli roleta  podniesiona powiedzmy o kilka cm.
Ponieważ z założenia nie wiem nigdy w jakim położeniu jest w danej chwili roleta, chciałem aby po wysłaniu msg="mikro" roleta opuszczała się przez 10s a następnie podnosiła przez 2s co wystarczy na uchylenie, oraz żebym miał w każdej chwili możliwość zatrzymania poprzez msg="stop"
 if (readString == "podnies2"){pm2 = cm;czas2 = 15;digitalWrite(6,LOW);digitalWrite(5,HIGH);}
 if (readString == "opusc2"){pm2=cm;czas2 = 15;digitalWrite(5,LOW);digitalWrite(6,HIGH);}
 if (readString == "stop2"){ pm2 = cm; czas2 = 0; digitalWrite(5,0);digitalWrite(6,0);}
if (readString == "mikro2"){???}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości