Stránka 1 z 3

blikanie len niekolko krat

Napsal: 21 črc 2018, 18:02
od Sperhak
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ť?

Re: blikanie len niekolko krat

Napsal: 21 črc 2018, 19:41
od petan
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);
}
}

Re: blikanie len niekolko krat

Napsal: 21 črc 2018, 22:14
od rejze69
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.

Re: blikanie len niekolko krat

Napsal: 21 črc 2018, 22:27
od petan
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;
}

Re: blikanie len niekolko krat

Napsal: 22 črc 2018, 10:13
od rejze69
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.

Re: blikanie len niekolko krat

Napsal: 22 črc 2018, 10:24
od Sperhak
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.

Re: blikanie len niekolko krat

Napsal: 22 črc 2018, 10:32
od petan
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í.

Re: blikanie len niekolko krat

Napsal: 22 črc 2018, 10:36
od petan
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.

Re: blikanie len niekolko krat

Napsal: 22 črc 2018, 11:01
od Sperhak
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?

Re: blikanie len niekolko krat

Napsal: 22 črc 2018, 11:25
od petan
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 ;)