Применение millis для нескольких процессов

Posol88
Offline
Зарегистрирован: 14.11.2019

а я как раз читаю

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

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

Posol88 пишет:

что значит "слишком много аргументов для функции ' void flash()'" ?

Ну, "много" - это значит "больше, чем ожидалось". Даже не знаю, как объяснить ...

По украински это: занадто багато аргументів для функції ' void flash()'

По китайски: 函數的參數過多 ' void flash()'

Какой язык Вы понимаете?

Posol88
Offline
Зарегистрирован: 14.11.2019

извините, поторопился с вопросом, пол страницы пропустил

в электронном виде тяжеловато читать...

Green
Offline
Зарегистрирован: 01.10.2015

Лучше комиксами?

Posol88
Offline
Зарегистрирован: 14.11.2019

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

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

ты вот этим 


unsigned long TIM;
void flash (){
  digitalWrite(ledPin,HIGH);
  TIM;
  digitalWrite(ledPin, LOW);
  TIM;
}

чо сказать хотел? Пусть переменная  TIM тут постоит?  Ну, пусть, Клапа не запрещал пока, вроде. 

Posol88
Offline
Зарегистрирован: 14.11.2019

В версии скетча примера, на месте ТИМ стояли delay(а тут не время в цифрах , а перемення int, которая назначались в круглых скобках функции flash ) ;

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Posol88 пишет:
В версии скетча примера, на месте ТИМ стояли delay(а тут не время в цифрах , а перемення int, которая назначались в круглых скобках функции flash ) ;

Вот нихрена збадуна не понял. 

Posol88
Offline
Зарегистрирован: 14.11.2019

С телефона не получается код вставить... До компа доберусь, всо покажу

bwn
Offline
Зарегистрирован: 25.08.2014

Так в функции flash, оберните код в блинка без делея и делайте инверсию по интервалу. Делей в лоб не лечится. 

Logik
Онлайн
Зарегистрирован: 05.08.2014

bwn, ему в вашем сообщении только слово лоб понятно ))

Posol88
Offline
Зарегистрирован: 14.11.2019
int ledPin = 13;
void setup()
{
  pinMode(ledPin, OUTPUT);
  flash(10, 100);
}
void loop()
{
  flash(1, 500);
}
void flash(int n, int delayPeriod)
{
  for (int i = 0; i < n; i++)
  {
    digitalWrite(ledPin, HIGH);
    delay(delayPeriod);
    digitalWrite(ledPin, LOW);
    delay(delayPeriod);
}
}

вот оригинальный скетч

Posol88
Offline
Зарегистрирован: 14.11.2019

к сожалению Logik почти прав...

b707
Offline
Зарегистрирован: 26.05.2017

Posol88 пишет:
вот оригинальный скетч

 

"найдите 10 отличий"

Посмотрите, например, как описана процедурв flash в оригинале и что с ней сделали вы

Posol88
Offline
Зарегистрирован: 14.11.2019

вот как это понять? по какому принципу это работает?


char* messages[] = {
 "My name is Arduino",
 "Buy books by Simon Monk",
 "Make something cool with me",
 "Raspberry Pis are fruity"};
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  int delayPeriod = random(2000, 8000);
  delay(delayPeriod);
  int messageIndex = random(4);
  Serial.println(messages[messageIndex]);
}

одна и та же команда random()  в первом случае она выбирает время а во втором номер строки из массива. и в книге про этот принцип ни слова

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

Posol88 пишет:

по какому принципу это работает? одна и та же команда random()  в первом случае она выбирает время а во втором номер строки из массива. 

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

b707
Offline
Зарегистрирован: 26.05.2017

Posol88 пишет:

одна и та же команда random()  в первом случае она выбирает время а во втором номер строки из массива

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

Posol88
Offline
Зарегистрирован: 14.11.2019

точно, но вот почему то доходит до меня это когда уже сюда спрошу. 

спасибо))

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

DetSimen пишет:

Posol88 пишет:
В версии скетча примера, на месте ТИМ стояли delay(а тут не время в цифрах , а перемення int, которая назначались в круглых скобках функции flash ) ;

Вот нихрена збадуна не понял. 

я не с бодуна, а тоже ни хрена не понял, отсталые мы )))

bwn
Offline
Зарегистрирован: 25.08.2014

Posol88 пишет:

к сожалению Logik почти прав...

Посмотрел, вам я этой ссылки не давал (там три статьи на тему делея), почитайте, может просветление наступит.

Posol88
Offline
Зарегистрирован: 14.11.2019

отличная статья! Благодарю

Green
Offline
Зарегистрирован: 01.10.2015

bwn пишет:

Посмотрел, вам я этой ссылки не давал (там три статьи на тему делея), почитайте, может просветление наступит.

Статья дурная. Вылизывание и якобы "оптимизация" начинающим (да и не только) ВООБЩЕ вредны!
Лучше бы за логикой следить, оформлением и наглядностью изложения.

bwn
Offline
Зарегистрирован: 25.08.2014

Green пишет:

Статья дурная. Вылизывание и якобы "оптимизация" начинающим (да и не только) ВООБЩЕ вредны!
Лучше бы за логикой следить, оформлением и наглядностью изложения.

Не соглашусь, для новичков, а к ним и себя отношу, хорошо описан принцип. ИМХО.

Green
Offline
Зарегистрирован: 01.10.2015

Насчёт принципа согласен. Насчёт оптимизации нет. Это уже потом, при необходимости. С этим и компилятор хорошо справляется.)

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

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

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Учит, а написал хрень:
 

  previousMillis = millis();  

 

bwn
Offline
Зарегистрирован: 25.08.2014

ua6em пишет:

Учит, а написал хрень:
 

  previousMillis = millis();  

 

Я, Вас, таки умоляю, ту тему читал, но преимуществ практического применения, по сравнению с вышеприведенным, не углядел, за исключением академического поглаживания ЧСВ, может не дорос.((((

sadman41
Offline
Зарегистрирован: 19.10.2016

Я бы тоже хотел узнать, что не так с previousMillis в данном случае.

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

bwn пишет:

ua6em пишет:

Учит, а написал хрень:
 

  previousMillis = millis();  

 

Я, Вас, таки умоляю, ту тему читал, но преимуществ практического применения, по сравнению с вышеприведенным, не углядел, за исключением академического поглаживания ЧСВ, может не дорос.((((

Нет там никаких "преимуществ" или "недоимуществ" . И я и Логик там объяснили, что это два РАЗНЫХ решения, для разных задач.

прошлое = настоящее --- обеспечивает интервал между событиями НЕ МЕНЬШЕ  заданного;

прошлое += интервал --- обеспечивает постоянное количество событий за единицу времени. Если нет пропусков, то интервал НЕ БОЛЬШЕ заданного.

-------------------------

Следует отметить, что в "настольном" программировании нормой является ПЕРВОЕ решение, как бы не газировал лужу наш "короткий волновик". Так как чаще важнее чтобы интервал между обработками был НЕ МЕНЬШЕ заданного.

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

 

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

По мне бредовость не в этом. Скорее при объяснении Леший , пытаясь упростить объяснение для "новичков" протупил "как новички". Какой подход новичков в написании . Накачать с инете готовые рабочие куски написать в кучу и запустить. Ну ладно на форуме попросить "клея для склейки" и "дихлофоса для багов" . А они форумчане , "жлобы проклятые" продают за "большие деньги" . А где здесь millis(). Так это с чего начинается объяснений почему "клей" и "дихлофос" дорогой.  Понятно millis() это "программный клей" и есть. А дихлофос это не пихать куда попало в setup loop все что свеже-позаимствованно с просторов инета , а оформлять в виде функций и методов.

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

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

динамически управляемая генерация событий с динамически изменяемым интервалом времени между событиями
http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-...

Posol88
Offline
Зарегистрирован: 14.11.2019

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

int ledPin = 13;//переменная на 13 ножке
volatile boolean flashFast = false; //назначение глобальной переменной и присвоение логического ноля.
void setup(){
  pinMode(ledPin, OUTPUT);// 13 выход
  attachInterrupt(0, stuffHapenned, FALLING);//прерывание второй контакт срабатывать при нуле
}
void loop()
{
  int period = 1000; //локальная переменная с присвоением значения 1000
  if (flashFast) period = 100;//оператор. если переменная flashFast что?
  digitalWrite(ledPin, HIGH);//еденица на 13 ножке
  delay(period);//преостановить на время period
    digitalWrite(ledPin, LOW);//ноль на 13 ножке
  delay(period);//преостановить на время period
}
void stuffHapenned()
{
  flashFast = ! flashFast;//заменить имеющееся значение на противоположное
}

строчки 9 и 10. 

b707
Offline
Зарегистрирован: 26.05.2017

оператор

if (flashFast) period = 100;

аналогичен такому

if (flashFast == true) period = 100;

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

b707 пишет:

оператор

if (flashFast) period = 100;

аналогичен такому

if (flashFast == true) period = 100;

 

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

Posol88
Offline
Зарегистрирован: 14.11.2019

а зачем тогда в 9й строчке переменной period присваивается значение 1000, если она ни где кроме оператора if не участвует,  а в нем ей сразу присваевается значение 100?

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

wdrakula пишет:

bwn пишет:

ua6em пишет:

Учит, а написал хрень:
 

  previousMillis = millis();  

 

Я, Вас, таки умоляю, ту тему читал, но преимуществ практического применения, по сравнению с вышеприведенным, не углядел, за исключением академического поглаживания ЧСВ, может не дорос.((((

Нет там никаких "преимуществ" или "недоимуществ" . И я и Логик там объяснили, что это два РАЗНЫХ решения, для разных задач.

прошлое = настоящее --- обеспечивает интервал между событиями НЕ МЕНЬШЕ  заданного;

прошлое += интервал --- обеспечивает постоянное количество событий за единицу времени. Если нет пропусков, то интервал НЕ БОЛЬШЕ заданного.

-------------------------

Следует отметить, что в "настольном" программировании нормой является ПЕРВОЕ решение, как бы не газировал лужу наш "короткий волновик". Так как чаще важнее чтобы интервал между обработками был НЕ МЕНЬШЕ заданного.

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

 

человек не написавший ни одной задачи под QNX  пытается что-то тут сказать, да у меня станки на длине 2000мм имели точность позиционирования 1 микрон, а точность на фрезеровании 2 микрона, да что говорить, здесь программисты реального точного железа в глаза не видевшие, естественно ПО было забугорное, ты ж так писать не можешь,  мозги работают то наоборот )))

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Posol88 пишет:

а зачем тогда в 9й строчке переменной period присваивается значение 1000, если она ни где кроме оператора if не участвует,  а в нем ей сразу присваевается значение 100?

затем, чтобы при нажатии кнопки период моргания сменялся с 1 секунды на 0,1 секунды

Posol88
Offline
Зарегистрирован: 14.11.2019

ааааааааааааа......... понял! до меня только что дошло что оператор if закончился в той же строчке в 10й... а то я сижу и думаю чем же она мигает))))))))))))))))

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Posol88 пишет:

ааааааааааааа......... понял! до меня только что дошло что оператор if закончился в той же строчке в 10й... а то я сижу и думаю чем же она мигает))))))))))))))))

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

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

ua6em пишет:
закавычивайте как можно чаще

Во-во! А то появится какая-нибудь 

Posol88 пишет:

//еденица на 13 ножке

и чё с ней делать?

Posol88
Offline
Зарегистрирован: 14.11.2019

не, ну имелось же ввиду логическая единица т.е. +5в

Posol88
Offline
Зарегистрирован: 14.11.2019

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

"Важно различать логический оператор "И" - && и битовый оператор "И" - &. Тоже самое относится к логическому оператору "ИЛИ" - || и битовому оператору "ИЛИ" - |." ?

P.S. Что такое бит представление имею))

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Posol88 пишет:

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

"Важно различать логический оператор "И" - && и битовый оператор "И" - &. Тоже самое относится к логическому оператору "ИЛИ" - || и битовому оператору "ИЛИ" - |." ?

P.S. Что такое бит представление имею))

&& - логический оператор AND, оперирует понятиями true и false

&  - побитовый оператор AND, оперирует битами 

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

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

DetSimen пишет:

Posol88 пишет:

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

"Важно различать логический оператор "И" - && и битовый оператор "И" - &. Тоже самое относится к логическому оператору "ИЛИ" - || и битовому оператору "ИЛИ" - |." ?

P.S. Что такое бит представление имею))

&& - логический оператор AND, оперирует понятиями true и false

&  - побитовый оператор AND, оперирует битами 

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

дед, ты продолжи, что записи для битов могут иметь и иной вид a*b*c + a*d ....

Posol88
Offline
Зарегистрирован: 14.11.2019

ua6em пишет:

DetSimen пишет:

Posol88 пишет:

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

"Важно различать логический оператор "И" - && и битовый оператор "И" - &. Тоже самое относится к логическому оператору "ИЛИ" - || и битовому оператору "ИЛИ" - |." ?

P.S. Что такое бит представление имею))

&& - логический оператор AND, оперирует понятиями true и false

&  - побитовый оператор AND, оперирует битами 

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

дед, ты продолжи, что записи для битов могут иметь и иной вид a*b*c + a*d ....

где a b c итд адрес бита в байте?

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Posol88 пишет:

ua6em пишет:

DetSimen пишет:

Posol88 пишет:

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

"Важно различать логический оператор "И" - && и битовый оператор "И" - &. Тоже самое относится к логическому оператору "ИЛИ" - || и битовому оператору "ИЛИ" - |." ?

P.S. Что такое бит представление имею))

&& - логический оператор AND, оперирует понятиями true и false

&  - побитовый оператор AND, оперирует битами 

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

дед, ты продолжи, что записи для битов могут иметь и иной вид a*b*c + a*d ....

где a b c итд адрес бита в байте?

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

Posol88
Offline
Зарегистрирован: 14.11.2019

принял, понял, закрепил.

Posol88
Offline
Зарегистрирован: 14.11.2019

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

int timeRequest = 0;
int i = 0;
void setup(){
  Serial.begin(9600);
}
void loop(){
  if (timeRequest==0){
    timeRequest = millis();
  }
  if (millis() - timeRequest >= 300ul){
    int clockFeed;
    Serial.print("POLY4uLocb ");
    timeRequest = 0;
    if ( Serial.println(i)){
        i++;
    }
  }
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Posol88 пишет:

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

int timeRequest = 0;

Тип переменной сменить на unsigned long.

Posol88
Offline
Зарегистрирован: 14.11.2019

получается что в типе int памяти не хватает? она при таком построении скетча не стирает что ли ни чего и хранит каждое пропечатанное значение?