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 » 19 říj 2019, 09:28

dobrý den, úprava kodu

Kód: Vybrat vše

#define TLACITKO 2   // pin pro TLACITKO
#define LED1  10    // pin pro LED1 zelená
#define LED2  11    // pin pro LED2 červená

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á hodnota proměnné led1svetlo
boolean led2svetlo;   //  pomocná hodnota 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_PULLUP);  // pin pro TLACITKO nastaven jako vstup
  digitalWrite(TLACITKO,HIGH);  //   

  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(){
  
  if ((digitalRead(TLACITKO)) == LOW) // tady se přečte stav tlačítka
   {
      mode++; // přičte k MODE hodnotu 1
      if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
      delay(200); // prodleva proti záchvěvům tlačítka 200ms
    }

  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 (led1svetlo) {          
          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 hodnoty led1svetlo zapíšu její negovanou hodnotu, svítila-li LED1 tak zhasne, byla-li zhaslá rožne se
    led2svetlo = !led1svetlo; // do hodnoty led2svetlo zapíšu negovanou hodnotu led1svetlo, 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é na výstupní pin 10
  digitalWrite(LED2,led2svetlo);  // aktualizace stavu LED2, zápis proměnné na výstupní pin 11   
}
proč pracuji s proměnnou led1svetlo v podmínkách blikacích mode ? a neřečím proměnnou led2svetlo, tedy až na to, že ji přiřazuji logickou uroveň false / true ? :?: zkusil jsem proměnné vyměnit a kod pracoval stejně

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 » 19 říj 2019, 16:07

Ten program při tom blikání, ať stejném nebo střídavém, přechází do dvou různých stavů. To do jakého stavu má přejít v probíhajícím kroku je závislé na stavu ve kterém právě je a tento stav lze velmi snadno zjistit právě přečtením hodnoty led1svetlo. Když chci blikat oběma diodama stejně, je mi fuk v jakém stavu je led2svetlo, protože tento stav nakonec bude stejný jako led1svetlo.

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 20 říj 2019, 15:16

dobrý den, protože mě zlobilo tlačítko a přeskakovalo /vynechávalo / mi blikání led, přidal jsem do kódu ošetření tlačítka i s původním komentářem - debounce jsem na foru řešil v minulosti při jiné příležitosti.
No, snad jsem kódy poskládal dobře ?

Kód: Vybrat vše

#define TLACITKO 2   // pin pro TLACITKO
#define LED1  10    // pin pro LED1 zelená
#define LED2  11    // pin pro LED2 červená

int reading;  // stav TLACITKA
int buttonState;  //nejnovější hodnota načtená ze vstupního pinu
int lastButtonState = LOW;  // předchozí hodnota načtení ze vstupního pinu
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_PULLUP);  // pin pro TLACITKO nastaven jako vstup
  digitalWrite(TLACITKO,HIGH);  //   

  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*/
  reading = digitalRead(TLACITKO);  // přečtení stavu tlačítka    
  if (reading != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime = millis();
  }
  lastButtonState = reading; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym reading, zda se to mezi tim nezmenilo

  if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (reading != buttonState) {  // Pokud se stav tlačítka změnil
    /*TADY SE ZAČÍNAJÍ DÍT VĚCI PŘI STISKNUTÍ/PUŠTĚNÍ TLAČÍTKA, NÁSLEDNĚ SE VYUŽIJÍ POZDĚJI V PROGRAMU*/
      buttonState = reading;   // zapamatuju si novy stav
    }
  }  /*TOHLE JE KONEC BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  
  if ((digitalRead(TLACITKO)) == LOW) // tady se přečte stav tlačítka  
   {
      mode++; // přičte k MODE hodnotu 1
      if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
      delay(200); // prodleva proti záchvěvům tlačítka 200ms
    }

  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 » 20 říj 2019, 18:31

jen tak rychle jsem to proletěl ... zásadní chyba je v tom, že testuješ stav na pinu a ne stav v proměnné, kde jsis ošetřené tlačítko uložil .... tady tady if ((digitalRead(TLACITKO)) == LOW) // tady se přečte stav tlačítka
tímhle příkazem jakýkoliv pokus o ošetření tlačítka skončil ...
jo a tohle zakomentuj delay(200); // prodleva proti záchvěvům tlačítka 200ms ... záchvěvy teď řeší debounce

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 22 říj 2019, 18:01

dobrý den, provedl jsem úpravy v debounce. Ale někde mám něco špatně, při přepínání mode mi velice rychle přeblikávají LEDky /jen po dobu co držím stisknuté tlačítko / a přeskočí mode např. z mode == 0 na mode ==3 nebo jinde, je to nepravidelně, zřejmě od toho jak dlouho jsem stisknul tlačítko ? Prosím, kde je chyba ?

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 reading;  // stav Tlačítka
int buttonState;  //nejnovější hodnota načtená ze vstupního pinu
int lastButtonState = HIGH;  // 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_PULLUP);  // pin pro TLACITKO nastaveno jako vstup
  digitalWrite(TLACITKO,HIGH);  //   

  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 reading, 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 != buttonState) {  // Pokud se stav tlačítka změnil      
      buttonState = buttonState;   // zapamatuju si novy stav reading
    }
  }  /*TOHLE JE KONEC BLOKU KDE OŠETŘUJI TLAČÍTKO*/  
                             
  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
//      delay(200); // prodleva proti záchvěvům tlačítka 200ms
    }

  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   
}
taky jsem trochu pozměnil komentáře, něco přidal, něco ubral.

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 » 22 říj 2019, 18:43

Kód: Vybrat vše

    if (buttonState != buttonState) {  // Pokud se stav tlačítka změnil      
      buttonState = buttonState;   // zapamatuju si novy stav reading
    }
pokud chceš, aby se ti to nepřepínalo během toho co držíš tlačítko, tak si musíš zapamatovat poslední ošetřený stav (nová proměnná) stisku tlačítka ... ten, pak porovnáváš s současným ošetřeným stavem stisku tlačítka a pak teprve spouštíš část, která udělá to, že změní mode. (tu máš napsanou níže)

když uděláš tohle, tak celý tohle příjde do pryč ... ale před tím ...

Kód: Vybrat vše

  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
//      delay(200); // prodleva proti záchvěvům tlačítka 200ms
    }
ale předtím tohle ...

Kód: Vybrat vše

mode++; // přičte k MODE hodnotu 1
if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
předtím tohle příjde do podmínky, která porovnává ty stavy ošetřených stisků tlačítek ...

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 říj 2019, 12:00

dobrý den, když jsem se prokousal všemi ... ale před tím ... , tak výsledek je takový, že při přepínání mode, pokud rychle stisknu tlačítko, tak to mode přepne, ale někdy taky přeskočí. Pokud přidržím strisknuté tlačítko, tak ledky a mode přeblikávají, jako kdybych vytáhl propojení tlačítka s arduinem a střídají se mode postupně a dokola. Zdá se mi to mírně lepší, ale ... :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 reading;  // poslední stav Tlačítka
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_PULLUP);  // pin pro TLACITKO nastaveno jako vstup
  digitalWrite(TLACITKO,HIGH);  //   

  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 (reading != buttonState) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem          
      lastButtonState = reading;   // tady si zapamatuje poslední ošetřený stav (nová proměnná) stisku tlačítka 
      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 » 23 říj 2019, 18:08

if (reading != buttonState) { // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem
lastButtonState = reading; // tady si zapamatuje poslední ošetřený stav (nová proměnná) stisku tlačítka

ne reading, ale lastButtonState ... a do lastButtonState potom zapisuješ buttonState, ne reading .... reading vůbec nikde nepoužíváš a můžeš ho vymazat .. to je zbytek z nějakýho tutoriálu slepený s tím co jsi sepsal při trápení se servem :) ... to je tím že kopíruješ dohromady cizí kódy a nepíšeš si je sám.

a ještě tam musíš pak dát podmínku, jestli je buttonState HIGH ... protože jinak ti to načte mode při každé změně tlačítka ... jednou při stisku a jednou při puštění ... ty chceš jen stisk

tohle
mode++; // přičte k MODE hodnotu 1
if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
příjde do podmínky co otestuje jestli je ten buttonState stisknutej ... pak už to bude pracovat správně

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

:oops: nedaří se, stále mi to problikává při přepínání mode :evil:

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_PULLUP);  // pin pro TLACITKO nastaveno jako vstup
  digitalWrite(TLACITKO,HIGH);  //   

  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   
}
atlačítko mám zapojené : pin 2 na tlačítko a zároveň na odpor, který je druhým koncem na GND, druhá strana tlačítka na +5V

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, 08:07

jedna závorka je špatně ... celý problém

Kód: Vybrat vše

  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 
     } // <-- tato závorka příjde níž       
     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
      }
      // <-- tady příjde            
     /*TOHLE JE KONEC BLOKU KDE OŠETŘUJI TLAČÍTKO*/   
  }  

Odpovědět

Kdo je online

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