Конечные автоматы - для "школьников". Есть такое?

Благодарю, постарайтесь пожалуйста воздерживаться от матов.

3 лайка

Речь идёт о дополнительном разбиение по аппаратным компонентам?
Типа:

if(event_indicator()){status_indicator();}
if(event_motor()){status_motor();}
if(event_svetodiodi()){status_svetodiodi();}

Речь идет о том, что основному циклу незачем знать, с какими event’ами работает какое устройство - это дело его внутренней кухни.


Берем случайный граф КА и внимательно разглядываем. Кружечки это состояния КА. А вот начало стрелочек это СОБЫТИЯ(ЕВЕНТЫ). И если внимательно посмотрим что в каждом состоянии свой комплект рассматриваемых евентов.А это значит что основному циклу надо знать в каком состоянии находится КА и какой комплект евентов рассматривать..

Ну и плюс отсутствие готовых рецептов перехода от delay() к millis(). По тем же циклам for, для той же умной гирлянды к примеру.

for(int i=0;i<111;i++){
//действие №1
delay(T1);
}
for(int i=0;i<222;i++){
//действие №2
delay(T2);
}
for(int i=0;i<333;i++){
//действие №3
delay(T3);
}

Не существует готовых рецептов перехода с языка Basic на язык Си/Си++. Просто for и delay() это фишки Basic. Да в Си их можно использовать, но они пипец как не эффективны.
Или есть, через учится, пробовать пытаться, даже если не хочется или не умеется.

я тут как-то код писал, нерешаемая проблема решилась использованием оператора GOTO (С++) )))
PS я не настоящий сталевар, если полностью всё переписать наверно можно было обойтись и без него, но это не точно

int T1=1000,T2=2000,T3=3000;
long Y=0;//переменная хранения моментов времени
int i=0;//счётчик
byte loop_=1;//счётчик последовательности delay();
void setup(){
}
void loop(){
if(loop_==1&&millis()-Y>T1){
Y=millis();
//действие №1
i++;if(i>111){i=0;loop_++;}
}
if(loop_==2&&millis()-Y>T2){
Y=millis();
//действие №2
i++;if(i>222){i=0;loop_++;}
}
if(loop_==3&&millis()-Y>T3){
Y=millis();
//действие №3
i++;if(i>333){i=0;loop_=1;}
}
}

Ну вот, как мне кажется эквивалент без делаев. Нужен счётчик для них в их скетчевой последовательности.

goto, на самом деле.

Его можно ещё более креативно использовать - с массивом меток и по индексу переходить :slight_smile:

А сама метка это что, слово?.. Когда то пробовал goto. Не везде можно метку ставить, вылазят ошибки какие то.

А что можно делать везде? Вон даже пукать и то не везде и не всегда можно :frowning:

Отнюдь.
Основному циклу не нужно знать ни то, ни другое.
Это все внутренне дело КА.

Как раз “по циклам for” есть вполне конкретный рецепт: избавляться нужно от этих циклов.

Я в том смысле, что маловато тут информации почему-то.

Оставляя delay?

delay это тоже for.

Останется if и millis() :slight_smile:

Ну например есть еще лямда функции

uint32_t past = 0;
void (*events)() = {
  []() {
    if (millis() - past >= 500) {
      past = millis();
      Serial.println("Tyk");
    }
  }
};
void setup() {
  Serial.begin(9600);
}
void loop() {
  events();
}

Да, ваще, ни хрена уже не осталось! @anonimSimen вот мне как-то сказал, что из системы команд интеля даже команду POPA убрали! Как теперь программировать-то?

И чем вам такой КА не нравится

uint32_t  T1 = 100, T2 = 200, T3 = 300;
int i = 0;
void (*events)() = {};
int state;
uint32_t past;
void go(int s) {
  state = s;
  past = millis();
  switch (s) {
    case 1:
      i = 0;
      events = {[]() {
        if (millis() - past >= T1) {
          Serial.println("Do 1");
          past = millis();
          i++; if (i > 3) go(2);
        }
      }
             };
      break;
    case 2:
      i = 0;
      events = {[]() {
        if (millis() - past >= T2) {
          Serial.println("Do 2");
          past = millis();
          i++; if (i > 3) go(3);
        }
      }
             };
      break;
    case 3:
      i = 0;
      events = {[]() {
        if (millis() - past >= T3) {
          Serial.println("Do 3");
          past = millis();
          i++; if (i > 3) go(0);
        }
      }
             };
      break;
    default:
      events = {[]() {
        Serial.println("End");
        delay(1000);
      }
             };
      break;
  }
}


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

void loop() {
  events();
}