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
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
