• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Złożone wystąpienie millis()
#1
Witam, serdecznie Wink

Mam pytanko jak poprawnie zapiać poniższy kod, zastępująć delay() funkcją millis(), próbowałem na różne sposoby, ale efekt nie był taki jak pownien ;/

Kod:
distance_1_mod_pr = false;
    motor_stop();
    motor_rear(255);
    delay(600);
   
    if(random(1,20) % 2 == 0)
    {
      motor_left(255);
    }
    else{
      motor_right(255);
    }
    delay(400);

    distance_1_mod_pr = true;
    motor_front(255);

Z góry dziękuje za pomoc Wink
 
Odpowiedź
#2
Jak coś nie jest powtarzalne, a tylko jednorazowe to można takie zadanie podzielić na etapy switch case, może ta konstrukcja być wrzucona w funkcję. Zmienne static są jak globalne, ale widoczne tylko między {}, lokalnie.
Kod:
loop()
{

switch (etap) //jeśli etap inny  to pójdzie drogą przez default i wyjdzie, jak w if nic tu nie robiąc.
{
static uint32_t teraz, poprzednio;
case 0: //ta droga przejdzie tylko raz i przeskoczy na case 1
distance_1_mod_pr = false;
    motor_stop();
    motor_rear(255);
poprzednio=millis();
etap++;
break;

case 1: // odmierzanie 600ms, tu bedzie wchodzi przez 600ms i zrobi etap++
teraz=millis();
if ((uint32_t)(teraz-poprzednio)>600UL) etap++;
break;

case 2 : // ta droga przejdzie tylko raz i przeskoczy na case 3
if(random(1,20) % 2 == 0)
    {
      motor_left(255);
    }
    else{
      motor_right(255);
    }
etap++;
poprzednio=millis();
break;

case 3: // odmierzanie 400ms jak poprzednio
if minelo 400 etap++
break;

case ostatniEtap:
etap++; jeśli nie powtarzamy i ma leciec przez default, gdzieś poza tym blokiem cos ustawi etap=0
etap=0; gdy zabawa zaczyna się od nowa
break;

default:
break;
}

}


W case 0 można wywalić break, jak już wejdzie w 0 to i wykona też 1, jak jest break to wykona 0, wyjdzie i przy kolejnym obiegu loop dopiero wejdzie w 1. Ale do 2 przejdzie dopiero jak spełni warunek z 1. Można też w 1 dodać break w else, jak nie minęło 600 to break, a jak minęło to etap++ i wykonanie 2. Ale jak loop trwa tyle ile powinno, czyli parę us to nie ma znaczenia.
Każdy case się odpala, jeśli ma się odpalić, ale typowo tylko jeden i wraca do loop.
Takie etapy mogą trwać wiele godzin, np. jak wędzę coś, to sobie rozgrzewam wędzarnie do 60oC, potem podsuszam wędlinę jeśli sobie nie powisiała lub warunki otoczenia nie pozwoliły, potem włączam generator dymu i grzałkę na 2-4h, pilnuję wybranej temperatury dla tego etapu i prędkości podawania wiórek,  potem mogę ustawić na 15 -60 minut temperaturę by upiec, inny czas i temperatura dla rybki, inaczej dla kiełbasy, a inaczej dla szynki, albo w ogóle nie ma tego etapu, bo nie dopiekam, tylko wrzucam do parzenia.
Jak parzę wędlinę, to rozgrzewam w garnku wodę do 95oC, jak zostanie wrzucona wędlina to pilnuję temperatury 80+/-5oC i czekam 30-120m.
A przynajmniej tak zrobię, jak mi się będzie chciało to faktycznie napisać i polutować Big Grin.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Dziękuje, za naprowadzenie Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości