Mini CNC osa Z

Odpovědět
Hanz
Příspěvky: 262
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od Hanz » 23 lis 2019, 22:11

dobrý den, kod vypadá takto : :roll:

Kód: Vybrat vše

#define TLACITKO 2   // číslo pinu TLACITKA
#define LED1  10    // číslo pinu LED1 zelená
#define LED2  11    // číslo pinu LED2 červená

boolean buttonState = false;  //nejnovější hodnota načtená ze vstupního pinu
boolean lastButtonState = false;  // předchozí hodnota načtení ze vstupního pinu
boolean lastTrueButtonState = false;  // předchozí hodnota ošetřeného tlačítka

// Následné proměnné jsou typu long, jelikož čas měřený v milisekundách se 
//rychle změní na větší číslo, jež nemůže být uloženo v int
unsigned long lastDebounceTime = 0;  // čas posledního změny výstupního pinu
unsigned long debounceDelay = 50;  // čas debounce prodlevy 

byte mode = 0;    // 0 - Vypnuto, 1 - Zapnuto, 2 - Blikání rychlé, 3 - Blikání pomalé, 4 - Blikání střídavé

unsigned long aktualniMillis;   //aktualní čas
unsigned long predchoziMillis1;   // předchozí čas pro rychle blikání
unsigned long predchoziMillis2;   // předchozí čas pro pomalé blikání
unsigned long predchoziMillis3;   // předchozí čas pro střídavé blikání

long buttonTime;      //  čas začátku stisknutí tlačítka 

boolean led1svetlo;   //  pomocná proměnná led1svetlo
boolean led2svetlo;   //  pomocná proměnná led2svetlo

 
void setup() {
  
  pinMode(LED1, OUTPUT);  // pin pro LED1 nastaven jako výstup
  pinMode(LED2, OUTPUT);  // pin pro LED2 nastaven jako výstup
  pinMode(TLACITKO, INPUT);  // pin pro TLACITKO nastaveno jako vstup

  Serial.begin(9600);   // konfigurace rychlosti seriového portu
  while (!Serial) {    ; // čekaní na připojení seriového portu, pry nezbytné pouze u desky Leonardo
  }   
  Serial.println("Seriovy port aktivni");  // První výpis na seriový port
}

void loop(){
  
  /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  buttonState = digitalRead(TLACITKO);  // přečtení stavu tlačítka    
  if (buttonState != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime = millis();
  }                             

  if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (buttonState != lastTrueButtonState) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             
       
     if(buttonState == true) { 
         mode++; // přičte k MODE hodnotu 1        
 //         buttonTime = millis(); 
 //         while (millis() - buttonTime <= 10000)     // odpočet 10s od stisknutí tlačítka, pak se provede "mode"               
         if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
      } 
       lastTrueButtonState = buttonState;  // uložím si nový pravý ošetřený stav tlačítka           
    } 
  }   
  
 lastButtonState = buttonState; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
                       
  if(mode == 0) {
    // ******* LED1, LED2 vypnuto ********    
     led1svetlo = false;  // zhasni LED1              
     led2svetlo = false;  // zhasni LED2
     Serial.println("LED1,LED2 vypnuto");  // výpis na seriový monitor                   
   }
   
  if(mode == 1) {
    // ******* LED1, LED2 zapnuto  ********       
     led1svetlo = true;  // rožni LED1             
     led2svetlo = true;  // rožni LED2
     Serial.println("LED1,LED2 zapnuto");  // výpis na seriový monitor                
   }
   
  if(mode == 2) {
    buttonTime = millis();
    if((mode == 2) && (millis() - buttonTime > 10000)) { // Pokud je mode dva a zároveň uběhlo už 10s      
    
    // ******* LED1,LED2 blikání rychlé  *******   
  aktualniMillis = millis();  //podívám se na hodinky - aktuální čas  
    if(aktualniMillis - predchoziMillis1 > 200) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 200ms od poslední akce?  
     if (led1svetlo) {          
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2
            }
     }       
            predchoziMillis1 = aktualniMillis;   // v tento čas jsem provedl poslední akci
   }      
  Serial.println("LED1,LED2 blikání rychlé");  // výpis na seriový monitor
 }
    
  if(mode == 3) { 
  // ******* LED1,LED2 blikání pomalé  *******
  aktualniMillis = millis();  //podívám se na hodinky - aktuální čas  
    if(aktualniMillis - predchoziMillis2 > 500) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 500ms od poslední akce?  
     if (led2svetlo) {          
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2
            }
            predchoziMillis2 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
  } 
  Serial.println("LED1,LED2 blikání pomalé");  // výpis na seriový monitor
 }
    
  if(mode == 4) { 
  // ******* LED1,LED2 blikání střídavé  *******   
  aktualniMillis = millis();  //podívám se na hodinky - aktuální čas
  if(aktualniMillis - predchoziMillis3 > 300) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 300ms ?
    led1svetlo = !led1svetlo; // do proměnné led1svetlo zapíšu její negovanou hodnotu, tj. svítila-li LED1 tak zhasne, byla-li zhaslá rožne se
    led2svetlo = !led1svetlo; // do proměnné led2svetlo zapíšu negovanou hodnotu led1svetlo, tj. pokud LED1 svítí chci LED2 zhaslou a naopak
    predchoziMillis3 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
    Serial.println("LED1,LED2 blikání střídavé");  // výpis na seriový monitor
  }
 } 
  digitalWrite(LED1,led1svetlo);  // aktualizace stavu LED1, zápis proměnné led1svetlo na výstupní pin 10
  digitalWrite(LED2,led2svetlo);  // aktualizace stavu LED2, zápis proměnné led2svetlo na výstupní pin 11   
}

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 24 lis 2019, 08:41

odkomentuj // buttonTime = millis();
potřebuješ si během vyhodnocení stisku tlačítka uložit, kdy to bylo

if(mode == 2) {
buttonTime = millis(); // tady to zase naopak zakomentuj - je naprosto nežádoucí, aby se ti ta proměná přepisovala kdykoliv jindy, než při stisku tlačítka a je zbytečné se ptát na mode==2 dvakrát ... nejprve se ptáš tady if(mode == 2) { a ob řádek znovu if((mode == 2) && (millis() - buttonTime > 10000)) { // Pokud je mode dva a zároveň uběhlo už 10s

proto se ti to nespustí ... při stisku tlačítka se ti neuloží buttonTime ... a před každou kontrolou jestli už je rozdím mezi aktualnim a button casem se ti ten buttonTime přepíše a rozdíl nikdy v životě nedosáhne více než 10000 a proto se nespustí ta podmínka

Hanz
Příspěvky: 262
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od Hanz » 24 lis 2019, 19:32

dobrý den, že potřebuju buttonTime jsem věděl, ale dal bych ho jinde, jenže pokud použiju zpoždění operace v dalších mode, tak je to logické ho mít tam, kde mi napověděl kiRRow. A taky jsem se sám sebe ptal, jestli je dobré mít 2x po sobě mode == 2,? jestli to není zbytečné - potvrzeno - bylo to zbytečné.

tady je upravený kod, zatím jen se zpožděním operace v mode dva :

Kód: Vybrat vše

#define TLACITKO 2   // číslo pinu TLACITKA
#define LED1  10    // číslo pinu LED1 zelená
#define LED2  11    // číslo pinu LED2 červená

boolean buttonState = false;  //nejnovější hodnota načtená ze vstupního pinu
boolean lastButtonState = false;  // předchozí hodnota načtení ze vstupního pinu
boolean lastTrueButtonState = false;  // předchozí hodnota ošetřeného tlačítka

// Následné proměnné jsou typu long, jelikož čas měřený v milisekundách se 
//rychle změní na větší číslo, jež nemůže být uloženo v int
unsigned long lastDebounceTime = 0;  // čas posledního změny výstupního pinu
unsigned long debounceDelay = 50;  // čas debounce prodlevy 

byte mode = 0;    // 0 - Vypnuto, 1 - Zapnuto, 2 - Blikání rychlé, 3 - Blikání pomalé, 4 - Blikání střídavé

unsigned long aktualniMillis;   //aktualní čas
unsigned long predchoziMillis1;   // předchozí čas pro rychle blikání
unsigned long predchoziMillis2;   // předchozí čas pro pomalé blikání
unsigned long predchoziMillis3;   // předchozí čas pro střídavé blikání

long buttonTime;      //  čas začátku stisknutí tlačítka

boolean led1svetlo;   //  pomocná proměnná led1svetlo
boolean led2svetlo;   //  pomocná proměnná led2svetlo

 
void setup() {
  
  pinMode(LED1, OUTPUT);  // pin pro LED1 nastaven jako výstup
  pinMode(LED2, OUTPUT);  // pin pro LED2 nastaven jako výstup
  pinMode(TLACITKO, INPUT);  // pin pro TLACITKO nastaveno jako vstup

  Serial.begin(9600);   // konfigurace rychlosti seriového portu
  while (!Serial) {    ; // čekaní na připojení seriového portu, pry nezbytné pouze u desky Leonardo
  }   
  Serial.println("Seriovy port aktivni");  // První výpis na seriový port
}

void loop(){
  
  /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  buttonState = digitalRead(TLACITKO);  // přečtení stavu tlačítka    
  if (buttonState != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime = millis();
  }                             

  if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (buttonState != lastTrueButtonState) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             
       
     if(buttonState == true) { 
         mode++; // přičte k MODE hodnotu 1        
          buttonTime = millis(); 
              
         if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
      } 
       lastTrueButtonState = buttonState;  // uložím si nový pravý ošetřený stav tlačítka           
    } 
  }   
  
 lastButtonState = buttonState; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
                       
  if(mode == 0) {
    // ******* LED1, LED2 vypnuto ********    
     led1svetlo = false;  // zhasni LED1              
     led2svetlo = false;  // zhasni LED2
     Serial.println("LED1,LED2 vypnuto");  // výpis na seriový monitor                   
   }
   
  if(mode == 1) {
    // ******* LED1, LED2 zapnuto  ********       
     led1svetlo = true;  // rožni LED1             
     led2svetlo = true;  // rožni LED2
     Serial.println("LED1,LED2 zapnuto");  // výpis na seriový monitor                
   }
   
    // zpožděná operace rychlého blikání o nastavených 10s v mode dva
  if((mode == 2) && (millis() - buttonTime > 10000)) {  // Pokud je mode dva a zároveň uběhlo už 10s      
     
    // ******* LED1,LED2 blikání rychlé  *******   
  aktualniMillis = millis();  // podívám se na hodinky - aktuální čas   
    if(aktualniMillis - predchoziMillis1 > 200) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 200ms od poslední akce?  
     if (led1svetlo) {          
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2            
            }                
            predchoziMillis1 = aktualniMillis;   // v tento čas jsem provedl poslední akci
     }    
    Serial.println("LED1,LED2 blikání rychlé");  // výpis na seriový monitor
   }
    
  if(mode == 3) { 
  // ******* LED1,LED2 blikání pomalé  *******
  aktualniMillis = millis();  //podívám se na hodinky - aktuální čas  
   if(aktualniMillis - predchoziMillis2 > 500) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 500ms od poslední akce?  
     if (led2svetlo) {          
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2
            }
            predchoziMillis2 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
   } 
  Serial.println("LED1,LED2 blikání pomalé");  // výpis na seriový monitor
  }
    
  if(mode == 4) { 
  // ******* LED1,LED2 blikání střídavé  *******   
  aktualniMillis = millis();  //podívám se na hodinky - aktuální čas
  if(aktualniMillis - predchoziMillis3 > 300) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 300ms ?
    led1svetlo = !led1svetlo; // do proměnné led1svetlo zapíšu její negovanou hodnotu, tj. svítila-li LED1 tak zhasne, byla-li zhaslá rožne se
    led2svetlo = !led1svetlo; // do proměnné led2svetlo zapíšu negovanou hodnotu led1svetlo, tj. pokud LED1 svítí chci LED2 zhaslou a naopak
    predchoziMillis3 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
    Serial.println("LED1,LED2 blikání střídavé");  // výpis na seriový monitor
  }
 } 
  digitalWrite(LED1,led1svetlo);  // aktualizace stavu LED1, zápis proměnné led1svetlo na výstupní pin 10
  digitalWrite(LED2,led2svetlo);  // aktualizace stavu LED2, zápis proměnné led2svetlo na výstupní pin 11   
}
při tomto objevování a učení mi pomáhá taky seriový monitor.
Jak udělám aby mi vypisoval např. po 1s bez delay ? nebo při výpisu delay nevadí ?
A je ten výpis na ser.monitor v tomto kodu na správném místě ? děkuju

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 25 lis 2019, 12:35

Pokud chceš aby se ti serial v mode == 2 vypsal ihned po přepnutí na mode, tak musíš rozdělit tu složenou podmínku
if((mode == 2) && (millis() - buttonTime > 10000)) { // Pokud je mode dva a zároveň uběhlo už 10s }

rozdělí se takhle

Kód: Vybrat vše

if(mode == 2){
	tady si vypisu věci na seriovou linku ihned a vždy když bude mode == 2 ( dobrý na ověření jestli se vůbec program sem dostal )
	
	if(millis() - buttonTime > 10000){
		tady si vypíšu věci na seriovou linku až když bude mode == 2 a zároveň už bude čas spouštět blikání ( dobrý na ověření jestli se vůbec program sem dostal )
	}
	
	tady si vypisu věci na seriovou linku ihned a vždy když bude mode == 2, ale tím, že jsem už na konci mode == 2 a zároveň už i za podmínkou, která kontroluje čas, tak si tady můžu vypsat informace, které se děly během mode == 2 ( dobrý na výpis informací které se vypočetly )
}
tady se to bude vypisovat vždy, když půjde program kolem ... každý průchod loopem
umístění výpisu do sériové linky je tedy pro odlaďění programu klíčové
delay nevadí, pokud nechceš aby procesor dělal něco jiného - což skoro vždy chceš a proto skoro vždy delay vadí
pokud chceš vypisovat do seriové linky informace pravidelně, vypisuješ vždy po provedení kódu, který ladíš. Pokud ti vadí, že ti to vypisuje moc rychle , tak kontroluješ pomocí proměnné jestli nastal čas vypsat výsledek na linku a necháš si ho vypsat třeba jen každou vteřinu

Hanz
Příspěvky: 262
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od Hanz » 25 lis 2019, 22:56

dobrý den, děkuju za vysvětlení, něco jsem si vyzkoušel. Mám prosbu - jak zobrazit na sériovém monitoru zpoždění blikání ledek ? Tedy těch nastavených 10 sekund. Abych věděl, že kód pokračuje ? Nyní je výpis postupně podle mode, tj.že jsou ledky vypnutý, zapnutý, blikají rychle, pak pomalu a střídavě. Avšak jak dojde k zpoždění, tak samozřejmě nevypíše nic, ani čas v rolování bez popisu, i když je zaškrtnut, jen prázdno a pak po 10s výpis, že ledky blikání rychlé a pokračuje dál v kódu, podle stisknutí tlačítka. Kdyby bylo zpoždění delší dobu asi bych si myslel, že mám někde problém. Díky

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od gilhad » 25 lis 2019, 23:30

Tak si proste udelas dalsi casovac, zapnes ho, kdyz nastavis mode 2, kazdou sekundu vypises cas a vypnes ho az kdyz zacnou ledky blikat ...

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 26 lis 2019, 08:32

Kód: Vybrat vše

if(mode == 2){
	if(millis() - buttonTime > 10000){
		//vypis : jsem v mode 2 a už je čas blikat
	} else {
		//vypis : jsem v mode 2, ale ještě není čas blikat - jestli chci vědět jak dlouho budu ještě čekat vypíšu 10000 - (millis() - buttonTime)
	}
}

Hanz
Příspěvky: 262
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od Hanz » 26 lis 2019, 15:36

dobrý den, vyzkoušel jsem nastavení pro seriový monitor, ale stalo se, že se mi zrušila podmínka pro odpočet 10s pro blikání a ledky v mode dva hned blikají rychle ? ve výpisu na seriovém monitoru je to správně. Schválně nechávám původní koment, můj jsem v kodu poupravil.

Kód: Vybrat vše

#define TLACITKO 2   // číslo pinu TLACITKA
#define LED1  10    // číslo pinu LED1 zelená
#define LED2  11    // číslo pinu LED2 červená

boolean buttonState = false;  //nejnovější hodnota načtená ze vstupního pinu
boolean lastButtonState = false;  // předchozí hodnota načtení ze vstupního pinu
boolean lastTrueButtonState = false;  // předchozí hodnota ošetřeného tlačítka

// Následné proměnné jsou typu long, jelikož čas měřený v milisekundách se 
//rychle změní na větší číslo, jež nemůže být uloženo v int
unsigned long lastDebounceTime = 0;  // čas posledního změny výstupního pinu
unsigned long debounceDelay = 50;  // čas debounce prodlevy 

byte mode = 0;    // 0 - Vypnuto, 1 - Zapnuto, 2 - Blikání rychlé, 3 - Blikání pomalé, 4 - Blikání střídavé

unsigned long aktualniMillis;   //aktualní čas
unsigned long predchoziMillis1;   // předchozí čas pro rychle blikání
unsigned long predchoziMillis2;   // předchozí čas pro pomalé blikání
unsigned long predchoziMillis3;   // předchozí čas pro střídavé blikání

long buttonTime;      //  čas začátku stisknutí tlačítka

boolean led1svetlo;   //  pomocná proměnná led1svetlo
boolean led2svetlo;   //  pomocná proměnná led2svetlo

 
void setup() {
  
  pinMode(LED1, OUTPUT);  // pin pro LED1 nastaven jako výstup
  pinMode(LED2, OUTPUT);  // pin pro LED2 nastaven jako výstup
  pinMode(TLACITKO, INPUT);  // pin pro TLACITKO nastaveno jako vstup

  Serial.begin(9600);   // konfigurace rychlosti seriového portu
  while (!Serial) {    ; // čekaní na připojení seriového portu, pry nezbytné pouze u desky Leonardo
  }   
  Serial.println("Seriovy port aktivni");  // První výpis na seriový port
}

void loop(){
  
  /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  buttonState = digitalRead(TLACITKO);  // přečtení stavu tlačítka    
  if (buttonState != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime = millis();
  }                             

  if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (buttonState != lastTrueButtonState) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             
       
     if(buttonState == true) { 
         mode++; // přičte k MODE hodnotu 1        
          buttonTime = millis(); 
              
         if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
      } 
       lastTrueButtonState = buttonState;  // uložím si nový pravý ošetřený stav tlačítka           
    } 
  }   
  
 lastButtonState = buttonState; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
                       
  if(mode == 0) {
    // ******* LED1, LED2 vypnuto ********    
     led1svetlo = false;  // zhasni LED1              
     led2svetlo = false;  // zhasni LED2   
     Serial.println("LED1,LED2 vypnuto");  // výpis na seriový monitor     
    }
                 
  if(mode == 1) {
    // ******* LED1, LED2 zapnuto  ********       
     led1svetlo = true;  // rožni LED1             
     led2svetlo = true;  // rožni LED2   
     Serial.println("LED1,LED2 zapnuto");  // výpis na seriový monitor 
   }
                      
  if(mode == 2){  // ******* LED1,LED2 blikání rychlé  *******  
    if(millis() - buttonTime > 10000){  // zjistím si jestli je čas něco provést, uběhlo už 10s od poslední akce?
      Serial.println("teď je čas ! LED1,LED2 blikání rychlé");  //vypis : jsem v mode 2 a už je čas blikat
    } else {
      //vypis : jsem v mode 2, ale ještě není čas blikat - jestli chci vědět jak dlouho budu ještě čekat vypíšu 10000 - (millis() - buttonTime)
      Serial.print("do bliknutí zbývá ");
      Serial.print(10000 - (millis() - buttonTime));
      Serial.println("  ms");
    }
                        
       aktualniMillis = millis();  // podívám se na hodinky - aktuální čas   
    if(aktualniMillis - predchoziMillis1 > 200) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 200ms od poslední akce?  
     if (led1svetlo) {          
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2            
            }                
            predchoziMillis1 = aktualniMillis;   // v tento čas jsem provedl poslední akci
     }        
    }        
     
      
  if(mode == 3) { 
  // ******* LED1,LED2 blikání pomalé  *******
  aktualniMillis = millis();  //podívám se na hodinky - aktuální čas  
   if(aktualniMillis - predchoziMillis2 > 500) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 500ms od poslední akce?  
     if (led2svetlo) {          
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2
            }
            predchoziMillis2 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
   } 
  Serial.println("LED1,LED2 blikání pomalé");  // výpis na seriový monitor
  }
    
  if(mode == 4) { 
  // ******* LED1,LED2 blikání střídavé  *******   
  aktualniMillis = millis();  //podívám se na hodinky - aktuální čas
  if(aktualniMillis - predchoziMillis3 > 300) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 300ms ?
    led1svetlo = !led1svetlo; // do proměnné led1svetlo zapíšu její negovanou hodnotu, tj. svítila-li LED1 tak zhasne, byla-li zhaslá rožne se
    led2svetlo = !led1svetlo; // do proměnné led2svetlo zapíšu negovanou hodnotu led1svetlo, tj. pokud LED1 svítí chci LED2 zhaslou a naopak
    predchoziMillis3 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
    Serial.println("LED1,LED2 blikání střídavé");  // výpis na seriový monitor
  }
 } 
  digitalWrite(LED1,led1svetlo);  // aktualizace stavu LED1, zápis proměnné led1svetlo na výstupní pin 10
  digitalWrite(LED2,led2svetlo);  // aktualizace stavu LED2, zápis proměnné led2svetlo na výstupní pin 11   
}
pak je ve výpisu na monitoru vidět desetimístné číslo ? to mě zaujalo, je při ukončení odpočítávání 10sekund, než začne výpis ...teď je čas... není to tzv. přetečení ? odkaz na screen : https://ctrlv.cz/kbSs děkuji

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od gilhad » 26 lis 2019, 16:14

protoze jsi to blikani ledek presunul z bloku, ktery je az po 10s a tak rozeskok s vypisovanim, tak se blika bez ohledu na ubehnuty cas a vypisy.

Cele to

Kód: Vybrat vše

       aktualniMillis = millis();  // podívám se na hodinky - aktuální čas   
    if(aktualniMillis - predchoziMillis1 > 200) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 200ms od poslední akce?  
     if (led1svetlo) {          
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2            
            }                
            predchoziMillis1 = aktualniMillis;   // v tento čas jsem provedl poslední akci
     }        
musis mit uvnitr bloku s podminkou

Kód: Vybrat vše

if(millis() - buttonTime > 10000){  // zjistím si jestli je čas něco provést, uběhlo už 10s od poslední akce?
(a i tak se ti po 10s bude ten retezec "teď je čas ! LED1,LED2 blikání rychlé" vypisovat porad pryc, asi i rychleji, nez ty LEDky budou blikat, stejne jako se ted vypisuje ten zbyvajici cas strasne rychle po sobe)

Hanz
Příspěvky: 262
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od Hanz » 27 lis 2019, 16:44

dobrý den, tady je kod, který vypisuje jednotlivé mode a taky odpočet do začátku rychlého blikání v mode dva

Kód: Vybrat vše

#define TLACITKO 2   // číslo pinu TLACITKA
#define LED1  10    // číslo pinu LED1 zelená
#define LED2  11    // číslo pinu LED2 červená

boolean buttonState = false;  //nejnovější hodnota načtená ze vstupního pinu
boolean lastButtonState = false;  // předchozí hodnota načtení ze vstupního pinu
boolean lastTrueButtonState = false;  // předchozí hodnota ošetřeného tlačítka

// Následné proměnné jsou typu long, jelikož čas měřený v milisekundách se 
//rychle změní na větší číslo, jež nemůže být uloženo v int
unsigned long lastDebounceTime = 0;  // čas posledního změny výstupního pinu
unsigned long debounceDelay = 50;  // čas debounce prodlevy 

byte mode = 0;    // 0 - Vypnuto, 1 - Zapnuto, 2 - Blikání rychlé, 3 - Blikání pomalé, 4 - Blikání střídavé

unsigned long aktualniMillis;   //aktualní čas
unsigned long predchoziMillis1;   // předchozí čas pro rychle blikání
unsigned long predchoziMillis2;   // předchozí čas pro pomalé blikání
unsigned long predchoziMillis3;   // předchozí čas pro střídavé blikání

long buttonTime;      //  čas začátku stisknutí tlačítka

boolean led1svetlo;   //  pomocná proměnná led1svetlo
boolean led2svetlo;   //  pomocná proměnná led2svetlo

 
void setup() {
  
  pinMode(LED1, OUTPUT);  // pin pro LED1 nastaven jako výstup
  pinMode(LED2, OUTPUT);  // pin pro LED2 nastaven jako výstup
  pinMode(TLACITKO, INPUT);  // pin pro TLACITKO nastaveno jako vstup

  Serial.begin(9600);   // konfigurace rychlosti seriového portu
  while (!Serial) {    ; // čekaní na připojení seriového portu, pry nezbytné pouze u desky Leonardo
  }   
  Serial.println("Seriovy port aktivni");  // První výpis na seriový port
}

void loop(){
  
  /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  buttonState = digitalRead(TLACITKO);  // přečtení stavu tlačítka    
  if (buttonState != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime = millis();
  }                             

  if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (buttonState != lastTrueButtonState) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             
       
     if(buttonState == true) { 
         mode++; // přičte k MODE hodnotu 1        
          buttonTime = millis(); 
              
         if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
      } 
       lastTrueButtonState = buttonState;  // uložím si nový pravý ošetřený stav tlačítka           
    } 
  }   
  
 lastButtonState = buttonState; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
                       
  if(mode == 0) {
    // ******* LED1, LED2 vypnuto ********    
     led1svetlo = false;  // zhasni LED1              
     led2svetlo = false;  // zhasni LED2   
     Serial.println("LED1,LED2 vypnuto");  // výpis na seriový monitor     
    }
                 
  if(mode == 1) {
    // ******* LED1, LED2 zapnuto  ********       
     led1svetlo = true;  // rožni LED1             
     led2svetlo = true;  // rožni LED2   
     Serial.println("LED1,LED2 zapnuto");  // výpis na seriový monitor 
   }
                      
  if(mode == 2){ 
    // ******* LED1,LED2 blikání rychlé  *******     
    if(millis() - buttonTime > 10000){  // zjistím si jestli je čas něco provést, uběhlo už 10s od poslední akce?
      Serial.println("teď už je čas ! LED1,LED2 blikání rychlé");  // vypis na seriový monitor
            aktualniMillis = millis();  // podívám se na hodinky - aktuální čas   
     if(aktualniMillis - predchoziMillis1 > 200) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 200ms od poslední akce?  
      if (led1svetlo) {          
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2            
            }                
            predchoziMillis1 = aktualniMillis;   // v tento čas jsem provedl poslední akci
      }         
     } else {
      //vypis : "do bliknutí zbývá ..... ms" - jestli chci vědět jak dlouho budu ještě čekat vypíšu 10000 - (millis() - buttonTime)
      Serial.print("do bliknutí zbývá ");
      Serial.print(10000 - (millis() - buttonTime));
      Serial.println("  ms");
    }                       
   }            
    
      
  if(mode == 3) { 
  // ******* LED1,LED2 blikání pomalé  *******
  aktualniMillis = millis();  //podívám se na hodinky - aktuální čas  
   if(aktualniMillis - predchoziMillis2 > 500) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 500ms od poslední akce?  
     if (led2svetlo) {          
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2
            }
            predchoziMillis2 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
   } 
  Serial.println("LED1,LED2 blikání pomalé");  // výpis na seriový monitor 
  }
    
  if(mode == 4) { 
  // ******* LED1,LED2 blikání střídavé  *******   
  aktualniMillis = millis();  //podívám se na hodinky - aktuální čas
  if(aktualniMillis - predchoziMillis3 > 300) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 300ms ?
    led1svetlo = !led1svetlo; // do proměnné led1svetlo zapíšu její negovanou hodnotu, tj. svítila-li LED1 tak zhasne, byla-li zhaslá rožne se
    led2svetlo = !led1svetlo; // do proměnné led2svetlo zapíšu negovanou hodnotu led1svetlo, tj. pokud LED1 svítí chci LED2 zhaslou a naopak
    predchoziMillis3 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
    Serial.println("LED1,LED2 blikání střídavé");  // výpis na seriový monitor
  }
 } 
  digitalWrite(LED1,led1svetlo);  // aktualizace stavu LED1, zápis proměnné led1svetlo na výstupní pin 10
  digitalWrite(LED2,led2svetlo);  // aktualizace stavu LED2, zápis proměnné led2svetlo na výstupní pin 11   
}
děkuju gilhad za upřesnění v kodu, no ale i tak tam zůstává, v přechodu na rychlé bliknutí, to číslo, které jsem dával jako screen - tohle číslo na řádku 16:41:24.750 -> do bliknutí zbývá 4294967284 ms
jak změním to rychlé řádkování /rolování /textu, abych nepoužil "delay" v seriovém monitoru ? děkuju

Odpovědět

Kdo je online

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