Mini CNC osa Z

Odpovědět
Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
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: 262
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

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
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: 262
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:

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
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: 262
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);
     }
 }  

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
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: 262
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

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 19 pro 2019, 17:11

dobrý den, poštou dorazil lcd displej 4x20 s i2c , tak jsem ho hned vyzkoušel
tady je kod, který je upraven z předchozího, kde bylo vypisování na seriový monitor

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á

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

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

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

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

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

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

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

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

  lcd.begin();   // inicializace LCD
  lcd.backlight();   // zapnutí podsvícení                            
  lcd.setCursor ( 0, 1 );   // nastavení kurzoru tj.začátek textu na první znak, druhý řádek
  lcd.print("LCD i2c 4x20");   // vypsání textu na druhý řádek
  lcd.setCursor( 4, 2 );   // nastavení kursoru na pátý znak, třetí řádek
  lcd.print("jsem pripraven !");   
}  


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 + 2000){
      cas = millis();
      lcd.clear();   // smaže všechny zobrazené znaky na displeji a nastaví kurzor do levého horního rohu
      lcd.setCursor ( 1, 1 );   // nastavení kursoru na druhý znak, druhý řádek  
      lcd.print("LED1,LED2");  // vypsání textu na lcd
      lcd.setCursor( 5, 2 );   // nastavení kursoru na šestý znak, třetí řádek
      lcd.print("jsme zhasnute");   // vypsání textu na lcd   
    }         
   }
                 
  if(mode == 1) {
    // ******* LED1, LED2 zapnuto  ********       
     led1svetlo = true;  // rožni LED1             
     led2svetlo = true;  // rožni LED2
    if(millis() >= cas + 1000){
      cas = millis();
      lcd.clear();     
      lcd.setCursor ( 1, 1 );    
      lcd.print("LED1,LED2");  
      lcd.setCursor( 6, 2 );
      lcd.print("uz svitime !");      
    }
   }   
                    
  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();
      lcd.clear();
      lcd.setCursor( 1, 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.clear();
      lcd.setCursor ( 0, 1 );
      lcd.print("blikat zacneme");
      lcd.setCursor ( 0, 2 );
      lcd.setCursor( 6, 2 );
      lcd.print("za");
      lcd.setCursor( 9, 2 );
      lcd.print(10000 - (millis() - buttonTime));   // zobrazí se odpočet do blikání led v 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();
     lcd.clear();
     lcd.setCursor( 1, 1 );
     lcd.print("LED1,LED2");
     lcd.setCursor( 5, 2 );
     lcd.print("blikame pomalu");          
    }
   } 
   
  if(mode == 4) { 
   // ******* LED1,LED2 blikání střídavé  *******   
   aktualniMillis = millis();  //podívám se na hodinky - aktuální čas     
   if(aktualniMillis - predchoziMillis3 > 300) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 300ms ?
     led1svetlo = !led1svetlo; // do proměnné led1svetlo zapíšu její negovanou hodnotu, tj. svítila-li LED1 tak zhasne, byla-li zhaslá rožne se
     led2svetlo = !led1svetlo; // do proměnné led2svetlo zapíšu negovanou hodnotu led1svetlo, tj. pokud LED1 svítí chci LED2 zhaslou a naopak
     predchoziMillis3 = aktualniMillis;   // v tento čas jsem provedl poslední akci 
     lcd.clear();
     lcd.setCursor( 1, 1 );
     lcd.print("LED1,LED2");
     lcd.setCursor( 3, 2 );
     lcd.print("blikame stridave"); 
   }
  } 
   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   
 }
zobrazování je super, ale lcd mi při blikání led problikává ? při vypisování odpočtu času je vidět text z leva více a do stracena ? tuším, že je to v napájení lcd, no nerad bych si něco odpálil a proto otázka - jak mám zapojit arduino a lcd, aby neproblikával a zobrazování bylo ok ? děkuju
jo a nyní mám napájení přes usb z pc do Arduina, pindeska napájená z "power" Arduina 5V a GND a taky ten lcd z pindesky

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

Re: Mini CNC osa Z

Příspěvek od kiRRow » 19 pro 2019, 18:09

problikává při blikání led, protože jsi napsal obsluhu displaye do místa, kde nastavuješ stavy, které na konci smyčky programu zapíšeš do pinů arduina. Taky ne vždy je nutné smazat celý display. Sežere to spoustu času ... a stejně to pak skoro celý vypíšeš znovu ... to sežere další čas ... lepší je přepsat jen část displaye.

Nejprve si obsluž tlačítko ... výsledky této činnosti se ti někde ukládají
Na základě těchto výsledků "vypočteš" v jakém stavu mají být ledky ... toto je výsledek, který se ti ukládá
Na základě výsledku výpočtu LEDek si je nakonci smyčky zapíšeš do pinů arduina
----
A až tady na základě všech předchozích výsledků vypisuješ něco na displej ... a to tehdy a pouze jen, když je třeba ... jedině když se někde něco změnilo. Většinou si člověk pamatuje událost "potrebaPrepsatDislay = true" - přepíše display a hodí to na false .... a když třeba pak zmáčkneš čudl, je to změna, mění se mode a ták, hodíš potrebaPrepsatDisplay na true ... a on se na konci smyčky zaktualizuje

Odpovědět

Kdo je online

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