Náhrada Delay

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

KeXT3r
Okoloidúci
Okoloidúci
Príspevky: 45
Dátum registrácie: 04 Nov 2014, 23:23

Náhrada Delay

Príspevok od používateľa KeXT3r » 11 Sep 2017, 23:33

Zdravím. S arduinom viac menej začínam. Pracujem na osvetlení schodov v dome. Spínač bude IR zavora ktora bude mat v klude na výstupe HIGH, pokal sa prerusi tak LOW a vtedy by sa mali rozsvietit ledky na napr. 15s. bez toho aby. som použil prikaz delay. Ide mi. o. to. že ak niekdo preruší zavoru zopne sa osvetlenie na 15 sekúnd. Ak medzi tym ako svietia ledky tak niekdo znova preruší zavoru odpočítavanie času pôjde od začiatku. Skúšal som hocičo no neviem sa s toho vysomáriť. Ako by s te to. riesili vy? poprípade nejaké návrhy. Budem vďačný za hoci akú pomoc.
0

Používateľov profilový obrázok
bobo87
Ultimate člen
Ultimate člen
Príspevky: 1913
Dátum registrácie: 15 Feb 2007, 00:00
Vek: 36
Kontaktovať používateľa:

Re: Náhrada Delay

Príspevok od používateľa bobo87 » 11 Sep 2017, 23:41

Toto sa da spravit aj s 555kou, trochu smetia naokolo a nemusis ani programovat. :)
0
float l,I,Q,_,o;int E;main(){I=1.125;while(I>=-1.225){for(l=-2;l<=1;l+=3/79.0){Q=_=0;for(E=127;Q*Q+_*_<4.0&&--E>32;){o=Q;Q=Q*Q-_*_+l;_=2*o*_+I;}putchar(E);}putchar(10);I-=9/88.0;}}

KeXT3r
Okoloidúci
Okoloidúci
Príspevky: 45
Dátum registrácie: 04 Nov 2014, 23:23

Re: Náhrada Delay

Príspevok od používateľa KeXT3r » 11 Sep 2017, 23:51

Praveze to chcem cez arduino lebo ledky budu WS2812.
0

Používateľov profilový obrázok
bobo87
Ultimate člen
Ultimate člen
Príspevky: 1913
Dátum registrácie: 15 Feb 2007, 00:00
Vek: 36
Kontaktovať používateľa:

Re: Náhrada Delay

Príspevok od používateľa bobo87 » 11 Sep 2017, 23:55

Tak niektory z casovacov nastavit napriklad na 1s interval. Spravis si globalnu premennu napr. uint8_t lightTimer. V preruseni spravis nieco taketo:

Kód: Vybrať všetko

if(lightTimer > 0)
   lightTimer--;
A v hlavnej slucke len kontrolujes premennu a ked je lightTimer == 0, zhasnes, ked lightTimer > 0, rozsvietis. Pri kazdom impulze od zavory uz len nastavis pozadovany cas, napr lightTimer = 15 a hotovo. :)
0
float l,I,Q,_,o;int E;main(){I=1.125;while(I>=-1.225){for(l=-2;l<=1;l+=3/79.0){Q=_=0;for(E=127;Q*Q+_*_<4.0&&--E>32;){o=Q;Q=Q*Q-_*_+l;_=2*o*_+I;}putchar(E);}putchar(10);I-=9/88.0;}}

Pega
Stály člen
Stály člen
Príspevky: 192
Dátum registrácie: 28 Mar 2012, 08:52

Re: Náhrada Delay

Príspevok od používateľa Pega » 12 Sep 2017, 08:04

Varianta bez přerušení:

Kód: Vybrať všetko

void my_delay(uint8_t sec)            // sec=15
{    
   for(uint16_t i=sec*10; i>0; i--)   // opakuj 150x
   {
      _delay_ms(100);
      if(vypinac_zapnuty) i=sec*10;   // každých 100 ms zkontroluj vypinač, 
   }                                  // pokud je zapnutý, nastav znovu 15 sec
}


int main(void)
{

  while(1)
  {
     if(vypinac_zapnuty)
     {
         zapni_svetla;
         my_delay(15);   // čekej 15 vteřin
         vypni_svetla;
     }
  }
}
0

TomasNM
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1371
Dátum registrácie: 22 Jan 2012, 19:24
Bydlisko: Nové Mesto nad Váhom
Vek: 43

Re: Náhrada Delay

Príspevok od používateľa TomasNM » 12 Sep 2017, 08:53

Alebo takto(vyvarujes sa pouzitiu delay uplne):

Kód: Vybrať všetko

unsigned long teraz,predtym;
const int interval=15000;
boolean vstup,vystup;

void setup() {
  // put your setup code here, to run once:
}

void loop() {
  // put your main code here, to run repeatedly:

  teraz=millis();

  if(vstup) { predtym=teraz;vystup=true;}//zapni  
  if(teraz-predtym>=interval) { vystup=false;}//vypni

}
0

KeXT3r
Okoloidúci
Okoloidúci
Príspevky: 45
Dátum registrácie: 04 Nov 2014, 23:23

Re: Náhrada Delay

Príspevok od používateľa KeXT3r » 13 Sep 2017, 20:31

Diki moc :) skusim a uvidim :)
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok