Время не властно над КА - конечный аппарат:)
Если серьёзно практический интерес был связан с оптимизацией при восприятии задачи - “нада объединить два скетча в один”
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.
И не надоело Вам жевать по новому.
Это главная ошибка и заблуждение. Главное это вопрос экономии процессорного времени на задежках в delay и лишних ненужных перепроверках.
В КА все просто. Там в текущем состоянии КА надо опрашивать только такие события и можно выполнить только такие действия. А если ничего не надо, то передавай управление процессора другим задачам(другим скетчам).
А причём в примере КА? Тут вопрос разделения изначально неделимого кода)
Вопрос перехода delay_millis решён, не решено удобоваримое восприятие перехода, думал КА как то систематизируют его…, но нет:)
глупость.
КА может не использовать миллис вовсе
@qwone1 - вы как пять лет назад не понимали сути вопроса, так и сейчас мало что изменилось. Ваши автоматы (примеры автоматов) чисто последовательные и переключаются по времени. В них и правда самое главное - это избавление от делей. Только вы не понимаете, что Ка для этого не нужен, тут нет ничего нового по сравнению с Блинк_Без_Делей
Главное это отсутствие многопоточности при решении задач и слабо понятная новичку замена на псевдомногозадачность через поочерёдность.
Вы тоже можете не использовать деньги вовсе. Но согласись с деньгами жить намного удобнее. Так зачем лишаться удобств, если с Удобствами жить УДОБНО.
Зачем обезьяне становится человеком, если это слабо понятно обезьяне. Или проще говоря. Не хочешь , не делай. Но тогда не завидуй, что у других это вышло.
Лилика понесло куда-то «не туда» уже
Это от зависти.
Архат оказывается из местных.
ну и молодежь пошла, стариков не уважают…
Лилик, не будите лихо. Мы тогда с трудом Архата с форума выперли, не ровен час он снова объявится.
вроде сам ушёл, не?
В дверь уходил и тут же в окно лез с другими никами: “я тут ученик Архата, так вот он мне говорил …”
слаб человек…слаб…но в нём жеж и хорошее присутствовало - и платы на атмеге2560 с расширенной памятью и малыми габаритами разработал и даже предлагал купить излишки, мостовые драйвера тоже делал, компактные, насколько помню он с сыном по соревнованиям ездил, а вот на чём зацепились не вспомню )))
Ну Вот вам как два скетча КА независимо работают
//------------------------
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