Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Arduino- delay
Jdi na stránku 1, 2  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Miniaturní počítače (Arduino, Raspberry a další)
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
dj_rizek



Založen: Apr 07, 2005
Příspěvky: 711
Bydliště: blízko Třeboně

PříspěvekZaslal: po červen 20 2016, 12:47    Předmět: Arduino- delay Citovat

Ahoj,

potřebuju synovi do domečku vyrobit ovládání světla.

Chci tuto funkci:
Ovládání tlačítky zap/vyp
po zapnutí aktivní časovač 60minut (znáte děti pořád něco nechával zaplý jako manželky)
výstup PWM pro LED pásek ovládané potenciometrem
zapínací tlačítko podsvícené pulzující LED

Funkce naprogramovaný (kromě 60m časovače tam bych ještě dodal odpočet pomocí LED po 10minutách)mám ale problém Delay (),ten mi zabrzdí všechno ostatní.

Prosím o nakopnutí jak to vyřešit aby to nečekalo,teda pokud to Arduino umí,zatím jsem s ním dělal vymyšlené věci nebo jednoduché aplikace.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pocitujlasku



Založen: Dec 12, 2005
Příspěvky: 2181

PříspěvekZaslal: po červen 20 2016, 12:54    Předmět: Citovat

nedavat delay, ale upravit to cez interrupt - prerusenie, kde sa bude v pravidelnych casovych intervaloch inkrementovat premenna. A v hlavnom programe len doplnit porovnavanie.
_________________
No vidis, a tak si sa bal
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
dj_rizek



Založen: Apr 07, 2005
Příspěvky: 711
Bydliště: blízko Třeboně

PříspěvekZaslal: po červen 20 2016, 12:57    Předmět: Citovat

Děkuju,

mohl bys hodit část nějakýho programu nebo odkaz abych to správně pochopil.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: po červen 20 2016, 13:02    Předmět: Citovat

Nahraď funkci Delay() testem zda uběhl již požadovaný čas. Nástřel:

kód:

#define DELAY_TIME = 500 // v milisekundach
long lastTime = 0;
...

void loop()
{
   if ((millis() - lastTime)) >= DELAY_TIME)
  {
    // neco, co se ma vykonat jednou za DELAY_TIME
   ...
   lastTime = millis();
  }
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
ross4435897



Založen: Nov 10, 2009
Příspěvky: 426
Bydliště: Brno

PříspěvekZaslal: po červen 20 2016, 13:04    Předmět: Citovat

co treba strejda Google ... ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: po červen 20 2016, 17:10    Předmět: Citovat

2FHonza
to mě vždycky zajímalo co se stane při přetečení proměnné lastTime a millis() ?

kód:

// millis() is an unsigned long
long lastTime = 0;

if ((millis() - lastTime)) >= DELAY_TIME)
{
//...
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
monterjirka



Založen: Jun 14, 2003
Příspěvky: 2794
Bydliště: Blížejov

PříspěvekZaslal: po červen 20 2016, 18:26    Předmět: Citovat

S tím "přetečením" je problém, ono se to vynuluje a jede to od začátku...
Ale potřeboval jsem to do jedné aplikace a nezjistil jsem jestli to jde nějak "programově" vynulovat...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: po červen 20 2016, 22:04    Předmět: Citovat

Vypadá to, že pokud je "millis" unsigned typ a "lastTime" signed typ stejné velikosti, přetékání nedělá žádný problém.
Zkoušel jsem to na uint16_t a int16_t s DELAY_TIME=500.
Ať přeteče millis nebo přeteče lastTime furt je rozdíl stejný (millis - lastTime = 500).
Nejsem matematik, připadá mě to, že souvisí s operací odečítání a interpretací kladného a záporného čísla.
kód:
void test_function( void)
{
uint16_t millis = 0;
int16_t lastTime = 0;
int16_t diff;
uint16_t terminate_me = 1000;

  for(;;)
  {
     millis++;
     if (diff = millis - lastTime, diff >= DELAY_TIME)
     {
         printf("%08i\t%08i\t%08i\t%08i\n", millis, lastTime, diff, terminate_me);
         lastTime = millis;
         terminate_me--;
         if (0==terminate_me) break;
     }
  }
}



2016-06-20-graph.png
 Komentář:

Stáhnout
 Soubor:  2016-06-20-graph.png
 Velikost:  6.69 kB
 Staženo:  212 krát

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: út červen 21 2016, 8:42    Předmět: Citovat

Správně by mělo být
kód:

unsigned long lastTime = 0;

už jenom protože fce milis() vrací také bezznaménkový long.
Otázkou je, jaký typ "použije" překladač pro výsledek ulong - long.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
ross4435897



Založen: Nov 10, 2009
Příspěvky: 426
Bydliště: Brno

PříspěvekZaslal: út červen 21 2016, 8:44    Předmět: Citovat

"Neresetujte millis, naucte se ovladat preteceni!"
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: út červen 21 2016, 8:47    Předmět: Citovat

a nejlíp "nepoužívejte millis, ale timer" Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
dj_rizek



Založen: Apr 07, 2005
Příspěvky: 711
Bydliště: blízko Třeboně

PříspěvekZaslal: út červen 21 2016, 10:30    Předmět: Citovat

Tak jsem se na to vyprdnul,pokud použiju něco jinýho,tak mi to neběží, zredukoval jsem delay časy a použiju externí 60 minutovej časovač,nějaký časovací moduly mám.

Program zveřejňovat nebudu protože byste se mi vysmáli,je to upravená slátanina několika programů ale dělá co potřebuju.

Už na škole moje programy v Pascalu učitele vždy pobavily. Cry
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: út červen 21 2016, 10:34    Předmět: Citovat

Nikdo by se ti nesmál, fakt. Nahraj sem původní program s Delay, rád ti pomůžu. Když už jednou v projektu máš mcu, tak je škoda dávat navíc HW jenom kvůli chybě v SW.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
dj_rizek



Založen: Apr 07, 2005
Příspěvky: 711
Bydliště: blízko Třeboně

PříspěvekZaslal: út červen 21 2016, 11:44    Předmět: Citovat

Je to paskvil ale to jsou začátky,
PWM mám aktivní pořád protože napájení LED bude přes relátko ovládaný taky arduinem (nechci mít vypnutý LED pásky pod žádným napětím) takže proto se neaktivuje až po stisknutí tlačítka.
Vstupy/výstupy taky zvolený nahodile.

kód:

int led = 11;           // Led ovladaci tlacitko
int brightness = 0;   
int fadeAmount = 6;   
int Ledpin=9;           //vystup na Mosfet PWM
int analogpin= A2;      //vstup potenciometru
int value=0;            //promenna pro hodnotu potenciometru
int x;                  //prevedena hodnota z 0..1023 na 0..255
int LEDka =2;           // rele pro 12V led + ovladaci napeti ext casovace
int TLAC = 3;           // ovladaci tlacitko
int timer= 7;           // vstup z ext casovace
boolean svetlo = false; // Pomocná hodnota světlooid setup()

void setup() {
 
  pinMode(led, OUTPUT);
  pinMode(Ledpin, OUTPUT);     
  pinMode(LEDka, OUTPUT);   
  pinMode(TLAC, INPUT);   
  pinMode(timer, INPUT); 
}

void loop() {
  //mzouratko
  analogWrite(led, brightness);
 
  brightness = brightness + fadeAmount;
   
  if (brightness == 50 || brightness == 255) {
    fadeAmount = -fadeAmount ; }
    {
   //PWM   
 value=analogRead(analogpin);  //precist potenciometr
 x=map(value,0,1023,0,255);    //prevod hodnot z potenciometru na PWM rozsah
 analogWrite(Ledpin,x);
     }   
 delay(20);
   
   {
  //tlac zap/vyp
  if (digitalRead(TLAC))
  {
   
   if (svetlo) svetlo = false; else svetlo = true;
     
   
   
   digitalWrite(LEDka, svetlo);
   
   while (digitalRead(TLAC))
         
      delay(50);
   
       
  }
    // vypnuti ext casovacem
  if (digitalRead(timer)) {
    svetlo=false;
    digitalWrite(LEDka,svetlo); delay(50);}
}
}

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: út červen 21 2016, 18:07    Předmět: Citovat

@FHonza
Co je to millis() ? Pokud dáte do programu millis(), tak arduino automaticky na "pozadí" spustí časovač, uživatel o tom mnohdy ani neví.

To jsem tak jednou přemýšlel proč mi nejede PWM. Až jsem udělal výpis pomocí:
build.path=f:\arduino_out\
build.verbose=true
Tak jsem zjistil, že arduino si už použilo časovač ke svým účelům...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Miniaturní počítače (Arduino, Raspberry a další) Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.15 sekund