/***/
#define RelPin1 5
#define RelPin2 9 //Например реле 2 на 6-м пине
enum {sRel_12ON = 0, sRel_1OFF, sRel_2OFF};
uint32_t time = 0;
uint8_t state = sRel_12ON;
uint32_t period = 0;// Период для ВК 1го и 2го-реле
//------------------------------
void setup() {
pinMode(RelPin1, OUTPUT);
pinMode(RelPin2, OUTPUT);
Serial.begin(115200);
Serial.println("Test start");
}
void loop() {
if ((millis() - time) >= period) {
time = millis();
switch (state) {
case sRel_12ON:
state = sRel_1OFF;
digitalWrite(RelPin1, HIGH );
digitalWrite(RelPin2, HIGH );
period = 20000; // Период для ВЫК 1го-реле
break;
case sRel_1OFF:
state = sRel_2OFF;
digitalWrite(RelPin1, LOW);
period = 60000;// Период для ВЫК 2го-реле
break;
case sRel_2OFF:
state = sRel_12ON;
digitalWrite(RelPin2, LOW);
period = 120000;// Период для ВК 1го и 2го-реле
break;
}
}
}
/**/
vosara, qwone и всем кто принимал участие в дискусии и помогал огромное спасибо. Код работает, правда пока только в Протеусе, но думаю и на железе заработает. Еще раз СПАСИБО!!!!!
Вчера до поздна сидел с этим кодом. Залил эмуляцию в Протеус и долго наблюдал за работой скетча. И до меня дошло, что при такой стурктуре скетча моя задача просто никогда не будет выполняться.
#define relay1 5
#define relay2 9 //Например реле 2 на 6-м пине
void setup(){
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
Serial.begin(115200); //Запускаем сом-порт
Serial.println("Test start");
} // КОНЕЦ ИНИЦИАЛИЗАЦИИ
void loop() // ПРОГРАММЫй безусловный ЦИКЛ
{
static bool state1;
static unsigned long time;
if((millis() - time) > (state1 ? 1000 : 5000)) // уменьшил цифры на 3 порядка, чтобы не ждать сутки :)
{
state1 = !state1;
digitalWrite(relay1, state1);
Serial.print("relay1:");
Serial.println(state1);
time = millis();
}
//Для второго реле
static bool state2;
static unsigned long time2;
if((millis() - time2) > (state2 ? 3000 : 5000)) // уменьшил цифры на 3 порядка, чтобы не ждать сутки :)
{
state2 = !state2;
digitalWrite(relay2, state2);
Serial.print("relay2:");
Serial.println(state2);
time2 = millis();
}
}
Поскольку постоянно будет происходить сдвиг в запуске реле на величину разницы в отключении первого и второго реле.
И по этой причине возникает вопрос. Как можно изменить код, чтобы реле одновременно включались, но отключались в разное время и через определенный интервал, снова 2 реле одновременно запускались и отключались в разное время и т.д.??? Получается я должен отсчитывать время запуска реле посредсвом команды millis, но вот для отсчета времени их отключения нужно использовать какой то другой таймер времени. Который будет только отсчитывать время с момента включения и до момента когда реле нужно отключить.
Задача решается банальным конечным автоматом.
А запутались Вы потому, что почему-то решили, что автомат может иметь только два состояния.
А состояний - три:
1 - включены оба реле,
2 - одно из реле отключилось, а второе еще включено,
3 - оба реле отлючены.
Собственно, переделайте переменную состояний с булевой на целую и откорректируйте условия переходов 1-2, 2-3 и 3-1.
Тогда уж сразу стоит ввести 4 состояния: "всё выключено", "первое релевключено, второе выключено", "первое реле выключено, второе включено" и "всё включено". Или оставить только 2 состояния "вкл", "Выкл", но создать ДВА автомата по количеству реле.
P.S. Ну и ещё, важный момент в автоматном проектировании кода: "состояние" конечного автомата (программы) - это то, что может длиться достаточно долго. А вот то, что переводит автомат из одного состояния в другое - есть "действие" конечного автомата. Есть особый класс неявных "действий" - перевод автомата в иное состояние по истечению времени. Как правило программируется единообразно и составляет ядро библиотеки КА.
Обучая детишек в 5-м классе программированию КА, внезапно обнаружил, что для них это ни разу не тривиально: что считать состоянием КА и где и как применять "действия".
P.P.S. Как пример, всё тот же наш "умный светофор" (специально левый, автор переложит сам): Есть "кнопка пешехода". По нажатию которой должен "мигнуть" светодиод и код должен сплюсовать пешехода. Как только пешеходов набралось заданное кол-во, надо перевести автомат самого светофора в "мигающий зеленый" (далее он сам переключится на красный)..
Вообще-то скетч выше это скорее недоавтомат или не автомат.
/***/
unsigned long mill;// переменная для millis()
//----------------------------------------
class Cl_Device {
protected:
byte pin1, pin2;
enum {sOFF = 0, sRel_12ON, sRel_1OFF, sRel_2OFF};
unsigned long past;
byte state;
void stand(byte s) {
state = s;
past = mill;
switch (state) {
case sOFF:
digitalWrite(pin1, LOW );
digitalWrite(pin2, LOW );
break;
case sRel_12ON:
digitalWrite(pin1, HIGH );
digitalWrite(pin2, HIGH );
break;
case sRel_1OFF:
digitalWrite(pin1, LOW);
break;
case sRel_2OFF:
digitalWrite(pin2, LOW);
break;
}
}
public:
Cl_Device(byte p1, byte p2): pin1(p1), pin2(p2) {}
void init() {
pinMode(pin1, OUTPUT);
pinMode(pin2, OUTPUT);
stand(sOFF);
}
void run() {
if (state == sRel_12ON && mill - past >= 20000) stand(sRel_1OFF);
if (state == sRel_1OFF && mill - past >= 60000) stand(sRel_2OFF);
if (state == sRel_2OFF && mill - past >= 120000) stand(sRel_12ON);
}
void start() {
stand(sRel_12ON);
}
};
//-----Компоновка--------------------------
Cl_Device Device(/*пин реле 1*/5,/*пин реле 2*/9);
//-------main()-----------------------
void setup() {
Device.init();
Device.start();
}
void loop() {
mill = millis();
Device.run();
}
/**/
Опять же народ путает что такое состояние. Состояние это что однократно должно быть сделано и перевод переменной state в значение этого состояния. А переход это вычисление условий этого перехода. Самые сложные автоматы это ПЛИС и Процессоры. А то что детишки в автоматах не разбираются. Так и взрослые не очень сильно разбираются в ПЛИС логике и в процессорах, куда там детишкам.
Ребята не хочу вас огорчать но вы допустили ошибки. В обоих случаях первое реле отключится через 20 секунд, а второе через 80 секунд.
Вы на полном серьезе считаете это ОШИБКОЙ? Или это юмор?
Никто не делал законченую программу для заказчика, был дан один из вариантов ответа на вопрос в начале топика. А если поменять цыфру из 60000 на 40000 или 140000 (в зависимости от задачи) проблема тогда да, это ОШИБКА
... Опять же народ путает что такое состояние. Состояние это что однократно должно быть сделано и перевод переменной state в значение этого состояния. А переход это вычисление условий этого перехода.
Да, вот и Вы совершили ту же самую ошибку что и мои детишки. :)
состояние - не зависит от того сколько раз оно должно быть сделано: однократно или многократно. Вычисление условий как раз и определяет НОВОЕ состояние и его переход - т.е. это - "действие" в том или ином виде текущего состояния. При отсутствии изменения условий - автомат находится в некотором состоянии и до тех пор пока эти условия НЕ ИЗМЕНЯТСЯ он в нем и будет торчать. Некоторые условия изменяются "по времени" - держим состояние заданное время, затем меняем на следующее. Некоторые условия сокрыты в процессе вычисления условий - поток входных симоволов какого-нибудь парсера (пример в вики) - факт обработки предыдущего символа, и переход к следующему и есть "условие". И т.д.
Arhat109-2, Вы это завязывайте с ... ну с тем что употребляете. Форум про Ардуину. Раздел Программирование. И конечные Автоматы применимо к этой тематике. А то что они могут существовать еще в механике и электронике, так это идите туда и им рассказывайте. В программировании это банально методика решить конкретную задачу и не больше. И да всякое компьютеное моделирование тоже за борт. Ну мало в Ардуине вычислительных ресурсов.
Состояние это что однократно должно быть сделано и перевод переменной state в значение этого состояния. А переход это вычисление условий этого перехода.
Вы, простите, какой автомат имеете в виду? Автомат Мура или автомат Мили? А то пока получается как у деда Щукаря: "Самокритика, - это когда я сам критикую".
Вы, простите, какой автомат имеете в виду? Автомат Мура или автомат Мили? А то пока получается как у деда Щукаря: "Самокритика, - это когда я сам критикую".
Не знаю я таких оружейников. Вот только задание темы вроде включением 2-х реле по времени. И vosara написал скетч, а я поправил. И пошла тема об оружии. Вы там тоже что то детишкам в школе про оружие говорили. Так что оружие в школе это вещь, если оно у тебя и много патронов.
Так про автоматы вроде Вы заговорили, а не я. Я лишь попытался уточнить какие именно Вы имеете в виду. Ну, не хотите говорить - не надо. Секретничайте дальше.
Кстати, бреда про оружие не понял. И причём тут оружие вообще? Об оружии я общаюсь на другом форуме.
Тогда уж сразу стоит ввести 4 состояния: "всё выключено", "первое релевключено, второе выключено", "первое реле выключено, второе включено" и "всё включено".
Можно вводить сколько угодно состояний, но только 3 из них когда-либо будут реализованы, остальные (кроме трех) не будут использоваться никогда. Поэтому остановиться на цифре 3 в данном случае представляется вполне разумным.
Так про автоматы вроде Вы заговорили, а не я. Я лишь попытался уточнить какие именно Вы имеете в виду. Ну, не хотите говорить - не надо. Секретничайте дальше.
Наверно потому что эти автоматы так же не реально организовать на языке Си, как автомат Узи или автомат Томпсон. Или у вас уже есть наработки в этом направлении.
Увольте, я всего лишь спросил какой именно автомат Вы имеете в виду, потому что не до конца понял Ваш пассаж с переходом. Вместо того, чтобы нормально ответить, Вы зачем-то нарываетесь на холивар. Зачем?
И что такого трудного в их реализации на С? Не понимаю.
И, да, кстати, если Вы и впрямь хоть раз в жизни реализовывали какой-либо автомат с выходом, то погуглив наконец названия, о которых я говорю, Вы с удивлением обнаружите, что один из них Вы и реализовывали. Как Журден, который страшно удивился, что всю жизнь говорил прозой.
Я прямо говорю. Что Мур или Милли здесь бесполезен. Ну не тот механизм. Он работает на "железе" . Для софта надо искать другие похожие приемы о которых ни Мур ни Милли не говорил.
я прямо говорю. Что Мур или Милли здесь бесполезен.
На самом деле Вы прямо сказали, что знания об автоматах у Вас на уровне "слышал такое слово". Прокачайте. И самому полезно и клоуном быть перестанете.
Для справки: автомат Мили отличается от автомата Мура тем, что в первом действия выполняются при переходе из одного состояния в другое (и потому какое именно действие будет выполнено, зависит от сигнала, исходного и целевого состояний). А у второго действие выполняется уже после того, как атомат перешёл в некоторое состояние и потому какое именно действие будет выполнено, зависит только от целевого состояния. Существует теорема об их "равномощности" и "взаимопреобразуемости".
я прямо говорю. Что Мур или Милли здесь бесполезен.
На самом деле Вы прямо сказали, что знания об автоматах у Вас на уровне "слышал такое слово". Прокачайте. И самому полезно и клоуном быть перестанете.
А зачем прокачивать?
Вот я, например, сам изобрел некоторый механизм решения задач.
Еще в эпоху "до Интернета".
А позже, уже из Интернета выяснил, что то, что я изобрел, какой-то мужик изобрел раньше, чем я, и что это изобретение принято называть конечным автоматом.
Но как-то незнание мной фамилии мужика, который изобрел что-то независимо от меня, совершенно не мешает мне пользоваться моим изобретением.
Цитата:
Для справки: ... Существует теорема об их "равномощности" и "взаимопреобразуемости".
Теперь тем более не вижу смысла выяснять фамилию мужика.
Наверное, я изобрел сразу оба, т.к. при использовании не вижу разницы. Для меня изменения происходят не "до" и не "после", а "во время", ибо я не вижу разницы между двумя фрагментами линейного кода:
do_something();
state = nextState;
и
state = nextState;
do_something();
при условии, что do_something() не использует значение state.
А Вы читали, что он писал? Прокачивать знания нужно, чтобы такого не писать.
andriano пишет:
ибо я не вижу разницы между двумя фрагментами линейного кода:
Ваш код не имеет отношения к тому, что я говорил, Вы невнимательно прочитали.
В автомате Мура действие происходит после перехода в состояние всегда, независимо от того из какого состояния и по какой причине был переход. Т.е. действие является функцией только конечного состояния. А в автомате Мили, действие проихсодит на переходе и выполнение действия зависит от исходного состояния и управляющего воздействия. Как видите разница в в подходах к проектированию логики автомата. Есть задачи, где удобнее одно, а есть - где другое.
В таком разе, надо начинать не с "к какому типу КА относится перестановка линейного кода", а к тому что вообще наличие переменной state и свича по ней - ещё не совсем "конченный автомат", да и наверное ещё и не автомат даже.. а то так можно каждый свитч в программе обозвать "автоматом"... :)
P.S. И да, тоже вспомнилось: в году так 2000-м, после 2-3 лет разработки БД на базе разных Access и прочих РА, "изобрел" хранение данных "повдоль таблицы" .. удобна, сил нет! Динамическое добавление свойств-полей, да "на раз", запросы с поиском посложнее, но тоже "на раз-два" .. красота. Динамический саморазвиваемый рубрикатор товаров - ляпота просто. И только позже, году к 2009-у внезапно (на собеседовании) узнал что это оказывается аж целая "модель EAV аж самого Тенцера" .. о как. А примерно через годик-два, разбирая завалы на ещё "Парадоксе" из под ДОС в одной из фирм, внезапно нашел аналогичное применение "EAV" от .. 1997 года.
Может оно и "все равно" как называется .. но варианты применений во всех трех случаях - были "на лице". Ни разу не отменяет читать нечто полезное.
А Вы читали, что он писал? Прокачивать знания нужно, чтобы такого не писать.
Не поручусь, что приведу Вашу цитату дословно, но ручаюсь, что смысл передаю правильно "Не указывайте мне, что мне писать, а что нет". И если заменить "мне" на "ему" основная мысль, содержащаяся в Вашем высказывании, как мне кажется, не поменяется.
Цитата:
В автомате Мура действие происходит после перехода в состояние всегда, независимо от того из какого состояния и по какой причине был переход. Т.е. действие является функцией только конечного состояния. А в автомате Мили, действие проихсодит на переходе и выполнение действия зависит от исходного состояния и управляющего воздействия.
==== конец цитаты ==== (и как бороться с форматированием этого форума?)
Пока я вижу, что, исходя из этого определения, один является подможеством другого. С другой стороны, перепроектировав набор состояний, для любого из автоматов "из множества", можно сконструировать аналог "из подмножества". Следовательно, подмножество равномощно самому множеству. Другими словами, вся разница в автоматах - исключительно в форме записи (или в подходе к проектированию).
Лично я не понимаю: если для каждой конкретной задачи я делаю тот или иной автомат, то зачем мне нужно знать, с фамилией какого из двух мужиков ассоциируется этот подход?
Вот знаете, наверное, все в школе учат таблицу умножения. Но кое-где учат еще и таблицу сложения. Т.е. в разных странах по-разному определяют, что ребенок должен учить, а до чего он должен быть способен додуматься самостоятельно.
И - да, если человек самостоятельно не способен додуматься до идеи конечного автомата, вполне допускаю, что без знания двух фамилий на букву "М" он также и не способен определить, как именно оптимальнее сконструировать алгоритм для конкретной задачи.
Но все то остальным (кто самостоятельно может додуматься до идеи конечного автомата) это зачем?
А зачем вообще нужна специальная терминология? Если я использую нечто, имеющее электрическое сопротивление, нахрена мне знать, что это нечто называется «резистор»? От того, что я буду (или не буду) это знать что-то изменится в токах и напряжениях? Или что?
А знать это нужно просто, чтобы иметь возможность общаться с другими людьми.
Вот в данном случае, я не понял слов человека и спросил о каком типе автомата речь. Короткий ответ снял бы мой вопрос. Но ответа я не получил (если хамство ответом не считать).
Я не понял, что Вы мне пытаетесь доказать? Что знания не нужны, если голова есть? Так, не надо. В том, что знания необходимы (особенно тому, у кого есть голова) я убеждён настолько, что переубедить меня невозможно.
А зачем вообще нужна специальная терминология? Если я использую нечто, имеющее электрическое сопротивление, нахрена мне знать, что это нечто называется «резистор»? От того, что я буду (или не буду) это знать что-то изменится в токах и напряжениях? Или что?
Терминология нужна для определения для ввода понятий и определений которые отсутсвуют в обычной отличной от отрасли жизни. А специальная терминология нужна для скрытого издевательства над не посвящеными-лохами. Вот Вы например сделали работу и Вам не заплатили. Вы говорите :Где деньги? А вас утопили в поносе слов из специальной терминологии. Вот ответ есть, а денег нет. А потом вас обзовут хамом и невеждой. Ну как же это светочь "специальной терминалогии".
Терминология нужна для определения для ввода понятий и определений которые отсутсвуют в обычной отличной от отрасли жизни. А специальная терминология нужна для скрытого издевательства над не посвящеными-лохами. .. А потом вас обзовут хамом и невеждой. Ну как же это светочь "специальной терминалогии". ..
Оперделенная доля истины в этом тоже присутствует. В частности, на том собеседовании, несмотря на то что применил это самое "хранение повдоль", но не знал(!) что это оказываца аж EAV ("изобретенный" в 2004г) меня и побрили со словами за "терминологию"..
но, конкретно тут несколько иной разрез: Вы пользуетесь этой самой "терминологией", употребляя слова "конченные автомат", но при этом слабо понимаете что далеко не каждый switch(var){} с присвоением нового значения var=... в ветке есть этот самый "автомат". :) И уж тем более, они не разделяются на "Мили/Мура" (и не только) местом присваивания этого var "до или после действия".
Неверное употребление термином говорит только о непонимании вопроса и ни о чем больше. Тогда уж лучше говорить о коде и вовсе "без специальных терминов"
ДОброго дня. Люди! если у кого есть время, подскажите где ошибка, пожалуйста. неделю мучаюсь. на выходе HOT время подачи сигнала все время скачет от 10 до 30 секунд. что я не так делаю?
#define ON 10
#define OF 3
#define HOT 9
#define DOP 8
unsigned long TIM;
void setup() {
attachInterrupt (1, myES, RISING);
pinMode (HOT, OUTPUT);
pinMode (DOP,OUTPUT);
TIM = ON;
}
void loop(){
if (digitalRead(ON)){
digitalWrite(HOT, HIGH);
}
if (millis() - TIM >= (7 * 60 * 1000) ) {
digitalWrite(HOT, LOW);
TIM = millis();
}
delay(20);
}
void myES() {
digitalWrite(HOT, LOW);
}
В строке №18 правая часть сравнения имеет совсем не то значение, на которое Вы надеетесь. Попробуйте напечатать её, чтобы убедиться. Ну, и исправляйте.
А в 18й там я думал что тире ставлю, а поставил минус по ходу... а на что же его заменить?
Я не знаю о чём Вы, какое тире, какой минус ... бред какой-то.
Я Вам сказал, напечатайте то, что написано в правой части операции сравнения и посмотрите чему оно равно. Вы это сделали? Нет! Тогда нахрена сюда пришли? Чтобы спрашивать советов и игнорировать их?
Пока не сделаете и не покажете результат, разговора не будет.
мне самому уже смешно, но я не понимаю: "if(millis() - TIM >= (7 * 60 * 1000) ) {" правая часть это сравнения - (7*60*1000) = 420000 т.е. значение в правой части сравнения равно четыреста двадцать тысяч. так как счетчик millis считает в милисекундах значит 420000 миллисикунд оно же 420 секунд и оно же 7 минут.
я по ходу конченый вообще, но больше не могу придумать как еще посмотреть чему равно значение в правой части сравнения...
(7*60*1000) = 420000 т.е. значение в правой части сравнения равно четыреста двадцать тысяч.
Кто тебе это сказал? Набей ему морду, чтоб не брехал! А сам, ну, напечатай ты, мля, наконец это хреново значение, тебе DetSimen уже просто всё написал на тарелочке и в рот положил!
vosara,поправил ваш скетч
vosara, qwone и всем кто принимал участие в дискусии и помогал огромное спасибо. Код работает, правда пока только в Протеусе, но думаю и на железе заработает. Еще раз СПАСИБО!!!!!
Вчера до поздна сидел с этим кодом. Залил эмуляцию в Протеус и долго наблюдал за работой скетча. И до меня дошло, что при такой стурктуре скетча моя задача просто никогда не будет выполняться.
Поскольку постоянно будет происходить сдвиг в запуске реле на величину разницы в отключении первого и второго реле.
И по этой причине возникает вопрос. Как можно изменить код, чтобы реле одновременно включались, но отключались в разное время и через определенный интервал, снова 2 реле одновременно запускались и отключались в разное время и т.д.??? Получается я должен отсчитывать время запуска реле посредсвом команды millis, но вот для отсчета времени их отключения нужно использовать какой то другой таймер времени. Который будет только отсчитывать время с момента включения и до момента когда реле нужно отключить.
Задача решается банальным конечным автоматом.
А запутались Вы потому, что почему-то решили, что автомат может иметь только два состояния.
А состояний - три:
1 - включены оба реле,
2 - одно из реле отключилось, а второе еще включено,
3 - оба реле отлючены.
Собственно, переделайте переменную состояний с булевой на целую и откорректируйте условия переходов 1-2, 2-3 и 3-1.
Тогда уж сразу стоит ввести 4 состояния: "всё выключено", "первое релевключено, второе выключено", "первое реле выключено, второе включено" и "всё включено". Или оставить только 2 состояния "вкл", "Выкл", но создать ДВА автомата по количеству реле.
P.S. Ну и ещё, важный момент в автоматном проектировании кода: "состояние" конечного автомата (программы) - это то, что может длиться достаточно долго. А вот то, что переводит автомат из одного состояния в другое - есть "действие" конечного автомата. Есть особый класс неявных "действий" - перевод автомата в иное состояние по истечению времени. Как правило программируется единообразно и составляет ядро библиотеки КА.
Обучая детишек в 5-м классе программированию КА, внезапно обнаружил, что для них это ни разу не тривиально: что считать состоянием КА и где и как применять "действия".
P.P.S. Как пример, всё тот же наш "умный светофор" (специально левый, автор переложит сам): Есть "кнопка пешехода". По нажатию которой должен "мигнуть" светодиод и код должен сплюсовать пешехода. Как только пешеходов набралось заданное кол-во, надо перевести автомат самого светофора в "мигающий зеленый" (далее он сам переключится на красный)..
Сколько тут "автоматов" и их "состояний"? :)
Вообще-то скетч выше это скорее недоавтомат или не автомат.
Опять же народ путает что такое состояние. Состояние это что однократно должно быть сделано и перевод переменной state в значение этого состояния. А переход это вычисление условий этого перехода. Самые сложные автоматы это ПЛИС и Процессоры. А то что детишки в автоматах не разбираются. Так и взрослые не очень сильно разбираются в ПЛИС логике и в процессорах, куда там детишкам.
vosara, qwone
Ребята не хочу вас огорчать но вы допустили ошибки. В обоих случаях первое реле отключится через 20 секунд, а второе через 80 секунд.
vosara, qwone
Ребята не хочу вас огорчать но вы допустили ошибки. В обоих случаях первое реле отключится через 20 секунд, а второе через 80 секунд.
долго наблюдал за работой скетча. И до меня дошло, что при такой стурктуре скетча моя задача просто никогда не будет выполняться.
"Я битый час вертел в руках солонку, и вдруг меня пронзило: «В этом — соль!»" (Л. Филатов)
vosara
Ну если так задумано и расчет был что оно должно отключится через минуту 20 то да все ок)
Но если вы расчитывали что оно отключится через 60, то дальше в коде погрешность увеличется еще на 2 минуты, и так с каждым циклом.
Да, вот и Вы совершили ту же самую ошибку что и мои детишки. :)
состояние - не зависит от того сколько раз оно должно быть сделано: однократно или многократно. Вычисление условий как раз и определяет НОВОЕ состояние и его переход - т.е. это - "действие" в том или ином виде текущего состояния. При отсутствии изменения условий - автомат находится в некотором состоянии и до тех пор пока эти условия НЕ ИЗМЕНЯТСЯ он в нем и будет торчать. Некоторые условия изменяются "по времени" - держим состояние заданное время, затем меняем на следующее. Некоторые условия сокрыты в процессе вычисления условий - поток входных симоволов какого-нибудь парсера (пример в вики) - факт обработки предыдущего символа, и переход к следующему и есть "условие". И т.д.
:)
Arhat109-2, Вы это завязывайте с ... ну с тем что употребляете. Форум про Ардуину. Раздел Программирование. И конечные Автоматы применимо к этой тематике. А то что они могут существовать еще в механике и электронике, так это идите туда и им рассказывайте. В программировании это банально методика решить конкретную задачу и не больше. И да всякое компьютеное моделирование тоже за борт. Ну мало в Ардуине вычислительных ресурсов.
ПС: Не завидую детишкам. Попался дядя ....
Состояние это что однократно должно быть сделано и перевод переменной state в значение этого состояния. А переход это вычисление условий этого перехода.
Вы, простите, какой автомат имеете в виду? Автомат Мура или автомат Мили? А то пока получается как у деда Щукаря: "Самокритика, - это когда я сам критикую".
Так про автоматы вроде Вы заговорили, а не я. Я лишь попытался уточнить какие именно Вы имеете в виду. Ну, не хотите говорить - не надо. Секретничайте дальше.
Кстати, бреда про оружие не понял. И причём тут оружие вообще? Об оружии я общаюсь на другом форуме.
Тогда уж сразу стоит ввести 4 состояния: "всё выключено", "первое релевключено, второе выключено", "первое реле выключено, второе включено" и "всё включено".
Можно вводить сколько угодно состояний, но только 3 из них когда-либо будут реализованы, остальные (кроме трех) не будут использоваться никогда. Поэтому остановиться на цифре 3 в данном случае представляется вполне разумным.
Так про автоматы вроде Вы заговорили, а не я. Я лишь попытался уточнить какие именно Вы имеете в виду. Ну, не хотите говорить - не надо. Секретничайте дальше.
Вы ... выпили? Ощущение такое, что мы о разных вещах говорим. Какие "эти"? Почему нереально? Вы о чём?
Вы ... выпили? Ощущение такое, что мы о разных вещах говорим. Какие "эти"? Почему нереально? Вы о чём?
Увольте, я всего лишь спросил какой именно автомат Вы имеете в виду, потому что не до конца понял Ваш пассаж с переходом. Вместо того, чтобы нормально ответить, Вы зачем-то нарываетесь на холивар. Зачем?
И что такого трудного в их реализации на С? Не понимаю.
И, да, кстати, если Вы и впрямь хоть раз в жизни реализовывали какой-либо автомат с выходом, то погуглив наконец названия, о которых я говорю, Вы с удивлением обнаружите, что один из них Вы и реализовывали. Как Журден, который страшно удивился, что всю жизнь говорил прозой.
:) Занавес. Закругляйтесь, Евгений. Это - биспалезна. (зато читать весело).. :)
На самом деле Вы прямо сказали, что знания об автоматах у Вас на уровне "слышал такое слово". Прокачайте. И самому полезно и клоуном быть перестанете.
Для справки: автомат Мили отличается от автомата Мура тем, что в первом действия выполняются при переходе из одного состояния в другое (и потому какое именно действие будет выполнено, зависит от сигнала, исходного и целевого состояний). А у второго действие выполняется уже после того, как атомат перешёл в некоторое состояние и потому какое именно действие будет выполнено, зависит только от целевого состояния. Существует теорема об их "равномощности" и "взаимопреобразуемости".
На самом деле Вы прямо сказали, что знания об автоматах у Вас на уровне "слышал такое слово". Прокачайте. И самому полезно и клоуном быть перестанете.
А зачем прокачивать?
Вот я, например, сам изобрел некоторый механизм решения задач.
Еще в эпоху "до Интернета".
А позже, уже из Интернета выяснил, что то, что я изобрел, какой-то мужик изобрел раньше, чем я, и что это изобретение принято называть конечным автоматом.
Но как-то незнание мной фамилии мужика, который изобрел что-то независимо от меня, совершенно не мешает мне пользоваться моим изобретением.
Для справки: ... Существует теорема об их "равномощности" и "взаимопреобразуемости".
Наверное, я изобрел сразу оба, т.к. при использовании не вижу разницы. Для меня изменения происходят не "до" и не "после", а "во время", ибо я не вижу разницы между двумя фрагментами линейного кода:
и
при условии, что do_something() не использует значение state.
А зачем прокачивать?
А Вы читали, что он писал? Прокачивать знания нужно, чтобы такого не писать.
ибо я не вижу разницы между двумя фрагментами линейного кода:
Ваш код не имеет отношения к тому, что я говорил, Вы невнимательно прочитали.
В автомате Мура действие происходит после перехода в состояние всегда, независимо от того из какого состояния и по какой причине был переход. Т.е. действие является функцией только конечного состояния. А в автомате Мили, действие проихсодит на переходе и выполнение действия зависит от исходного состояния и управляющего воздействия. Как видите разница в в подходах к проектированию логики автомата. Есть задачи, где удобнее одно, а есть - где другое.
В таком разе, надо начинать не с "к какому типу КА относится перестановка линейного кода", а к тому что вообще наличие переменной state и свича по ней - ещё не совсем "конченный автомат", да и наверное ещё и не автомат даже.. а то так можно каждый свитч в программе обозвать "автоматом"... :)
P.S. И да, тоже вспомнилось: в году так 2000-м, после 2-3 лет разработки БД на базе разных Access и прочих РА, "изобрел" хранение данных "повдоль таблицы" .. удобна, сил нет! Динамическое добавление свойств-полей, да "на раз", запросы с поиском посложнее, но тоже "на раз-два" .. красота. Динамический саморазвиваемый рубрикатор товаров - ляпота просто. И только позже, году к 2009-у внезапно (на собеседовании) узнал что это оказывается аж целая "модель EAV аж самого Тенцера" .. о как. А примерно через годик-два, разбирая завалы на ещё "Парадоксе" из под ДОС в одной из фирм, внезапно нашел аналогичное применение "EAV" от .. 1997 года.
Может оно и "все равно" как называется .. но варианты применений во всех трех случаях - были "на лице". Ни разу не отменяет читать нечто полезное.
А Вы читали, что он писал? Прокачивать знания нужно, чтобы такого не писать.
Не поручусь, что приведу Вашу цитату дословно, но ручаюсь, что смысл передаю правильно "Не указывайте мне, что мне писать, а что нет". И если заменить "мне" на "ему" основная мысль, содержащаяся в Вашем высказывании, как мне кажется, не поменяется.
В автомате Мура действие происходит после перехода в состояние всегда, независимо от того из какого состояния и по какой причине был переход. Т.е. действие является функцией только конечного состояния. А в автомате Мили, действие проихсодит на переходе и выполнение действия зависит от исходного состояния и управляющего воздействия.
Пока я вижу, что, исходя из этого определения, один является подможеством другого. С другой стороны, перепроектировав набор состояний, для любого из автоматов "из множества", можно сконструировать аналог "из подмножества". Следовательно, подмножество равномощно самому множеству. Другими словами, вся разница в автоматах - исключительно в форме записи (или в подходе к проектированию).
Лично я не понимаю: если для каждой конкретной задачи я делаю тот или иной автомат, то зачем мне нужно знать, с фамилией какого из двух мужиков ассоциируется этот подход?
Вот знаете, наверное, все в школе учат таблицу умножения. Но кое-где учат еще и таблицу сложения. Т.е. в разных странах по-разному определяют, что ребенок должен учить, а до чего он должен быть способен додуматься самостоятельно.
И - да, если человек самостоятельно не способен додуматься до идеи конечного автомата, вполне допускаю, что без знания двух фамилий на букву "М" он также и не способен определить, как именно оптимальнее сконструировать алгоритм для конкретной задачи.
Но все то остальным (кто самостоятельно может додуматься до идеи конечного автомата) это зачем?
А знать это нужно просто, чтобы иметь возможность общаться с другими людьми.
Вот в данном случае, я не понял слов человека и спросил о каком типе автомата речь. Короткий ответ снял бы мой вопрос. Но ответа я не получил (если хамство ответом не считать).
Я не понял, что Вы мне пытаетесь доказать? Что знания не нужны, если голова есть? Так, не надо. В том, что знания необходимы (особенно тому, у кого есть голова) я убеждён настолько, что переубедить меня невозможно.
Вставлять не Ctrl+V а Ctrl+Shift+V.
ПС: Вот пример когда вводятся термины, а затем ими же человека и запутывают.https://youtu.be/oZrI4veFdo8?t=275
Оперделенная доля истины в этом тоже присутствует. В частности, на том собеседовании, несмотря на то что применил это самое "хранение повдоль", но не знал(!) что это оказываца аж EAV ("изобретенный" в 2004г) меня и побрили со словами за "терминологию"..
но, конкретно тут несколько иной разрез: Вы пользуетесь этой самой "терминологией", употребляя слова "конченные автомат", но при этом слабо понимаете что далеко не каждый switch(var){} с присвоением нового значения var=... в ветке есть этот самый "автомат". :) И уж тем более, они не разделяются на "Мили/Мура" (и не только) местом присваивания этого var "до или после действия".
Неверное употребление термином говорит только о непонимании вопроса и ни о чем больше. Тогда уж лучше говорить о коде и вовсе "без специальных терминов"
ДОброго дня. Люди! если у кого есть время, подскажите где ошибка, пожалуйста. неделю мучаюсь. на выходе HOT время подачи сигнала все время скачет от 10 до 30 секунд. что я не так делаю?
Во-первых - неправильно вставляете код: http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
прошу прощения))
В строке №18 правая часть сравнения имеет совсем не то значение, на которое Вы надеетесь. Попробуйте напечатать её, чтобы убедиться. Ну, и исправляйте.
Ещё строка 10 сверхидеотизмом попахивает.
В целом, да, но начать надо с 18-ой. Десятая не так сильно влияет на результат.
такс... 10я строка - это я приравнял переменную что бы отсчет времени велся с момента нажатия кнопки ON.
как это сделать по другому пока не сообразил. А в 18й там я думал что тире ставлю, а поставил минус по ходу... а на что же его заменить?
Какой там бывает посол?)
Наш посол на их украину)))
Я Вам сказал, напечатайте то, что написано в правой части операции сравнения и посмотрите чему оно равно. Вы это сделали? Нет! Тогда нахрена сюда пришли? Чтобы спрашивать советов и игнорировать их?
Пока не сделаете и не покажете результат, разговора не будет.
420 000 миллисикунд там получится должно. то есть нужно вместо примера написать готовое число в миллисикундах?
Простите, но Вы довели: для особо альтернативно-одарённых, повторяю: напечатайте это значение, посмотрите чему оно равно.
Пока не сделаете и не покажете результат, разговора не будет.
мне самому уже смешно, но я не понимаю: "
if
(millis() - TIM >= (7 * 60 * 1000) ) {" правая часть это сравнения - (7*60*1000) = 420000 т.е. значение в правой части сравнения равно четыреста двадцать тысяч. так как счетчик millis считает в милисекундах значит 420000 миллисикунд оно же 420 секунд и оно же 7 минут.
я по ходу конченый вообще, но больше не могу придумать как еще посмотреть чему равно значение в правой части сравнения...
Простите, но Вы довели: для особо альтернативно-одарённых, повторяю: напечатайте это значение, посмотрите чему оно равно.
Пока не сделаете и не покажете результат, разговора не будет.
а ведь не напечатает )))
просто Serial.println(7 *....);
конченый, посмотри так
Serial.print(7*60*1000);
(7*60*1000) = 420000 т.е. значение в правой части сравнения равно четыреста двадцать тысяч.
Кто тебе это сказал? Набей ему морду, чтоб не брехал! А сам, ну, напечатай ты, мля, наконец это хреново значение, тебе DetSimen уже просто всё написал на тарелочке и в рот положил!
а ведь не напечатает )))
Значит, разговора не будет. Со мною, по крайней мере.
после строчки TIM = ON и рассуждений про "минус и тире" я уже ничему не удивлюсь в этой ветке.
Похоже ТС весь этот нехитрый код нашел готовым в инете, так как у него самого не хватило бы знаний даже одинарное тире написать :)
не, я сам написал по роликам в ютубе. сейчас и с Serial.print попробую разобраться
у меня правильно считает 420000, тока я тут сначала почитал когда-то )))
PS ВОРОТА! Морду бить некому ...