Mini CNC osa Z

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

Re: Mini CNC osa Z

Příspěvek od kiRRow » 19 led 2020, 08:46

Děje se totiž to, že vyselektuješ mode1, pak dáš start, uběhne 5vteřin a pak přepneš selectem na mode2 a to odpočítává od zbývajících 5ti vteřin.
Ošetříš to právě tak, že "uživateli" zakážeš měnit mode, kdyz program má běžet.

mode = (mode + 1) % 5; - tento zápis se stará o to aby se mode zvyšovalo ale nikdy nebylo větší než 4. Používá k tomu matematickou operaci modulo=zbytek po dělení.

Mno a jak to zakázat ?
Buď budeš kompletně ignorovat tlačítko select, když mamBezet == true ... ale to by byla škoda ... půlka tlačítek by v polovině programu byla vyřazena z funkce.

Já bych šel cestou, kdy bych při mamBezet == true přeskočil ten příkaz co přičítá mode.

A nebo se to dá vymyslet i tak, že když během blikání někdo přepne select, tak se sice mode zvýší, ale zároveň dojde k zastavení blikání a bude nutno znovu jej spustit pomocí start
------
Řešení je tak snadné, že může být až složité na něj přijí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 led 2020, 11:07

dobrý den, upravil jsem kod pro : Přeskočení mode2 v kodu Start / Stop blikání led . Jestli jste to myslel takto, budu mít velkou radost, zde je kod :

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 == false){      
        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) && (mamBezet = false)) {  // ******* LED1,LED2 blikání rychlé  ******* 
    
  //        if(mamBezet == true) {   // ZRUŠENÁ PODMÍNKA A PŘESUNUTA VIZ.VÝŠE K MODE2                            
           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   
 }  
 
upraveno pouze mode2, mohl jsem to možná udělat i jinak, ale tohle mě "hned" napadlo
tady je odkaz na video, jak kod nyní pracuje : https://www.youtube.com/watch?v=ynZxJm-QWY4
jen mi uniká , proč jsem měl zakázat mode2 ? pravda je, že se pořád mám co učit a doufám, že se ještě dlouho budu :lol:
děkuju
ps: hudbu jsem u videa zrušil ;)

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

Re: Mini CNC osa Z

Příspěvek od kiRRow » 19 led 2020, 12:22

stačilo jen upravit toto

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
takhle

Kód: Vybrat vše

	if(mamBezet == false) {
	         mode++; // přičte k MODE hodnotu 1      
               
         	if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
         }

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, 17:57

dobrý den, tak jsem upravil kod, jak radí kiRRow a přidáním podmínky je dosaženo nejenom toho, že se odpočet 10 s vždy provede celý, ale taky toho, že se mode dají přepnout jen ve stavu Stop ! což je úžasné a profi :lol:
Vemte si například ovládání bezpečnostních modulů, motorů, zdvihacích zařízení atd... .
Tady je kod s úpravou tj. provede se celý nastavený odpočet času v mode2 + mode se přepnou pouze ve stavu Stop :

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) { 
                               // přidáním podmínky docílím vždy celého odpočtu času 10s !
      if(mamBezet == false) {  // a taky přepnutí mode jen tehdy, když jsou mode ve Stop       
         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 == false){      
        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;
         Serial.println("Mode:1 - LED1 Zap");
         led2svetlo = true;
  //       Serial.println(11);
         lcd.setCursor( 12, 2 );
         lcd.print("START");             
       } 
         else {       
          led1svetlo = false;
          Serial.println("Mode:1 - LED1 Vyp");
          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) {   // ZRUŠENÁ PODMÍNKA mamBezet    - zmena true za false                          
           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   
 }  
 
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 » 22 led 2020, 09:28

dobrý den, do kodu jsem přidal třetí tlačítko, které má za úkol odčítat mode tedy selectDown. Druhé je přejmenováno na selectUp. Tlačítko Start/Stop v mode zůstává. Chodí to, mode Up od mode0 do mode4 a tlačítko Down odčítá. Problém mi nastavá tehdy, když Down odečte na mode0 a při jeho dalším stisknutí např. 6x jakoby do mínusu, musím taky potom 6x stisknout Up , abych se dostal zpět na mode0 ? Stiskám tlačítka v podstatě naprázdno a mohl bych asi do nekonečna ? :roll:

Kód: Vybrat vše

#define buttonSelect 2   // číslo pinu tlačítka SELECT pro výběr MODE nahoru
#define buttonStart 3   // číslo pinu tlačítka START/STOP - červené
#define buttonSelectDown 4   // číslo pinu tlačítka pro výběr MODE dolů
#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 buttonStateDown = false;  
boolean lastButtonStateDown = false;  
boolean lastTrueButtonStateDown = false;  

boolean mamBezet = false;

unsigned long lastDebounceTime = 0;  // čas posledního změny výstupního pinu
unsigned long lastDebounceTime2 = 0;
unsigned long lastDebounceTime3 = 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
  pinMode(buttonSelectDown, INPUT);  //pin pro tlačítko buttonSelectDown 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(){
  
 //-------------- debounce pro tlačítko Select Up ----------
  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) { 
                               // přidáním podmínky - začátek počítání vždy např. od 10s
      if(mamBezet == false) {  // a taky přepnutí mode jen tehdy, když jsou mode ve Stop 
         mode++; // přičte k MODE hodnotu 1 
                   
//------- zrušením podmínky mode > 4 -------- Up dojde do mode=4  a  Down vrací zpět na mode=0 , nechodí dokola 0,1,2,3,4,0,1 atd. -------      
//         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
  //---------------konec ošetření tlačítka Select Up -----------

 //-------------- debounce pro tlačítko Select Down ----------
  buttonStateDown = digitalRead(buttonSelectDown);  // přečtení stavu tlačítka    
  if (buttonStateDown != lastButtonStateDown) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime3 = millis();
  }                            
  if ((millis() - lastDebounceTime3) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (buttonStateDown != lastTrueButtonStateDown) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             
  
     if(buttonStateDown == true) { 
                               // přidáním podmínky docílím vždy celého odpočtu času 10s !
      if(mamBezet == false) {  // a taky přepnutí mode jen tehdy, když jsou mode ve Stop       
         mode--; // odečte od MODE hodnotu 1     
       }  
     }
       lastTrueButtonStateDown = buttonStateDown;  // uložím si nový pravý ošetřený stav tlačítka           
    } 
  }     
  lastButtonStateDown = buttonStateDown; // 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 Select Down ---------- 
  
  //-------------- debounce pro tlačítko START/STOP ----------  
    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/Stop ----------
   
                       
  if(mode == 0) {  // ******* LED1,LED2 vypnuto ******** 
     if(mamBezet == false){      
        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;
         Serial.println("Mode:1 - LED1 Zap");
         led2svetlo = true;
         lcd.setCursor( 12, 2 );
         lcd.print("START");             
       } 
         else {       
          led1svetlo = false;
          Serial.println("Mode:1 - LED1 Vyp");
          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) {   // ZRUŠENÁ PODMÍNKA mamBezet    - zmena true za false                          
           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 = false;
                led2svetlo = false;            
                }                                     
                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   
 }  
 
problém je i u mode4 a stiskání tlačítka dál ? jak tohle ošetřit ? 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 » 22 led 2020, 14:58

dobrý den, upraveny /přidány /do kodu podmínky, u problému dalšího stisknutí tlačítka u mode4 a mode0. Nyní při mode4 nebo mode0 tlačítka ihned reagují na stisknutí nahoru a dolů v mode. :lol:
tady je kod pro : Up + Down + Start/Stop v mode blikání led s výpisem na LCD 4x20 i2c

Kód: Vybrat vše

#define buttonSelect 2   // číslo pinu tlačítka SELECT pro výběr MODE nahoru
#define buttonStart 3   // číslo pinu tlačítka START/STOP - červené
#define buttonSelectDown 4   // číslo pinu tlačítka pro výběr MODE dolů
#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 buttonStateDown = false;  
boolean lastButtonStateDown = false;  
boolean lastTrueButtonStateDown = false;  

boolean mamBezet = false;

unsigned long lastDebounceTime = 0;  // čas posledního změny výstupního pinu
unsigned long lastDebounceTime2 = 0;
unsigned long lastDebounceTime3 = 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
  pinMode(buttonSelectDown, INPUT);  //pin pro tlačítko buttonSelectDown 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(){
  
 //-------------- debounce pro tlačítko Select Up ----------
  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) { 
                               // přidáním podmínky - začátek počítání vždy např. od 10s
      if(mamBezet == false) {  // a taky přepnutí mode jen tehdy, když jsou mode ve Stop 
        if(mode < 4) {  // když je hodnota mode menší než 4
         mode++; // přičte k mode hodnotu 1   
         }          
       }   
     }
       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
  //---------------konec ošetření tlačítka Select Up -----------

 //-------------- debounce pro tlačítko Select Down ----------
  buttonStateDown = digitalRead(buttonSelectDown);  // přečtení stavu tlačítka    
  if (buttonStateDown != lastButtonStateDown) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime3 = millis();
  }                            
  if ((millis() - lastDebounceTime3) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (buttonStateDown != lastTrueButtonStateDown) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             
  
     if(buttonStateDown == true) { 
                               // přidáním podmínky docílím vždy celého odpočtu času 10s !
      if(mamBezet == false) {  // a taky přepnutí mode jen tehdy, když jsou mode ve Stop 
        if(mode > 0) {  // když je mode větší než 0
         mode--; // odečte od mode hodnotu 1 
         }             
       }  
     }
       lastTrueButtonStateDown = buttonStateDown;  // uložím si nový pravý ošetřený stav tlačítka           
    } 
  }     
  lastButtonStateDown = buttonStateDown; // 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 Select Down ---------- 
  
  //-------------- debounce pro tlačítko START/STOP ----------  
    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/Stop ----------
   
                       
  if(mode == 0) {  // ******* LED1,LED2 vypnuto ******** 
     if(mamBezet == false){      
        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;
         Serial.println("Mode:1 - LED1 Zap");
         led2svetlo = true;
         lcd.setCursor( 12, 2 );
         lcd.print("START");             
       } 
         else {       
          led1svetlo = false;
          Serial.println("Mode:1 - LED1 Vyp");
          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) {   // ZRUŠENÁ PODMÍNKA mamBezet    - zmena true za false                          
           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 = false;
                led2svetlo = false;            
                }                                     
                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   
 }  
 
tady odkaz na video : https://www.youtube.com/watch?v=4aeQUBd ... e=youtu.be
děkuju

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

Re: Mini CNC osa Z

Příspěvek od kiRRow » 22 led 2020, 17:42

Takže jsi na to přišel sám ? :-) ... to je pocit, když něco vymyslíš a ono to funguje, co ? :-)

Mno a teď k tomu přidělej to servo, kterým vlastně celá tahle konverzace začala. :-D
Když to přepneš do mode5, a dáš start, tak pomocí selectUP a selectDOWN budeš moct nastavit pozici serva :-D

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 25 led 2020, 21:04

dobrý den, super pocit, když něco funguje ;) je to k nezaplacení, no radoval jsem se chvilku, jen do té doby, než jsem se pokusil v mode5 přidat servo, :oops: Nemůžu na to přijít. Tady se to aspoň trochu vrtí :cry:

Kód: Vybrat vše

#define buttonSelectUp 2   // číslo pinu tlačítka SELECT pro výběr MODE nahoru
#define buttonStart 3   // číslo pinu tlačítka START/STOP - červené
#define buttonSelectDown 4   // číslo pinu tlačítka pro výběr MODE dolů
#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

#include <Servo.h>  // knihovna pro ovládání serva
Servo myservo;  // instance třídy servo viz. Objektově Orientované Programování
int pos = 0;  // proměnná úhlu natočení serva


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

boolean buttonStateStart = false;
boolean lastButtonStart = false;
boolean lastTrueButtonStart = false;

boolean buttonStateDown = false;  
boolean lastButtonStateDown = false;  
boolean lastTrueButtonStateDown = false;  

boolean mamBezet = false;

unsigned long lastDebounceTime = 0;  // čas posledního změny výstupního pinu
unsigned long lastDebounceTime2 = 0;
unsigned long lastDebounceTime3 = 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(buttonSelectUp, INPUT);  // pin pro tlačítko buttonSelect nastaveno jako vstup
  pinMode(buttonStart, INPUT);  // pin pro tlačítko buttonStart nastaveno jako vstup
  pinMode(buttonSelectDown, INPUT);  //pin pro tlačítko buttonSelectDown nastaveno jako vstup

  myservo.attach(9);  // pin pro servo

  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(){
  
 //-------------- debounce pro tlačítko Select Up ----------
  buttonStateUp = digitalRead(buttonSelectUp);  // přečtení stavu tlačítka    
  if (buttonStateUp != lastButtonStateUp) { // 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 (buttonStateUp != lastTrueButtonStateUp) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             
  
     if(buttonStateUp == true) { 
                               // přidáním podmínky - začátek počítání vždy např. od 10s
      if(mamBezet == false) {  // a taky přepnutí mode jen tehdy, když jsou mode ve Stop 
        if(mode < 5) {  // když je hodnota mode menší než 5
         mode++; // přičte k mode hodnotu 1
        }          
       }   
     }
       lastTrueButtonStateUp = buttonStateUp;  // uložím si nový pravý ošetřený stav tlačítka           
    } 
  }     
  lastButtonStateUp = buttonStateUp; // 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 Select Up -----------

 //-------------- debounce pro tlačítko Select Down ----------
  buttonStateDown = digitalRead(buttonSelectDown);  // přečtení stavu tlačítka    
  if (buttonStateDown != lastButtonStateDown) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime3 = millis();
  }                            
  if ((millis() - lastDebounceTime3) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (buttonStateDown != lastTrueButtonStateDown) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             
  
     if(buttonStateDown == true) { 
                               // přidáním podmínky docílím vždy celého odpočtu času 10s !
      if(mamBezet == false) {  // a taky přepnutí mode jen tehdy, když jsou mode ve Stop 
        if(mode > 0) {  // když je mode větší než 0
         mode--; // odečte od mode hodnotu 1 
         }             
       }  
     }
       lastTrueButtonStateDown = buttonStateDown;  // uložím si nový pravý ošetřený stav tlačítka           
    } 
  }     
  lastButtonStateDown = buttonStateDown; // 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 Select Down ---------- 
  
  //-------------- debounce pro tlačítko START/STOP ----------  
    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/Stop ----------
   
                       
  if(mode == 0) {  // ******* LED1,LED2 vypnuto ******** 
     if(mamBezet == false){      
        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) {   // ZRUŠENÁ PODMÍNKA mamBezet    - zmena true za false                          
           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 = false;
                led2svetlo = false;            
                }                                     
                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");                  
      }

     if(mode == 5){  // ******* SERVO *******                    
      if(buttonStateStart == false){ 
//        if(buttonSelectUp == true){
        if(buttonStateUp == false){             
         if (pos <= 175) {        
            pos +=1;  
            myservo.write(pos);             
         }
        }
//       } 
//      if(buttonSelectDown == true){                             
         if(buttonStateDown == false){  
           if(pos >= 5){          
              pos -=1;  
              myservo.write(pos);              
            }
          }
//        } 
        lcd.setCursor( 12, 2);
        lcd.print("STOP "); 
        if(mamBezet == true){
          lcd.setCursor( 12, 2);
          lcd.print("START");                                          
        }   
       }              
       lcd.setCursor( 2, 1 );
       lcd.print("Mode 5");    
     }
    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   
 }  
 
v mode5 jsou zakomentované příkazy, protože :?: , výpisy jsem odstranil , zpomalovaly mi servo, aspoň mi to tak připadalo.Taky mám servo napájené z pevného zdroje, kdy +5V a GND zdroje jdou přímo na servo, žlutý na pin9 Arduina a GND ze zdroje a Arduina jsou propojeny, problikával mi lcd, díky odběru serva a 9V baterka to dlouho neudržela. Taky mě zarazilo, že když jsem přepnul na mode5, tak se servo natočilo na polovinu svoji dráhy ? Nezačalo od 0 ? Když jsem si nechal vypsat pos na lcd, tak ty úhly neseděly s úhly na servu . děkuju

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

Re: Mini CNC osa Z

Příspěvek od kiRRow » 26 led 2020, 06:47

Kód: Vybrat vše

if(mode == 5){//mode 5
	if(mamBezet == true) {// program spuštěn
	
		if(lastTrueButtonStateUp == true){// stisknuto tlačítko selectUp
			//pokud můžu a nebourám servem do krajní pozice, měním pozici serva
		}
		if(lastTrueButtonStateDown == true){// stisknuto tlačítko selectDown
			//pokud můžu a nebourám servem do druhé krajní pozice, měním pozici serva druhým směrem		
		}

	}
}

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 led 2020, 09:15

dobrý den, upravil jsem kod - mode5, ale vůbec mě to nepustí na ten mode5 :cry:

Kód: Vybrat vše

#define buttonSelectUp 2   // číslo pinu tlačítka SELECT pro výběr MODE nahoru
#define buttonStart 3   // číslo pinu tlačítka START/STOP - červené
#define buttonSelectDown 4   // číslo pinu tlačítka pro výběr MODE dolů
#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

#include <Servo.h>  // knihovna pro ovládání serva
Servo myservo;  // instance třídy servo viz. Objektově Orientované Programování
int pos = 0;  // proměnná úhlu natočení serva

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

boolean buttonStateStart = false;
boolean lastButtonStart = false;
boolean lastTrueButtonStart = false;

boolean buttonStateDown = false;  
boolean lastButtonStateDown = false;  
boolean lastTrueButtonStateDown = false;  

boolean mamBezet = false;

unsigned long lastDebounceTime = 0;  // čas posledního změny výstupního pinu
unsigned long lastDebounceTime2 = 0;
unsigned long lastDebounceTime3 = 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(buttonSelectUp, INPUT);  // pin pro tlačítko buttonSelect nastaveno jako vstup
  pinMode(buttonStart, INPUT);  // pin pro tlačítko buttonStart nastaveno jako vstup
  pinMode(buttonSelectDown, INPUT);  //pin pro tlačítko buttonSelectDown nastaveno jako vstup

  myservo.attach(9);  // pin pro servo

  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(){
  
 //-------------- debounce pro tlačítko Select Up ----------
  buttonStateUp = digitalRead(buttonSelectUp);  // přečtení stavu tlačítka    
  if (buttonStateUp != lastButtonStateUp) { // 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 (buttonStateUp != lastTrueButtonStateUp) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             
  
     if(buttonStateUp == true) { 
                               // přidáním podmínky - začátek počítání vždy např. od 10s
      if(mamBezet == false) {  // a taky přepnutí mode jen tehdy, když jsou mode ve Stop 
        if(mode < 5) {  // když je hodnota mode menší než 5
         mode++; // přičte k mode hodnotu 1
        }          
       }   
     }
       lastTrueButtonStateUp = buttonStateUp;  // uložím si nový pravý ošetřený stav tlačítka           
    } 
  }     
  lastButtonStateUp = buttonStateUp; // 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 Select Up -----------

 //-------------- debounce pro tlačítko Select Down ----------
  buttonStateDown = digitalRead(buttonSelectDown);  // přečtení stavu tlačítka    
  if (buttonStateDown != lastButtonStateDown) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime3 = millis();
  }                            
  if ((millis() - lastDebounceTime3) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (buttonStateDown != lastTrueButtonStateDown) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             
  
     if(buttonStateDown == true) { 
                               // přidáním podmínky docílím vždy celého odpočtu času 10s !
      if(mamBezet == false) {  // a taky přepnutí mode jen tehdy, když jsou mode ve Stop 
        if(mode > 0) {  // když je mode větší než 0
         mode--; // odečte od mode hodnotu 1 
         }             
       }  
     }
       lastTrueButtonStateDown = buttonStateDown;  // uložím si nový pravý ošetřený stav tlačítka           
    } 
  }     
  lastButtonStateDown = buttonStateDown; // 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 Select Down ---------- 
  
  //-------------- debounce pro tlačítko START/STOP ----------  
    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/Stop ----------
   
                       
  if(mode == 0) {  // ******* LED1,LED2 vypnuto ******** 
     if(mamBezet == false){      
        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) {   // ZRUŠENÁ PODMÍNKA mamBezet    - zmena true za false                          
           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 = false;
                led2svetlo = false;            
                }                                     
                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");                  
      }

     if(mode == 5){  // ********** SERVO **********
             if(mamBezet == true) {  // program spuštěn 
     
                     if(lastTrueButtonStateUp == true){  // stisknuto tlačítko selectUp
                             //pokud můžu a nebourám servem do krajní pozice, měním pozici serva
                             if(pos <= 175){
                              pos +=1;
                              myservo.write(pos);
                             }
                     }
                     if(lastTrueButtonStateDown == true){  // stisknuto tlačítko selectDown
                             //pokud můžu a nebourám servem do druhé krajní pozice, měním pozici serva druhým směrem 
                             if(pos >= 5){
                              pos -=1;
                              myservo.write(pos);  
                             }
                     }
                 
             }
     }  
   
    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   
 }  
 
pochopil jsem správně, že pod ... //pokud můžu a nebourám servem do druhé krajní pozice, měním pozici serva druhým směrem....má být natáčení serva do "skoro" krajní pozice ? děkuju

Odpovědět

Kdo je online

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