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 » 03 led 2020, 11:58

dobrý den, provedl jsem po delší pauze částečnou úpravu kodů, aby mi neproblikával /neblikal/ display lcd. Zrušil jsem na doporučení mazání celého displaye, upravil přepisování textu, zrušil doby čekání millis / není už třeba bylo to pro výpis na seriový monitor /. Lze taky už vidět čísla odpočtu 10 s do rychlého blikání. Výsledek je podstatně, podstatně lepší, ale nevím si rady s tímto - "potrebaPrepsatDislay = true" atd.
kod se změnami : pro výpis stavu blikání Led na lcd 4x20 i2c

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á

#include <Wire.h>   // knihovny pro LCD přes I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);   // nastavení adresy I2C (0x27), počtu znaků, řádků LCD 20x4

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í
unsigned long cas = 0;

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

  lcd.begin();   // inicializace LCD
  lcd.backlight();   // zapnutí podsvícení

  lcd.setCursor ( 0, 1 );   // nastavení kursoru na druhý znak, druhý řádek  
  lcd.print(" LED1,LED2   ");  // vypsání textu na lcd
}  


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 
      lcd.setCursor( 3, 2 );   // nastavení kursoru na šestý znak, třetí řádek
      lcd.print("  jsme zhasnute ");   // vypsání textu na lcd           
   }
                 
  if(mode == 1) {
    // ******* LED1,LED2 zapnuto  ********       
     led1svetlo = true;  // rožni LED1             
     led2svetlo = true;  // rožni LED2
      lcd.setCursor( 5, 2 );
      lcd.print(" uz svitime !");    
   }   
                    
  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?
      lcd.setCursor( 0, 1 );
      lcd.print(" LED1,LED2     ");
      lcd.setCursor ( 5, 2 );
      lcd.print("blikame rychle");          
    
     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 : "blikat začneme" - jestli chci vědět jak dlouho budu ještě čekat, tak vypíšu 10000 - (millis() - buttonTime)
      lcd.setCursor ( 1, 1 );
      lcd.print("blikat zacneme");
      lcd.setCursor( 6, 2 );
      lcd.print("za");
      lcd.setCursor( 9, 2 );
      lcd.print(10000 - (millis() - buttonTime));   // zobrazí se odpočet do blikání led v ms 
      lcd.setCursor( 13, 2 );
      lcd.print(" 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 
   }
     lcd.setCursor( 0, 1 );
     lcd.print(" LED1,LED2     ");
     lcd.setCursor( 5, 2 );
     lcd.print("blikame pomalu"); 
   } 
   
  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 
     lcd.setCursor( 1, 1 );
     lcd.print("LED1,LED2");
     lcd.setCursor( 3, 2 );
     lcd.print("blikame stridave"); 
   }  
  } 
   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

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 03 led 2020, 13:48

dobrý den, přidávám odkaz na videa pro kod zobrazení variací blikání led na lcd 4x20 i2c :
https://www.youtube.com/watch?v=CTvLOpqmfDg
barva lcd displaye je více modrá, mobil to zkreslil.
a v černo - bílé variantě videa :
https://www.youtube.com/watch?v=7Jm57Lu3gK0 tak se mrkněte díky

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 » 03 led 2020, 18:31

Občas je rychlejší display celý smazat, třeba když mám zaplněné všechny 4řádky a najednou chci vytisknout uprostřed na display třeba nápis STOP. Nebudu přece přepisovat řádky práznými znaky.

Program jako takový ti koukám funguje. Ale ... je napsán dost neoptimalizovaně ... chápu, že nechápeš co tím myslím ... ale zkus tohle :

Přidej ještě jedno tlačítko. Nyní budou mít tlačítka funkci SELECT a START. Tlačítkem SELECT budeš postupně vybírat mode. 0,1,2,3...0,1,2,3... samozřejmě si musíš vypsat na displej, který mode máš zrovna nalistovaný. Tlačítkem START ten mode spustíš.

Už při návrhu se zamysli i dopředu nad tím, že jednou v budoucnu budeš chtít mít ještě jedno tlačítko ... jedním budeš listovat mode nahoru, druhým dolů a třetím ho spustíš. Tlačítko START by mohlo fungovat i jako STOP.

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 05 led 2020, 17:02

dobrý den, děkuji za nápady pro zlepšení, je to pro mě vzdycky výzva !
byly přejmenovány tlačítka ! lepší orienzace v kodu / více jak jedno tlačítko/, do budoucna jich může být více, dávám na radu od kiRRow
dneska jen bohužel malá chvilka na testování a učení, ale tady je kod, ve kterém jsem přidal druhé tlačítko buttonStart do mode==1, zatím jen zapnutí LEDek. Přijde taky ošetřit tlačítko debounce a přidat i v mode vypnutí LEDek. kod zde :

Kód: Vybrat vše

#define buttonSelect 2   // číslo pinu tlačítka SELECT pro výběr MODE
#define buttonStart 3   // číslo pinu tlačítka START
#define LED1  10    // číslo pinu LED1 zelená
#define LED2  11    // číslo pinu LED2 červená

#include <Wire.h>   // knihovny pro LCD přes I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);   // nastavení adresy I2C (0x27), počtu znaků, řádků LCD 20x4

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í
unsigned long cas = 0;

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(buttonSelect, INPUT);  // pin pro tlačítko buttonSelect nastaveno jako vstup
  pinMode(buttonStart, INPUT);  // pin pro tlačítko buttonStart nastaveno jako vstup

  lcd.begin();   // inicializace LCD
  lcd.backlight();   // zapnutí podsvícení

  lcd.setCursor ( 0, 1 );   // nastavení kursoru na druhý znak, druhý řádek  
  lcd.print(" LED1,LED2   ");  // vypsání textu na lcd
}  


void loop(){
  
  
  /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  buttonState = digitalRead(buttonSelect);  // 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 
      lcd.setCursor( 3, 2 );   // nastavení kursoru na šestý znak, třetí řádek
      lcd.print("  jsme zhasnute ");   // vypsání textu na lcd 
      lcd.setCursor( 1, 3 );
      lcd.print("Mode 0");          
   }
  
  if(mode == 1) {
    // ******* LED1,LED2 zapnuto  ********  
    if (digitalRead(buttonStart) == 1) {  // když je stisknuto tlačítko, tak vykonej mode 1                            
       led1svetlo = true;  // rožni LED1             
       led2svetlo = true;  // rožni LED2           
       lcd.setCursor( 5, 2 );
       lcd.print(" uz svitime !"); 
    }   
       lcd.setCursor( 1, 3 );
       lcd.print("Mode 1");           
   }
                    
  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?
      lcd.setCursor( 0, 1 );
      lcd.print(" LED1,LED2     ");
      lcd.setCursor ( 5, 2 );
      lcd.print("blikame rychle");
 //     lcd.setCursor( 1, 3 );
 //     lcd.print("Mode 2");                   
    
     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 : "blikat začneme" - jestli chci vědět jak dlouho budu ještě čekat, tak vypíšu 10000 - (millis() - buttonTime)
      lcd.setCursor ( 1, 1 );
      lcd.print("blikat zacneme");
      lcd.setCursor( 5, 2 );
      lcd.print(" za ");
      lcd.setCursor( 9, 2 );
      lcd.print(10000 - (millis() - buttonTime));   // zobrazí se odpočet do blikání led v ms 
      lcd.setCursor( 13, 2 );
      lcd.print(" ms  "); 
      lcd.setCursor( 1, 3 );
      lcd.print("Mode 2");           
    }                       
   }            
          
  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 
   }
     lcd.setCursor( 0, 1 );
     lcd.print(" LED1,LED2     ");
     lcd.setCursor( 5, 2 );
     lcd.print("blikame pomalu");
     lcd.setCursor( 1, 3 );
     lcd.print("Mode 3");         
   } 
   
  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 
     lcd.setCursor( 1, 1 );
     lcd.print("LED1,LED2");
     lcd.setCursor( 3, 2 );
     lcd.print("blikame stridave");
     lcd.setCursor( 1, 3 );
     lcd.print("Mode 4");    
   }  
  } 
   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   
 }
a taky přijde dodělat "zap/vyp" u ostatních mode. Děkuji za inspiraci Super !

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 » 06 led 2020, 18:03

No já tu změnu navrhnul účelně ... takhle to zatím fungovat bude ... ale narazíš na problém. A to je dobře :) ... to jsou ty nejužitečnější chyby, ze kterých se člověk nejlépe poučí :). Až se tak stane, tak to rozlousknem. Tvojí práci zdar.

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 07 led 2020, 09:10

dobrý den, pokud byl myslený tento problém, tak si ho můžete prohlédnout na tomto odkazu :
https://www.youtube.com/watch?v=-NOj_37gHMg
je na něm vidět problém, kdy po stisknutí tlačítka svítí LEDky a když pustím tlačítko, tak LEDky zhasnou. Není tak splněná podmínka jedním tlačítkem Zap/Vyp v mode. Kod přidávám zde :

Kód: Vybrat vše

#define buttonSelect 2   // číslo pinu tlačítka SELECT pro výběr MODE
#define buttonStart 3   // číslo pinu tlačítka START
#define LED1  10    // číslo pinu LED1 zelená
#define LED2  11    // číslo pinu LED2 červená

#include <Wire.h>   // knihovny pro LCD přes I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);   // nastavení adresy I2C (0x27), počtu znaků, řádků LCD 20x4

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í
unsigned long cas = 0;

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(buttonSelect, INPUT);  // pin pro tlačítko buttonSelect nastaveno jako vstup
  pinMode(buttonStart, INPUT);  // pin pro tlačítko buttonStart nastaveno jako vstup

  lcd.begin();   // inicializace LCD
  lcd.backlight();   // zapnutí podsvícení

  lcd.setCursor ( 0, 1 );   // nastavení kursoru na druhý znak, druhý řádek  
  lcd.print(" LED1,LED2   ");  // vypsání textu na lcd
}  


void loop(){
  
  
  /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  buttonState = digitalRead(buttonSelect);  // 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 
      lcd.setCursor( 3, 2 );   // nastavení kursoru na šestý znak, třetí řádek
      lcd.print("  jsme zhasnute ");   // vypsání textu na lcd 
      lcd.setCursor( 1, 3 );
      lcd.print("Mode 0");          
   }
  
  if(mode == 1) {
    // ******* LED1,LED2 zapnuto  ********  
    if (digitalRead(buttonStart) == 1) {  // když je stisknuto tlačítko, tak rožni ledky                           
       led1svetlo = true;  // rožni LED1             
       led2svetlo = true;  // rožni LED2           
       lcd.setCursor( 5, 2 );
       lcd.print(" uz svitime !"); 
    } 
    
    if (digitalRead(buttonStart) == 0) {  // když není stisknuto tlačítlo, tak zhasni ledky    
      led1svetlo = false;
      led2svetlo = false;
      lcd.setCursor( 3, 2 );   // nastavení kursoru na šestý znak, třetí řádek
      lcd.print("  jsme zhasnute ");   // vypsání textu na lcd 
    }
       lcd.setCursor( 1, 3 );
       lcd.print("Mode 1");           
   }
                    
  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?
      lcd.setCursor( 0, 1 );
      lcd.print(" LED1,LED2     ");
      lcd.setCursor ( 5, 2 );
      lcd.print("blikame rychle");                   
    
     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 : "blikat začneme" - jestli chci vědět jak dlouho budu ještě čekat, tak vypíšu 10000 - (millis() - buttonTime)
      lcd.setCursor ( 1, 1 );
      lcd.print("blikat zacneme");
      lcd.setCursor( 5, 2 );
      lcd.print(" za ");
      lcd.setCursor( 9, 2 );
      lcd.print(10000 - (millis() - buttonTime));   // zobrazí se odpočet do blikání led v ms 
      lcd.setCursor( 13, 2 );
      lcd.print(" ms  "); 
      lcd.setCursor( 1, 3 );
      lcd.print("Mode 2");           
    }                       
   }            
          
  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 
   }
     lcd.setCursor( 0, 1 );
     lcd.print(" LED1,LED2     ");
     lcd.setCursor( 5, 2 );
     lcd.print("blikame pomalu");
     lcd.setCursor( 1, 3 );
     lcd.print("Mode 3");         
   } 
   
  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 
     lcd.setCursor( 1, 1 );
     lcd.print("LED1,LED2");
     lcd.setCursor( 3, 2 );
     lcd.print("blikame stridave");
     lcd.setCursor( 1, 3 );
     lcd.print("Mode 4");    
   }  
  } 
   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   
 }


tušil jsem, že budu potřebovat proměnnou na zapamatování si stavu tlačítka, no nevím jestli je to co bylo myšleno
popis :
v mode==1 při stisknutí tlačítka buttonStart se zapnou LEDky a při znovu stisknutí tlačítka buttonStart se LEDky vypnou. Můžu tak v mode1 xkrát rožínat a zhasínat led, pokud nezměním mode tlačítkem buttonSelect /červené na videu/.Taky je přiřazen patřičný popis co dělají LEDky na lcd. Musím to vyzkoušet ještě na jiném mode, uvidím jestli to bude funkční ?
odkaz na video : https://www.youtube.com/watch?v=VHgxUWoOgY4
kod zde:

Kód: Vybrat vše

#define buttonSelect 2   // číslo pinu tlačítka SELECT pro výběr MODE
#define buttonStart 3   // číslo pinu tlačítka START
#define LED1  10    // číslo pinu LED1 zelená
#define LED2  11    // číslo pinu LED2 červená

#include <Wire.h>   // knihovny pro LCD přes I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);   // nastavení adresy I2C (0x27), počtu znaků, řádků LCD 20x4

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

boolean  buttonStateStart = false;
boolean  lastButtonStart = false;

// 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í
unsigned long cas = 0;

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(buttonSelect, INPUT);  // pin pro tlačítko buttonSelect nastaveno jako vstup
  pinMode(buttonStart, INPUT);  // pin pro tlačítko buttonStart nastaveno jako vstup

  lcd.begin();   // inicializace LCD
  lcd.backlight();   // zapnutí podsvícení

  lcd.setCursor ( 0, 1 );   // nastavení kursoru na druhý znak, druhý řádek  
  lcd.print(" LED1,LED2   ");  // vypsání textu na lcd
}  


void loop(){
  
  
  /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  buttonState = digitalRead(buttonSelect);  // 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 
      lcd.setCursor( 3, 2 );   // nastavení kursoru na šestý znak, třetí řádek
      lcd.print("  jsme zhasnute ");   // vypsání textu na lcd 
      lcd.setCursor( 1, 3 );
      lcd.print("Mode 0");          
   }
  
  if(mode == 1) {
    // ******* LED1,LED2 zapnuto  ********  
    buttonStateStart = digitalRead(buttonStart);   // nacteni aktualniho stavu tlacitka 
      
   if(buttonStateStart == 0 && lastButtonStart == 1)  {  // je-li ted stisknuto tlacitko a zaroven predtim nebylo                                               
      led1svetlo = !led1svetlo;  // zhasni nebo rožni LED1
      led2svetlo = !led2svetlo;  // zhasni nebo rožni LED2
      if(!led1svetlo && !led2svetlo) {  // když je stav led "takový" vypiš na lcd
        lcd.setCursor( 3, 2 );   // nastavení kursoru na šestý znak, třetí řádek
        lcd.print("  jsme zhasnute");   // vypsání textu na lcd 
      }
      else {  // jinak vypiš "takový" stav led na lcd
        lcd.setCursor( 3, 2 );   // nastavení kursoru na šestý znak, třetí řádek
        lcd.print("   uz svitime !");   // vypsání textu na lcd 
      }
    }  
    lastButtonStart = buttonStateStart;  // uloz aktualni stav tlacitka jako minuly stav
      lcd.setCursor( 1, 3 );
      lcd.print("Mode 1");           
   }
                    
  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?
      lcd.setCursor( 0, 1 );
      lcd.print(" LED1,LED2     ");
      lcd.setCursor ( 5, 2 );
      lcd.print("blikame rychle");                  
    
     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 : "blikat začneme" - jestli chci vědět jak dlouho budu ještě čekat, tak vypíšu 10000 - (millis() - buttonTime)
      lcd.setCursor ( 1, 1 );
      lcd.print("blikat zacneme");
      lcd.setCursor( 5, 2 );
      lcd.print(" za ");
      lcd.setCursor( 9, 2 );
      lcd.print(10000 - (millis() - buttonTime));   // zobrazí se odpočet do blikání led v ms 
      lcd.setCursor( 13, 2 );
      lcd.print(" ms  "); 
      lcd.setCursor( 1, 3 );
      lcd.print("Mode 2");           
    }                       
   }            
          
  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 
   }
     lcd.setCursor( 0, 1 );
     lcd.print(" LED1,LED2     ");
     lcd.setCursor( 5, 2 );
     lcd.print("blikame pomalu");
     lcd.setCursor( 1, 3 );
     lcd.print("Mode 3");         
   } 
   
  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 
     lcd.setCursor( 1, 1 );
     lcd.print("LED1,LED2");
     lcd.setCursor( 3, 2 );
     lcd.print("blikame stridave");
     lcd.setCursor( 1, 3 );
     lcd.print("Mode 4");    
   }  
  } 
   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 a mrkněte na videa

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 » 07 led 2020, 18:22

Druhé tlačítko by se mělo vyhodnotit mezi vyhodnocením prvního tlačítka a mode==0

Dále budeš potřebovat proměnnou typu boolean ve které si uchováš stav programu ... má se svítit/blikat ??? ...
Až vyhodnotíš druhé tlačítko, tak tuto hodnotu vždy neguješ ... Stisknu start, přehodím proměnnou mamBezet = !mamBezet; // ( byla false, bude true - byla true. bude false ... s každým stiskem se ti změní )
Tuto proměnnou pak budeš testovat u mode ... if((mode == 1)&&(mamBezet == true)) {
Pokud to tlačítko nedebouncneš, bude ti to dělat, že jednou se ti mode spustí, podruhé ne, potřetí ne, po čtvrté zase jo ( zákmity ... hodně rychle se ti to bude měnit 1,0,1,0,1,0,1 ... záleží na tom kde se to ustálí )

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 09 led 2020, 23:53

dobrý den, změnil jsem v kodu mode == 1, ale nejsem si jist, jestli to má takto vypadat /fungovat/? mám tam duplikátní věci a asi jsem něco zmastil :oops: , kod sic v mode == 1 pracuje tak, že tlačítko Start rozsvítí LEDky, ale už je nezhasne po dalším stisknutí - pracuje to jako jen Zap v mode1. Když jsem se pokusil tohle aplikovat i na mode == 2, tak to nepracovalo dobře, v dalších mode jsem to ani nezkoušel. V kodu u mode==2 jsem to pro názornost ponechal a zakomentoval .Tady je kod :

Kód: Vybrat vše

#define buttonSelect 2   // číslo pinu tlačítka SELECT pro výběr MODE
#define buttonStart 3   // číslo pinu tlačítka START
#define LED1  10    // číslo pinu LED1 zelená
#define LED2  11    // číslo pinu LED2 červená

#include <Wire.h>   // knihovny pro LCD přes I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);   // nastavení adresy I2C (0x27), počtu znaků, řádků LCD 20x4

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

boolean  buttonStateStart = false;
boolean  lastButtonStart = false;

boolean mamBezet = false;  // byla false, bude true - byla true. bude false ... s každým stiskem se změní stav proměnné

// 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í
unsigned long cas = 0;

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(buttonSelect, INPUT);  // pin pro tlačítko buttonSelect nastaveno jako vstup
  pinMode(buttonStart, INPUT);  // pin pro tlačítko buttonStart nastaveno jako vstup

  lcd.begin();   // inicializace LCD
  lcd.backlight();   // zapnutí podsvícení

  lcd.setCursor ( 0, 1 );   // nastavení kursoru na druhý znak, druhý řádek  
  lcd.print(" LED1,LED2   ");  // vypsání textu na lcd
}  


void loop(){
  
  
  /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  buttonState = digitalRead(buttonSelect);  // 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 ((digitalRead(buttonStart)) == true) {   
     mamBezet = !mamBezet;     
   } 
                       
  if(mode == 0) {  // ******* LED1,LED2 vypnuto ********
        
     led1svetlo = false;  // zhasni LED1              
     led2svetlo = false;  // zhasni LED2 
      lcd.setCursor( 3, 2 );   // nastavení kursoru na šestý znak, třetí řádek
      lcd.print("  jsme zhasnute ");   // vypsání textu na lcd 
      lcd.setCursor( 1, 3 );
      lcd.print("MODE 0");          
   }
  
  if(mode == 1) {  // ******* LED1,LED2 zapnuto  ********
     if((mode == 1)&&(mamBezet == true)) {
        mamBezet = !mamBezet;                      
       led1svetlo = true;  // rožni LED1             
       led2svetlo = true;  // rožni LED2           
       lcd.setCursor( 5, 2 );
       lcd.print(" uz svitime !"); 
      }
       lcd.setCursor( 1, 3);
       lcd.print("MODE 1");
       
    }                         
  if(mode == 2){   // ******* LED1,LED2 blikání rychlé  ******* 
//    if((mode == 2)&&(mamBezet == true)) {
//      mamBezet = !mamBezet;  
    if(millis() - buttonTime > 10000){  // zjistím si jestli je čas něco provést, uběhlo už 10s od poslední akce?
      lcd.setCursor( 0, 1 );
      lcd.print(" LED1,LED2     ");
      lcd.setCursor ( 5, 2 );
      lcd.print("blikame rychle");                  
//    }
     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 : "blikat začneme" - jestli chci vědět jak dlouho budu ještě čekat, tak vypíšu 10000 - (millis() - buttonTime)
      lcd.setCursor ( 1, 1 );
      lcd.print("blikat zacneme");
      lcd.setCursor( 5, 2 );
      lcd.print(" za ");
      lcd.setCursor( 9, 2 );
      lcd.print(10000 - (millis() - buttonTime));   // zobrazí se odpočet do blikání led v ms 
      lcd.setCursor( 13, 2 );
      lcd.print(" ms  "); 
      lcd.setCursor( 1, 3 );
      lcd.print("MODE 2");           
    }                       
   }            
          
  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 
   }
     lcd.setCursor( 0, 1 );
     lcd.print(" LED1,LED2     ");
     lcd.setCursor( 5, 2 );
     lcd.print("blikame pomalu");
     lcd.setCursor( 1, 3 );
     lcd.print("MODE 3");         
   } 
   
  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 
     lcd.setCursor( 1, 1 );
     lcd.print("LED1,LED2");
     lcd.setCursor( 3, 2 );
     lcd.print("blikame stridave");
     lcd.setCursor( 1, 3 );
     lcd.print("MODE 4");    
   }  
  } 
   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   
 }
do debounce pro tlačítko Start jsem se nepouštěl, děkuju za nápovědy

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 » 10 led 2020, 16:04

jen tak letmo okem jsem to prolítnul ... pořádně na to mrknu o víkendu

if((mode == 1)&&(mamBezet == true)) {
mamBezet = !mamBezet; // tohle tu rozhodně nemá být - to jestli to má běžet nebo ne přece ovládá tlačítko start ... pokud to budeš chtít v mode 1 i zhasnout, musíš to tam dopsat ... že pokud je mode 1 a mamBezet false ... led1 a led2 taky false

debounce nejrychleji provedeš tak, že zkopíruješ to debounce co už máš a přejmenuješ promenné ... dokud debounce neprovedeš, bude se tlačítko start chovat náladově
--edit
a nebo ho může na hovado dočasně pro testovací účely ošetřit tak, že po stisku tlačítka program na 20ms natvrdo pozastavíš delayem
if ((digitalRead(buttonStart)) == true) {
mamBezet = !mamBezet;
delay(20);
}

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 » 10 led 2020, 16:16

asi jsem ti neporadil moc dobře stou složenou podmínkou ... raději to přepiš takhle

Kód: Vybrat vše

if(mode == 1){
	if(mamBezet == true){
		// Zde se provede to co se má dělat když je mode 1 a program má běžet (rožne ledky)
	} else {
		// Zde se provede to co se má dělat když je mode 1 a program nemá běžet	(zhasne ledky)
	}
	// Zde se provede to co se má dělat když je mode 1 a a je fuk jestli program má bežet nebo ne (vypíše něco na display)
}

if(mode == 2){
	if(mamBezet == true){
		// Zde se provede to co se má dělat když je mode 2 a program má běžet
	} else {
		// Zde se provede to co se má dělat když je mode 2 a program nemá běžet
	}
	// Zde se provede to co se má dělat když je mode 2 a a je fuk jestli program má bežet nebo ne
}

Odpovědět

Kdo je online

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