Mini CNC osa Z

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

Re: Mini CNC osa Z

Příspěvek od kiRRow » 26 led 2020, 09:58

nepustí ? ... na ostatní mode tě pustí ? ... nemate tě jen to, že nemáš v mode5 ještě napsáv výpis na displej ?
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á :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 » 26 led 2020, 14:30

dobrý den, tak přesně jak píše kiRRow, úplně mi vypadlo to, že nemám v mode5 výpisy :roll: , č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){
, stalo se, že jsem mohl při stisknutí tlačítka UP řídit servo nahoru a kdykoliv ho zastavit ? podobné u řízení serva dolů. Když tam podmínka nebyla servo jezdilo nahoru nebo dolů od např. 5 do 175 stupňů, protože nechtěl jsem jezdit na dorazy serva. Tady je kod, ve kterém je přidáno mode = 5 pro servo, které je řízeno tlačítkem nahoru UP a dolů Down s výpisy na lcd a seriový monitor.

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   
 }  
 
abych nezapoměl, nevím kam napsat, že v mode5 je Start ? Stop mám, trošku to potom mýlí při přepínání mode :cry:
za návrhy a změny budu jen vděčný, stále je co zlepšovat ;) děkuju

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

Re: Mini CNC osa Z

Příspěvek od kiRRow » 26 led 2020, 17:05

zásadně troskotáš na řídících struktůrách IF ... ELSE ...

if(mamBezet) je to samé jako if(mamBezet == true) ..... za předpokladu, že v proměnné mamBezet je uloženo true
if(!mamBezet) je to samé jako if(mamBezet == false) ..... stím, že v proměnné mamBezet je uloženo false

za tímto přichází část kódu uzavřená v { } která se provede, pokud je pravda to co je v kulatých závorkách ... pak příjde "else" a druhé složené závorky, tam se provádí část kódu, pokud kulaté závorky obsahují nepravdu

Kód: Vybrat vše

if(mamBezet) {
	// program běží dělám něco
} else {
	// program neběží, dělám něco jiného
}
v podstatě i takhle

POKUD (dáš mi peníze == pravda) {
nechámTěJít();
} NEBO CO {
dostanešPřesHubu();
}

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

dobrý den, kod v mode5, je nyní bez úprav a popisů, pracuje tak, že servo po stisknutí Up jede bez zastavení do pozice 175 stupňů, a když stisknu Down, tak jede zpět do pozice 0 stupňů bez zastavení. Problém je, když napíšu výpis do mode5 - servo se při stisknutí tlačítka rozjede, ale při puštění tlačítka se zastaví v poloze, kde zrovna je ? a další problém je, že se rychlost serva zpomalí ? proč ? tohle se děje jak při výpisu na lcd, tak na seriový monitor ? kde tedy mají být správně umístěny jednotlivé výpisy na lcd a seriový monitor ? :roll:

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   
 }  
 
děkuju

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

Re: Mini CNC osa Z

Příspěvek od kiRRow » 29 led 2020, 16:40

Servo by se mělo nastavovat jen při držení tlačítka UP nebo DOWN a jen za předpokladu že program je v mode5 a má běžet.

Výpis pro obsluhu na displej, nebo seriovou linku se provádí většinou až po vykonání nejdůležitějších funkcí programu. Zabírá totiž systémový čas, který ti pak zpomaluje běh programu. Proto se taky výpis provádí jen tehdy, kdy je potřeba. Program si musí hlídat kdy je třeba změnit výpis na displeji.
Taky ne vždy ho musíš měnit celý. Pokud na 75% displeje zobrazuji statický text, který popisuje čísla, tak nemusím vždy smazat celý displej, napsat tam znovu ten statický text a za něj hodnotu kterou chci zobrazit, ale nastavím pozici kurzoru a přepíšu jen tu část displeje, která se má změnit. Zase ale když program je přerušen, nebo doběhnul na konec a já chci na displeji zobrazit něco úplně jiného, tak je třeba ho smazat.

Potom je ale i případ, kdy potřebuješ udělat takzvaný debug ... program někde prostě harpruje a ty nevíš kde a proč ... v tom případě si výpisy na seriovou linku, nebo displej napíšeš přímo do vnitřní struktůry kódu (tak jak to máš ty) a sleduješ kde, proč a s jakými daty v kterých proměných se procesor ve zpracování programu dostal do přesně toho bodu kde máš výpis .... (tím ale způsobíš to, že program se musí v určitý moment zastavit a provést výpis svých hodnot)

Zkus si projet ten kód co jsem tu posílal jak jsem z tlačítek udělal třídy a místo displeje jsem to vypisoval na seriovou linku. Tam je vidět jak si hlídám kdy ji vypsat a kde ji v programu vypisuji.

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 30 led 2020, 09:39

dobrý den, upravil jsem kod u výpisuna lcd, kdy není třeba všude vypisovat ho celý tj. Mode 0, ale stačí na začátku vypsat Mode 0 a pak již jen měnit číslo mode tj. 0,1,..., ve kterém se nachází. Přesunul jsem výpis u mode5 a na seriovém monitoru nechal vypisovat přesun serva bez všech výpisů a s výpisy na lcd a seriový monitor - neskutečný rozdíl v přesunech serva :cry: , 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
určitě to jde vypsat jen jednou při změně , ale nepřišel jsem na to ? přitom v kodu , kde je třída Button viz.výše str.23 , tam to krásně vypisuje :roll:
tady jsou ty kosmetické úpravy výpisu :

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   
 }  
 
v mode5 jsou zakomentovány příkazy, tak jsem prováděl testy na změření času výpisu.můžete si to taky případně změřit děkuju

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

Re: Mini CNC osa Z

Příspěvek od kiRRow » 30 led 2020, 22:08

trap se a uč se :) ... 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.

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 31 led 2020, 13:42

dobrý den, trápil jsem se, učil jsem se a výsledek je zde :

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*/
 }  
 
:lol: Super, Super, Super :lol:
pokusím se ještě dostat do výpisu odpočet v mode2 :roll:, 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 :?: , ale to jen když mi to nebude ovlivńovat rychlost serva atd.
Můžu tak uvažovat a pokračovat v kodu ? nebo je to jen vize ? děkuju
a tady odkaz na video : kde je " Blikání Led v mode + Servo mode + výpis na 4x20 lcd i2c displej" https://www.youtube.com/watch?v=uVblhg_ ... e=youtu.be

taky jsem vyzkoušel , aby mi v seriovém monitoru neutíkal výpis, zminil jsem to minule. Výpis je s millis místo delay ;) 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                    
        }                  
      }
přidávám odkaz na černo bílou verzi videa ;) : https://www.youtube.com/watch?v=Xbaoa8VWUhU

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

Re: Mini CNC osa Z

Příspěvek od kiRRow » 02 úno 2020, 09:08

Jak dostat ke každýmu mode jinačí text

Kó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*/

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 04 úno 2020, 14:04

dobrý den, trošku jsem pokročil v kodu. Přidán do mode2 výpis odpočtu času na lcd , v mode5 přidán výpis servo - chtěl jsem, aby bylo ihned jasné že mode5 obsluhuje servo, ne ledky. Přidány malé 3mm červené ledky, které v mode5 jsou u tlačítek a mají za úkol se rožnout, když je třeba stisknout tlačítko, aby zavrtělo servem na správnou stranu tj. mám servo v poloze 175° a potřebuju servo do polohy 0°, rožne se led u tlačítka Down stisknu tlačítko, servo se přesune do 0°, rozvítí se ledka u tlačítka Up ... a opačně, ale jen v případě stavu Start v mode5.
tady je kod : upravené výpisy na lcd pro odpočet času a servo + pomocné led verze 2.

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*/
 }  
 


snad jsem kod napsal správně, no funguje , ale nejsem si jist u mode2 ? dost mě potrápil :oops:
tady je video pro představu, jak to šlape ;) https://www.youtube.com/watch?v=Xy13MeJw3nw
za info a připomínky ke kodu děkuju

Odpovědět

Kdo je online

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