Возобновление цикла loop
- Войдите на сайт для отправки комментариев
Вс, 02/09/2018 - 22:43
Добрый день!
С моей точки зрения - нерешаемая задача, но не мне судить:
1. идет выполнение цикла loop (паровоз едет по рельсам, на пути два геркона - кнопки - реализовано челночнье движение, старт, разгон, проехали над герконом - выход на крейсерскую скорость, проехали над другим геркном - торможение, смена полярности ( l293d), пауза (millis), разгон....)
2. выключили макет
3. включили питание макета, питание пришло на ардуино и ....
Как в этот момент продолжить выполнять действие выполняемое в момент 2.???
Заранее спасибо!
Т.е. выключение макета?
Выключение ардуино, как и включение происходит при выключении всего макета (железнодорожный макет в масштабе 1-87), от которого в свою очередь запитана ардуино
Перечитайте свой вопрос и пункт N 2. Потом попробуйте еще раз ответить на заданный вопрос.
Видимо из-за скудности ума ваш вопрос я не понял, додумал его и ответил на то что надумал) задайте более конструктивный вопрос пожалуйста)
2. выключили макет
...
Как в этот момент продолжить выполнять действие выполняемое в момент 2.???
...
Какое действие ваша ардуина должна выполнять? Я не вижу в пункте 2 ничего, кроме выключения.
Ну из того что понял, как минимум сохранять значения переменных в память, а в момент включения считывать из памяти и прога типа "продолжится", но значения миллис если их все время сохранять ушатают память очень быстро, как я понял пункт2 штука внезапная? Автор я правильно понял? Автор, косноязычие плохая штука, учитесь выражаться яснее.
Либо тупо насиловать EEPROM (прикинуть, на сколько хватит). Либо делать контроль внешнего питания и при отключении переходить на резервное, чтобы "сохраниться".
Вы поняли абсолютно верно. Внезапное выключение питания.
Ну из того что понял, как минимум сохранять значения переменных в память, а в момент включения считывать из памяти и прога типа "продолжится"
Это можно реализовать ?
Если не миллис а например чтение serial print перед каждым действием?
Предложение следующее:
1. Организовать отдельное питание ардуины на 5сек (можно конденсаторами).
2. При пропадании питания на основном макете писать в ЕЕПРОМ и останавливать программу.
3. Убрать паузы (на вклейках в форуме есть варианты).
Мне более интересно, что будет, если после включения сразу дать крейсерскую скорость (допустим, что лепестричество пропало на этом этапе). Или, допустим, модель по инерции проехала геркон, но не зафиксировала данный факт, так как контроля уже не было. ...газануть прямо в отбойник что ли?
Мне более интересно, что будет, если после включения сразу дать крейсерскую скорость (допустим, что лепестричество пропало на этом этапе). Или, допустим, модель по инерции проехала геркон, но не зафиксировала данный факт, так как контроля уже не было. ...газануть прямо в отбойник что ли?
Это еще хорошо, что модель паровоза, а не самолета
ИМХО. надо на трассе расставить больше герконов. После пропадпния питания запускаем "аварийный режим" и тихим шагом движемся до ближайшего контрольного пункта, где определяем свое местонахождение и запускаем программу с этого места.
При таком раскладе ЕЕПРОМ вообще не нужен.
ИМХО. надо на трассе расставить больше герконов. После пропадпния питания запускаем "аварийный режим" и тихим шагом движемся до ближайшего контрольного пункта, где определяем свое местонахождение и запускаем программу с этого места.
При таком раскладе ЕЕПРОМ вообще не нужен.
Еще надо знать в какую сторону ехать. Боюсь, что без запоминания таки не обойтись.
Еще надо знать в какую сторону ехать. Боюсь, что без запоминания таки не обойтись.
Да.. очень важно в какую сторону и как...
Как же реализовать запоминание?
Предложение следующее:
1. Организовать отдельное питание ардуины на 5сек (можно конденсаторами).
2. При пропадании питания на основном макете писать в ЕЕПРОМ и останавливать программу.
3. Убрать паузы (на вклейках в форуме есть варианты).
3. Паузы это delay? Если да, то не использую
2. Еепром это как и что такое?
1. Я думал над отдельном питании .. допетрил только до батарейки, как в Биос. А кондером это как?
Можно еще ионистором, думаю.
2. Еепром это как и что такое? - матчасть изучил, 100000 циклов записи в еепром. В реальности это сколько? 100000 обращений - 50000 включений/выключений, верно?
Ионистор - альтернатива конденсатору?
Если решения нет, возможно действительно - при включении доказывать состав до дополнительных герконов на старт/финиш точках на самой малой скорости, и после сработает - остановка, смена полярности, millis, и по основному алгоритму?
Ну почему же решения нет? Решение Вам написали. Делаете схему контроля напряжения, делаете резервное питание (аккумуляторы, ионисторы, батарейки). И в случае отключения электричества записываете состояние макета в еепром. В таком режиме Вам её ресурса хватит за глаза.
Если не хотите/не можете с этим разобраться, попробуйте придумать какой-нибудь алгоритм безопасного адекватного включения макета, типа процитированного.
Если честно, я не понял что решение найдено)
1. Хочу разобраться, а смогу или нет - это покажет время;
2. Буду искать схему контроля питания
3. Результат выложу
Всем спасибо
Я думаю, что нужно начать с простой вещи: понять, зачем городить всю эту фигню с сохранением состояния. Если это демо-макет, а не фрезерный станок, то доехать до концевика и продолжить работать по простому алгориму, видится не самым худшим решением.
Я думаю, что нужно начать с простой вещи: понять, зачем городить всю эту фигню с сохранением состояния. Если это демо-макет, а не фрезерный станок, то доехать до концевика и продолжить работать по простому алгориму, видится не самым худшим решением.
1. Я не знаю фигня или нет, но гораздо эффектнее выглядит когда ты включаешь макет, а поезд поехал как ни в чем не бывало, а не откатывается до геркона/концевика;
2. Вы правы, если не получится найти в сети скетч с контролем питания и схемой с кондициционером или батерейкой и не получится все это скомпилировать в общий скетч, откачусь к идее алгоритма включения через докатку до концевика
3. Был бы признателен если кто-то встречал подобный скетч - с отправкой в еепром состояния скетча при отключении пеитания - поделитесь)
Нет у скетча никакого сохраняемого состояния. Сохранить можно только значения переменных. Вот подумайте, какие переменные вам нужно сохранить, чтобы из нулевого состояния определить, где вы находитесь, в какую сторону ехать и с какой скоростью. И учтите, что перемещения модели вне времени контроля микроконтроллером никак не могут быть учтены сохранением в EEPROM или еще куда-то.
Спасибо
Ушел в глухую берлогу думать
А еще можно насиловать внешнюю EEPROM, стоит копейки, например
В теле программы писать в EEPROM только измененные данные
//пробуем пока без герконов int IN1 = 8; //input1 подключен к выводу 8 int IN2 = 7; int EN1 = 9; int LED1 = 4; int LED2 = 13; int flag1 = 0; // вводим переменную для кнопки/геркона 1 int flag2 = 0; // вводим переменную для кнопки/геркона 2 void setup() { pinMode (EN1, OUTPUT); pinMode (IN1, OUTPUT); pinMode (IN2, OUTPUT); pinMode (LED1, OUTPUT); pinMode (LED2, OUTPUT); { pinMode(2, OUTPUT); pinMode(12, OUTPUT); } } void loop() { { if(digitalRead(2)==HIGH&&flag1==0)//если кнопка 1 нажата // и перемення flag1 равна 0 , то ..) { digitalWrite(4,!digitalRead(4)); flag1=1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% } if(digitalRead(2)==LOW&&flag1==1)//если кнопка 1 НЕ нажата //и переменная flag1 равна - 1 ,то ... { flag1=0;//обнуляем переменную flag1 } } { if(digitalRead(12)==HIGH&&flag2==0)//если кнопка 2 нажата // и перемення flag2 равна 0 , то ..) { digitalWrite(13,!digitalRead(13)); flag2=1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% } if(digitalRead(12)==LOW&&flag2==1)//если кнопка 2 НЕ нажата //и переменная flag2 равна - 1 ,то ... { flag2=0;//обнуляем переменную flag2 } } { { digitalWrite (IN2, HIGH); // задаем digitalWrite (IN1, LOW); // полярность analogWrite(EN1,55); //разгон { //время выполнения unsigned long a = millis(); while(millis()-2000 < a); //конец времени выполнения } analogWrite(EN1,105);//средний ход { //время выполнения unsigned long a = millis(); while(millis()-2000 < a); //конец времени выполнения } analogWrite(EN1,255);//крейсерская скорость { //время выполнения unsigned long a = millis(); while(millis()-2000 < a); //конец времени выполнения } analogWrite(EN1,105);//средний ход { //время выполнения unsigned long a = millis(); while(millis()-2000 < a); //конец времени выполнения } analogWrite(EN1,55);//торможение { //время выполнения unsigned long a = millis(); while(millis()-2000 < a); //конец времени выполнения } analogWrite(EN1,0);//стоянка { //время выполнения unsigned long a = millis(); while(millis()-2000 < a); //конец времени выполнения } digitalWrite (IN2, LOW); // смена digitalWrite (IN1, HIGH); // полярности } } }Вот такой код надумался
По направлению движения -
переменные
EN1
IN1
IN2
эти данные помогут продолжить двигаться в нужном направлении с нужной скоростью
Соответственно при считывании этих данных поезд продолжит движение.
Но, если питание выключилось на EN1 = 55 как ему понять какое значение EN1 следующее - 105 или 0?
Опять я что-то упускаю....
Уже вижу ошибку.
Ввожу regim иначае не прекину полярность.
Но вопрос осталя....
Medvedev81, Если вы такой используете код для опроса кнопок(геркона), то воспользуйтесь этим.
/**/ const byte btnPin = 2; bool btn = 1; void setup() { Serial.begin(9600); pinMode(btnPin, INPUT_PULLUP); } void loop() { if (!digitalRead(btnPin) && btn) { delay(10); btn = 0; Serial.println("down"); } if (digitalRead(btnPin) && !btn) { delay(10); btn = 1; Serial.println("up"); } } /**/Medvedev81, Если вы такой используете код для опроса кнопок(геркона), то воспользуйтесь этим.
Очень круто но не очень понятно... Я как раз не могу понять как мне читать вторую кнопку, режим ее не хочет читать
if(digitalRead(2)==HIGH&&flag1==0)//если кнопка нажата // и перемення flag1 равна 0 , то ... { regim1 ++; flag1 =1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% if(regim1>2)//ограничим количество режимов { regim1 =1;//так как мы используем только одну кнопку, // то переключать режимы будем циклично } } if(digitalRead(2)==LOW&&flag1==1)//если кнопка НЕ нажата //и переменная flag1 равна - 1 ,то ... { flag1=0;//обнуляем переменную "кнопка 1" } if(regim1==1)//первый режим { digitalWrite(4,HIGH);//включаем синий диод digitalWrite(13,LOW); //добавим значение en1 } if(regim1==2)//второй режим { digitalWrite(13,HIGH);//включаем желтый диод digitalWrite(4,LOW); //добавим значение en1 } if(digitalRead(2)==HIGH&&flag2==0)//если кнопка нажата // и перемення flag2 равна 0 , то ... { regim2 ++; flag2 =1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% if(regim2>2)//ограничим количество режимов { regim2 =1;//так как мы используем только одну кнопку, // то переключать режимы будем циклично } } if(digitalRead(2)==LOW&&flag2==1)//если кнопка НЕ нажата //и переменная flag1 равна - 1 ,то ... { flag2=0;//обнуляем переменную "кнопка 1" } if(regim2==1)//первый режим { digitalWrite(4,HIGH);//включаем оба диода digitalWrite(13,HIGH); //добавим значение en1 } if(regim2==2)//второй режим { digitalWrite(13,LOW);//выключаем оба диода digitalWrite(4,LOW); //добавим значение en1 }А как вашими переменными читать ?
Medvedev81, Если вы такой используете код для опроса кнопок(геркона), то воспользуйтесь этим.
/**/ const byte btnPin = 2; bool btn = 1; void setup() { Serial.begin(9600); pinMode(btnPin, INPUT_PULLUP); } void loop() { if (!digitalRead(btnPin) && btn) { delay(10); btn = 0; Serial.println("down"); } if (digitalRead(btnPin) && !btn) { delay(10); btn = 1; Serial.println("up"); } } /**/Ваш просто очень короче и как-то красивее но пока не пойму что он делает
А он просто опрашивает 4 кнопки и действия отправляет в Serial
/**/ const byte btn1Pin = 2; bool btn1 = 1; const byte btn2Pin = 3; bool btn2 = 1; const byte btn3Pin = 4; bool btn3 = 1; const byte btn4Pin = 5; bool btn4 = 1; void setup() { Serial.begin(9600); pinMode(btn1Pin, INPUT_PULLUP); pinMode(btn2Pin, INPUT_PULLUP); pinMode(btn3Pin, INPUT_PULLUP); pinMode(btn4Pin, INPUT_PULLUP); } void loop() { /*1 кнопка*/ if (!digitalRead(btn1Pin) && btn1) { delay(10); btn1 = 0; Serial.println("btn1 down"); } if (digitalRead(btn1Pin) && !btn1) { delay(10); btn1 = 1; Serial.println("btn1 up"); } /*2 кнопка*/ if (!digitalRead(btn2Pin) && btn2) { delay(10); btn2 = 0; Serial.println("btn2 down"); } if (digitalRead(btn2Pin) && !btn2) { delay(10); btn2 = 1; Serial.println("btn2 up"); } /*3 кнопка*/ if (!digitalRead(btn3Pin) && btn3) { delay(10); btn3 = 0; Serial.println("btn3 down"); } if (digitalRead(btn3Pin) && !btn3) { delay(10); btn3 = 1; Serial.println("btn3 up"); } /*4 кнопка*/ if (!digitalRead(btn4Pin) && btn4) { delay(10); btn4 = 0; Serial.println("btn4 down"); } if (digitalRead(btn4Pin) && !btn4) { delay(10); btn4 = 1; Serial.println("btn4 up"); } } /**///пробуем пока без герконов #include<avr/interrupt.h> int IN1 = 8; //input1 подключен к выводу 8 int IN2 = 7; int EN1 = 9; int LED1 = 4; int LED2 = 13; int flag1 = 0; // вводим переменную для кнопки/геркона 1 int flag2 = 0; // вводим переменную для кнопки/геркона 2 int regim1 = 1; //переменная считает нажатия на кнопку 1 int regim2 = 1; //переменная считает нажатия на кнопку 2 //подсказка гуру const byte btn1Pin = 2; bool btn1 = 1; const byte btn2Pin = 4; bool btn2 = 1; const byte btn3Pin = 14; bool btn3 = 1; const byte btn4Pin = 15; bool btn4 = 1; void setup() { Serial.begin(9600); pinMode(btn1Pin, INPUT_PULLUP); pinMode(btn2Pin, INPUT_PULLUP); pinMode(btn3Pin, INPUT_PULLUP); pinMode(btn4Pin, INPUT_PULLUP); pinMode (EN1, OUTPUT); pinMode (IN1, OUTPUT); pinMode (IN2, OUTPUT); pinMode (LED1, OUTPUT); pinMode (LED2, OUTPUT); { pinMode(2, OUTPUT); pinMode(12, OUTPUT); } } void loop() { /* { if(digitalRead(2)==HIGH&&flag1==0)//если кнопка 1 нажата // и перемення flag1 равна 0 , то ..) { digitalWrite(4,!digitalRead(4)); flag1=1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% } if(digitalRead(2)==LOW&&flag1==1)//если кнопка 1 НЕ нажата //и переменная flag1 равна - 1 ,то ... { flag1=0;//обнуляем переменную flag1 } } { if(digitalRead(12)==HIGH&&flag2==0)//если кнопка 2 нажата // и перемення flag2 равна 0 , то ..) { digitalWrite(13,!digitalRead(13)); flag2=1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% } if(digitalRead(12)==LOW&&flag2==1)//если кнопка 2 НЕ нажата //и переменная flag2 равна - 1 ,то ... { flag2=0;//обнуляем переменную flag2 } } */ //подсказка гуру /*1 кнопка*/ if (!digitalRead(btn1Pin) && btn1) { delay(10); btn1 = 0; digitalWrite(4,HIGH);//включаем синий диод digitalWrite(13,LOW); Serial.println("btn1 down"); } if (digitalRead(btn1Pin) && !btn1) { delay(10); btn1 = 1; digitalWrite(4,LOW);//включаем желтый диод digitalWrite(13,HIGH); Serial.println("btn1 up"); } /*2 кнопка*/ if (!digitalRead(btn2Pin) && btn2) { delay(10); btn2 = 0; digitalWrite(4,HIGH);//включаем оба диода digitalWrite(13,HIGH); Serial.println("btn2 down"); } if (digitalRead(btn2Pin) && !btn2) { delay(10); btn2 = 1; digitalWrite(4,LOW);//выключаем оба диода digitalWrite(13,LOW); Serial.println("btn2 up"); } /*3 кнопка*/ if (!digitalRead(btn3Pin) && btn3) { delay(10); btn3 = 0; Serial.println("btn3 down"); } if (digitalRead(btn3Pin) && !btn3) { delay(10); btn3 = 1; Serial.println("btn3 up"); } /*4 кнопка*/ if (!digitalRead(btn4Pin) && btn4) { delay(10); btn4 = 0; Serial.println("btn4 down"); } if (digitalRead(btn4Pin) && !btn4) { delay(10); btn4 = 1; Serial.println("btn4 up"); } { { digitalWrite (IN2, HIGH); // задаем digitalWrite (IN1, LOW); // полярность analogWrite(EN1,55); //разгон { //время выполнения unsigned long a = millis(); while(millis()-2000 < a); //конец времени выполнения } analogWrite(EN1,105);//средний ход { //время выполнения unsigned long a = millis(); while(millis()-2000 < a); //конец времени выполнения } analogWrite(EN1,255);//крейсерская скорость { //время выполнения unsigned long a = millis(); while(millis()-2000 < a); //конец времени выполнения } analogWrite(EN1,105);//средний ход { //время выполнения unsigned long a = millis(); while(millis()-2000 < a); //конец времени выполнения } analogWrite(EN1,55);//торможение { //время выполнения unsigned long a = millis(); while(millis()-2000 < a); //конец времени выполнения } analogWrite(EN1,0);//стоянка { //время выполнения unsigned long a = millis(); while(millis()-2000 < a); //конец времени выполнения } digitalWrite (IN2, LOW); // смена digitalWrite (IN1, HIGH); // полярности } } }А он просто опрашивает 4 кнопки и действия отправляет в Serial
/**/ const byte btn1Pin = 2; bool btn1 = 1; const byte btn2Pin = 3; bool btn2 = 1; const byte btn3Pin = 4; bool btn3 = 1; const byte btn4Pin = 5; bool btn4 = 1; void setup() { Serial.begin(9600); pinMode(btn1Pin, INPUT_PULLUP); pinMode(btn2Pin, INPUT_PULLUP); pinMode(btn3Pin, INPUT_PULLUP); pinMode(btn4Pin, INPUT_PULLUP); } void loop() { /*1 кнопка*/ if (!digitalRead(btn1Pin) && btn1) { delay(10); btn1 = 0; Serial.println("btn1 down"); } if (digitalRead(btn1Pin) && !btn1) { delay(10); btn1 = 1; Serial.println("btn1 up"); } /*2 кнопка*/ if (!digitalRead(btn2Pin) && btn2) { delay(10); btn2 = 0; Serial.println("btn2 down"); } if (digitalRead(btn2Pin) && !btn2) { delay(10); btn2 = 1; Serial.println("btn2 up"); } /*3 кнопка*/ if (!digitalRead(btn3Pin) && btn3) { delay(10); btn3 = 0; Serial.println("btn3 down"); } if (digitalRead(btn3Pin) && !btn3) { delay(10); btn3 = 1; Serial.println("btn3 up"); } /*4 кнопка*/ if (!digitalRead(btn4Pin) && btn4) { delay(10); btn4 = 0; Serial.println("btn4 down"); } if (digitalRead(btn4Pin) && !btn4) { delay(10); btn4 = 1; Serial.println("btn4 up"); } } /**/Вообще не реагирует.
Сразу зажигает синий диод а на нажатия кнопок не реагирует
Сериал выкидывает 3 down и 4 down, так как я их на аналог повесил, а с 2 и 4 пина кнопки ничего не меняют
Такое ощущение что не туда поплыли
Medvedev81, а вот это што за ужас?
кто вас научил так интервалы отмерять?
Эта конструкция - полный аналог лператора delay(2000) и она точно так же блокирует работу программы на 2 секунды. С таким кодом никакой опрос кнопок работать не будет