Mini CNC osa Z

Odpovědět
Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od gilhad » 27 zář 2019, 06:38

JEstli to nebude tim, ze s obema delas vsechno stejne naraz, takze se prekvapive chovaji stejne ...

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 27 zář 2019, 08:08

Dobrý den, ano po přepracování na millis oprsvdu obě led blikají stejně, šlo mi však o to jakou podmínkou to blikání rozchodit ať už blikání střídavé nebo jiné. Pořád se mám co učit. Myslím si, že do podmínky od kdy blikat má být čas stisknutí mode 4 ale co dál ? Co k tomu nevím. Když jsem dal předešlé podmínky jako text a ubral složenou závorku, tak to blikalo. děkuji za rady

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 zář 2019, 12:14

Já bych se na to střídavé blikání kouknul asi takhle ...
zkontroluji, zda-li je čas bliknout diodama
negoval bych první diodu ... ať je její stav jakýkoliv
potom bych si načetl její stav po negování, pokud je zaplá, vypnu druhou diodu, pokud je vyplá, tak druhou diodu zapnu
uložím si čas, kdy jsem tohle provedl
pokračuji dál v cyklování programem, dokud nebude čas bliknout diodama

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 říj 2019, 18:50

dobrý den, pokoušel jsem se dát dohromady, co mi napsal kiRRow , ale opět nezklamu a po x-tých pokusech a hledáních na netu ,změnách ve sketchi, kdy jsem používal od "bliknutí bez delay", přes "blikáme s Led od Robot klubu" až po skvělý tutorial https://www.baldengineer.com/millis-tutorial.html Nevím
Tady je výsledek, kdy ledky, při čtvrtém stisknutí tlačítka, mají střídavě blikat, ale místo toho trvale svítí až do dalšího stisknutí tlačítka, pak všechno pokračuje jak má.

Kód: Vybrat vše

int Tlacitko = 7; // tlacitko na pinu 7
int LED1 = 10; // Led 1 na pinu 10
int LED2 = 11; // Led 2 na pinu 11
 
boolean Svetla = false;
boolean Blik = true;
boolean Blik2 = true; 
boolean Blik3 = true;

int mode = 0; //(0 - Vypnuto, 1 - Zapnuto, 2 - Blikání rychlé, 3 - Blikání pomalé, 4 - Blikání střídavé 
long posledniBlik = 0; // promenná pro počet milisekund pri poslednim bliku (pomale blikání)
long posledniBlik2 = 0;
long posledniBlik3 = 0;

// odsud přidáno z https://www.baldengineer.com/millis-tutorial.html  až po void setup !

// each "event" (LED) gets their own tracking variable
unsigned long previousMillisLED1=0;  // změnil jsem  VSUDE !!!   LED10 na LED1 a LED11 na LED2
unsigned long previousMillisLED2=0;


int intervalLED1 = 500;
int intervalLED2 = 500;
 
boolean LED2state = false;     // the LED will turn ON in the first iteration of loop()
boolean LED1state = false;     // need to seed the light to be OFF
 
 
void setup() {
 pinMode(LED1, OUTPUT); // nastaví vystup u Led 1 na výstup
 pinMode(LED2, OUTPUT); // nastaví vystup u Led 2 na výstup
 
 pinMode(Tlacitko, INPUT); // nastaví pin kde je připojeno tlačítko jako výstup
 digitalWrite(Tlacitko,HIGH); // zapnutí pullup rezistoru, aby jsme k tlačítku
 // nemuseli přidávat rezistor. Tlačítko je tedy připojeno ke GND a pinu 7 !!!!!!
 // Při vypnutém tlačítku vnitřní pullup rezistor připojujuje k +5V.
 
 
}
 
void loop() {
  // zapne nebo vypne LED v závislosti na stavu proměné Svetla
  digitalWrite(LED1, Svetla);
  digitalWrite(LED2, Svetla);
 
  // když je na vstupu Tlačítka logická 0 (LOW)
  // !!! není spínálo log. 1, protože využíváme tzv. pulldown rezistoru v čipu
  if ((digitalRead(Tlacitko)) == LOW) // tady se přečte stav tlačítka
    {
      mode++; // přičte k MODE hodnotu 1
      if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluj
      delay(200); // prodleva proti záchvěvům tlačítka  
    }
   if (mode == 0) Svetla = 0; //Vypni světla
   if (mode == 1) Svetla = 1; //Zapni světla
   if (mode == 2) Svetla = Blik; // Rychlé blikání - Svetla zavisí na stavu promené Blik
   if (mode == 3) Svetla = Blik2; // Pomalé blikání - Svetla zavisí na stavu promené Blik
   if (mode == 4) Svetla = Blik3; // Střídavé blikání
   
   // časovač pro blikání *********************************************   
   if ((millis() - posledniBlik) > 200) // když celkový počet milisekund
   // minus počet milisekund při poslednim "bliku" je vetši jak 200
   // tady můžete nastavit rychlost blikání v počtu milisekund
   {
     Blik = !Blik; // Blik se rovná negaci Blik (neguje proměnou)
     posledniBlik = millis(); // zapiš poslední blik
   }

     // časovač pro blikání 2 *********************************************     
   if ((millis() - posledniBlik2) > 400) // když celkový počet milisekund
   // minus počet milisekund při poslednim "bliku" je vetši jak 400
   // tady můžete nastavit rychlost blikání v počtu milisekund
   {
     Blik2 = !Blik2; // Blik2 se rovná negaci Blik (neguje proměnou)
     posledniBlik2 = millis(); // zapiš poslední blik2
   } 
  
    // časovač pro blikání 3 *********************************************    
    // TADY LEDKY SVITI TRVALE DO STISKNUTI TLACITKA !!!
    
  unsigned long currentMillis = millis();  { // zkontroluji, zda-li je správný čas na bliknutí LED  
  
   if ((unsigned long)(currentMillis - previousMillisLED1) >= intervalLED1) {
      LED1state = !LED1state;   // neguje se LED1
      digitalWrite(10, !LED1state);      // "!" uděla blikání     
      previousMillisLED1 = currentMillis;  // uloží aktualní čas na pinu 10
   } 

  if ((unsigned long)(currentMillis - previousMillisLED2) >= intervalLED2) {
      LED2state = !LED2state;
      digitalWrite(11, LED2state);        
      previousMillisLED2 = currentMillis; // uloží aktualní čas na pinu 11
    } 
   }                     
 }
moc díky :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 » 01 říj 2019, 21:02

přestaň kopírovat a začni psát sám ... tohlecto je jako fakt mazec ... ty příklady jsou jen na ukázku, aby člověk mohl prostudovat proč a jak to funguje ... když píšeš kód, tak ho píšeš celý ... pak jsi pán všech proměnných a funkcí atd ... tohle mi příjde jako že matleš 3 tutoriály dohromady ...

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 » 02 říj 2019, 16:47

Jinak ... na začátku sketche, ještě před funkcí setup() ... tam se deklarují a definují globální proměnné. Když vím, že nějaká hodnota se za celou dobu běhu programu nezmění, jako třeba právě číslo pinu na který je připojena LED, tak není nutné ( a ani vhodné ) toto deklarovat a definovat jako proměnnou. Kompilátor má příkaz #define. Slouží k pojmenování nějaké konstatní hodnoty a zpracovává se ještě před samotnou kompilací.
Syntax :

Kód: Vybrat vše

#define jmenoHodnoty hodnota
//například
#define led1Pin 2
#define led2Pin 3
#define tlac1Pin 4
Rozdíl je takový:
Použiju-li int led1Pin = 2 , tak kompilátor veme a v procesoru si vymezí 2byte programové paměti a do nich uloží číslo 2 ... při spuštění procesoru se tato programová paměť přesouvá do operační paměti, protože se předpokládá, že se sní bude pracovat ... a když dojde na ovládání výstupu, tak se procesor musí kouknout do operační paměti a načíst si to číslo, kde je.
Použiju-li #define led1Pin 2 (to rovná se se tam fakt nepíše), tak před spuštěním kompilace kódu kompilátor celý sketch projede ... kdykoliv někde najde název led1Pin, tak tam natvrdo napíše "2" ... stejně jako funkce najdi a nahraď ... tato hodnota je pak natvrdo napsána do programové paměti, kde zabírá jen jeden byte a při spuštění se nenačítá do operační paměti.

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 03 říj 2019, 18:27

dobrý den, provedena změna ve sketchi "z"

Kód: Vybrat vše

int LED1 = 10; // Led 1 na pinu 10
int LED2 = 11; // Led 2 na pinu 11
"na"

Kód: Vybrat vše

#define LED1 10   // Led 1 na pinu 10
#define LED2 11   // Led 2 na pinu 11

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 » 03 říj 2019, 18:36

Mno ... a dál ?

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 03 říj 2019, 19:46

jdu od začátku,abych se srovnal, takže taky jsem si vyzkoušel co všechno potřebuju, aby to střídavě blikalo s millis

Kód: Vybrat vše

#define LED1 10
#define LED2 11 

boolean Blik3;
boolean Blik4;
long posledniBlik3;
long posledniBlik4;

void setup() {
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);  
}

void loop() {
  if (millis() >= posledniBlik3 + 500) {
    posledniBlik3 = millis();
    Blik3 = !Blik3;
    digitalWrite(10,Blik3);
  }
  if (millis() >= posledniBlik4 + 500) {
    posledniBlik4 = millis();
    Blik4 = !Blik4;
    digitalWrite(11,!Blik4);
  }  
}

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 » 04 říj 2019, 16:00

digitalWrite(10,Blik3);
digitalWrite(11,!Blik4);

Zjevně nechápeš k čemu to #define slouží ... slouží to k dvěma věcem.
1) Nemusíš si pamatovat co kde máš připojeno, protože číslo toho pinu si pojmenuješ zapamatovatelným lidským názvem.
2) Když potom z nějakého důvodu musíš vzít a LEDku z pinu 10 přepojit na pin 12, tak nemusíš projíždět celý program a hledat veškeré příkazy a přepisovat všude 10 na 12, ale přepíšeš to jen jednou jedinkrát právě v tom define.

Zkus k střídavému blikání tenhle přístup. Je potřeba jen jedna proměnná na uložení času.
1) Zkontroluji zda-li je čas bliknout diodama
2) Pokud ne, přeskočím to, pokud ano provedu přebliknutí a uložím si čas kdy jsem toto provedl
Samotné přebliknutí zkus takhle.
1) Nehledě na stavu LED1 ji neguji (byla li zaplá vypne se, byla li vyplá zapne se)
2) Načtu stav LED1, neguji ho a uložím do stavu LED2 (pokud LED1 svítí LED2 zhasne, pokud LED1 nesvítí LED2 se rožne)

Odpovědět

Kdo je online

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