Mini CNC osa Z

Odpovědět
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 » 27 říj 2019, 09:42

Ty odpory se na ty tlačítka dávají z toho důvodu, aby při rozpojeném tlačítku ten pin "nevisel ve vzduchu" ... pokud ten odpor dám nožičkou k plusu, říká se mu PULLUP ... tahá v neaktivním stavu ten pin na napájení. Když ten odpor dám nožičkou k zemi, tak je to PULLDOWN ... v neaktivním stavu stahuje pin k zemi.

Jestli chápu správně jak to máš zapojené, tak používáš PULLDOWN rezistor. Ten v neaktivním stavu přivádí zem na vstupní pin arduina, při zmáčknutí na něm bude napájecí napětí, takže bude HIGH.
pinMode(TLACITKO, INPUT_PULLUP); // nenastavuj ten pin jako pullup ... jen pouze input ...
digitalWrite(TLACITKO,HIGH); // ten komentář tu chybí záměrně? Protože tohle je zcela nepotřebný příkaz ?

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 říj 2019, 21:15

dobrý den, provedl jsem nastavení tlačítka na INPUT, opravil špatnou závorku, ale po nahrátí kodu do Arduina tlačítko nespustí žádný mode, jen seriový monitor vypisuje hlášku LED1,LED2 vypnuto

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á

int buttonState;  //nejnovější hodnota načtená ze vstupního pinu
int lastButtonState = LOW;  // předchozí hodnota načtení ze vstupního pinu

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

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
  digitalWrite(TLACITKO,HIGH);  // stav vstupního pinu Tlačítka log.1  

  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();
  }                              // uložení do lastButtonState poslední načtená hodnota pro další smyčku v loop()
   lastButtonState = buttonState; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo

  if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (buttonState != lastButtonState) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             
       lastButtonState = buttonState;   // tady si zapamatuje poslední ošetřený stav (novou hodnotu stavu ) stisknutého tlačítka
     if(buttonState == HIGH) { 
         mode++; // přičte k MODE hodnotu 1
         if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
      }            
    } 
    /*TOHLE JE KONEC BLOKU KDE OŠETŘUJI TLAČÍTKO*/   
  }   
                      
  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é  *******
  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 » 28 říj 2019, 06:25

digitalWrite(TLACITKO,HIGH); // stav vstupního pinu Tlačítka log.1 <-- tohle do pryč
Pokud zapisuješ 0 nebo 1 do pinu, který je nastaven jako input, tak zapínáš a vypínáš interní pullup rezistor. Máš ho pak připojený jednak tvým odporem k zemi a zároveň jsi aktivoval odpor uvnitř toho čipu, který to celý připojí z druhé strany k napájení.
Další věc je to, jestli to máš opravdu zapojené správně a to tlačítko je při stisku HIGH ... pokud to máš zapojené opačně, je třeba to změnit i tady if(buttonState == HIGH) {

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 28 říj 2019, 09:39

dobrý den, vymazal jsem tohle : digitalWrite(TLACITKO,HIGH); // stav vstupního pinu Tlačítka log.1
zkontroloval jsem zapojení tlačítka a nahrál kod do Arduina - výsledek se bohužel nezměnil a tlačítko nepřepne mode
Tlačítko je proměřeno a funkční zapojení : odpor mezi GND a první stranou tlačítka + připojen pin2 arduina, druhá strana tlačítka na 5V / to jenom pro kontrolu /, a taky zkoušel změnit v kodu HIGH za LOW , ledky ani nemrkly :cry:

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á

int buttonState;  //nejnovější hodnota načtená ze vstupního pinu
int lastButtonState = LOW;  // předchozí hodnota načtení ze vstupního pinu

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

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();
  }                              // uložení do lastButtonState poslední načtená hodnota pro další smyčku v loop()
   lastButtonState = buttonState; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo

  if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (buttonState != lastButtonState) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             
       lastButtonState = buttonState;   // tady si zapamatuje poslední ošetřený stav (novou hodnotu stavu ) stisknutého tlačítka
     if(buttonState == HIGH) { 
         mode++; // přičte k MODE hodnotu 1
         if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
      }            
    } 
    /*TOHLE JE KONEC BLOKU KDE OŠETŘUJI TLAČÍTKO*/   
  }   
                      
  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é  *******
  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 » 28 říj 2019, 11:12

už jsem z toho domotaný i já :( ... že jsem si toho nevšimnul ...

Kód: Vybrat vše

  buttonState = digitalRead(TLACITKO);  
  if (buttonState != lastButtonState) {  
    lastDebounceTime = millis();
  }                              
   lastButtonState = buttonState; // <-- tohle příjde až na konec ... tady si totiž přepíšeš moc brzo lastButtonState a když ho níž porovnáváš je vždy stejný jako buttonState, takže se ti to vyhodnotí špatně

  if ((millis() - lastDebounceTime) > debounceDelay) { 
    if (buttonState != lastButtonState) {  // <-- tady se to špatně vyhodnocovalo, protože se moc brzo přepsala hodnota lastButtonState          
       lastButtonState = buttonState;   // <-- smazat, není to zde už třeba
     if(buttonState == HIGH) { 
         mode++; 
         if (mode > 4) mode = 0; 
      }            
    } 
  } 
//<-- až semhle to příjde  
ps: ty tvoje komenty jsem odmazal, aby ty moje šly lépe vidě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 » 28 říj 2019, 18:08

pořád nic i po úpravách :cry: tady je obrázek zapojení : https: //ctrlv.cz/dB9Y
a tady kod :

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á

int buttonState;  //nejnovější hodnota načtená ze vstupního pinu
int lastButtonState = LOW;  // předchozí hodnota načtení ze vstupního pinu

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

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 != lastButtonState) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             
       
     if(buttonState == HIGH) { 
         mode++; // přičte k MODE hodnotu 1
         if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
      }            
    } 
  }   
  
 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é  *******
  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 » 28 říj 2019, 18:23

zkus tohle ... momentálně nemám na čem otestovat, ale asi mě doženeš k tomu abych rozebral momentální projekt a zkusit si to zapojit s tvým programem

Kód: Vybrat vše

  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 ošetřeným stavem             
       
     if(buttonState == true) { 
         mode++; // přičte k MODE hodnotu 1
         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
a nahoře

Kód: Vybrat vše

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

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 28 říj 2019, 18:51

dobrý den, po posledních úpravách v kodu se po stisknutí tlačítka mode přepíná, ale musím stisknout tlačítko velmi rychle, aby se mode nespustilo další,další ... do rozepnutí tlačítka :(
tady je výpis na seriovém monitoru : https://ctrlv.cz/T8JT
a tady kod :

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í

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
         if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
      }            
    } 
  }   
  
 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é  *******
  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 » 28 říj 2019, 18:55

jeden řádek chybí
if(buttonState == true) {
mode++; // přičte k MODE hodnotu 1
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

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 28 říj 2019, 19:32

dobrý večer, obrovský respekt, obdiv a veliké děkuju pro kiRRow

Tady je plně funkční kod pro : varianty blikání Led s ošetřeným tlačítkem debounce

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í

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
         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é  *******
  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   
}
Vyzkoušeno ! po stisknutí tlačítka se přepne mode a k dalšímu mode dojde až při dalším stisknutí tlačítka :D

Tohle ošetření debounce , jsem snad na netu nikde neviděl ? Tedy na " lastTrueButtonState " určitě ne , a taky kde nejnovější a předchozí hodnota ze vstupních pinů a tlačítka jsou boolean a false - můžete mi prosím vysvětlit
proč to tak je ? děkuju

Odpovědět

Kdo je online

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