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 » 12 led 2020, 09:27

Mno já mám zapojeno. Program jsem začal psát od začátku a postupně do něj nakopíroval většinu tvého kódu. Zatím neřeštím zpožděné spuštění jednoho mode a LCD displej. Ale já už bliká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 » 12 led 2020, 17:17

dobrý den, moje gratulace pro kiRRow ;) , no já se učím, ale zatím ... :roll: , ale když se nedaří, tak něco přeci ;) .
V kodu jsem se pokusil dodělat debounce, radši jsem ho zakomentoval, jelikož mám někde chybu a nechodí to ? Co se naopak povedlo, v mode==1, jak jsem chtěl a bylo navrženo start/stop nebo zap/vyp ledek v mode + výpis na lcd display. mode==2 jsem nechal raději tak, jak je. Úspěch jen poloviční Mode==3 a mode==4, tak tam je, že po stisknutí tlačítka buttonStart se zastaví blikání v mode. A úspěšně jsem na lcd nechal výpisovat co se děje.
Tady je odkaz na video : https://www.youtube.com/watch?v=ghI27mlX3zc
a tady kod :

Kód: Vybrat vše

#define buttonSelect 2   // číslo pinu tlačítka SELECT pro výběr MODE
#define buttonStart 3   // číslo pinu tlačítka START
#define LED1  10    // číslo pinu LED1 zelená
#define LED2  11    // číslo pinu LED2 červená

#include <Wire.h>   // knihovny pro LCD přes I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);   // nastavení adresy I2C (0x27), počtu znaků, řádků LCD 20x4

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

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

// Následné proměnné jsou typu long, jelikož čas měřený v milisekundách se 
//rychle změní na větší číslo, jež nemůže být uloženo v int
unsigned long lastDebounceTime = 0;  // čas posledního změny výstupního pinu
unsigned long lastDebounceTime2 = 0;
unsigned long debounceDelay = 50;  // čas debounce prodlevy 

byte mode = 0;    // 0 - Vypnuto, 1 - Zapnuto, 2 - Blikání rychlé, 3 - Blikání pomalé, 4 - Blikání střídavé

unsigned long aktualniMillis;   //aktualní čas
unsigned long predchoziMillis1;   // předchozí čas pro rychle blikání
unsigned long predchoziMillis2;   // předchozí čas pro pomalé blikání
unsigned long predchoziMillis3;   // předchozí čas pro střídavé blikání
unsigned long cas = 0;

long buttonTime;      //  čas začátku stisknutí tlačítka
long buttonTime2;

boolean led1svetlo;   //  pomocná proměnná led1svetlo
boolean led2svetlo;   //  pomocná proměnná led2svetlo

 
void setup() {
  
  pinMode(LED1, OUTPUT);  // pin pro LED1 nastaven jako výstup
  pinMode(LED2, OUTPUT);  // pin pro LED2 nastaven jako výstup
  pinMode(buttonSelect, INPUT);  // pin pro tlačítko buttonSelect nastaveno jako vstup
  pinMode(buttonStart, INPUT);  // pin pro tlačítko buttonStart nastaveno jako vstup

  lcd.begin();   // inicializace LCD
  lcd.backlight();   // zapnutí podsvícení

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

     if (buttonStateStart == true) {         
         buttonTime2 = millis();
     }             
      lastTrueButtonState = buttonStateStart;  // uložím si nový pravý ošetřený stav tlačítka        
    }  
   } 
  lastButtonStart = buttonStateStart; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
  //-------------- konec ořetření tlačítka Start ----------*/
   
                       
  if(mode == 0) {  // ******* LED1,LED2 vypnuto ********        
     led1svetlo = false;  // zhasni LED1              
     led2svetlo = false;  // zhasni LED2      
      lcd.setCursor( 3, 2 );   // nastavení kursoru na čtvrtý 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) {  // vypiš stav led na lcd
        lcd.setCursor( 3, 2 );   // nastavení kursoru na šestý znak, třetí řádek
        lcd.print("  jsme zhasnute");   // vypsání textu na lcd 
      }
      else {  // vypiš 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é  ******* 
     if(digitalRead(buttonStart) == false) {    
        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(digitalRead(buttonStart) == true) {
         lcd.setCursor( 3, 2 );   
         lcd.print("  blikani STOP ! ");          
        }    
     }              
   
  if(mode == 4) {  // ******* LED1,LED2 blikání střídavé  *******      
    if(digitalRead(buttonStart) == false) {  
        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"); 
     }
        if(digitalRead(buttonStart) == true) {       
          lcd.setCursor( 3, 2 );
          lcd.print("  blikani STOP !");    
         }
          lcd.setCursor( 1, 3 );
          lcd.print("MODE 4");                     
   }
    digitalWrite(LED1,led1svetlo);  // aktualizace stavu LED1, zápis proměnné led1svetlo na výstupní pin 10
    digitalWrite(LED2,led2svetlo);  // aktualizace stavu LED2, zápis proměnné led2svetlo na výstupní pin 11   
 }
 
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 » 12 led 2020, 18:28

počti tady tohle https://arduino.cz/objektove-orientovan ... amovani-i/

naprogramujeme potom třídu "Button" (tlačítko), bude umět sedět na nějakém pinu, ošetřovat si sama sobě debounce a na dotaz nám řekne co se s tlačítkem děje. Kdykoliv potom budeš chtít přidat tlačítko, jednoduše přes třídu vytvoříš nový objekt. Až třídu odladíme, tak z ní můžeme udělat knihovnu. Potom ji můžeš použít v jakémkoliv budoucím projektu. Už nikdy více debounce :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 » 12 led 2020, 22:21

dobrý den, třída "Button" ? a knihovna ? a ještě tlačítko na dotaz řekne co se s ním děje ? To zní velmi, velmi lákavě ;) a rád se tohle naučím, už se těším ! No stejně by mě zajímalo, kde je problém s tím debounce pro tlačítko Start ? Zakomentoval jsem ho spíše proto, že nevím jak a kde na něho navázat s kódem :roll: , případně v kódech budoucích ? Myslím si že navázat mám tam, kde je koment // Pokud se stav tlačítka změnil tj. porovná se buttonState ... a pak jsou tam ještě hodnoty, které se ukládají pro další průchod loopem ? Někdy můžou být na konci kódu, jindy už výš v kódu ? Změnit proměnné jsem snad zvládnul, některé změnil možná i zbytečně ? Děkuju

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 12 led 2020, 23:20

V článku " objektově orientované programování " od Zbyška Vody viz. výše je taky mj. uvedena v příkladu kódu složená závorka a za ní středník !
Vzpomněl jsem si, kde jsem to viděl !
Bylo to v článku od gilhad http://robodoupe.cz/2018/drobnicky-006- ... e-klikacu/. :lol:
Jo a v Klikaču jsou tři tlačítka Up, Down,push , o nich se zmiňuje i kiRRow v souvislosti s vylepšením kódu u mode do budoucna / snad jsem to pochopil správně /
a taky ošetření Debounce - tlačítka tam klikají jak o život ;)

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 » 13 led 2020, 16:26

Jelikož je kód z větší části tvůj, já ho jen více méně uklidil a přidal něco málo pro budoucí použití. Zatím je vše v jednom souboru. Ale už teď můžeš celou tu class Button{ ... }; přesunout do souboru s koncovlou *.h, tento soubor musí být v samé složce jako sketch, pak jej můžeš vložit do sketche skoro jako knihovnu pomocí #include "jmenoSouboru.h" - pozor opravdu jsou tam uvozovky a ne <>

Kód: Vybrat vše

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

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

public:

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

void Update(){
  buttonState = digitalRead(buttonPin);  // přečtení stavu tlačítka    
  if (buttonState != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime = millis();
    lastButtonState = buttonState; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
  }
  
  if((millis() - lastDebounceTime) > debounceDelay){ // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    rise = (buttonState != lastTrueButtonState) && (buttonState == HIGH); // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem + zároveň je HIGH tak rise bude true
    fall = (buttonState != lastTrueButtonState) && (buttonState == LOW); // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem + zároveň je LOW tak fall bude true
    change = buttonState != lastTrueButtonState; // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem bude change true
    lastTrueButtonState = buttonState;
  }
}

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

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

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

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

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

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

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

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(LED1, OUTPUT);  // pin pro LED1 nastaven jako výstup
  pinMode(LED2, OUTPUT);  // pin pro LED2 nastaven jako výstup
  delay(10);
  Serial.println("Program spuštěn.");
}

void loop() {
  /*TOHLE JE TEĎ NOVĚ OŠETŘENÍ TLAČÍTEK*/
  tlacitkoStart.Update(); // tady se volá metoda, která provede debounce tlačítka a zaktualizuje jeho stavy
  tlacitkoSelect.Update(); // tady se volá metoda, která provede debounce tlačítka a zaktualizuje jeho stavy
 
  if(tlacitkoStart.isRising()){
    mamBezet = !mamBezet;
    vypisLinku = true; // došlo ke změně, je potřeba provést nový výpis na RS232
  }
  if(tlacitkoSelect.isRising()){
    mode = (mode + 1) % 5;
    vypisLinku = true; // došlo ke změně, je potřeba provést nový výpis na RS232
  }
  /*KONEC OŠETŘENÍ TLAČÍTEK*/
  /*PROVEDENÍ MODE*/
  if(mode == 0){
    if(mamBezet){
      led1svetlo = false;
      led2svetlo = false;    
    }
  }
  if(mode == 1){
    if(mamBezet){
      led1svetlo = true;
      led2svetlo = true;    
    } else {
      led1svetlo = false;
      led2svetlo = false;
    }
  }
  if(mode == 2){
    if(mamBezet){
      if(millis() - predchoziMillis > 1000) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 1000ms ?
       led1svetlo = !led1svetlo; // do proměnné led1svetlo zapíšu její negovanou hodnotu, tj. svítila-li LED1 tak zhasne, byla-li zhaslá rožne se
       led2svetlo = led1svetlo; // do proměnné led2svetlo zapíšu led1svetlo - chci aby blikali stejně
       predchoziMillis = millis();   // v tento čas jsem provedl poslední akci
      }
    } else {
      led1svetlo = false;
      led2svetlo = false;
    }
  }
  if(mode == 3){
    if(mamBezet){
      if(millis() - predchoziMillis > 500) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 500ms ?
       led1svetlo = !led1svetlo; // do proměnné led1svetlo zapíšu její negovanou hodnotu, tj. svítila-li LED1 tak zhasne, byla-li zhaslá rožne se
       led2svetlo = led1svetlo; // do proměnné led2svetlo zapíšu led1svetlo - chci aby blikali stejně
       predchoziMillis = millis();   // v tento čas jsem provedl poslední akci
      }
    } else {
      led1svetlo = false;
      led2svetlo = false;
    }
  }
  if(mode == 4){
    if(mamBezet){
      if(millis() - predchoziMillis > 250) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 300ms ?
       led1svetlo = !led1svetlo; // do proměnné led1svetlo zapíšu její negovanou hodnotu, tj. svítila-li LED1 tak zhasne, byla-li zhaslá rožne se
       led2svetlo = !led1svetlo; // do proměnné led2svetlo zapíšu negovanou hodnotu led1svetlo, tj. pokud LED1 svítí chci LED2 zhaslou a naopak
       predchoziMillis = millis();   // v tento čas jsem provedl poslední akci
      }
    } else {
      led1svetlo = false;
      led2svetlo = false;
    }
  }
  /*KONEC PROVEDENI MODE*/
  /*OBSLUHA LED*/
  digitalWrite(LED1,led1svetlo);  // aktualizace stavu LED1, zápis proměnné led1svetlo na výstupní pin 10
  digitalWrite(LED2,led2svetlo);  // aktualizace stavu LED2, zápis proměnné led2svetlo na výstupní pin 11
  /*KONEC OBSLUHA LED*/
  /*OBSLUHA RS232 - TY BUDEŠ ASI VYPISOVAT NA LCD DISPLAY*/
  if(vypisLinku){
    Serial.print("MODE : ");
    Serial.print(mode);
    Serial.print(" - ");
    if(mamBezet){
      Serial.println("START");
    } else {
      Serial.println("STOP");
    }
    vypisLinku = false;
  }
  /*KONEC OBSLUHY RS232*/
}
... výpis chodí do seriové linky ...
další metody které nejsou v kódu ukázány
tlacitkoStart.getState() - Vrátí ti právě aktuální hodnotu tlačítka - tu debouncnutou samozřejmě - Pokud je tlačítko HIGH vrací TRUE
tlacitkoStart.isFalling() - V podstatě opak metody isRising - vrátí ti TRUE v momentě kdy dojde k přechodu na tlačítku z HIGH na LOW
tlacitkoStart.isChange() - Tady se objeví TRUE pokaždé když dojde ke změně na tlačítku ... při stisku i při puštění

a jak se přidá další tlačítko ? ... tam kde volám konstruktory, prostě přidám jeden řádek navíc ... tam kde probíhaj updaty tlačítek, tam přidám taky další řádek navíc ... a kdekoliv pak v loopu už můžu s tlačítkem pomocí metod pracovat.

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 14 led 2020, 15:58

dobrý den, je to úžasné :D , vyzkoušel jsem kod - to nemá chybu ! ;) stručné,krátké,přesné, nachystáno do budoucna, jak již bylo několikrát zmíněno kiRRow ...atd.
Tady je pro zajímavost
print screen seriového monitoru, kdy jsem pro ukázku otočil všechny čtyři mode : https://ctrlv.cz/UKTp
a kolik projekt zabírá místa od kiRRow : https://ctrlv.cz/LeQN
a kolik projekt zabírá místa ode mě : https://ctrlv.cz/whSn
při procházení kodu jsem narazil na tohle :

Kód: Vybrat vše

 boolean fall; // změna z HIGH na LOWoo
, předpokládám , že je to překlep v komentu kodu ? děkuju Hanz
a stále mě zajímá ta chyba v kodu výše, kde je zakomentované debounce ? :roll:

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 » 14 led 2020, 16:35

Kód: Vybrat vše

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

     if (buttonStateStart == true) {         
         buttonTime2 = millis();
         //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
     }             
      lastTrueButtonState = 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 ----------*/
Hodně paměti ušetří použití oné třídy. Ty musíš kód fyzicky několikrát zkopírovat a při kompilaci programu pak dojde k tomu, že do procesoru se uloží několik téměř identických částí kódů.
Když zkompiluješ třídu, tak při kompilaci se vytvoří jen jeden kus kódu, který ale místo proměnných bude používat ukazatele do paměti. Když tu část kódu bude používat jedno tlačítko, tak ukazatele budou ukazovat na jiné místo, než když ho bude používat tlačítko druhé. Hodně místa mi taky ušetřilo použití jen jedné proměnné na uložení poslední akce. Vím, že se můžu dostat vždy jen do jednoho mode, proto můžu pro všechny použít jednu společnou proměnnou.

---
jo a to LOWoo je samozřejmě překlep :)

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 » 14 led 2020, 19:00

Jen tak mimochodem. Ta třída se dá použít i na jiné věci než na tlačítko. Půjde třeba i na různé senzory, které dávají na výstupu LOW nebo HIGH a kmitají ... nebo potřebuješ aby ti program zareagoval jen na senzor, který je sepnutý určitou dobu ... (nevýhoda je, že aby zareagoval znovu, musí být i rozepnutý stejnou dobu - to dělá ten debounce ... ale absolutně nic nebrání tomu, aby se vytvořila nová metoda reset() ...)

mno a teď je otázka ... chápeš, proč nám to tlačítko neštěká, že se jmenuje Alík ? ... zkonstruováno je to skoro jako třída Pes ... má to svoje vlastnosti/atributy (většinu z nich jsi zapsal ty, já tam jen něco dodal), má to konstruktor, ten jsem vlastně taky zkopíroval a něco dodal ... kód, který to pohání (nejhlavnější metoda uptade()) je tvůj až na tohle :

Kód: Vybrat vše

rise = (buttonState != lastTrueButtonState) && (buttonState == HIGH); // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem + zároveň je HIGH tak rise bude true
fall = (buttonState != lastTrueButtonState) && (buttonState == LOW); // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem + zároveň je LOW tak fall bude true
change = buttonState != lastTrueButtonState; // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem bude change true
a zbývající metody jen vrací hodnoty, protože jsou ty hodnoty privátní a jinak se knim nejde dostat

je důležité, abys chápal ty tři řádky

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 » 14 led 2020, 19:27

všiml jsem si toho až teď ... u toho tvého kódu ... lastTrueButtonState = buttonStateStart; // uložím si nový pravý ošetřený stav tlačítka ...... máš tam špatnou proměnnou ... lastTrueButtonStart tam má být ... projeď si to celé jestli tam nemáš ještě něco takovýho podobnýho :)

Odpovědět

Kdo je online

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