A ano ... ne vždy pracuje servo v rozsahu od 0 do 180 ... někdy třeba chceš, aby se ti hýbalo v rozsahu 80-100 ... zapsat na něj jinačí hodnotu by znamenalo že servo někde nabourá, vyrve se z uložení, poláme si zoubky, rozmlátí věc kterou ovládá


 , čučel jsem do toho asi dlouho. Takže,  mode5 se už zobrazuje a servo v něm se vrtí . Doplnil jsem ještě při stisknutí tlačítka Up / Down výpisy na lcd displej, tak nějaké výpisy na seriový monitor - např. stupně natočení serva. Když jsem napsal do mode5 podmínku
 , čučel jsem do toho asi dlouho. Takže,  mode5 se už zobrazuje a servo v něm se vrtí . Doplnil jsem ještě při stisknutí tlačítka Up / Down výpisy na lcd displej, tak nějaké výpisy na seriový monitor - např. stupně natočení serva. Když jsem napsal do mode5 podmínku
 Kód: Vybrat vše
if(buttonStateUp == true){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( 0, 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( 0, 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( 0, 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( 0, 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(buttonStateUp == true){
                               lcd.setCursor( 12, 2 ); 
                                lcd.print(" UP "); 
                             }else{                     
                              lcd.setCursor( 12, 2);
                              lcd.print("STOP");
                             } 
                              Serial.print(pos);  // výpis odečtené hodnoty stupňů serva                                                        
                              Serial.println("° UP ↑");  // výpis na seriový monitor ... za hodnotu 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);
                             }
                              if(buttonStateDown == true){ 
                                lcd.setCursor( 12, 2 ); 
                                lcd.print("DOWN"); 
                             }else{
                              lcd.setCursor( 12, 2);
                              lcd.print("STOP"); 
                             } 
                              Serial.print(pos);                       
                              Serial.println("° DOWN ↓"); 
                                      
                     }
            }                                                    
           
        lcd.setCursor( 0, 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   
 }  
  
  děkuju
  děkujuKód: Vybrat vše
if(mamBezet) {
	// program běží dělám něco
} else {
	// program neběží, dělám něco jiného
}

 
 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 ");
        Serial.println("Mode 0 > STOP"); 
      } else {          
        lcd.setCursor( 12, 2 );
        lcd.print("START");
        Serial.println("Mode 0 > 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");
         Serial.println("Mode 1 > START");             
       } 
         else {       
          led1svetlo = false;         
          led2svetlo = false;
          lcd.setCursor( 12, 2 );
          lcd.print("STOP ");
          Serial.println("Mode 1 > 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   ");
             Serial.println("Mode 2 > 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  ");
                Serial.println("Mode 2 > 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   ");
       Serial.println("Mode 3 > START");
      } else  {
        led1svetlo = false;
        led2svetlo = false;
        lcd.setCursor( 12, 2);
        lcd.print("STOP ");
        Serial.println("Mode 3 > 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");
          Serial.println("Mode 4 > START");   
      } else {              
           led1svetlo = false;
           led2svetlo = false;          
           lcd.setCursor( 12, 2 );
           lcd.print("STOP ");
           Serial.println("Mode 4 > STOP");           
       }      
        lcd.setCursor( 2, 1 );
        lcd.print("Mode 4");                  
      }
     if(mode == 5){  // ********** SERVO **********  
                   // tady jsem zkoušel dát výpis na seriový monitor servo zastaví po puštění tlačítka, po stisku jede dál 
                 Serial.println("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(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   
 }  
  , více jak 3 sekundy. Rád bych upravil i výpis na seriový monitor, který vypisuje stále a stále do změny tohle při modech a jejich stavech :  https://ctrlv.cz/PJDh
 , více jak 3 sekundy. Rád bych upravil i výpis na seriový monitor, který vypisuje stále a stále do změny tohle při modech a jejich stavech :  https://ctrlv.cz/PJDh  
  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 ");
        Serial.println(mamBezet);
 //       Serial.println("Mode 0 → STOP"); 
      } else {          
        lcd.setCursor( 12, 2 );
        lcd.print("START");
        Serial.println(mamBezet);
//        Serial.println("Mode 0 → START");
        }         
        lcd.setCursor( 2, 1 );
        lcd.print("Mode 0");  // základní výpis mode na lcd                   
   }
  
  if(mode == 1) {  // ******* LED1,LED2 zapnuto  ********    
       if(mamBezet == true){                                  
         led1svetlo = true;        
         led2svetlo = true;
         lcd.setCursor( 12, 2 );
         lcd.print("START");
         Serial.println("Mode 1 → START");             
       } 
         else {       
          led1svetlo = false;         
          led2svetlo = false;
          lcd.setCursor( 12, 2 );
          lcd.print("STOP ");
          Serial.println("Mode 1 → STOP");                       
          }
          lcd.setCursor( 7, 1 );
          lcd.print("1");  // není třeba vypisovat celý mode, mění se pouze číslo mode  
   }
                      
  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   ");
             Serial.println("Mode 2 → 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  ");
                Serial.println("Mode 2 → STOP");
                led1svetlo = false;
                led2svetlo = false;            
                }                                     
                lcd.setCursor( 7, 1 );
                lcd.print("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   ");
       Serial.println("Mode 3 → START");
      } else  {
        led1svetlo = false;
        led2svetlo = false;
        lcd.setCursor( 12, 2);
        lcd.print("STOP ");
        Serial.println("Mode 3 → STOP");   
      }
       lcd.setCursor( 7, 1 );
       lcd.print("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");
          Serial.println("Mode 4 → START");   
      } else {              
           led1svetlo = false;
           led2svetlo = false;          
           lcd.setCursor( 12, 2 );
           lcd.print("STOP ");
           Serial.println("Mode 4 → STOP");           
       }      
        lcd.setCursor( 7, 1 );
        lcd.print("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);                               
                             }
                     }
                 
             }   // ********* VÝPISY NA LCD A SER.MONITOR SNÍŽÍ RYCHLOST SERVA ?! *********
 //                   Serial.println(pos); // výpis na seriový monitor pro zjištění času přejezdu serva 
                    lcd.setCursor( 7, 1);  // nastavení cursoru na pozici výpisu
                    lcd.print("5"); // není třeba vypisovat celý mode, mění se pouze číslo mode 
                 if(mamBezet){
                   lcd.setCursor( 12, 2);
                   lcd.print("START");                  
 /*                  Serial.println("Mode 5 → START");
                 } else {
                   lcd.setCursor( 12, 2);
                   lcd.print("STOP ");
                   Serial.println("Mode 5 → STOP");
                 }       */   
                 }       
     }  
   
    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   
 }  
  ... já si v tom programu pamatuji, kdy se změnily informace. Když se změní, vypíšu (bohužel tady musím) kompletně vše na seriovou linku a pak to zapamatování zase vynuluji. Displej má vlastní procesor a vlastní paměť, proto ho občas je lepší nepřepisovat celý, ale využít toho, že si umí zapamatovat něco, co do něj nadřazený procesor zapsal předtím.
 ... já si v tom programu pamatuji, kdy se změnily informace. Když se změní, vypíšu (bohužel tady musím) kompletně vše na seriovou linku a pak to zapamatování zase vynuluji. Displej má vlastní procesor a vlastní paměť, proto ho občas je lepší nepřepisovat celý, ale využít toho, že si umí zapamatovat něco, co do něj nadřazený procesor zapsal předtím.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;  
int mode = 0;
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 
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
boolean vypisLCD = true; // proměnná kde si uchovávám jestli je potřeba provést update na lcd displeji
 
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(1500); 
}  
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
          vypisLCD = true;
        }          
       }   
     }
       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          
         vypisLCD = true;  
         }             
       }  
     }
       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(); 
          vypisLCD = true;  // příkaz vypisuje funkci tlačítka, tedy start / stop
          Serial.println("stisk START/STOP");  // výpis na seriový monitor stisknutí tlačítka START/STOP                
      }
        // 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 
     }                        
   }
  
  if(mode == 1) {  // ******* LED1,LED2 zapnuto  ********    
       if(mamBezet == true){                                          
         led1svetlo = true;        
         led2svetlo = true;
       } else {       
          led1svetlo = false;         
          led2svetlo = false; 
         }
  }
                      
  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?
               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 {                                    
                 led1svetlo = false;
                 led2svetlo = false;            
                } 
        }       
  }
   
  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 
        } 
      } else {
        led1svetlo = false;
        led2svetlo = false;   
      }        
     } 
                
     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 
          }   
         } else {              
           led1svetlo = false;
           led2svetlo = false;         
          }                       
     }
     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 
    /*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*/
 }  
  Super, Super, Super
 Super, Super, Super   
  , bylo to efektní a hned bude jasné, že se něco děje a kod nezamrznul
, bylo to efektní a hned bude jasné, že se něco děje a kod nezamrznul   , rád bych taky na lcd vypsal, že mode5 se týká serva a které tlačítko stisknout, aby bylo hned jasné kam se servo natočí a nemačkal prvně naprázdno
  , rád bych taky na lcd vypsal, že mode5 se týká serva a které tlačítko stisknout, aby bylo hned jasné kam se servo natočí a nemačkal prvně naprázdno   , ale to jen když mi to nebude ovlivńovat rychlost serva atd.
 , ale to jen když mi to nebude ovlivńovat rychlost serva atd. a vypisuje se po jedné sekundě
 a vypisuje se po jedné sekundě
Kód: Vybrat vše
  if(mode == 0) {  // ******* LED1,LED2 vypnuto ******** 
     if(mamBezet == false){      
        led1svetlo = false;  // zhasni LED1              
        led2svetlo = false;  // zhasni LED2             
        lcd.setCursor( 12, 2 );
        lcd.print("STOP ");
        if(millis() >= cas + 1000){  // nastavení času 1000 ms pro výpis na seriový monitor
          cas = millis();  // uložení času od začátku programu do proměnné cas 
          Serial.println("Mode 0 → STOP");  // výpis zprávy na seriový monitor                    
        }                  
      } : https://www.youtube.com/watch?v=Xbaoa8VWUhU
 : https://www.youtube.com/watch?v=Xbaoa8VWUhUKód: Vybrat vše
 /*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 ");
    }
    
    lcd.setCursor( 2, 2); // Nastavím kurzor na místo kde chci vypsat informační text
    if(mode == 0){ // Dle mode vyberu který
    	lcd.print("LED Vypnute");
    }
    if(mode == 1){ // Dle mode vyberu který
    	lcd.print("LED Zapnute");
    }
    if(mode == 2){ // Dle mode vyberu který
	// tady si to musím pohlídat - tohle mode má totiž tři stavy, které chci vypsat - takže si musím zjistit v jakém stavu je
	// pokud program spuštěný není ... mamBezet == false ... chci si vypsat, že to je blikání s čekáním
	// pokud je spuštěný program mamBezet == true ... ale ještě nedošlo k uplynutí toho čekacího času, chci vypsat, že program se spustí za
	// nějakou dobu - takže vlastně i tu dobu si budu muset někde zapamatovat, nebo ji znovu zase vypočítat
	// pokud je spuštěný program mamBezet a už došlo k uplynutí zpoždění, tak chci vypsat, že LEDky blikají
    }
    // a tak dále ... 
    
    vypisLCD = false;
  }
  /*KONEC OBSLUHY 20x4 LCD DISPLAY*/
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á
#define LED3  5
#define LED4  6
#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;  
int mode = 0;
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 
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
boolean vypisLCD = true;  // proměnná kde si uchovávám jestli je potřeba provést update na lcd displeji
void setup() {
  
  pinMode(LED1, OUTPUT);  // pin pro LED1 nastaven jako výstup
  pinMode(LED2, OUTPUT);  // pin pro LED2 nastaven jako výstup
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  
  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(1500); 
  }  
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
          vypisLCD = true;
        }          
       }   
     }
       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          
         vypisLCD = true;  
         }             
       }  
     }
       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(); 
          vypisLCD = true;  // příkaz vypisuje funkci tlačítka, tedy start / stop
          Serial.println("stisk START/STOP");  // výpis na seriový monitor stisknutí tlačítka START/STOP                
      }
        // 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 
     }                        
   }
  
  if(mode == 1) {  // ******* LED1,LED2 zapnuto  ********    
       if(mamBezet == true){                                          
         led1svetlo = true;        
         led2svetlo = true;
       } else {       
          led1svetlo = false;         
          led2svetlo = false; 
         }
  }
                      
  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?            
               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 {                                    
                 led1svetlo = false;
                 led2svetlo = false;                               
                 vypisLCD = true;                                                                           
                } 
        }       
  }
   
  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 
        } 
      } else {
        led1svetlo = false;
        led2svetlo = false;   
      }        
     } 
                
     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 
          }   
         } else {              
           led1svetlo = false;
           led2svetlo = false;         
          }                       
     }
     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(LED4, pos < 175);  // svítí, když je servo v pozici Up - 175° stupňů
                     digitalWrite(LED3, pos > 5);  // svítí, když je servo v pozici Down - 5° stupňů  
                     }
             }                
             if(mamBezet == false){  // když je mode5 ve stavu Stop, tak ledky jsou zhasnuté            
               digitalWrite(LED4,false);
               digitalWrite(LED3,false);                     
     } 
   
    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 
    /*OBSLUHA 20x4 LCD DISPLAY*/
  if(vypisLCD){
    lcd.setCursor( 0, 1);  // tady se zadává pozice výpisu 3 znak, 2 řádek  BYLO 2,1
    lcd.print("  Mode ");
    lcd.print(mode);
    lcd.print("  -  ");       
    if(mamBezet){      
      lcd.print("START");
    } else {      
      lcd.print("STOP ");
     }
     
    if(mode == 2){
        if(millis() - buttonTime > 10000){
          mamBezet == true;    
            lcd.setCursor( 3, 2);
            lcd.print("    ");
        } else {              
           lcd.setCursor( 3, 2);
           lcd.print((10000 - (millis() - buttonTime)));  // jestli chci vědět jak dlouho budu ještě čekat vypíšu 10000 - (millis() - buttonTime)
          if( mamBezet == false){
            lcd.setCursor( 3, 2);
            lcd.print("    ");
          }
       }
    } 
        
    if(mode == 4){
      lcd.setCursor( 2, 2);
      lcd.print("               ");  // vymazání výpisu servo       
    } 
    
    if(mode == 5){                      
      lcd.setCursor( 2, 2);
      lcd.print("servo  "); 
    }   
  vypisLCD = false;    
  }     
  /*KONEC OBSLUHY 20x4 LCD DISPLAY*/
 }  
  
  https://www.youtube.com/watch?v=Xy13MeJw3nw
  https://www.youtube.com/watch?v=Xy13MeJw3nwUživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host