Таймер для миксера

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

Всех с наступившим Новым Годом!

Прошу помощи... В рамках "гаражной самопальщины" понадобилось сваять миксер. Работать будет так: Включается моторчик на 20 секунд, останавливается на 1 секунду, включается (вращаясь в другую сторону) на 20 секунд. И так по кругу. Останавливается вся эта пляска через пять минут. И стоит колом до перезапуска (откл/вкл питания). Точностей по выдержке времени никакой. Шим не нужен. Кнопки не нужны. Решил не наворачивать полну. DIN рейку таймеров, а начать осваивать ардуинку (как все нормальные люди). Соорудил вот такую великую программку:

 
Все это, ка ни странно (с учетом квалификации программиста) заработало. А вот с остановкой работы через 5 минут после старта, не задалось. Пробовал разные варианты таймеров. Сами по себе они работают, а остановить цикл не получается. Подскажите пожалуйста, как написать для этого код. Вот не догоняю...
Заранее благодарен.
 
xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

без схемы обсуждать нечего, и да, код сейчас вас попросят вставить по правилам

http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Самое дубовое решение - добавить в нужном месте: if(millis() > 300000) while(1);

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021
void setup() {
  pinMode(13, OUTPUT); 
  pinMode(12, OUTPUT);
}

void loop() { 
  digitalWrite(13, HIGH); // Запуск двигателя "Вперед"
  delay(20000);           // Время работы вперед, 20 секунд
  digitalWrite(13, LOW);  // Остановка двигателя
  delay(1000);            // Пауза для выработки инерции механикой привода
  digitalWrite(12, HIGH);  // Запуск двигателя "Назад"
  delay(20000);           // Время работы назад, 20 секунд
  digitalWrite(12, LOW); // Остановка двигателя
  delay(1000);            // Пауза для выработки инерции механикой привода
}

 

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

Исправился

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Павел К. пишет:

 Сами по себе они работают, а остановить цикл не получается. Подскажите пожалуйста, как написать для этого код.

 

#define STOP_T (5*60*1000)  //5 минут

void loop() { 


      //ваш код сюда

  if (millis()>STOP_T)
  {
    while (1){}
  }
}

 

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

Сейчас попробую

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

я то подумал что у него это все останавливается через 5 минут, а оказывается это так надо сделать ))

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

asam пишет:

Павел К. пишет:

 Сами по себе они работают, а остановить цикл не получается. Подскажите пожалуйста, как написать для этого код.

 

#define STOP_T (5*60*1000)  //5 минут

void loop() { 


      //ваш код сюда

  if (millis()>STOP_T)
  {
    while (1){}
  }
}

 

догадается что нет инициализации?

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021
#define STOP_T (5*60*1000)  //5 минут

void setup() {
  pinMode(13, OUTPUT); 
  pinMode(12, OUTPUT);
}

void loop() { 
  digitalWrite(13, HIGH); // Запуск двигателя "Вперед"
  delay(20000);           // Время работы вперед, 20 секунд
  digitalWrite(13, LOW);  // Остановка двигателя
  delay(1000);            // Пауза для выработки инерции механикой привода
  digitalWrite(12, HIGH);  // Запуск двигателя "Назад"
  delay(20000);           // Время работы назад, 20 секунд
  digitalWrite(12, LOW); // Остановка двигателя
  delay(1000);            // Пауза для выработки инерции механикой привода
  
  if (millis()>STOP_T)
  {
    while (1){}
 }
}

А вот останавливаться не хочет.... Может все дело в том, что пробую не на железе, а на симуляторе, но ведь запускается....

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

догадался))

ну и как работает?

с учетом ваших делайев, это надо править

#define STOP_T (5*60*1000)  //5 минут

хотя если точность не важна, забей..

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

xDriver пишет:

 

догадается что нет инициализации?

 

Инициализации чего? Переменных нету.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

asam пишет:

xDriver пишет:

 

догадается что нет инициализации?

 

Инициализации чего? Переменных нету.

пинов, епта

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

xDriver пишет:

 

с учетом ваших делайев, это надо править

#define STOP_T (5*60*1000)  //5 минут

 

 

Если миксер должен выключится через 5 минут после включения, то зачем править?

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

А вот это волшебное слово MILLIS я не должен в качестве переменной прописать? 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

xDriver пишет:

asam пишет:

xDriver пишет:

 

догадается что нет инициализации?

 

Инициализации чего? Переменных нету.

пинов, епта

Так у ТС инициализация пинов с самого начала же была прописана. 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Павел К. пишет:

А вот это волшебное слово MILLIS я не должен в качестве переменной прописать? 

millis() это встроенная функция. http://arduino.ru/Reference/Millis

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

asam пишет:

xDriver пишет:

asam пишет:

xDriver пишет:

 

догадается что нет инициализации?

 

Инициализации чего? Переменных нету.

пинов, епта

Так у ТС инициализация пинов с самого начала же была прописана. 

он оказался продвинутый ))) а то залил твой код с правкой только лооп и - не работает!

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Павел К. пишет:

#define STOP_T (5*60*1000)  //5 минут

void setup() {
  pinMode(13, OUTPUT); 
  pinMode(12, OUTPUT);
}

void loop() { 
  digitalWrite(13, HIGH); // Запуск двигателя "Вперед"
  delay(20000);           // Время работы вперед, 20 секунд
  digitalWrite(13, LOW);  // Остановка двигателя
  delay(1000);            // Пауза для выработки инерции механикой привода
  digitalWrite(12, HIGH);  // Запуск двигателя "Назад"
  delay(20000);           // Время работы назад, 20 секунд
  digitalWrite(12, LOW); // Остановка двигателя
  delay(1000);            // Пауза для выработки инерции механикой привода
  
  if (millis()>STOP_T)
  {
    while (1){}
 }
}

А вот останавливаться не хочет.... Может все дело в том, что пробую не на железе, а на симуляторе, но ведь запускается....

ну вот

а 5 минут прошло?

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

Добавил к своему коду то, что посоветовали, это сюда и выложил

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

На опробование я изменил "время пробега" с 5*60*1000 на 1*60*1000

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

и что, как понимаешь что "не останавливается"?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Павел К. пишет:

На опробование я изменил "время пробега" с 5*60*1000 на 1*60*1000

Ну там, да, малость больше 5 минут будет крутить.

Upper
Offline
Зарегистрирован: 23.06.2020

#define STOP_T (5*60*1000UL)  //5 минут

Допишите UL

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Если не хотите, чтобы пинали ногами, то код вставлять только так. Иначе, удем пинать.

Возьмите всё добро из функции lopp, и вставьте в setup семь раз. А loop оставьте пустым. Будет крутить 4 минуты 54 секунды и останавливаться. Вам же это надо?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

ЕвгенийП пишет:

Возьмите всё добро из функции lopp, и вставьте в setup семь раз. А loop оставьте пустым. Будет крутить 4 минуты 54 секунды и останавливаться. 

Все гениальное - просто! ;)

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

Не вероятно! Заработало! Огромное спасибо! А что такое UL?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Upper пишет:

#define STOP_T (5*60*1000UL)  //5 минут

Допишите UL

красава!!! я пропустил

 

 

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

Господа, всем огромное спасибо! Посмотрел, подумал... Наверное теперь озадачусь привязкой сюда ШИМ и сооответственно, ключей на полевиках. От полной дин рейки таймеров уйти и при этом оставить клацающие какие то там железяки, имея ардуино... Не Айс. Так что, надолго не прощаюсь... :)

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

Понял. Как то умножает по другому. Три часа ночи, вряд ли уже вникну, что и к чему...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Павел К. пишет:

надолго не прощаюсь... :)

И не надо.

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

Можно еще посмеяться. Не вижу Ваших сообщений, пока не выйду в корень форума, в свою тему..

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

F5 дави, это ж не чат тебе какой то.

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

Век живи, век учись и дураком помрешь.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

да..., видно совсем зеленый, но смышленый))

на ночь зубрить до посинения

https://arduino-technology.ru/coding/language/datatype/

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

завтра скажешь на что можно заменить UL, в твоем случае))

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

Спасибо! Буду разбираться по мере поступивших задач.

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

Думаю, что на LONG

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Павел К. пишет:

Думаю, что на LONG

Не угадал!

Вам же сказали

xDriver пишет:

завтра скажешь 

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

Думал так и сделать. Это моя первая, но не последняя самоделка на ардуино. По этому, буду пытаться делать хоть как то по человечьи :)

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ЕвгенийП пишет:

Павел К. пишет:

Думаю, что на LONG

Не угадал!

Вам же сказали

xDriver пишет:

завтра скажешь 

да ладно Евгений, угадал (почти), но завтра еще один вариант обязательно !! ))

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

 

int FRWD=12;
int REV=13;
int Start_Butt=11;
byte counter=0;
byte count=0;
bool forvard=true;
bool _Stop=false;
unsigned int _timer;
void setup() {
  pinMode(FRWD, OUTPUT); 
  pinMode(REV, OUTPUT); 
  pinMode(Start_Butt, INPUT_PULLUP); 
 }
void work()
{count++;
  if(count>(_Stop?2:40))
  {if(_Stop)
  {_Stop=false;
  digitalWrite((forvard?FRWD:REV),HIGH);
  forvard=!forvard;
  count=0;
    }
    else
    {counter++;
     digitalWrite(REV,LOW);
     digitalWrite(FRWD,LOW);
    _Stop=true;
    count=0;
    }
    }
  }
void loop() {
if (millis()-_timer>=500&&counter<=15)
{_timer=millis();
  work();
}
if(counter>15&&!digitalRead(Start_Butt))
{counter=0;
_Stop=false;
forvard=false;
}
}

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

эт че такое было, даже без "объяснений"???

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

xDriver пишет:

эт че такое было, даже без "объяснений"???

Это было Crtl+C и Ctrl+V, логично же! А чепятать - не царское дело, пальчики еще устанут )))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

Если не хотите, чтобы пинали ногами, то код вставлять только так. Иначе, удем пинать.

Возьмите всё добро из функции lopp, и вставьте в setup семь раз. А loop оставьте пустым. Будет крутить 4 минуты 54 секунды и останавливаться. Вам же это надо?

Не надо ничего вставлять 7 раз. Нужно добавить пустую функцию loop(), а функцию lopp() вызывать из setup в цикле 7 раз.

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

Добрейшего!

Перерыл туеву хучу всего, а кроме  unsignet long ничего не нашел

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

вызывать из setup в цикле 7 раз.

Мне казалось, что семь раз нажать Ctrl+V легче, чем искать видосик с объяснением как это "вызывать в цикле". Может, и ошибаюсь.

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

Если бы на этом все и закончилось... :) Дурная голова рукам покоя не дает. Начал прилаживать туда всякие кнопочки, ШИМики и пр. украшательства. А если при этом "начальный вариант" кода получился покомпактнее, оно лучше.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Тогда 7 раз вызвать без цикла.

SLKH
Offline
Зарегистрирован: 17.08.2015

Павел К. пишет:

Если бы на этом все и закончилось... :) Дурная голова рукам покоя не дает. Начал прилаживать туда всякие кнопочки, ШИМики и пр. украшательства. А если при этом "начальный вариант" кода получился покомпактнее, оно лучше.

программа по рекомендации  в #24, прекрасно выполняет функции, изложенные в исходном техзадании.

"всякие кнопочки, ШИМики и пр. украшательства" - это принципиально другая задача. добавить эти функции в программу не получится, нужно писать с нуля новую, без delay().

Павел К.
Павел К. аватар
Offline
Зарегистрирован: 01.01.2021

Доброго вечера! 

Решил, ради спортивного интереса, запустить написанный Вами скетч. Сначала программа долго ругалась на всевозможные точки с запятой, скобки и пр. мелочь. Расставил, ругаться перестала. Но все равно, не работает. Оба светодиода горят и все тут. Может подскажите, в чем дело? Интересно же..