dobrý den, pokud byl myslený tento problém, tak si ho můžete prohlédnout na tomto odkazu :
https://www.youtube.com/watch?v=-NOj_37gHMg
je na něm vidět problém, kdy po stisknutí tlačítka svítí LEDky a když pustím tlačítko, tak LEDky zhasnou. Není tak splněná podmínka jedním tlačítkem Zap/Vyp v mode. Kod přidávám zde :
Kód: Vybrat vše
#define buttonSelect 2   // číslo pinu tlačítka SELECT pro výběr MODE
#define buttonStart 3   // číslo pinu tlačítka START
#define LED1  10    // číslo pinu LED1 zelená
#define LED2  11    // číslo pinu LED2 červená
#include <Wire.h>   // knihovny pro LCD přes I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);   // nastavení adresy I2C (0x27), počtu znaků, řádků LCD 20x4
boolean buttonState = false;  // nejnovější hodnota načtená ze vstupního pinu
boolean lastButtonState = false;  // předchozí hodnota načtení ze vstupního pinu
boolean lastTrueButtonState = false;  // předchozí hodnota ošetřeného tlačítka
// Následné proměnné jsou typu long, jelikož čas měřený v milisekundách se 
//rychle změní na větší číslo, jež nemůže být uloženo v int
unsigned long lastDebounceTime = 0;  // čas posledního změny výstupního pinu
unsigned long debounceDelay = 50;  // čas debounce prodlevy 
byte mode = 0;    // 0 - Vypnuto, 1 - Zapnuto, 2 - Blikání rychlé, 3 - Blikání pomalé, 4 - Blikání střídavé
unsigned long aktualniMillis;   //aktualní čas
unsigned long predchoziMillis1;   // předchozí čas pro rychle blikání
unsigned long predchoziMillis2;   // předchozí čas pro pomalé blikání
unsigned long predchoziMillis3;   // předchozí čas pro střídavé blikání
unsigned long cas = 0;
long buttonTime;      //  čas začátku stisknutí tlačítka
boolean led1svetlo;   //  pomocná proměnná led1svetlo
boolean led2svetlo;   //  pomocná proměnná led2svetlo
 
void setup() {
  
  pinMode(LED1, OUTPUT);  // pin pro LED1 nastaven jako výstup
  pinMode(LED2, OUTPUT);  // pin pro LED2 nastaven jako výstup
  pinMode(buttonSelect, INPUT);  // pin pro tlačítko buttonSelect nastaveno jako vstup
  pinMode(buttonStart, INPUT);  // pin pro tlačítko buttonStart nastaveno jako vstup
  lcd.begin();   // inicializace LCD
  lcd.backlight();   // zapnutí podsvícení
  lcd.setCursor ( 0, 1 );   // nastavení kursoru na druhý znak, druhý řádek  
  lcd.print(" LED1,LED2   ");  // vypsání textu na lcd
}  
void loop(){
  
  
  /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  buttonState = digitalRead(buttonSelect);  // přečtení stavu tlačítka    
  if (buttonState != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime = millis();
  }                             
  if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (buttonState != lastTrueButtonState) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             
       
     if(buttonState == true) { 
         mode++; // přičte k MODE hodnotu 1        
          buttonTime = millis(); 
              
         if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
      } 
       lastTrueButtonState = buttonState;  // uložím si nový pravý ošetřený stav tlačítka           
    } 
  }   
  
  lastButtonState = buttonState; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
                       
  if(mode == 0) {
    // ******* LED1,LED2 vypnuto ********    
     led1svetlo = false;  // zhasni LED1              
     led2svetlo = false;  // zhasni LED2 
      lcd.setCursor( 3, 2 );   // nastavení kursoru na šestý znak, třetí řádek
      lcd.print("  jsme zhasnute ");   // vypsání textu na lcd 
      lcd.setCursor( 1, 3 );
      lcd.print("Mode 0");          
   }
  
  if(mode == 1) {
    // ******* LED1,LED2 zapnuto  ********  
    if (digitalRead(buttonStart) == 1) {  // když je stisknuto tlačítko, tak rožni ledky                           
       led1svetlo = true;  // rožni LED1             
       led2svetlo = true;  // rožni LED2           
       lcd.setCursor( 5, 2 );
       lcd.print(" uz svitime !"); 
    } 
    
    if (digitalRead(buttonStart) == 0) {  // když není stisknuto tlačítlo, tak zhasni ledky    
      led1svetlo = false;
      led2svetlo = false;
      lcd.setCursor( 3, 2 );   // nastavení kursoru na šestý znak, třetí řádek
      lcd.print("  jsme zhasnute ");   // vypsání textu na lcd 
    }
       lcd.setCursor( 1, 3 );
       lcd.print("Mode 1");           
   }
                    
  if(mode == 2){ 
    // ******* LED1,LED2 blikání rychlé  *******     
    if(millis() - buttonTime > 10000){  // zjistím si jestli je čas něco provést, uběhlo už 10s od poslední akce?
      lcd.setCursor( 0, 1 );
      lcd.print(" LED1,LED2     ");
      lcd.setCursor ( 5, 2 );
      lcd.print("blikame rychle");                   
    
     aktualniMillis = millis();  // podívám se na hodinky - aktuální čas   
     if(aktualniMillis - predchoziMillis1 > 200) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 200ms od poslední akce?  
      if (led1svetlo) {          
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2            
            }                
            predchoziMillis1 = aktualniMillis;   // v tento čas jsem provedl poslední akci
      }         
     } else {
      // vypis : "blikat začneme" - jestli chci vědět jak dlouho budu ještě čekat, tak vypíšu 10000 - (millis() - buttonTime)
      lcd.setCursor ( 1, 1 );
      lcd.print("blikat zacneme");
      lcd.setCursor( 5, 2 );
      lcd.print(" za ");
      lcd.setCursor( 9, 2 );
      lcd.print(10000 - (millis() - buttonTime));   // zobrazí se odpočet do blikání led v ms 
      lcd.setCursor( 13, 2 );
      lcd.print(" ms  "); 
      lcd.setCursor( 1, 3 );
      lcd.print("Mode 2");           
    }                       
   }            
          
  if(mode == 3) { 
    // ******* LED1,LED2 blikání pomalé  *******
    aktualniMillis = millis();  //podívám se na hodinky - aktuální čas  
   if(aktualniMillis - predchoziMillis2 > 500) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 500ms od poslední akce?  
     if (led2svetlo) {          
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2
             }
             predchoziMillis2 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
   }
     lcd.setCursor( 0, 1 );
     lcd.print(" LED1,LED2     ");
     lcd.setCursor( 5, 2 );
     lcd.print("blikame pomalu");
     lcd.setCursor( 1, 3 );
     lcd.print("Mode 3");         
   } 
   
  if(mode == 4) { 
   // ******* LED1,LED2 blikání střídavé  *******   
   aktualniMillis = millis();  //podívám se na hodinky - aktuální čas     
   if(aktualniMillis - predchoziMillis3 > 300) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 300ms ?
     led1svetlo = !led1svetlo; // do proměnné led1svetlo zapíšu její negovanou hodnotu, tj. svítila-li LED1 tak zhasne, byla-li zhaslá rožne se
     led2svetlo = !led1svetlo; // do proměnné led2svetlo zapíšu negovanou hodnotu led1svetlo, tj. pokud LED1 svítí chci LED2 zhaslou a naopak
     predchoziMillis3 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
     lcd.setCursor( 1, 1 );
     lcd.print("LED1,LED2");
     lcd.setCursor( 3, 2 );
     lcd.print("blikame stridave");
     lcd.setCursor( 1, 3 );
     lcd.print("Mode 4");    
   }  
  } 
   digitalWrite(LED1,led1svetlo);  // aktualizace stavu LED1, zápis proměnné led1svetlo na výstupní pin 10
   digitalWrite(LED2,led2svetlo);  // aktualizace stavu LED2, zápis proměnné led2svetlo na výstupní pin 11   
 }
tušil jsem, že budu potřebovat proměnnou na zapamatování si stavu tlačítka, no nevím jestli je to co bylo myšleno
popis :
 v mode==1 při stisknutí tlačítka buttonStart se zapnou LEDky a při znovu stisknutí tlačítka buttonStart se LEDky vypnou. Můžu tak v mode1 xkrát rožínat a zhasínat led, pokud nezměním mode tlačítkem buttonSelect /červené na videu/.Taky je přiřazen patřičný popis co dělají LEDky na lcd. Musím to vyzkoušet ještě na jiném mode, uvidím jestli to bude funkční ?
odkaz na video : 
https://www.youtube.com/watch?v=VHgxUWoOgY4
kod zde:
Kód: Vybrat vše
#define buttonSelect 2   // číslo pinu tlačítka SELECT pro výběr MODE
#define buttonStart 3   // číslo pinu tlačítka START
#define LED1  10    // číslo pinu LED1 zelená
#define LED2  11    // číslo pinu LED2 červená
#include <Wire.h>   // knihovny pro LCD přes I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);   // nastavení adresy I2C (0x27), počtu znaků, řádků LCD 20x4
boolean buttonState = false;  // nejnovější hodnota načtená ze vstupního pinu
boolean lastButtonState = false;  // předchozí hodnota načtení ze vstupního pinu
boolean lastTrueButtonState = false;  // předchozí hodnota ošetřeného tlačítka
boolean  buttonStateStart = false;
boolean  lastButtonStart = false;
// Následné proměnné jsou typu long, jelikož čas měřený v milisekundách se 
//rychle změní na větší číslo, jež nemůže být uloženo v int
unsigned long lastDebounceTime = 0;  // čas posledního změny výstupního pinu
unsigned long debounceDelay = 50;  // čas debounce prodlevy 
byte mode = 0;    // 0 - Vypnuto, 1 - Zapnuto, 2 - Blikání rychlé, 3 - Blikání pomalé, 4 - Blikání střídavé
unsigned long aktualniMillis;   //aktualní čas
unsigned long predchoziMillis1;   // předchozí čas pro rychle blikání
unsigned long predchoziMillis2;   // předchozí čas pro pomalé blikání
unsigned long predchoziMillis3;   // předchozí čas pro střídavé blikání
unsigned long cas = 0;
long buttonTime;      //  čas začátku stisknutí tlačítka
boolean led1svetlo;   //  pomocná proměnná led1svetlo
boolean led2svetlo;   //  pomocná proměnná led2svetlo
 
void setup() {
  
  pinMode(LED1, OUTPUT);  // pin pro LED1 nastaven jako výstup
  pinMode(LED2, OUTPUT);  // pin pro LED2 nastaven jako výstup
  pinMode(buttonSelect, INPUT);  // pin pro tlačítko buttonSelect nastaveno jako vstup
  pinMode(buttonStart, INPUT);  // pin pro tlačítko buttonStart nastaveno jako vstup
  lcd.begin();   // inicializace LCD
  lcd.backlight();   // zapnutí podsvícení
  lcd.setCursor ( 0, 1 );   // nastavení kursoru na druhý znak, druhý řádek  
  lcd.print(" LED1,LED2   ");  // vypsání textu na lcd
}  
void loop(){
  
  
  /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  buttonState = digitalRead(buttonSelect);  // přečtení stavu tlačítka    
  if (buttonState != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime = millis();
  }                             
  if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (buttonState != lastTrueButtonState) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             
       
     if(buttonState == true) { 
         mode++; // přičte k MODE hodnotu 1        
          buttonTime = millis(); 
              
         if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
      } 
       lastTrueButtonState = buttonState;  // uložím si nový pravý ošetřený stav tlačítka           
    } 
  }   
  
  lastButtonState = buttonState; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
                       
  if(mode == 0) {
    // ******* LED1,LED2 vypnuto ********    
     led1svetlo = false;  // zhasni LED1              
     led2svetlo = false;  // zhasni LED2 
      lcd.setCursor( 3, 2 );   // nastavení kursoru na šestý znak, třetí řádek
      lcd.print("  jsme zhasnute ");   // vypsání textu na lcd 
      lcd.setCursor( 1, 3 );
      lcd.print("Mode 0");          
   }
  
  if(mode == 1) {
    // ******* LED1,LED2 zapnuto  ********  
    buttonStateStart = digitalRead(buttonStart);   // nacteni aktualniho stavu tlacitka 
      
   if(buttonStateStart == 0 && lastButtonStart == 1)  {  // je-li ted stisknuto tlacitko a zaroven predtim nebylo                                               
      led1svetlo = !led1svetlo;  // zhasni nebo rožni LED1
      led2svetlo = !led2svetlo;  // zhasni nebo rožni LED2
      if(!led1svetlo && !led2svetlo) {  // když je stav led "takový" vypiš na lcd
        lcd.setCursor( 3, 2 );   // nastavení kursoru na šestý znak, třetí řádek
        lcd.print("  jsme zhasnute");   // vypsání textu na lcd 
      }
      else {  // jinak vypiš "takový" stav led na lcd
        lcd.setCursor( 3, 2 );   // nastavení kursoru na šestý znak, třetí řádek
        lcd.print("   uz svitime !");   // vypsání textu na lcd 
      }
    }  
    lastButtonStart = buttonStateStart;  // uloz aktualni stav tlacitka jako minuly stav
      lcd.setCursor( 1, 3 );
      lcd.print("Mode 1");           
   }
                    
  if(mode == 2){ 
    // ******* LED1,LED2 blikání rychlé  *******     
    if(millis() - buttonTime > 10000){  // zjistím si jestli je čas něco provést, uběhlo už 10s od poslední akce?
      lcd.setCursor( 0, 1 );
      lcd.print(" LED1,LED2     ");
      lcd.setCursor ( 5, 2 );
      lcd.print("blikame rychle");                  
    
     aktualniMillis = millis();  // podívám se na hodinky - aktuální čas   
     if(aktualniMillis - predchoziMillis1 > 200) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 200ms od poslední akce?  
      if (led1svetlo) {          
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2            
            }                
            predchoziMillis1 = aktualniMillis;   // v tento čas jsem provedl poslední akci
      }         
     } else {
      // vypis : "blikat začneme" - jestli chci vědět jak dlouho budu ještě čekat, tak vypíšu 10000 - (millis() - buttonTime)
      lcd.setCursor ( 1, 1 );
      lcd.print("blikat zacneme");
      lcd.setCursor( 5, 2 );
      lcd.print(" za ");
      lcd.setCursor( 9, 2 );
      lcd.print(10000 - (millis() - buttonTime));   // zobrazí se odpočet do blikání led v ms 
      lcd.setCursor( 13, 2 );
      lcd.print(" ms  "); 
      lcd.setCursor( 1, 3 );
      lcd.print("Mode 2");           
    }                       
   }            
          
  if(mode == 3) { 
    // ******* LED1,LED2 blikání pomalé  *******
    aktualniMillis = millis();  //podívám se na hodinky - aktuální čas  
   if(aktualniMillis - predchoziMillis2 > 500) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 500ms od poslední akce?  
     if (led2svetlo) {          
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2
             }
             predchoziMillis2 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
   }
     lcd.setCursor( 0, 1 );
     lcd.print(" LED1,LED2     ");
     lcd.setCursor( 5, 2 );
     lcd.print("blikame pomalu");
     lcd.setCursor( 1, 3 );
     lcd.print("Mode 3");         
   } 
   
  if(mode == 4) { 
   // ******* LED1,LED2 blikání střídavé  *******   
   aktualniMillis = millis();  //podívám se na hodinky - aktuální čas     
   if(aktualniMillis - predchoziMillis3 > 300) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 300ms ?
     led1svetlo = !led1svetlo; // do proměnné led1svetlo zapíšu její negovanou hodnotu, tj. svítila-li LED1 tak zhasne, byla-li zhaslá rožne se
     led2svetlo = !led1svetlo; // do proměnné led2svetlo zapíšu negovanou hodnotu led1svetlo, tj. pokud LED1 svítí chci LED2 zhaslou a naopak
     predchoziMillis3 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
     lcd.setCursor( 1, 1 );
     lcd.print("LED1,LED2");
     lcd.setCursor( 3, 2 );
     lcd.print("blikame stridave");
     lcd.setCursor( 1, 3 );
     lcd.print("Mode 4");    
   }  
  } 
   digitalWrite(LED1,led1svetlo);  // aktualizace stavu LED1, zápis proměnné led1svetlo na výstupní pin 10
   digitalWrite(LED2,led2svetlo);  // aktualizace stavu LED2, zápis proměnné led2svetlo na výstupní pin 11   
 }
děkuju a mrkněte na videa