Помогите новичку пожалуйста.

Фикрет
Offline
Зарегистрирован: 05.02.2017

Здравствуйте. я только учусь .

В общем суть такова: нужно сделать программу которая сигнализирует через какие то промежутки времени и ждёт ответа от человека в течении 5 секунд. Если ответа нет, то включается сигнализация. Это не что то очень мне нужное, но входит в курс обучения.

Понимаю что нужно сделать разбивки на, примерно 250 мс (потому что тупо delay(5000) заморозит программу и она не сможет получить сигнал с пина входного) и после каждого такого ожидания digitalRead(BUTTON).
но как завершить этот цикл через 5 секунд?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А вы готовы к большим пинкам от форумчан или вам только готовый код?

tryinfinity
Offline
Зарегистрирован: 24.04.2017
for (int i=0; i <= 3000; i++){
      delay(100);
	  if (ожидаемое событие) break;
   }

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Гениальный неправильный ответ.

tryinfinity
Offline
Зарегистрирован: 24.04.2017

qwone пишет:

Гениальный неправильный ответ.

Это еще почему? Это только кусочек, как проверять действия с интервалом в 100мс. Еще нужно добавить флаг, что если ответ пришел, то true, если нет то to false и потом уже желать условие по результату.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Человек говорит , что delay(5000) ...Говно.А вы не нравится говно есть одним куском, то ешь по кусочкам delay(100)

 

tryinfinity
Offline
Зарегистрирован: 24.04.2017

Фикрет пишет:
Понимаю что нужно сделать разбивки на, примерно 250 мс (потому что тупо delay(5000) заморозит программу и она не сможет получить сигнал с пина входного) и после каждого такого ожидания digitalRead(BUTTON). но как завершить этот цикл через 5 секунд?

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

tryinfinity пишет:

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

Проблема человека не в разбивке delay()  на множество коротких delay(). Вы что его полного альтернативного одаренного считаете. Хотя я уже не удивлюсь . А не знанию или не умению millis()

http://arduino.ru/Reference/Millis

Но похоже и вы о наличии этого инструмента не в курсе.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

никогда клоунов на форуме не было - и, вот, снова.

класс титановый велосипед для delay без delay().

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

Фикрет пишет:
Это не что то очень мне нужное, но входит в курс обучения.
Чей курс обучения?

Ваш или мой?

Если Ваш, то учитесь и делайте. А если мой, то я сам сделаю как-нибудь.

Сюда-то Вы зачем пришли? Если есть вопросы, так обратитесь к своему преподавателю, он за ответы на Ваши вопросы деньги получает.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ОФФТОП:

Судя по примитивности задания это не ВУЗ, а ПТУ, как их теперь обзывают - "Колледж".

Вот зачем человек учится, если это ему не нужно? Сейчас служат 1 год, обычно - в своем регионе. На крайний случай - "плоскостопные войска" никто не отменял, а больные - все, есть плохо обследованные.

Отслужит, пойдет в охранники, а там и мелкого отбойщика дорастет. Хорошая, счастливая жизнь, не так?

tryinfinity
Offline
Зарегистрирован: 24.04.2017

qwone пишет:

Но похоже и вы о наличии этого инструмента не в курсе.

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

tryinfinity пишет:

я чего то вобще не догоняю)

Да. И это очень мягко сказано.

tryinfinity
Offline
Зарегистрирован: 24.04.2017

wdrakula пишет:

tryinfinity пишет:

я чего то вобще не догоняю)

Да. И это очень мягко сказано.

Да, но что то никакой конструктивной критики с тыканием носом в код нет, одни только прелюдия)

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

tryinfinity пишет:

Да, но что то никакой конструктивной критики с тыканием носом в код нет

И не будет, ибо задолбали уже. И ТС со своим курсом обучения (хрен знает чему он там обучается, если такая задача его в тупик ставит) в Вы со своим искренним стремлением помь бездельнику получить липовый диплом.

tryinfinity
Offline
Зарегистрирован: 24.04.2017

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

И не будет, ибо задолбали уже. И ТС со своим курсом обучения (хрен знает чему он там обучается, если такая задача его в тупик ставит) в Вы со своим искренним стремлением помь бездельнику получить липовый диплом.

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

tryinfinity пишет:

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

Вот вам наводка.

//#1
//#2
//#3
void setup() {
  //#1
  //#2
  //#3
}
void loop() {
  //#1 1000 миллисекунд вычислит. поток 1
  static uint32_t past_1 = 0 ;
  if (millis() - past_1 >= 1000) { // если прошло 1000 миллисек
    past_1 = millis() ;
    // сам код
  }
  //#2  200 миллисекунд вычислит. поток 2
  static uint32_t past_2 = 0 ;
  if (millis() - past_2 >= 200) { // если прошло 200 миллисек
    past_2 = millis() ;
    // сам код
  }
  //#3  100 миллисекунд вычислит. поток 3
  static uint32_t past_3 = 0 ;
  if (millis() - past_3 >= 100) { // если прошло 100 миллисек
    past_3 = millis() ;
    // сам код
  }
}

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

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

tryinfinity пишет:

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

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

tryinfinity
Offline
Зарегистрирован: 24.04.2017

Все понял, спасибо, все время забываю что void loop это цикл.

Фикрет
Offline
Зарегистрирован: 05.02.2017

qwone пишет:

А вы готовы к большим пинкам от форумчан или вам только готовый код?

не не, готовый код не надо. мне бы пинки в какую сторону копать

Фикрет
Offline
Зарегистрирован: 05.02.2017

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

Фикрет пишет:
Это не что то очень мне нужное, но входит в курс обучения.
Чей курс обучения?

Ваш или мой?

Если Ваш, то учитесь и делайте. А если мой, то я сам сделаю как-нибудь.

Сюда-то Вы зачем пришли? Если есть вопросы, так обратитесь к своему преподавателю, он за ответы на Ваши вопросы деньги получает.

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

 

Фикрет
Offline
Зарегистрирован: 05.02.2017

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

tryinfinity пишет:

Да, но что то никакой конструктивной критики с тыканием носом в код нет

И не будет, ибо задолбали уже. И ТС со своим курсом обучения (хрен знает чему он там обучается, если такая задача его в тупик ставит) в Вы со своим искренним стремлением помь бездельнику получить липовый диплом.

тебе мой диплом показать который я 10 лет назад получил??

Фикрет
Offline
Зарегистрирован: 05.02.2017

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

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

P.S. Задолбали. второй раз обращаюсь тут за помощью и второй раз выпендрежники засирают тему

Фикрет
Offline
Зарегистрирован: 05.02.2017

qwone пишет:

tryinfinity пишет:

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

Вот вам наводка.

//#1
//#2
//#3
void setup() {
  //#1
  //#2
  //#3
}
void loop() {
  //#1 1000 миллисекунд вычислит. поток 1
  static uint32_t past_1 = 0 ;
  if (millis() - past_1 >= 1000) { // если прошло 1000 миллисек
    past_1 = millis() ;
    // сам код
  }
  //#2  200 миллисекунд вычислит. поток 2
  static uint32_t past_2 = 0 ;
  if (millis() - past_2 >= 200) { // если прошло 200 миллисек
    past_2 = millis() ;
    // сам код
  }
  //#3  100 миллисекунд вычислит. поток 3
  static uint32_t past_3 = 0 ;
  if (millis() - past_3 >= 100) { // если прошло 100 миллисек
    past_3 = millis() ;
    // сам код
  }
}

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

я очень извиняюсь, а можно обьяснить как идиоту, что именно этот millis делает? по описанию команды он возвращает какое то время на выполнение программы

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Фикрет пишет:
я очень извиняюсь, а можно обьяснить как идиоту, что именно этот millis делает? по описанию команды он возвращает какое то время на выполнение программы

В свое время человечество придумало часы, а потом для понтов повесило их на руку. И вот что интересно , для тех людей которые нашли им применение, жизнь упростилась и начали они успевать намного больше. Так вот millis() и есть такие часы. Вот только считают они миллисекунды (0,001 сек).  Вот вам надо выполнить действие  не раньше чем произошло какое-то событие. Вот засекаете время события , а потом переодически поглядываете на "часы". Если разница больше чем надо, то все прошло достаточно времени.

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Фикрет пишет:

я очень извиняюсь, а можно обьяснить как идиоту, что именно этот millis делает? по описанию команды он возвращает какое то время на выполнение программы

Извиняться можно, но только не здесь ...

Написано вроде по-русски - возвращает число миллисекунд с начала выполнения программы (то бишь с момента включения) ардуино

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

millis - это часы.

Когда Вы разрабатываете алгоритм работы программы, самый действенный путь - представить, как бы лично Вы решали эту задачу, оказавшись на месте микроконтроллера.

Так вот, delay - это что-то вроде тяжелого наркотика - принял и вырубился на какое-то время. А millis - это часы, обычные часы, по которым можно узнать текущее время. Строго говоря, количество миллисекунд, прошедших с момента включения микроконтроллера.

tryinfinity
Offline
Зарегистрирован: 24.04.2017

Это как сквозной таймер без задержки по delay. mills() это текущее значение времени в ардуино. То что отсчет идет от старта программы (это так, для информации). В скрипте идет сравнение старого значения mills()  (которое записали в переменную) и текущего, а когда достигает нужного значения, то срабатывает условие так называемого таймера, ну и таймер обнуляется путем присвоения переменной текущего значения mills().

 

Фикрет
Offline
Зарегистрирован: 05.02.2017

tryinfinity пишет:

Это как сквозной таймер без задержки по delay. mills() это текущее значение времени в ардуино. То что отсчет идет от старта программы (это так, для информации). В скрипте идет сравнение старого значения mills()  (которое записали в переменную) и текущего, а когда достигает нужного значения, то срабатывает условие так называемого таймера, ну и таймер обнуляется путем присвоения переменной текущего значения mills().

 

Спасибо ОГРОМНОЕ)))) вот теперь реально понятно 

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

Фикрет пишет:
тебе мой диплом показать который я 10 лет назад получил??

На кой чёрт мне Ваш диплом? Уровень знаний и так вижу.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
Фикрет
Offline
Зарегистрирован: 05.02.2017

[/quote]

Вот вам наводка.

//#1
//#2
//#3
void setup() {
  //#1
  //#2
  //#3
}
void loop() {
  //#1 1000 миллисекунд вычислит. поток 1
  static uint32_t past_1 = 0 ;
  if (millis() - past_1 >= 1000) { // если прошло 1000 миллисек
    past_1 = millis() ;
    // сам код
  }
  //#2  200 миллисекунд вычислит. поток 2
  static uint32_t past_2 = 0 ;
  if (millis() - past_2 >= 200) { // если прошло 200 миллисек
    past_2 = millis() ;
    // сам код
  }
  //#3  100 миллисекунд вычислит. поток 3
  static uint32_t past_3 = 0 ;
  if (millis() - past_3 >= 100) { // если прошло 100 миллисек
    past_3 = millis() ;
    // сам код
  }
}

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

[/quote]

А почему именно static?? Для чего мне сохранять эти данные?

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

Фикрет пишет:
А почему именно static?? Для чего мне сохранять эти данные?

Так Вы в 13-ой строке время начала запомнили. Не для того же, чтобы при следующем входе в loop оно снова нулём стало.

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

Если нужно бысторо и единожды, то лучше купить готовое.

Здесь их на все случаи жизни, с сбросом, тригером, импульсами....

Думаю, что в других регионах не будет проблем найти подобное.

Есть куча разных фирм и производителей.