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

Время не властно над КА - конечный аппарат:)

Если серьёзно практический интерес был связан с оптимизацией при восприятии задачи - “нада объединить два скетча в один”

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);
}
/////////////////////////////// сверху один, снизу другой
for(int i=0;i<111;i++){
//действие №1
delay(T11);
}
for(int i=0;i<222;i++){
//действие №2
delay(T22);
}
for(int i=0;i<333;i++){
//действие №3
delay(T33);
}

Красная - подсветка экрана, остальные три - установка времени: синяя - “начать установку” и “принять текущее значение”, а белые - +1 и -1.

1 лайк

И не надоело Вам жевать по новому.

Это главная ошибка и заблуждение. Главное это вопрос экономии процессорного времени на задежках в delay и лишних ненужных перепроверках.
В КА все просто. Там в текущем состоянии КА надо опрашивать только такие события и можно выполнить только такие действия. А если ничего не надо, то передавай управление процессора другим задачам(другим скетчам).

А причём в примере КА? Тут вопрос разделения изначально неделимого кода)

Вопрос перехода delay_millis решён, не решено удобоваримое восприятие перехода, думал КА как то систематизируют его…, но нет:)

глупость.
КА может не использовать миллис вовсе
@qwone1 - вы как пять лет назад не понимали сути вопроса, так и сейчас мало что изменилось. Ваши автоматы (примеры автоматов) чисто последовательные и переключаются по времени. В них и правда самое главное - это избавление от делей. Только вы не понимаете, что Ка для этого не нужен, тут нет ничего нового по сравнению с Блинк_Без_Делей

2 лайка

:slight_smile:
Главное это отсутствие многопоточности при решении задач и слабо понятная новичку замена на псевдомногозадачность через поочерёдность.

Вы тоже можете не использовать деньги вовсе. Но согласись с деньгами жить намного удобнее. Так зачем лишаться удобств, если с Удобствами жить УДОБНО.

Зачем обезьяне становится человеком, если это слабо понятно обезьяне. Или проще говоря. Не хочешь , не делай. Но тогда не завидуй, что у других это вышло.

Лилика понесло куда-то «не туда» уже :smiley:

:slight_smile:
Это от зависти.

Архат оказывается из местных.

ну и молодежь пошла, стариков не уважают…

Лилик, не будите лихо. Мы тогда с трудом Архата с форума выперли, не ровен час он снова объявится.

2 лайка

вроде сам ушёл, не?

В дверь уходил и тут же в окно лез с другими никами: “я тут ученик Архата, так вот он мне говорил …:slight_smile:

слаб человек…слаб…но в нём жеж и хорошее присутствовало - и платы на атмеге2560 с расширенной памятью и малыми габаритами разработал и даже предлагал купить излишки, мостовые драйвера тоже делал, компактные, насколько помню он с сыном по соревнованиям ездил, а вот на чём зацепились не вспомню )))

1 лайк

Ну Вот вам как два скетча КА независимо работают

//------------------------
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:
      Serial.println("End");
      events = {[]() {
      }
             };
      break;
  }
}
/*Music*/
const byte BuzzerPin = 10; // пин подключения зуммера
#include "pitches.h"
const int melody[] PROGMEM = {4, NOTE_C4, 8, NOTE_G3, 8, NOTE_G3, 4, NOTE_A3, 4, NOTE_G3, 4, 0, 4, NOTE_B3, 4, NOTE_C4, 0, 0};
const int temp = 800; // темп исполнения
//-- музыкальный движок
void (*musics)() = {};
uint32_t Mpast, time;
int* ii;
void stopMusic() {
  musics = {[]() {}};
}
void playMusic(const int *data) {
  int n = pgm_read_word(data); if (n == 0)return;
  ii =  (int *)data + 1; time = temp / n ;
  tone(BuzzerPin, pgm_read_word(ii), time / 1.3);
  musics = {[]() {
    if (millis() - Mpast >= time) {
      Mpast = millis();
      ii++;
      int n = pgm_read_word(ii);
      if (n == 0)stopMusic();
      else {
        time = temp / n; ii++;
        tone(BuzzerPin, pgm_read_word(ii),  time / 1.3);
      }
    }
  }
           };
}
//------------------------------
void setup() {
  Serial.begin(9600);
  go(1);
  playMusic(melody);//<- проиграть мелодию
}
void loop() {
  events();
  musics();
}

Почему время цикла музыки в 1.3 раза больше чем длительность ноты? Что за таинственный множитель?

О это магический множитель для последователей Ардуины. https://www.arduino.cc/en/Tutorial/BuiltInExamples/toneMelody