Mini CNC osa Z

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

Re: Mini CNC osa Z

Příspěvek od Hanz » 23 srp 2019, 19:44

s velkou radostí Vás všechny zdravím a hned na začátek Super zpráva - sketch, který vrtí servem nastavený čas 30 sekund je plně funkční ! Pánové gilhad a kiRRow měli pravdu, že mám zkusit definovat buttonTime. No zkusil jsem tohle :

Kód: Vybrat vše

 /* TADY PRAVE PRETEKL CAS ?! */                                    
long buttonTime = -15001;                // čas začátku stisknutí tlačítka tj. začátek vrtění serva
Po nahrátí do Arduina se servo nastaví do polohy 0, zároveň se rožne Ledka co signalizuje, že se servo nevrtí a čeká se na stisk tlačítka. Tlačítko dá povel k vrtění serva nastavený čas 30s. Pak se zastaví v poloze zrovna tam, kde je. Po opětovném stisknutí tlačítka se vrtí 30s a cyklus se opakuje. Tady je celý sketch :

Kód: Vybrat vše

#include <Servo.h>                // zahrnutí knihovny pro ovládání servo motoru
Servo myservo;                // každý motor má svou instanci třídy Servo
int buttonPin = 3;                // číslo pinu tlačítka

int pos = 0;               // proměnná obsahující pozici motoru (úhel natočení)
int buttonState;                // nejnovější hodnota načtená ze vstupního pinu tlačítka
int lastButtonState = LOW;            // předchozí hodnota načtení ze vstupního pinu tlačítka
int reading;                // stav tlacitka
int step = 1;                // ukládá se do ní hodnotu jednoho kroku serva

int Led1 = 10;                // číslo pinu Led1
int Led2 = 11;                // číslo pinu Led2
int Led = 12;                // číslo pinu Led


                // 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
long lastDebounceTime = 0;                // čas posledního změny výstupního pinu
long debounceDelay = 50;                // čas debounce prodlevy
 /* TADY PRAVE PRETEKL CAS ?! */                                    
long buttonTime = -15001;                // čas začátku stisknutí tlačítka tj. začátek vrtění serva
                                         

void setup() {
  myservo.attach(9);                // servo je připojeno na pin 9
  pinMode(buttonPin, INPUT);                // nastavení tlačítka jako vstup
  myservo.write(pos);                // nastavení počátečního stavu serva
  
  pinMode(Led1, OUTPUT);                // nastavení Led1 jako výstup
  pinMode(Led2, OUTPUT);                // nastavení Led2 jako výstup
  pinMode(Led, OUTPUT);                // nastavení Led jako výstup
}

void loop() {
  /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  reading = digitalRead(buttonPin);

  if (reading != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime = millis();
  }

  lastButtonState = reading; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym reading, zda se to mezi tim nezmenilo

  if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (reading != buttonState) {  // Pokud se stav tlačítka změnil
      
      /*TADY SE ZAČÍNAJÍ DÍT VĚCI PŘI STISKNUTÍ/PUŠTĚNÍ TLAČÍTKA, NÁSLEDNĚ SE VYUŽIJÍ POZDĚJI V PROGRAMU*/
      buttonState = reading;   // zapamatuju si novy stav
    }
  }
  /*TOHLE JE KONEC BLOKU KDE OŠETŘUJI TLAČÍTKO*/

  /*TOHLE JE ZAČÁTEK BLOKU KDE NA ZÁKLADĚ DŘÍVE ZJIŠTĚNÝCH INFORMACÍ OBSLUHUJI SERVO*/
  // a tady (treba) budu neco delat

  if (buttonState == HIGH) {   // je stisknuto tlačítko??
    buttonTime = millis();     // příkazy, které si zapamatují čas, kdy bylo tlačítko stisknuto
  }

  /* podmínka = od toho času, kdy bylo tlačítko stisknuto, uběhlo méně než 30000ms ??
    (Pokud ano, udělej jeden cykl, pokud ne, ukonči cyklování a pokračuj dále v programu) */
   while (millis() - buttonTime <= 15000)  {   // podmínka
       digitalWrite(Led,LOW);     // Led nesvítí Servo se vrtí 
        
 /*TADY SE KONTROLUJE KRAJNÍ POZICE MOTORU*/
      if (pos <= 0) {     // zkontroluji si jestli je pozice 0 nebo méně
           step = 2;        // nastavím step na 1 (TOHLE JE ZMĚNA SMĚRU
      }
      if (pos >= 180) {    // zkontroluji si jestli je pozice 180 nebo více
           step = -2;        // nastavím step na -1 (TOHLE JE ZMĚNA SMĚRU)
      }
      /*TADY KONČÍ KONTROLA POZICE*/
      
      /*TADY SE OBSLUHUJE SERVO*/
      pos += step;       // k pozici motoru přičtu step (TA JE BUĎ 1 A POS SE ZVYŠUJE, NEBO -1 A POS SE SNIŽUJE)
         digitalWrite(Led1,pos>=175);
         digitalWrite(Led2,pos<=5);
      myservo.write(pos);     // nastavení serva na pozici
           delay(10);     // nějaký ten delay, aby se to stihlo natočit
      /*KONEC OBSLUHY SERVA*/
   }
     digitalWrite(Led,HIGH);     // Led svítí Servo stojí
 }
obrovské díky pro gilhad a kiRRow

a s číslem u step jsem si samozřejmě hrál taky, servo se vrtí rychleji ;)

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 srp 2019, 15:25

zdravím všechny, k poslednímu sketchi jsem natočil video. Je zde názorně vidět, že při nahrátí do Arduina, resetování a zapnutí napětí se servo natočí do pozice 0 a setrvává v něm do stisknutí tlačítka, pak se vrtí nastavených čas v mojem případě 30sekund. Pak zase čeká na stisnutí tlačítka.
Tady je odkaz : https://www.youtube.com/watch?v=j6Ks987 ... e=youtu.be

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 srp 2019, 19:36

zdravím, prosím můžete mi vysvětlit proč sketch, který jsem uvedl viz.výše a vrtí servem 30 sekund, po přidání Led3 se změní a vrtí servem jen nastavených 15000 ms ? vyzkoušel jsem i další časy. Když jsem dal buttonTime -30000, a do podmínky 20000, tak servo se vrtělo 20s. pokud buttonTime -15000, a do podmínky 15000, tak servo se vrtělo 15s. Co jsem provedl, že se čas změnil ?
změna :

Kód: Vybrat vše

         if (buttonState == HIGH) {
             digitalWrite(8,reading);        // pokud je zaznamenán stisk tlačítka, rozsviť Led3
         }  
         if (buttonState == LOW)  {         
             digitalWrite(8,reading);         // pokud není, zhasni Led3                 
         }
celý sketch

Kód: Vybrat vše

// TED SE SERVO VRTI JEN NASTAVENY CAS TJ 15000 MILISEKUND ! PROC ???
// přidat Led3 pro signalizaci stisknutí tlačítka vrtění serva

#include <Servo.h>                // zahrnutí knihovny pro ovládání servo motoru
Servo myservo;                // každý motor má svou instanci třídy Servo
int buttonPin = 3;                // číslo pinu tlačítka

int pos = 0;               // proměnná obsahující pozici motoru (úhel natočení)
int buttonState;                // nejnovější hodnota načtená ze vstupního pinu tlačítka
int lastButtonState = LOW;            // předchozí hodnota načtení ze vstupního pinu tlačítka
int reading;                // stav tlacitka
int step = 1;                // ukládá se do ní hodnotu jednoho kroku serva

int Led1 = 10;                // číslo pinu Led1
int Led2 = 11;                // číslo pinu Led2
int Led = 12;                // číslo pinu Led
int Led3 = 8;                // číslo pinu Led3


                // 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
long lastDebounceTime = 0;                // čas posledního změny výstupního pinu
long debounceDelay = 50;                // čas debounce prodlevy
 /* TADY PRAVE PRETEKL CAS ?! */                                    
long buttonTime = -15001;                // čas začátku stisknutí tlačítka tj. začátek vrtění serva
                                         

void setup() {
  myservo.attach(9);                // servo je připojeno na pin 9
  pinMode(buttonPin, INPUT);                // nastavení tlačítka jako vstup

  myservo.write(pos);                // nastavení počátečního stavu serva
  
  pinMode(Led1, OUTPUT);                // nastavení Led1 jako výstup
  pinMode(Led2, OUTPUT);                // nastavení Led2 jako výstup
  pinMode(Led, OUTPUT);                // nastavení Led jako výstup
  pinMode(Led3, OUTPUT);                // nastavení Led1 jako výstup  
}

void loop() {
   /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  reading = digitalRead(buttonPin);

  if (reading != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime = millis();
  }

  lastButtonState = reading; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym reading, zda se to mezi tim nezmenilo

  if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (reading != buttonState) {  // Pokud se stav tlačítka změnil
      
      /*TADY SE ZAČÍNAJÍ DÍT VĚCI PŘI STISKNUTÍ/PUŠTĚNÍ TLAČÍTKA, NÁSLEDNĚ SE VYUŽIJÍ POZDĚJI V PROGRAMU*/
      buttonState = reading;   // zapamatuju si novy stav tlačítka
         if (buttonState == HIGH) {
             digitalWrite(8,reading);        // pokud je zaznamenán stisk tlačítka, rozsviť Led3
         }  
         if (buttonState == LOW)  {         
             digitalWrite(8,reading);         // pokud není, zhasni Led3                 
         }
  }
  /*TOHLE JE KONEC BLOKU KDE OŠETŘUJI TLAČÍTKO*/

  /*TOHLE JE ZAČÁTEK BLOKU KDE NA ZÁKLADĚ DŘÍVE ZJIŠTĚNÝCH INFORMACÍ OBSLUHUJI SERVO*/
  // a tady (treba) budu neco delat

  if (buttonState == HIGH) {   // je stisknuto tlačítko??
    buttonTime = millis();     // příkazy, které si zapamatují čas, kdy bylo tlačítko stisknuto
  }

  /* podmínka = od toho času, kdy bylo tlačítko stisknuto, uběhlo méně než 30000ms ??
    (Pokud ano, udělej jeden cykl, pokud ne, ukonči cyklování a pokračuj dále v programu) */
   while (millis() - buttonTime <= 15000)  {   // podmínka
       digitalWrite(Led,LOW);     // Led nesvítí Servo se vrtí        
       
 /*TADY SE KONTROLUJE KRAJNÍ POZICE MOTORU*/
      if (pos <= 0) {     // zkontroluji si jestli je pozice 0 nebo méně
           step = 2;        // nastavím step na 1 (TOHLE JE ZMĚNA SMĚRU
      }
      if (pos >= 180) {    // zkontroluji si jestli je pozice 180 nebo více
           step = -2;        // nastavím step na -1 (TOHLE JE ZMĚNA SMĚRU)
      }
      /*TADY KONČÍ KONTROLA POZICE*/
      
      /*TADY SE OBSLUHUJE SERVO*/
      pos += step;       // k pozici motoru přičtu step (TA JE BUĎ 1 A POS SE ZVYŠUJE, NEBO -1 A POS SE SNIŽUJE)
         digitalWrite(Led1,pos>=175);
         digitalWrite(Led2,pos<=5);
      myservo.write(pos);     // nastavení serva na pozici
           delay(10);     // nějaký ten delay, aby se to stihlo natočit
      /*KONEC OBSLUHY SERVA*/
   }
     digitalWrite(Led,HIGH);     // Led svítí Servo stojí
 }
 }

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 srp 2019, 16:15

Máš binec ve složených závorkách. Ta předposlední je na špatném místě.

... to je tak, když si neděláš pořádek v kódu.

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 srp 2019, 17:49

teď si vzpomínám, že při kompilaci jsem jednu složenou závorku přidával, tak už tady jsem chyboval :roll: A to si psaní kodů snažím hlídat, když kliknu na závorku v IDE, tak mi ukáže, kde je druhá polovička, nebo ji při psaní hned napíše - docela dobrá vychytávka. Měřil jsem čas a takhle to je správně :

Kód: Vybrat vše

#include <Servo.h>                // zahrnutí knihovny pro ovládání servo motoru
Servo myservo;                // každý motor má svou instanci třídy Servo
int buttonPin = 3;                // číslo pinu tlačítka

int pos = 0;               // proměnná obsahující pozici motoru (úhel natočení)
int buttonState;                // nejnovější hodnota načtená ze vstupního pinu tlačítka
int lastButtonState = LOW;            // předchozí hodnota načtení ze vstupního pinu tlačítka
int reading;                // stav tlacitka
int step = 1;                // ukládá se do ní hodnotu jednoho kroku serva

int Led1 = 10;                // číslo pinu Led1
int Led2 = 11;                // číslo pinu Led2
int Led = 12;                // číslo pinu Led
int Led3 = 8;                // číslo pinu Led3


                // 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
long lastDebounceTime = 0;                // čas posledního změny výstupního pinu
long debounceDelay = 50;                // čas debounce prodlevy
 /* TADY PRAVE PRETEKL CAS ?! */                                    
long buttonTime = -15001;                // čas začátku stisknutí tlačítka tj. začátek vrtění serva
                                         

void setup() {
  myservo.attach(9);                // servo je připojeno na pin 9
  pinMode(buttonPin, INPUT);                // nastavení tlačítka jako vstup

  myservo.write(pos);                // nastavení počátečního stavu serva
  
  pinMode(Led1, OUTPUT);                // nastavení Led1 jako výstup
  pinMode(Led2, OUTPUT);                // nastavení Led2 jako výstup
  pinMode(Led, OUTPUT);                // nastavení Led jako výstup
  pinMode(Led3, OUTPUT);                // nastavení Led1 jako výstup  
}

void loop() {
   /*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
  reading = digitalRead(buttonPin);

  if (reading != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
    lastDebounceTime = millis();
  }

  lastButtonState = reading; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym reading, zda se to mezi tim nezmenilo

  if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
    if (reading != buttonState) {  // Pokud se stav tlačítka změnil
      
      /*TADY SE ZAČÍNAJÍ DÍT VĚCI PŘI STISKNUTÍ/PUŠTĚNÍ TLAČÍTKA, NÁSLEDNĚ SE VYUŽIJÍ POZDĚJI V PROGRAMU*/
      buttonState = reading;   // zapamatuju si novy stav tlačítka
         if (buttonState == HIGH) {
             digitalWrite(8,reading);        // pokud je zaznamenán stisk tlačítka, rozsviť Led3
         }  
         if (buttonState == LOW)  {         
             digitalWrite(8,reading);         // pokud není, zhasni Led3                 
         }
    }
  } 
  /*TOHLE JE KONEC BLOKU KDE OŠETŘUJI TLAČÍTKO*/

  /*TOHLE JE ZAČÁTEK BLOKU KDE NA ZÁKLADĚ DŘÍVE ZJIŠTĚNÝCH INFORMACÍ OBSLUHUJI SERVO*/
  // a tady (treba) budu neco delat

  if (buttonState == HIGH) {   // je stisknuto tlačítko??
    buttonTime = millis();     // příkazy, které si zapamatují čas, kdy bylo tlačítko stisknuto
  }

  /* podmínka = od toho času, kdy bylo tlačítko stisknuto, uběhlo méně než 30000ms ??
    (Pokud ano, udělej jeden cykl, pokud ne, ukonči cyklování a pokračuj dále v programu) */
   while (millis() - buttonTime <= 15000)  {   // podmínka
       digitalWrite(Led,LOW);     // Led nesvítí Servo se vrtí        
       
 /*TADY SE KONTROLUJE KRAJNÍ POZICE MOTORU*/
      if (pos <= 0) {     // zkontroluji si jestli je pozice 0 nebo méně
           step = 2;        // nastavím step na 1 (TOHLE JE ZMĚNA SMĚRU
      }
      if (pos >= 180) {    // zkontroluji si jestli je pozice 180 nebo více
           step = -2;        // nastavím step na -1 (TOHLE JE ZMĚNA SMĚRU)
      }
      /*TADY KONČÍ KONTROLA POZICE*/
      
      /*TADY SE OBSLUHUJE SERVO*/
      pos += step;       // k pozici motoru přičtu step (TA JE BUĎ 1 A POS SE ZVYŠUJE, NEBO -1 A POS SE SNIŽUJE)
         digitalWrite(Led1,pos>=175);
         digitalWrite(Led2,pos<=5);
      myservo.write(pos);     // nastavení serva na pozici
           delay(10);     // nějaký ten delay, aby se to stihlo natočit
      /*KONEC OBSLUHY SERVA*/
   }
     digitalWrite(Led,HIGH);     // Led svítí Servo stojí
}

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 srp 2019, 18:20

jsou i vychytanější editory než arduinoIDE ... koukni jak vypadá tvůj kód ve visual studio code https://ctrlv.cz/QjwM mírně upraveno v malování

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 zář 2019, 16:32

zdravím, pánové prosím mám nějaký problém se servama a to hned se dvěma /ozačení Tower Pro Micro Servo 9g SG90/, po načtení do Arduina se nechcou vrtět. Arduino jsem přehodil za jiné a výsledek je stejný, nahrál jsem i jiný sketch / blink /, jinou šňůru, restartoval IDE a taky PC. Jak můžu vyzkoušet servo bez servotesteru ? A jak se mohla porouchat hned 2 serva najednou ? Je to možné nastavením vrtění ? od pozice 0 do pozice 180 ? pak Arduino bylo připojeno stále na usb k pc.
díky za odpovědi

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

Re: Mini CNC osa Z

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

dobrý den pánové, se servy jsem to vyřešil tak, že jsem koupil nové, protože se zničily - no co už jsou z číny.
Ale mám jiný problém a nechci zakládat nové vlákno.
V rámci učení se, jsem v tomto sketchi, který tlačítkem přepíná varianty blikání Led, jsem přidal pomalé blikání Led
a potom střídavé blikání Led.
Problém je , že když stisknu tlačítko po střídavém blikání, tak má následovat zhasnutí Led tj. mod == 0. Ale musím stisknout tlačítko někdy i několikrát.
Mám přidání blikání napsáno dobře ? Když jsem zkoušel napsat jinak, vždycky mi sketch po nahrání začal střídavě blikat. ?! Nepatří tam ještě další podmínka ? Nebo by stačilo ošetřit tlačítko proti debouce ? Tady jsem zvýšil čas z 200ms na 300ms
Originál tady: https://arduino8.webnode.cz/news/lekce- ... 661472/10/
Můj upravený sketch :

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 Svetla1 = 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;

 
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)
    {
      mode++; // přičte k MODE hodnotu 1
      if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluj
      delay(400); // 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í Led
   if (mode == 3) Svetla = Blik2;  // pomalé blikání Led
   if (mode == 4) Svetla = Svetla1;  // 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 400
   // 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č 2 pro blikání ********************************
   if ((millis() - posledniBlik2) > 1000)
    {
     Blik2 = !Blik2;
     posledniBlik2 = millis();
    }
    
// tady to není 100% přepnutí zpátky od začátku  !!!  
   // časovač 3 pro blikání ********************************
   if (mode == 4)
    {
      digitalWrite(Led1,HIGH);
      digitalWrite(Led2,LOW);
      delay (500);
      digitalWrite(Led1,LOW);
      digitalWrite(Led2,HIGH); 
      delay (500);          
    } 
   
   if (mode > 4)Svetla = 0;
   
 }
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 » 23 zář 2019, 15:59

Problém je v tom, že při střídavém blikání používáš delay. V momentě kdy procesor vykonává delay, nemůže dělat nic jiného. Proto ignoruje stisky tlačítka.

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 zář 2019, 17:34

díky kiRRow, zkusil jsem tohle, ale nemůžu se pohnout, nemůžu přijít na podmínku, která spustí střídavé blikání ?

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;

unsigned long lastMillis1;
unsigned long lastMillis2;

int intervalLed = 500;
  
void setup() {
 pinMode(Led1, OUTPUT); // nastaví vystup u Led 1 na výstup
 pinMode(Led2, OUTPUT); // nastaví vystup u Led 2 na výstup

 lastMillis1 = millis();
 lastMillis2 = millis();
 
 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)
    {
      mode++; // přičte k MODE hodnotu 1
      if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluj
      delay(600); // 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í Led
   if (mode == 3) Svetla = Blik2;  // pomalé blikání Led
   if (mode == 4) 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 400
   // 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č 2 pro blikání ********************************
   if ((millis() - posledniBlik2) > 500)
    {
     Blik2 = !Blik2;
     posledniBlik2 = millis();
    }
    
// TADY TO NEFUNGUJE 
// tj. když stiskneš 4x tlačítko - střídavě blikej led 

   // časovač 3 pro blikání ********************************
   if (mode == 4)
    {
    if ((millis() - lastMillis1) >= 500) {        
       digitalWrite(Led1, !digitalRead(Led1));
       lastMillis1 = millis();
     } 
    if ((millis() - lastMillis2) >= 500) {    
       digitalWrite(Led2, !digitalRead(Led2));
       lastMillis2 = millis(); 
     }            
   }
 } 
Všechno chodí jak má, ale jak dojde na střídavé blikání , tak podle toho co napíšu, se obě ledky rožnou nebo jsou obě zhasnuté :roll: :oops:

Odpovědět

Kdo je online

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