Mini CNC osa Z

Odpovědět
kiRRow
Příspěvky: 173
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 27 lis 2019, 17:50

Úplně stejně jako řešíš to, aby ti diody blikaly bez delay.

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 28 lis 2019, 15:30

dobrý den, v kodu upraven výpis na seriový monitor - nyní výpisy po 1s bez millis v mode nula a v mode 1. V mode 2 a v mode 3 jsem čas bliknutí násobil 2x / zhasnutí + rožnutí / snad jsem to vyhodnotil správně. Synchron bliknutí a výpisu moc se mi nelíbí, nevím - asi je výpis jinde než má být ? Pak jsem u "zpoždění" blikání nechal ubíhat čas po ms na řádku, jen pro efekt ;)

Kód: Vybrat vše

#define TLACITKO 2   // číslo pinu TLACITKA
#define LED1  10    // číslo pinu LED1 zelená
#define LED2  11    // číslo pinu LED2 červená

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

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

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

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

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

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

 
void setup() {
  
  pinMode(LED1, OUTPUT);  // pin pro LED1 nastaven jako výstup
  pinMode(LED2, OUTPUT);  // pin pro LED2 nastaven jako výstup
  pinMode(TLACITKO, INPUT);  // pin pro TLACITKO nastaveno jako vstup

  Serial.begin(9600);   // konfigurace rychlosti seriového portu
  while (!Serial) {    ; // čekaní na připojení seriového portu, pry nezbytné pouze u desky Leonardo
  }   
  Serial.println("Seriovy port aktivni");  // První výpis na seriový port
}

void loop(){
  
  /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  buttonState = digitalRead(TLACITKO);  // přečtení stavu tlačítka    
  if (buttonState != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime = millis();
  }                             

  if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (buttonState != lastTrueButtonState) {  // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem             
       
     if(buttonState == true) { 
         mode++; // přičte k MODE hodnotu 1        
          buttonTime = millis(); 
              
         if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
      } 
       lastTrueButtonState = buttonState;  // uložím si nový pravý ošetřený stav tlačítka           
    } 
  }   
  
  lastButtonState = buttonState; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
                       
  if(mode == 0) {
    // ******* LED1, LED2 vypnuto ********    
     led1svetlo = false;  // zhasni LED1              
     led2svetlo = false;  // zhasni LED2 
    if(millis() >= cas + 1000){
      cas = millis();
      Serial.println("LED1,LED2 vypnuto");  // výpis na seriový monitor 
    }         
   }
                 
  if(mode == 1) {
    // ******* LED1, LED2 zapnuto  ********       
     led1svetlo = true;  // rožni LED1             
     led2svetlo = true;  // rožni LED2
    if(millis() >= cas + 1000){
      cas = millis();    
      Serial.println("LED1,LED2 zapnuto");  // výpis na seriový monitor 
    }
   }   
                    
  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?
     if(millis() >= cas + 400){  
      cas = millis();    
      Serial.println("LED1,LED2 blikání rychlé");  // výpis na seriový monitor 
     }     
     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 : "do bliknutí zbývá ..... ms" - jestli chci vědět jak dlouho budu ještě čekat vypíšu 10000 - (millis() - buttonTime)
      Serial.print(" blikání za ");
      Serial.print(10000 - (millis() - buttonTime));
      Serial.println(" ms");
    }                       
   }            
    
      
  if(mode == 3) { 
    // ******* LED1,LED2 blikání pomalé  *******
    aktualniMillis = millis();  //podívám se na hodinky - aktuální čas  
   if(aktualniMillis - predchoziMillis2 > 500) {  // nejprve si zjistím jestli je čas něco provést, uběhlo už 500ms od poslední akce?  
     if (led2svetlo) {          
          led1svetlo = false;  // zhasnu LED1
          led2svetlo = false;  // zhasnu LED2
          } else {
            led1svetlo = true;  // rožnu LED1
            led2svetlo = true;  // rožnu LED2
            }
            predchoziMillis2 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
   }
   if(millis() >= cas + 1000){  
     cas = millis();           
     Serial.println("LED1,LED2 blikání pomalé");  // výpis na seriový monitor 
    }
   } 
   
  if(mode == 4) { 
   // ******* LED1,LED2 blikání střídavé  *******   
   aktualniMillis = millis();  //podívám se na hodinky - aktuální čas     
   if(aktualniMillis - predchoziMillis3 > 300) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 300ms ?
     led1svetlo = !led1svetlo; // do proměnné led1svetlo zapíšu její negovanou hodnotu, tj. svítila-li LED1 tak zhasne, byla-li zhaslá rožne se
     led2svetlo = !led1svetlo; // do proměnné led2svetlo zapíšu negovanou hodnotu led1svetlo, tj. pokud LED1 svítí chci LED2 zhaslou a naopak
     predchoziMillis3 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
     Serial.println("LED1,LED2 blikání střídavé");  // výpis na seriový monitor
   }
  } 
   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   
 }
A to velké číslo : píše o něm v souvislosti s millis Zbyšek Voda zde : https://arduino.cz/uzitecne-funkce-3/
mám velkou radost děkuju

kiRRow
Příspěvky: 173
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 28 lis 2019, 18:07

Já taky děkuji gilhadovi za pomoc :-)

millis() je funkce s návratovou hodnotou unsigned long ... to znamená, že když zavolám v programu millis(), dostanu zpátky 4byte. To unsigned znamená, že nejvyžší bit nefunguje jako ukazatel jestli je číslo kladné či záporné. V těchto 4byte bude uložena hodnota počtu milivteřin od začátku běhu programu.

Když chci časovat nějakou operaci pomocí millis(), tak si potřebuji uložit poslední stav millis() ... když chci zjistit jak dlouho tato operace neproběhla, tak od aktuálního millis() musím odečíst ten poslední stav. Tím dostanu hodnotu, kterou porovnávám s přesně stanovemým časem po jakém se má provádět operace.

(millis()-ToCoJsemSiUlozilJakoPosledniCasOperace) >= PEVNE_DANY_CAS

otázka : pokud bych do proměnné uložil výsledek x=(millis()-ToCoJsemSiUlozilJakoPosledniCasOperace) >= PEVNE_DANY_CAS
co dostanu jako odpověď, kdybych tento výsledek nechal zobrazit na sérivou linku ? Víš to, nebo to musíš zkusit ?

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 29 lis 2019, 14:56

dobrý den, zřejmě bych tam měl vidět hodnotu porovnávanou s přesně stanoveným časem, tedy hodnotu jak dlouho tato operace neproběhla :roll:

kiRRow
Příspěvky: 173
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 29 lis 2019, 16:43

ne. výsledek bude 0 nebo 1

buď je to co je v těch závorkách nepravda, nebo to je pravda ...

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 29 lis 2019, 18:03

dobrý den, ano musím jen souhlasit a děkuju kiRRow za vysvětlení. Neodolal jsem a ověřil si to na seriovém monitoru, kdy čas je nastaven na 10s. Monitor vypisuje jejdříve 0 tedy nepravda /po jedné sekundě/ a pak 1 tedy pravda - podmínka je splněna, tak jak je nastaveno v podmínce.
A bude zřejmě vypisovat jedničku až do přetečení časovače, nebo změny v podmínce, souhlasí ?

Kód: Vybrat vše

unsigned long cas = 0;
unsigned long x = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
    if(millis() >= cas + 1000){  // výpis po 1000ms 
      cas = millis();
      Serial.println((millis() - x ) >= 10000);
     }
 }  

kiRRow
Příspěvky: 173
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 29 lis 2019, 22:02

to postrádá absolutně smysl, hlavu a patu ... vytvoříš si proměnou x ... uložíš do ní 0 a už ji vůbec nikde nijak nepoužíváš .... nezapisuješ do ní, neměníš ji .... jen tu nulu nesmyslně odečítáš od milis ... kdybys tam to " - x " nenapsal, tak je to uplně to samé

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 01 pro 2019, 11:37

Dobrý den, mnou uvedený kód, ale stačil na ověření Vaší odpovědi v otázce co se zobrazí ? sériový monitor vypisoval to, co jste psal :?: bohužel nemám připomínky na čem ověřit, i proto tenhle dotaz :roll: jak by kód měl vypadat při tom výpisu na otázku ? Děkuju

Odpovědět

Kdo je online

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