void loop, lampki schodowe

alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

Witam mam pytanie do bardziej zaawansowanych użytkowników, działa mi juz sterowanie przekażnikami, roletami, odczyty z czujników temperatury, lecz teraz chciałem jesszcze do mojego programu dołożyć obsługę lampek przy schodach, dwa czujniki jeden na dole jeden do góry i 9 lampek, które będą załączać się po wykryciu ruchu przez dany czujnik w nadanej sekwencji. Goły program działa mi bez zarzutu, lecz w połączeniu z suplą rozłącza mi cały czas serwer, podejrzewam że problem leży po stronie mojego programu, gdyż używam void loop. Jak to obejść chcę dołożyc do mojego arduino jeszcze m.in alarm i raczej potrzebuję void loop. Została mi jeszcze jedna kwestia dotycząca przycisku furtki, ale o tym problemie piszę w innym wątku. Pozdrawiam
User avatar
shimano73
Posts: 2174
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze
Been thanked: 1 time

Post

A pokazałbyś swój program ,podejrzewam ze ta twoja sekwencja potrzebuje zbyt dużo czasu na wykonanie , prawdopodobnie używasz „delay”
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
User avatar
pzygmunt
Posts: 20302
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Been thanked: 59 times

Post

NIe użzywaj loopa tylko wbudowanego timera SuplaDevice.setTimerFuncImpl
Nie używaj też delay-ów jak już shimano73 wyżej napisał
SUPLA.... Nareszcie w domu.
alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

Code: Select all

unsigned long czas; 

int pin[9]={30,31,32,33,34,35,36,37,38};

int q = 0;
byte s = 0;
byte c = 0;
byte v = 0;
bool c_on = false;
bool c_off = false;



//LED delay 
 int tOn = 250; //czas wlaczania
 int tOff = 100; //czas wylanczania
 int offC = 200; // 


void setup() {
 
 Serial.begin(9600);

 
 pinMode(26, INPUT); // czujnik dolny 0
 pinMode(27, INPUT); // czujnik gorny 1
 
 pinMode(30, OUTPUT); // lampka pierwsza dolna 1    2
 pinMode(31, OUTPUT);
 pinMode(32, OUTPUT);
 pinMode(33, OUTPUT);
 pinMode(34, OUTPUT);
 pinMode(35, OUTPUT);
 pinMode(36, OUTPUT);
 pinMode(37, OUTPUT);
 pinMode(38, OUTPUT); // lampka ostatnia górna 9 13

}
void loop() {


// z dołu


if (digitalRead(26) == LOW and s == 0)
  {
   c_on=true; 
   OnDown(); 
  }
if (digitalRead(26) == HIGH and c_on == true)
  {
   s= 1; 
   c_on=false;
   czas = millis()+30000;
  }


if (digitalRead(26) == LOW and s == 1)
   { 
    c=1; 
    }
if (digitalRead(26) == HIGH and c == 1)
    {
      OffDown();
      }
if (digitalRead(26) == HIGH and s == 1)
   {  
     if (millis()  > czas )
     { 
       OffCzas();
       }
    }

// z góry
  

if (digitalRead(27) == LOW and s == 0)
  {
   c_off=true; 
   OnUp(); 
  }
if (digitalRead(27) == HIGH and c_off == true)
  {
   s= 1; 
   c_off=false;
   czas = millis()+30000;
  }

  
if (digitalRead(27) == LOW and s == 1)
    {
      v=1; 
    }
if (digitalRead(27) == HIGH and v == 1 )
    {
      OffUp();
    }
if (digitalRead(27) == HIGH and s == 1)
   {  
     if (millis()  > czas ) 
     { 
       OffCzas();
       }
    
    }
}

void OnUp(){ 

 for( q = 0; q < 9; q++ ){
  digitalWrite( pin[q], HIGH );delay(tOn);}
 

} 

void OffUp(){ 
 
 for( q = 9; q >= 0; q-- ){
  digitalWrite( pin[q], LOW );delay(tOff);}
  
    s = 0;
    v = 0;
    c = 0; 
    q = 0;
   
} 

void OnDown(){
 
for( q = 9; q >= 0; q-- ){
  digitalWrite( pin[q], HIGH );delay(tOn);}
        
} 

void OffDown(){ 
 
 for( q = 0; q < 9; q++ ){
  digitalWrite( pin[q], LOW );delay(tOff);}

  s = 0;
  v = 0;
  c = 0; 
  q = 0;
  
}

void OffCzas(){

digitalWrite(30, LOW );
digitalWrite(38, LOW );
delay(offC);
digitalWrite(31, LOW );
digitalWrite(37, LOW );
delay(offC);
digitalWrite(32, LOW );
digitalWrite(36, LOW );
delay(offC);
digitalWrite(33, LOW );
digitalWrite(35, LOW );
delay(offC);
digitalWrite(34, LOW );
delay(offC);


  s = 0;
  v = 0;
  c = 0; 
}

 
alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

to jest wycinek działania lampek schodowych, jak to ominąć ?
User avatar
Espablo
Posts: 1754
Joined: Wed Jun 29, 2016 5:04 pm
Location: Oświęcim

Post

@shimano73 miał rację masz tam "w pierony" delay ów. Postaraj się to zrobić nie blokująco bez delay
Każde urządzenie elektryczne działa o wiele lepiej jeśli podłączysz je do prądu. :? :roll:
User avatar
pzygmunt
Posts: 20302
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Been thanked: 59 times

Post

Podziel sobie kod na sekcje obwarowane znacznikami czasowymi.
Przykład (pisany na kolanie więc nie wiem czy się skompiluje).

Code: Select all

#define SECTION_COUNT 3
unsigned long section_time[SECTION_COUNT];

void setup(){
  for(int a=0;a<SECTION_COUNT;a++) {
     section_time[a] = 0;
  };
  section_time[0] =  millis()+1000;
}
void loop(){

  unsigned long now = millis();

  for(int a=0;a<SECTION_COUNT;a++) {
      if ( section_time[a] != 0 && now >= section_time[a] ) {
         section_time[a] = 0;
         switch(a) {
            case 0:
                  section_time[1] = now + 1000;
                  break;
            case 1:
                  section_time[2] = now + 1000;
                  break;
            case 2:
                  section_time[0] = now + 1000;
                  break;
         };
      };
  };

}
SUPLA.... Nareszcie w domu.

Return to “Pomoc”