blikanie len niekolko krat

Sperhak
Příspěvky: 46
Registrován: 22 čer 2018, 19:49
Reputation: 0

blikanie len niekolko krat

Příspěvek od Sperhak » 21 črc 2018, 18:02

Zdravím potreboval by som vyriešiť niečo takéto. Majme nejaký program v nom sa zmení d na 0 alebo 1 a zakaždým by som potreboval keď sa zmení d na nejakú hodnotu aby 3x blikla ledka v t intervaloch,s delayom to viem ale chcel by som to bez delay zatial mám niečo takéto to ale ledka bliká donemoty ak je d 1

Kód: Vybrat vše

void ledka() {
  aktualny_cas = millis();
  if (d == 1) {
     if (ledka_cas < aktualny_cas) {
        ledka_cas = aktualny_cas;
        ledka_cas += 200;
      }
      if ((ledka_cas - 100) > aktualny_cas) {
       digitalWrite(kontrolka, LOW);
      }
      else if (ledka_cas > aktualny_cas) {
        digitalWrite(kontrolka, HIGH);
      }
  }
}

Chcel by som aby pri 0 blikla 3x a pri 1 napr 5x v takom 100ms intervale vedely by ste ma nasmerovať?

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: blikanie len niekolko krat

Příspěvek od petan » 21 črc 2018, 19:41

Zkus třeba tohle. Netestoval jsem to...
Jinak, tvůj dotaz tady nemá co dělat. Vidíš ten červenej pruh nahoře? Tohle patří do sekce "Programování obecně", nebo podobné.

Kód: Vybrat vše

unsigned long lastTime; //proměnná s uloženým časem posledního vyvolání funkce
unsigned long presentTime; //proměnná pro aktuální čas 

bool ledState; //aktuální stav LEDky
byte b; //tato proměnná se hlídá
byte count; //kolikrát má LEDka bliknout

void setup() {
 pinMode(13, OUTPUT);
 pinMode(12, INPUT);
} 

void loop() { 
 presentTime = millis(); //uložení aktuálního času do proměnné
 b = digitalRead(12); //načtení stavu vstupu

 if (presentTime - lastTime >= 50) { 
  //toto se spouští každých 50 ms
  lastTime = presentTime;
  ledState = !ledState; //blikání s proměnnou v intervalu 50 ms
 } 

if(b != b){
 //proběhla změna stavu
 ledState = true; //zapnu Ledku
 if (b){
  count = 10; //nastav počet bliknutí na 5 (je nutné zadat dvojnásobek 1 bliknutí = jednou svítí, pak zas ne)
 }
 else{
  count = 6; //nastav počet bliknutí na 3
 }
}

if (b > 0){
 digitalWrite(13, ledState);
 b--;
}
else{
 digitalWrite(13, LOW);
}
}

rejze69
Příspěvky: 174
Registrován: 02 dub 2018, 18:56
Reputation: 0

Re: blikanie len niekolko krat

Příspěvek od rejze69 » 21 črc 2018, 22:14

V principu by to fungovat mohlo, ale b se bude vždy rovnat b ,takže podmínka nemůže být splněna. Další je že by se mělo porovnávat a odečítat count tedy if(count>0) a tedy count --
Pro začátečníka je vždy lepší,když může vycházet z vyzkoušeného kódu. Tohle mu zamotá hlavu.

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: blikanie len niekolko krat

Příspěvek od petan » 21 črc 2018, 22:27

rejze69 píše:
21 črc 2018, 22:14
V principu by to fungovat mohlo, ale b se bude vždy rovnat b ,takže podmínka nemůže být splněna.
Jo, mám tam chyby. Opraveno. Ale stále neotestováno :D

Kód: Vybrat vše

unsigned long lastTime; //proměnná s uloženým časem posledního vyvolání funkce
unsigned long presentTime; //proměnná pro aktuální čas 

bool ledState; //aktuální stav LEDky
byte b, lastb; //tato proměnná se hlídá
byte count; //kolikrát má LEDka bliknout

void setup() {
 pinMode(13, OUTPUT);
 pinMode(12, INPUT);
} 

void loop() { 
 presentTime = millis(); //uložení aktuálního času do proměnné
 b = digitalRead(12); //načtení stavu vstupu

 if (presentTime - lastTime >= 50) { 
  //toto se spouští každých 50 ms
  lastTime = presentTime;
  ledState = !ledState; //blikání s proměnnou v intervalu 50 ms
 } 

if(b != lastb){
 //proběhla změna stavu
 ledState = true; //zapnu Ledku
 if (b){
  count = 10; //nastav počet bliknutí na 5 (je nutné zadat dvojnásobek 1 bliknutí = jednou svítí, pak zas ne)
 }
 else{
  count = 6; //nastav počet bliknutí na 3
 }
}

if (count > 0){
 digitalWrite(13, ledState);
 count--;
}
else{
 digitalWrite(13, LOW);
}

lastb = b;
}

rejze69
Příspěvky: 174
Registrován: 02 dub 2018, 18:56
Reputation: 0

Re: blikanie len niekolko krat

Příspěvek od rejze69 » 22 črc 2018, 10:13

To už vypadá funkčně. S drobnou výhradou k proměnné presentTime,která vlastně kopíruje millis a zdá se být tudíž zbytečná. Maximálně po přetečení millis() nedodrží interval blknutí jednou za 50dní. Pokud ale nemusí šetřit RAM tak proč ne.

Sperhak
Příspěvky: 46
Registrován: 22 čer 2018, 19:49
Reputation: 0

Re: blikanie len niekolko krat

Příspěvek od Sperhak » 22 črc 2018, 10:24

Tak skúsil som to upraviť. Pridal som tam tlačidlo ktoré mení premennú z 0 na 1.A nefunguje to. Ked sa zmení b tak ledka blikne len raz aj to rýchlo a na polovičný jas.

Kód: Vybrat vše

unsigned long lastTime; //proměnná s uloženým časem posledního vyvolání funkce
unsigned long presentTime; //proměnná pro aktuální čas 

bool ledState; //aktuální stav LEDky
byte d, lastd; //tato proměnná se hlídá
byte count; //kolikrát má LEDka bliknout

int buttonState; //nejnovější hodnota načtená ze vstupního pinu
int lastButtonState = LOW; // předchozí hodnota načtení ze vstupního pinu
long lastDebounceTime = 0; // čas posledního změny výstupního pinu
long debounceDelay = 3000; // 4as po ktor9 sa mus9 dr6at tla4idlo

int tlacidlo = 4;
int b;


void setup() {
  
  pinMode(tlacidlo, INPUT);
 pinMode(13, OUTPUT);
 b = 0;
 d = 0;
} 

void loop() { 
  button();
 presentTime = millis(); //uložení aktuálního času do proměnné
 d = b; //načtení stavu vstupu

 if (presentTime - lastTime >= 100) { 
  //toto se spouští každých 50 ms
  lastTime = presentTime;
  ledState = !ledState; //blikání s proměnnou v intervalu 50 ms
 } 

if(d != lastd){
 //proběhla změna stavu
 ledState = true; //zapnu Ledku
 if (d){
  count = 10; //nastav počet bliknutí na 5 (je nutné zadat dvojnásobek 1 bliknutí = jednou svítí, pak zas ne)
 }
 else{
  count = 6; //nastav počet bliknutí na 3
 }
}

if (count > 0){
 digitalWrite(13, ledState);
 count--;
}
else{
 digitalWrite(13, LOW);
}
lastd = d;
}


void button() {
  int reading = digitalRead(tlacidlo);// Stav spínača priradí do premennej reading
  if (reading != lastButtonState) { // Pokud se spínač změnil kvůli šumu nebo stlačení:
    lastDebounceTime = millis(); // upravte proměnou lastDebounceTime
  }
  if ((millis() - lastDebounceTime) > debounceDelay) { // Ať už je načtená hodnota jakákoliv, byla tam déle než debounce prodleva,
    if (reading != buttonState) { // Pokud se stav tlačítka změnil:
      buttonState = reading;
      if (buttonState == HIGH) { // LED přepněte pouze když je nový stav tlačítka označen jako HIGH
       
        b = !b;
      }
    }
  }

lastButtonState = reading; // načtené hodnoty uložte. V příští smyčce bude označeno jako lastButtonState:
}
Tak skúsil som to aj bez tej mojej úpravy a tiez to robí to isté ledka blikne iba raz pri zmene stavu.

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: blikanie len niekolko krat

Příspěvek od petan » 22 črc 2018, 10:32

V tomhle konkrétním případě je kopírování millis zbytečný. Pokud by se ale provádělo víc věcí, je dobrý si hodnotu na začátku uložit, aby start všech akcí vycházel ze stejnýho času. Otázkou je, co je rychlejší - vícenásobné čtení millis, nebo přiřazení do proměnné a porovnávání.

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: blikanie len niekolko krat

Příspěvek od petan » 22 črc 2018, 10:36

Vymaž tento kód z původního místa a přidej ho do smyčky za ledState = !ledState;

Kód: Vybrat vše

if (count > 0){
 digitalWrite(13, ledState);
 count--;
}
else{
 digitalWrite(13, LOW);
}

Máš tam zbytečně proměnnou b. Hned na začátku ji kopíruješ do d (d = b;). To můžeš rovnou v té tvojí části přehodit b na d. A ušetřit jednu proměnnou.

Sperhak
Příspěvky: 46
Registrován: 22 čer 2018, 19:49
Reputation: 0

Re: blikanie len niekolko krat

Příspěvek od Sperhak » 22 črc 2018, 11:01

Vďaka pomohlo už to funguje. Len nechápem tomuto

Kód: Vybrat vše

if (b){
  count = 10; //nastav počet bliknutí na 5 (je nutné zadat dvojnásobek 1 bliknutí = jednou svítí, pak zas ne)
 }
 else{
  count = 6; //nastav počet bliknutí na 3
 }
if (b) čo to znamená čo je b odkiaľ vie že kedy ma spraviť ten count?

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: blikanie len niekolko krat

Příspěvek od petan » 22 črc 2018, 11:25

Tohle kontroluje, jestli je b (tedy ten vstup v logické jedničce). Pokud je vstup aktivní, je přiřazeno do proměnné count číslo 10, pokud ne, tak číslo 6. Pak se to v té časové smyčce odpočítává. Pokud to spadne na 0, tak se výstup vypne.

if (b) znamená to stejný co if (b == 1)

Předtím tam byla chyba, že se odečítání proměnné pouštělo mimo časovou smyčku. Takže se do proměnné načetlo třeba 10, ale jakmile program 10x projel smyčkou loop tak LEDka zablikala - proto svítila jen trochu.

Teď v tom programu máš v podstatě dvakrát kontrolu změny vstupu. Jednou je to if (d = !lastd) ... a pak if (reading != lastButtonState). Vidíš, je to úplně stejný....

Pokus se ten program pochopit po jednotlivých částech ;)

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 8 hostů