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 » 15 led 2020, 18:20

dobrý den, přesunul jsem class Button a to tak , že jsem ze sketche zkopíroval vybraný kod do poznámkového bloku a přejmenoval koncovku souboru *.txt na *.h
Aby mi W10 ukázaly příponu, tak podle tohoto : https://wintip.cz/515-jak-zobrazit-pripony-souboru
a takhle to vypadá : https://ctrlv.cz/JFFc - přejmenovaný soubor na .h
https://ctrlv.cz/QIIW - soubor.h + sketch

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 16 led 2020, 07:27

dobrý den, v předešlé odpovědi, kde jsme narazili na objektově orientované programování je otázka, které moc nerozumím ?
mno a teď je otázka ... chápeš, proč nám to tlačítko neštěká, že se jmenuje Alík ? ... zkonstruováno je to skoro jako třída Pes ...
když jsem si to vyzkoušel , tak seriový monitor vypsal tohle : https://ctrlv.cz/RfcO
tam je ale vypsáno, že Alik steka Haf! děkuju za vysvětlení

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

No občas jsem rýpavej a sarkastickej, nenech se tím rozhodit :-)

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 16 led 2020, 17:27

dobrý den, upravil jsem kod, který po stisknutí a držení tlačítka Start zastavil blikání led v mode. Na doporučení podle kiRRow ze dne 10.1.2020 16:16 hod.je teď upraveno, že při stisknutí tlačítka Start ve všech mode , vyjma mode2, se provede STOP nebo START blikání . Přidána proměnná mamBezet. Stavy mode a stav tlačítka Start jsou vypsány na lcd.
tady video : https://www.youtube.com/watch?v=rF146CnL_pI
tady upravený 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 lastTrueButtonStart = false;

boolean mamBezet = 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 lastDebounceTime2 = 0;
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
long buttonTime2;

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í
  Serial.begin(9600);   // konfigurace rychlosti seriového portu
  Serial.println("Seriovy port aktivni");  // První výpis na seriový port
  
  lcd.setCursor ( 0, 1 );   // nastavení kursoru na druhý znak, druhý řádek  
  lcd.print(" LED1,LED2   ");  // vypsání textu na lcd
  lcd.setCursor( 1, 3);
  lcd.print("All ready"); 
  delay(2000); 
}  


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
  
  //-------------- debounce pro tlačítko START ----------  
    buttonStateStart = digitalRead(buttonStart);  // přečtení stavu tlačítka    
  if (buttonStateStart != lastButtonStart) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime2 = millis();
  }                            
  if ((millis() - lastDebounceTime2) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (buttonStateStart != lastTrueButtonStart) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             

     if (buttonStateStart == true) {
         mamBezet = !mamBezet;          
         buttonTime2 = millis(); 
          Serial.println("START");  // výpis na seriový monitor          
      } 
        // TADY CHYBÍ CO SE MÁ PROVÉST PŘI STISKU TLAČÍTKA START ... U MODE SE PŘIČÍTÁ MODE ...
        // ...U STARTU BY SE MĚLA PŘEKLÁPĚT PROMĚNNÁ mamBezet - hoď si tu nějaký výpis do seriové linky a uvidíš že to funguje
        
     }             
      lastTrueButtonStart = buttonStateStart;  // uložím si nový pravý ošetřený stav tlačítka        
    }  
   
  lastButtonStart = buttonStateStart; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
  //-------------- konec ořetření tlačítka Start ----------
   
                       
  if(mode == 0) {  // ******* LED1,LED2 vypnuto ******** 
     if(mamBezet == true){      
        led1svetlo = false;  // zhasni LED1              
        led2svetlo = false;  // zhasni LED2      
        lcd.setCursor( 12, 2 );
        lcd.print("STOP "); 
      } else {  
       lcd.setCursor( 12, 2 );
       lcd.print("START");
        }      
      lcd.setCursor( 1, 3 );
      lcd.print("MODE 0   ");            
   }
  
  if(mode == 1) {  // ******* LED1,LED2 zapnuto  ********    
       if(mamBezet == true){                                  
         led1svetlo = true;
         led2svetlo = true;
         lcd.setCursor( 12, 2 );
         lcd.print("START");             
       } 
         else {       
          led1svetlo = false;
          led2svetlo = false;
          lcd.setCursor( 12, 2 );
          lcd.print("STOP ");             
        }
      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("       START  ");               
    
     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( 10, 2 );
      lcd.print(10000 - (millis() - buttonTime));   // zobrazí se odpočet do blikání led v ms 
      lcd.setCursor( 14, 2 );
      lcd.print(" ms  "); 
      lcd.setCursor( 1, 3 );
      lcd.print("Mode 2");           
    }                       
   }            
          
               
         
  if(mode == 3) {  // ******* LED1,LED2 blikání pomalé  *******  
     if(mamBezet == true){
        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("       START   ");
      } else  {
        led1svetlo = false;
        led2svetlo = false;
        lcd.setCursor( 5, 2);
        lcd.print("       STOP   ");   
      }
       lcd.setCursor( 1, 3 );
       lcd.print("MODE 3   ");         
     } 
                
     if(mode == 4) {  // ******* LED1,LED2 blikání střídavé  *******     
      if(mamBezet == true){ 
        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( 12, 2 );
          lcd.print("START");   
      } else {              
           led1svetlo = false;
           led2svetlo = false;          
           lcd.setCursor( 12, 2 );
           lcd.print("STOP ");    
        
       }      
        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   
 }
 
s těmi výpisy si musím ještě trošku pohrát , aby nebyly vypisovány prázdné pole :roll:
prosím o kontrolu a připomínky. Ještě snad se pokusím v mode2 taky doplnit start/stop a snad taky třetí tlačítko kdy se bude měnit směr mode, tedy od mode==4; do mode==0; nebo když bude stisknuto. děkuju
na OOProgramování nezapomínám ;)

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 » 17 led 2020, 18:28

tím, že je spouštěcí tlačítko Start ... tak z tlačítka Select je nutno řádek "buttonTime = millis();" přemístit do tlačítka Start příjde to místo "buttonTime2 = millis();" ... buttonTime2 vůbec nepotřebuješ.

Jak přidat Start/Stop do mode 2 ?

1) výjmu všechno co mám v mode 2 aby mi zbylo jen :

Kód: Vybrat vše

if(mode == 2){  // ******* LED1,LED2 blikání rychlé  ******* 
}
2) dopíšu si tam vnitřní podmínku mamBezet a dostanu :

Kód: Vybrat vše

if(mode == 2){  // ******* LED1,LED2 blikání rychlé  *******
	if(mamBezet == true){

	} else {

	}
}
3) vrátím to co jsem výjmul :

Kód: Vybrat vše

if(mode == 2){  // ******* LED1,LED2 blikání rychlé  *******
	if(mamBezet == true){
		// tady vrátím to co jsem výjmul
	} else {
		// tady napíšu že led1 a led2 jsou zhaslé
	}
}

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 18 led 2020, 17:16

dobrý den, jak bylo avizováno, upravil a zjednodušil jsem výpisy na lcd displej. Doplněno i start/stop do mode2.
Nyní je tedy plně funkční kod : Start / Stop blikání led v mode s výpisem na 20x4 lcd

Kód: Vybrat vše

#define buttonSelect 2   // číslo pinu tlačítka SELECT pro výběr MODE červené
#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 lastTrueButtonStart = false;

boolean mamBezet = false;

unsigned long lastDebounceTime = 0;  // čas posledního změny výstupního pinu
unsigned long lastDebounceTime2 = 0;
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í
  Serial.begin(9600);   // konfigurace rychlosti seriového portu
  Serial.println("Seriovy port aktivni");  // První výpis na seriový port  
  
  lcd.setCursor( 2, 1);
  lcd.print("ready"); 
  delay(1000); 
}  


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      
               
         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
  
  //-------------- debounce pro tlačítko START ----------  
    buttonStateStart = digitalRead(buttonStart);  // přečtení stavu tlačítka    
  if (buttonStateStart != lastButtonStart) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime2 = millis();
  }                            
  if ((millis() - lastDebounceTime2) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (buttonStateStart != lastTrueButtonStart) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             

     if (buttonStateStart == true) {
         mamBezet = !mamBezet;          
         buttonTime = millis(); 
          Serial.println("START");  // výpis na seriový monitor          
      }
        // TADY CHYBÍ CO SE MÁ PROVÉST PŘI STISKU TLAČÍTKA START ... U MODE SE PŘIČÍTÁ MODE ...
        // ...U STARTU BY SE MĚLA PŘEKLÁPĚT PROMĚNNÁ mamBezet - hoď si tu nějaký výpis do seriové linky a uvidíš že to funguje
      }             
      lastTrueButtonStart = buttonStateStart;  // uložím si nový pravý ošetřený stav tlačítka        
    }  
   
  lastButtonStart = buttonStateStart; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
  //-------------- konec ořetření tlačítka Start ----------
   
                       
  if(mode == 0) {  // ******* LED1,LED2 vypnuto ******** 
     if(mamBezet == true){      
        led1svetlo = false;  // zhasni LED1              
        led2svetlo = false;  // zhasni LED2      
        lcd.setCursor( 12, 2 );
        lcd.print("STOP "); 
      } else {          
        lcd.setCursor( 12, 2 );
        lcd.print("START");
        }         
        lcd.setCursor( 2, 1 );
        lcd.print("Mode 0");            
   }
  
  if(mode == 1) {  // ******* LED1,LED2 zapnuto  ********    
       if(mamBezet == true){                                  
         led1svetlo = true;
         led2svetlo = true;
         lcd.setCursor( 12, 2 );
         lcd.print("START");             
       } 
         else {       
          led1svetlo = false;
          led2svetlo = false;
          lcd.setCursor( 12, 2 );
          lcd.print("STOP ");                       
          }
          lcd.setCursor( 2, 1 );
          lcd.print("Mode 1");  
   }
                      
  if(mode == 2){  // ******* LED1,LED2 blikání rychlé  *******  
          if(mamBezet == true) {                                  
           if(millis() - buttonTime > 10000){  // zjistím si jestli je čas něco provést, uběhlo už 10s od poslední akce?
             lcd.setCursor ( 10, 2 );
             lcd.print("  START   ");                           
    
               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( 11, 2 );
              lcd.print(10000 - (millis() - buttonTime));   // zobrazí se odpočet do blikání led v ms 
              lcd.setCursor( 15, 2 );
              lcd.print(" ms");             
              }                  
              } else {                                          
                lcd.setCursor( 11, 2 );
                lcd.print(" STOP  ");
                led1svetlo = true;
                led2svetlo = true;            
                }                                     
                lcd.setCursor( 2, 1 );
                lcd.print("Mode 2"); 
   }       
   
  if(mode == 3) {  // ******* LED1,LED2 blikání pomalé  *******  
     if(mamBezet == true){
        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( 5, 2 );
       lcd.print("       START   ");
      } else  {
        led1svetlo = false;
        led2svetlo = false;
        lcd.setCursor( 12, 2);
        lcd.print("STOP ");   
      }
       lcd.setCursor( 2, 1 );
       lcd.print("Mode 3");         
     } 
                
     if(mode == 4) {  // ******* LED1,LED2 blikání střídavé  *******     
      if(mamBezet == true){ 
        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( 12, 2 );
          lcd.print("START");   
      } else {              
           led1svetlo = false;
           led2svetlo = false;          
           lcd.setCursor( 12, 2 );
           lcd.print("STOP ");    
        
       }      
        lcd.setCursor( 2, 1 );
        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   
 }  
třetím tlačítkem jsem se zatím nezabýval, dokončoval jsem tento kod
a taky pro srovnání přidával ke kodu ze dne 13.ledna 2020, 16:26 výpisy na lcd, zajímalo mě jak to bude chodit ?
- zjištění chodí to Super :lol: a u výpisu jsem zadával pouze umístění prvního znaku ve větě ?!, žádné další pozice a přepisování prázdnýma polema ? nevím, snad je to tím, že se slova ve výpisu řadí za sebe tak, jak jdou v kodu - větě :roll:
netušil jsem, že to půjde tak hladce a bude stačit jen vyměnit serial za lcd v kodu :idea: ?!
Bomba tady je kod s třídou Button :

Kód: Vybrat vše

class Button
{
private:
  byte buttonPin; // pin na kterém je tlačítko připojeno
  boolean buttonState; // nejnovější hodnota načtená ze vstupního pinu
  boolean lastButtonState; // minulá hodnota načtená ze vstupního pinu
  boolean lastTrueButtonState = false;  // předchozí hodnota ošetřeného tlačítka
  unsigned long lastDebounceTime;  // čas posledního změny výstupního pinu
  unsigned int debounceDelay;  // čas debounce prodlevy - tady jsem to změnil na int, zabere to méně místa a myslím že 65535ms na max debounce stačí

  boolean change; // zde si uložíme jestli při kontrole a debounce tlačítka došlo k jeho změně
  boolean rise; // změna z LOW na HIGH
  boolean fall; // změna z HIGH na LOWoo

public:

Button(byte pin, unsigned int delay){ // Konstruktor - při vytvoření objektu nastaví jeho vlastnosti a přepne jeho pin na vstup
  buttonState = false;
  lastButtonState = false;
  lastTrueButtonState = false;
  lastDebounceTime = 0;
  change = false;
  rise = false;
  fall = false;
  buttonPin = pin;
  debounceDelay = delay;
  pinMode(pin, INPUT);
}

void Update(){
  buttonState = digitalRead(buttonPin);  // 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();
    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
    rise = (buttonState != lastTrueButtonState) && (buttonState == HIGH); // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem + zároveň je HIGH tak rise bude true
    fall = (buttonState != lastTrueButtonState) && (buttonState == LOW); // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem + zároveň je LOW tak fall bude true
    change = buttonState != lastTrueButtonState; // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem bude change true
    lastTrueButtonState = buttonState;
  }
}

boolean getState(){
  return lastTrueButtonState; // vrátí 0 nebo 1 podle stavu tlačítka
}

boolean isRising(){
  return rise; // vrátí 1 pouze tehdy pokud v poslední změně doško ke změne z LOW na HIGH
}

boolean isFalling(){
  return fall;  // vrátí 1 pouze tehdy pokud v poslední změně došlo k změně z HIGH na LOW
}

boolean isChange(){
  return change; // 1 vrací jedna při jakékoliv změně na tlačítku
}
  
};
/*--------------------------------------------------------------------------------------------------*/
#define LED1 10
#define LED2 11
#define TLACITKO_SELECT 2
#define TLACITKO_START 3
#define TLACITKO_DEBOUNCE_TIME 50

#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

int mode = 0;
boolean mamBezet = false; // proměnná na uchování stavu programu jestli je start nebo stop
boolean led1svetlo;   //  pomocná proměnná led1svetlo
boolean led2svetlo;   //  pomocná proměnná led2svetlo
unsigned long predchoziMillis;

boolean vypisLinku = true; // proměnná kde si uchovávám jestli je potřeba provést update na seriové lince
boolean vypisLCD = true;

// KONSTRUKCE OBJEKTŮ
Button tlacitkoSelect(TLACITKO_SELECT, TLACITKO_DEBOUNCE_TIME); // tady se volá konstruktor třídy Button - předávám mu PIN a DebounceTime pro dané tlačítko
Button tlacitkoStart(TLACITKO_START, TLACITKO_DEBOUNCE_TIME); // tady se volá konstruktor třídy Button - předávám mu PIN a DebounceTime pro dané tlačítko, každé tlačítko může mít i jiný debounce time

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  
  lcd.begin();   // inicializace LCD
  lcd.backlight();   // zapnutí podsvícení
  
  pinMode(LED1, OUTPUT);  // pin pro LED1 nastaven jako výstup
  pinMode(LED2, OUTPUT);  // pin pro LED2 nastaven jako výstup
  delay(10);
  Serial.println("Program spuštěn.");
  
  lcd.setCursor( 2, 1);
  lcd.print("Program spusten.");
  delay(1500); 
 // lcd.clear(); 
}

void loop() {
  /*TOHLE JE TEĎ NOVĚ OŠETŘENÍ TLAČÍTEK*/
  tlacitkoStart.Update(); // tady se volá metoda, která provede debounce tlačítka a zaktualizuje jeho stavy
  tlacitkoSelect.Update(); // tady se volá metoda, která provede debounce tlačítka a zaktualizuje jeho stavy
 
  if(tlacitkoStart.isRising()){
    mamBezet = !mamBezet;
    vypisLinku = true; // došlo ke změně, je potřeba provést nový výpis na RS232
    vypisLCD = true;
  }
  if(tlacitkoSelect.isRising()){
    mode = (mode + 1) % 5;
    vypisLinku = true; // došlo ke změně, je potřeba provést nový výpis na RS232
    vypisLCD = true;
  }
  /*KONEC OŠETŘENÍ TLAČÍTEK*/
  /*PROVEDENÍ MODE*/
  if(mode == 0){
    if(mamBezet){
      led1svetlo = false;
      led2svetlo = false;    
    }
  }
  if(mode == 1){
    if(mamBezet){
      led1svetlo = true;
      led2svetlo = true;    
    } else {
      led1svetlo = false;
      led2svetlo = false;
    }
  }
  if(mode == 2){
    if(mamBezet){
      if(millis() - predchoziMillis > 1000) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 1000ms ?
       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 led1svetlo - chci aby blikali stejně
       predchoziMillis = millis();   // v tento čas jsem provedl poslední akci
      }
    } else {
      led1svetlo = false;
      led2svetlo = false;
    }
  }
  if(mode == 3){
    if(mamBezet){
      if(millis() - predchoziMillis > 500) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 500ms ?
       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 led1svetlo - chci aby blikali stejně
       predchoziMillis = millis();   // v tento čas jsem provedl poslední akci
      }
    } else {
      led1svetlo = false;
      led2svetlo = false;
    }
  }
  if(mode == 4){
    if(mamBezet){
      if(millis() - predchoziMillis > 250) { // 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
       predchoziMillis = millis();   // v tento čas jsem provedl poslední akci
      }
    } else {
      led1svetlo = false;
      led2svetlo = false;
    }
  }
  /*KONEC PROVEDENI MODE*/
  /*OBSLUHA LED*/
  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
  /*KONEC OBSLUHA LED*/
  /*OBSLUHA RS232 - TY BUDEŠ ASI VYPISOVAT NA LCD DISPLAY*/
  if(vypisLinku){
    Serial.print("MODE : ");
    Serial.print(mode);
    Serial.print(" - ");
    if(mamBezet){
      Serial.println("START");
    } else {
      Serial.println("STOP");
    }
    vypisLinku = false;   
  }
  /*KONEC OBSLUHY RS232*/  
    /*OBSLUHA 20x4 LCD DISPLAY*/
  if(vypisLCD){
    lcd.setCursor( 2, 1);  // tady se zadává pozice výpisu 3 znak, 2 řádek
    lcd.print("MODE : ");
    lcd.print(mode);
    lcd.print(" - ");
    if(mamBezet){      
      lcd.print("START");
    } else {
      lcd.print("STOP ");
    }        
    vypisLCD = false;
  }
  /*KONEC OBSLUHY 20x4 LCD DISPLAY*/
}
snad je všechno v pořádku ? a netvrdím bludy ? později přidám i video. Snad, všiml jsem si, že u mode2 tady není v kodu to 10 sekundové časování do startu blikání ? 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 » 18 led 2020, 19:16

dobrý den, slíbené video : Start / Stop blikání led v mode s výpisem na 20x4 lcd i2c
odkaz : https://www.youtube.com/watch?v=ur_biclS8EA&t=13s

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 » 18 led 2020, 21:43

Vypadá to dobře, akorát jsem musel vypnout zvuk ... ta hudba je děs. Už mi to nedělej, prosím :-) .
Zvládneš zakázat měnit mode, když program bliká ? Všimnul jsem si toho když jsi přešel z 1 na 2, že to nezačlo od 10000ms. A divím se, že se nedivíš tomuhle : "mode = (mode + 1) % 5;" :-) . Jo... a proč máš otočený start a stop u mode0 :-D - prostě je chudák takový ... když ho zapneš, tak vypne LEDky ... a když ho vypneš, tak je vypne taky :-)

Ano, časování spuštění mode2 chybí ... v tom co jsem psal já jsem se nezabýval samotným během programu, ale ukazoval jsem jak funkční třídu a jak ji tak nějak přibližně využít v tvém programu. Použil jsem hromadu tvojeho kódu, poznáváš ho snad :)

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 led 2020, 00:08

dobrý den, za music se omlouvám, budu se snažit ji upravit :P , kod jsem poznal, ale už jsem neřešil tohle :
"mode = (mode + 1) % 5;" ? Mode0 jsem otočil tady, začíná nyní "Mode 0 STOP" - neuvědomil jsem si

Kód: Vybrat vše

 if(mode == 0) {  // ******* LED1,LED2 vypnuto ******** 
     if(mamBezet == false){      
        led1svetlo = false;  // zhasni LED1              
        led2svetlo = false;  // zhasni LED2      
ale pokud přepínám jen jednotlivá mode, tak v jakém stavu skončím tj. Start nebo Stop,
tak mi pokračuje následující mode ?! Takže pokud mode0 Stop , tak stiskáním tlačítka Select bude pořád Stop v dalším a dalším a dalším mode, pokud v jakémkoliv mode nepřepnu tlačítkem Start na Start , tak bude pokračovat mode Start atd.
Zvládneš zakázat měnit mode, když program bliká ?
tehle otázečce moc dobře nerozumím :oops: , ale pokud je myšleno na Objektově Orientované programování, kdy nemusím mít přístup do programu, abych já nebo někdo jiný měnil "knihovnu" , tak to nevím :roll: asi jsem to ještě nezkoušel ? A časování v kodu začíná odpočet od 10000. děkuju
edit : zkoušel jsem i kod s třídou Button a zdá se mi stejný, tedy to přepínání mode a start stop v mode :roll:

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 led 2020, 07:34

dobrý den, tak už jsem vysledoval - máte pravdu, že na videu první odpočet 10s v mode2 nezačíná jak má. Vyzkoušel jsem a je to tím, že jsem předtím probíhal mode dokola a u mode2 nepočkal až dojde odpočet 10 sekund :( no při dalším najetí na mode2 se pokračovalo v odpočtu tam, kde se minule přestalo ?! tak by to asi být nemělo, že ? protože nastavený odpočet času je 10s. Dá se to ošetřit ? určitě někde nějak v podmínce ...? děkuju za postřehy a rady

Odpovědět

Kdo je online

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