нужна помощь! Таймер программы....

JuriySOFT
Offline
Зарегистрирован: 18.04.2014

Здравствуйте!

Я буквально на днях приобрел Ардуино и сразу захотелось начать делать различные проекты.

Сейчас застрял на теме ВРЕМЯ...

Уже создал меню на дисплее, сделал кнопки, теперь нужно написать скрипт, который бы:

включал таймер при нажатии на 1 кнопку, ставил паузу при нажатии на другую, опять продолжал отсчет с 3й кнопки и снова была пауза от нажатия 2й. и самое главное, когда таймер дойдет до 1минуты или 1час(это ж всегда можно переделать) чтобы включалась другая программапосле достижения заданного времени.

 

Я представляю себе это так:

int timer = 0;

int endtimer= 60000; // 60секунд



void loop() 

{

if(кнопка1,HIGH)

то включается таймер и начинает отсчет

digitalWrite (motor,HIGH);

else if (здесь опять таймер>=endtimer);

{

digitalWrite(LED,HIGH);

}

 

Это примерно как я представляю себе код.

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

p.S. У меня Arduino Uno

Geronimo
Offline
Зарегистрирован: 06.05.2013

Чтобы получить время, используй функцию millis(). А далее цепочка if else и арифметических операций

JuriySOFT
Offline
Зарегистрирован: 18.04.2014

я просто меньше недели этим занимаюсь, еще всех тонкостей не знаю... про millis() я читал, но так и не понял, как его запустить и потом сделать паузу, а не сброс, и снова продолжить....

Подскажите хоть простенький код, по которому можно было бы понять принцип работы....?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

JuriySOFT, если вам датут готовый код, вашему образованию это в пользу не пойдёт. В этом разделе гигантское количество аналогичных примеров и задач, на работу с кнопками, на работу с временем, часы и таймеры в ассортименте. Возьмите себе сначала задачу попроще, -считать и выводить на дисплей минуты и секунды например. Потом совершать какие-то действия при достижении определённого времени, и  в конце-концов придёте к тому, что задумано.

JuriySOFT
Offline
Зарегистрирован: 18.04.2014

dimax пишет:

JuriySOFT, если вам датут готовый код, вашему образованию это в пользу не пойдёт. В этом разделе гигантское количество аналогичных примеров и задач, на работу с кнопками, на работу с временем, часы и таймеры в ассортименте. Возьмите себе сначала задачу попроще, -считать и выводить на дисплей минуты и секунды например. Потом совершать какие-то действия при достижении определённого времени, и  в конце-концов придёте к тому, что задумано.

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

Geronimo
Offline
Зарегистрирован: 06.05.2013

Чтобы понять принцип, отложите клавиатуру в сторону и нарисуйте на бумаге блок-схем алгоритма

JuriySOFT
Offline
Зарегистрирован: 18.04.2014

Geronimo пишет:
Чтобы понять принцип, отложите клавиатуру в сторону и нарисуйте на бумаге блок-схем алгоритма

Принцип можно понять когда видишь пример перед глазами....

Теория это хорошо, но лучше практика...

P.S. Я жведь не просил рассуждать на тему зачем мне нужен код примера, я просто попросил, если у кого-то он есть, поделиться им, а если никто не знает, то не обязательно было здесь писать что-то вроде того, что было написано в предыдещих сообщениях...

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

 

В данном случае я попросил помощи! Кто сможет, я уверен, поможет. А кто не может помочь, лучше просто проходите мимо этой темы.

com
Offline
Зарегистрирован: 06.09.2013

JuriySOFT пишет:

Теория это хорошо, но лучше практика...

да вы бы лучше сами, вместо того, чтобы поучать других, что они не так и не то советуют, лучше попробовали свои советы к себе применить. К примеру,  загрузили свой пример кода в среду, попытались откомпилировать..... получили бы хоть 5 строчек, но работающих.

JuriySOFT
Offline
Зарегистрирован: 18.04.2014

com пишет:

JuriySOFT пишет:

Теория это хорошо, но лучше практика...

да вы бы лучше сами, вместо того, чтобы поучать других, что они не так и не то советуют, лучше попробовали свои советы к себе применить. К примеру,  загрузили свой пример кода в среду, попытались откомпилировать..... получили бы хоть 5 строчек, но работающих.

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

 

что касается моих советов, то я всегда помогаю людям кто интересуется html, т.к. я знаю этот язык и никогда не говорю никому: "для этого есть поиск..." или что-то подобное....

Я сейчас решил начать изучать C++ и в этом я новичек, поэтому и спрашиваю здесь. Для этого и создан этот форум, чтобы спрашивать и делиться тем что знаешь!!!!!!!!!

 

Поэтому я прошу в данной теме писать сообщения по теме или вообще не писать ничего.

Geronimo
Offline
Зарегистрирован: 06.05.2013

int stopTime = 0;
byte en=0:
int last;
void loop()
{
if(digitalRead(btnPin) == 1)
{
stopTime = 60*1000;
last = millis();
en = 1;
}
if(en)
{
if(millis()-last >= 1000)
{
last = millis();
stopTime--;
}
if(stopTime == 0)
{ digitalWrite(ledPin,1);
en =0;
}}}

Сорри за плохое форматирование, с телефона набирал

JuriySOFT
Offline
Зарегистрирован: 18.04.2014

Geronimo пишет:
int stopTime = 0; byte en=0: int last; void loop() { if(digitalRead(btnPin) == 1) { stopTime = 60*1000; last = millis(); en = 1; } if(en) { if(millis()-last >= 1000) { last = millis(); stopTime--; } if(stopTime == 0) { digitalWrite(ledPin,1); en =0; }}} Сорри за плохое форматирование, с телефона набирал

 

Спасибо большое за пример, сейчас буду пробовать! Как-только получится, отпишусь!))

com
Offline
Зарегистрирован: 06.09.2013

надо сетап добавить

Geronimo
Offline
Зарегистрирован: 06.05.2013

com пишет:

надо сетап добавить


Это набросок на коленке, тутт много что можно улучшить

JuriySOFT
Offline
Зарегистрирован: 18.04.2014

Я тут немного поэксперементировал  с урокам и получилось вот что: 

const int ledPin =  2;     
long interval = 5000;   
 
void setup() {
  pinMode(ledPin, OUTPUT);     
  pinMode(Rele, OUTPUT);     
  pinMode(22, INPUT);     
  pinMode(23, INPUT);     
}
 
void loop()
{
if(digitalRead(22)==HIGH){
 
   long currentMillis = millis();
long previousMillis = 0;   
 
  if(currentMillis - previousMillis > interval) {
   previousMillis = currentMillis; 

    digitalWrite(ledPin, HIGH);
    digitalWrite(Rele, LOW);
  }
  else if(digitalRead(22)==HIGH){
   
   if(currentMillis - previousMillis < interval) {
    previousMillis = currentMillis; 

    digitalWrite(ledPin, LOW);
    digitalWrite(Rele, HIGH);
    int previousMillis = 0;      

  }}
}



}

Но тут проблема, счетчик начинает считать от запуска программы, а не от нажатия кнопки!...

Подскажите, где проблему искать?

Мне кажется, что нужно что-то поменять тут:

long currentMillis = millis();

Но вот что? Я пока не знаю, подскажите!?

 

Geronimo
Offline
Зарегистрирован: 06.05.2013

Нарисуй блок схему алгоритма

Geronimo
Offline
Зарегистрирован: 06.05.2013

Нарисуй блок схему алгоритма

JuriySOFT
Offline
Зарегистрирован: 18.04.2014

Блок схемы не особо умею рисовать, но что смог.....

Где режим 1-4 , там кнопки.... при нажатии на которые и происхоит то или иное действие

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

JuriySOFT, начните с чего-то попроще. Ваш текущий код весь в логических ошибках.

Например попробуйте нажатием кнопки зажигать светодиод на 5 секунд.

JuriySOFT
Offline
Зарегистрирован: 18.04.2014

Через Delay() элементарно. а вот через Millis() пока что-то никак до меня не доходит....

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

JuriySOFT, ну хорошо, вот вам скетч, с подробным описанием. При нажатии на кнопку светодиод светится 10 секунд и гаснет. Вам домашнее задание -доработать скетч так, что-бы повторным нажатием на кнопку (до истечения 10 секунд) погасить светодиод.

/* скетч зажигает светодиод на выводе 13 на 10 секунд после нажатия на кнопку*/
#define ledPin 13 //определение вывода светодиода
#define knopka 7  //определение вывода кнопки
unsigned long prevmillis = 0; //переменная для хранения отсчёта времени
boolean myflag; //переменная для хранения состояния задачи (запущена или нет)
void setup(){
  pinMode(ledPin, OUTPUT);
  pinMode(knopka, INPUT_PULLUP); //подтяжка кнопки к питанию, нажатие кнопки -LOW
}
void loop() {
// в первом условии отрабатываем случай нажатия на кнопку
  if (digitalRead(knopka)==LOW && myflag==false){ // если кнопка нажата и задача не запускалась
    while (digitalRead(knopka)==LOW); //сперва подождём пока её отпустят (простой антидребезг)
    digitalWrite(ledPin,HIGH); //включим светодиод
    prevmillis=millis(); //положим в переменную текущий счёт миллисекунд
    myflag=true; //поднимем флаг активности задачи
  } // конец условия "если кнопка нажата"

// во втором условии контролируем наличие исполняемой задачи, и время её выполнения
  if (myflag==true && millis() - prevmillis > 10000){  // если задача выполняется, и 10 секунд прошли, то..
      digitalWrite(ledPin,LOW); //вЫключим светодиод
      myflag=false; //уберём флаг активности задачи
  } //закрываем условие "если задача выполняется"


} //конец функции loop

 

com
Offline
Зарегистрирован: 06.09.2013

имхо myflag - бесполезная в принципе-то переменная ;)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

com, ага, но она полезна при расширении возможностей. Я то сначала написал скетч с включением и  отключением светодиода при повторном нажатии , но потом эту возможность убрал, что бы товарищ потренировался сам :)

com
Offline
Зарегистрирован: 06.09.2013

dimax, если одно и тоже (суть состояние процесса, должна ли гореть лампа или нет) хранить в двух переменных, а именно 1)как значение myflag и 2)как уровень сигнала на пине, то рано или поздно эти две переменных как пить дать рассинхронизируются из-за ошибки программиста и наступит неопределенность - должен ли гореть светодиод, если myflag==true и digitalRead(ledPin)==LOW ???

:)))

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

com, ну соббсно myflag==true и digitalRead(ledPin)==LOW как раз начало условия, которое я специально из скетча убрал :)

com
Offline
Зарегистрирован: 06.09.2013

вот я и говорю - зачем проверять myflag если ту же самую информацию можно получить из digitalRead(ledPin)? они всегда должны совпадать.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

com, совершенно с вами согласен. Myflag был заложен "на вырост",  например если светодиод будет мигать.

Похоже зря я старался, топикстартера не интересует ничего кроме его конкретной задачи.

JuriySOFT
Offline
Зарегистрирован: 18.04.2014

dimax пишет:

com, совершенно с вами согласен. Myflag был заложен "на вырост",  например если светодиод будет мигать.

Похоже зря я старался, топикстартера не интересует ничего кроме его конкретной задачи.

Меня интересует многое, просто пока я не пойму то, что мне нужно, я не могу браться за другие вещи.....

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

JuriySOFT пишет:

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

Я вам написал этот скетч конкретно под вашу задачу, но что-бы её не решать полностью, и не оставить вас без возможности самому что-то сделать, я сделал логику наоборот.  Вам просто нужно переделать логику на свою, и всё.

JuriySOFT
Offline
Зарегистрирован: 18.04.2014

dimax пишет:

JuriySOFT пишет:

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

Я вам написал этот скетч конкретно под вашу задачу, но что-бы её не решать полностью, и не оставить вас без возможности самому что-то сделать, я сделал логику наоборот.  Вам просто нужно переделать логику на свою, и всё.

Ну это тоже самое, как если б человек попросил бы лопату, а ему дали черенок от неё....и сказали: А остальное сам доделаешь...

Не проще ли помочь человеку, если есть возможность? Или кайф в  том, чтобы посмотреть как человек будет долго мучиться, пытаться что-то сделать, задавать много вопросов на которые не получит нужного ответа....?

Еслиб ардуина воспринимала html, я б за пару сек все бы сделал что нужно, а в этом языке я пока еще 0 и пройдет еще время когда у меня начнет что-то получаться путное....

У меня нет знакомых кто мог бы подсказать, поэтому я обратился на этот форум, потому как уже не знаю как дальше быть и что делать....Не получается идти дальше пока эта задача не решена.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

JuriySOFT, я вам в который раз повторю -вы начали с слишком сложной задачи. Если у вас задача научиться -учитесь, я вам в 19 сообщении дал довольно простую задачку, гораздо  проще чем то, что хотите вы сделать. Усложнять нужно шаг за шагом.  Если не хотите учиться, -есть раздел "Ищу исполнителя".

JuriySOFT
Offline
Зарегистрирован: 18.04.2014

dimax пишет:

JuriySOFT, я вам в который раз повторю -вы начали с слишком сложной задачи. Если у вас задача научиться -учитесь, я вам в 19 сообщении дал довольно простую задачку, гораздо  проще чем то, что хотите вы сделать. Усложнять нужно шаг за шагом.  Если не хотите учиться, -есть раздел "Ищу исполнителя".

 

Теперь то я понял для чего вы тут все сидите.... чтобы закидать сначала сообщениями не по теме, затем запутать человека, чтобы поставить в "безвыходную" ситуацию, и чтобыф человек обратился в платный раздел, где за 5 сек, все те кто ему до этого якобы добра желали, напишут за деньги нужный ему код....)))

 

P.S. если б я не хотел учиться, я бя сразу обратился к тем, что мне целиком напишет то что мне нужно.

leshak
Offline
Зарегистрирован: 29.09.2011

JuriySOFT пишет:

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

Да "тьфу на вас". Вам человек объяснял, давал учебные задачи, тратил время. Все это бесплатно. И не пытаясь даже намекнуть на "платный раздел". Может вы не вкурсе, но вот так "учить" это гораздо трудней, нервней и времяемко чем "тупо взять и дать готовое".

И если бы вы полазили по форуму, то вы бы увидели что десятки людей нашли решение своих проблем и смогли научится именно таким образом.

И что-бы вам было понятно. Сам форум/раздел "за деньги", появился именно для того, что-бы очистить основные форумы от "помогите за деньги". Не отвечающие были инициаторами создания раздела, а именно те кто хотят что-бы им помогли. Цель была именно, что-бы "локализировать" комерцию. Раз уж совсем искоренить ее невозможно. Раз "спрос" все равно имеет место быть.

Так что, то что вы не способны научится "бесплатно", а предпочитаете искать огрехи в "учителях" - это сугубо ваша проблема. Может быть "учитель" и "фиговый". Да вот только - какой есть.

Хотите - становитесь "идельным учителем". Вакансий - хватит на всех. Никаких "заявлений, конкурсов и т.п.". Просто берите и помогайте. Собирайте свои "спасибо". И свои "проклятия". Будет и то и другое.

P.S. А если еще лучше пошерстите, то найдете не один пример, когда человек просил "за деньги", а ему те же самые люди которые "работают" - делают бесплатно. 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

JuriySOFT, ну конкретно я  ничего не писал за деньги. Вы поймите, тут вас всегда поддержат, если вы хотите учиться, я вам ещё в начале темы написал, что нужно делать, но вы не хотите слушать, и не хотите ничего учить. Значит вам нужен тот, кто всё сделает за вас, как иначе?

com
Offline
Зарегистрирован: 06.09.2013

JuriySOFT пишет:

Теперь то я понял для чего вы тут все сидите.... чтобы закидать сначала сообщениями не по теме, затем запутать человека, чтобы поставить в "безвыходную" ситуацию, и чтобыф человек обратился в платный раздел, где за 5 сек, все те кто ему до этого якобы добра желали, напишут за деньги нужный ему код....)))

а еще мы делаем фигурки нубов и втыкаем в них иголки, чтобы запутать окончательно

leshak
Offline
Зарегистрирован: 29.09.2011

com пишет:

а еще мы делаем фигурки нубов и втыкаем в них иголки, чтобы запутать окончательно

Только тыкаем, естественно, с помощью сервы. И на иголку выдаем PWM.