Осталось разобраться как не ждать когда подойдет очередь кнопки а нажать и отпустить ее в момент горения диода.
Боюсь Вас разочаровать, но это невозможно. Тут надо выбирать, либо вставлять паузы, либо обрабатывать кнопки. А Вы хотите всё и сразу - так не бывает :-)
Буду опрашивать кнопки (попытаюсь по крайней мере )
Осталось разобраться как не ждать когда подойдет очередь кнопки а нажать и отпустить ее в момент горения диода.
Боюсь Вас разочаровать, но это невозможно. Тут надо выбирать, либо вставлять паузы, либо обрабатывать кнопки. А Вы хотите всё и сразу - так не бывает :-)
варианты:
1) флаг. а) по фронту б) по лог уровню в) с перезапуском таймера г) без перезапуска
2) после события всегда выполняется только одно условие по таймеру (или задержке).
3) он всегда есть, просто не все его могут заметить...
Я еще вариант придумал (самый простой на мой взгляд), но он почему то не работает (нигде не написано что нельзя делать повторение одной и той же функции). Т.е. горят диоды и идет опрос на HIGH входного пина, как только пин получил питание, переход по goto. Почему то с одним разом работает а с множеством нет....
[code]
if (digitalRead(inPin) == HIGH ) // если на пин 2 подано напряжение
{
goto lab ;
}
analogWrite (ledPin, 255), analogWrite (ledPin1, 255), analogWrite (ledPin2, 0);// включаем светодиод 1 и 2, выход 13 отключаем
delay (1000); // время горения диода
if (digitalRead(inPin) == HIGH ) // если на пин 2 подано напряжение
{
goto lab ;
}
analogWrite (ledPin, 255), analogWrite (ledPin1, 255), analogWrite (ledPin2, 0);// включаем светодиод 1 и 2, выход 13 отключаем
delay (1000); // время горения диода
if (digitalRead(inPin) == HIGH ) // если на пин 2 подано напряжение
{
goto lab ;
}
analogWrite (ledPin, 255), analogWrite (ledPin1, 255), analogWrite (ledPin2, 0);// включаем светодиод 1 и 2, выход 13 отключаем
delay (1000); // время горения диода
if (digitalRead(inPin) == HIGH ) // если на пин 2 подано напряжение
{
goto lab ;
}
analogWrite (ledPin, 255), analogWrite (ledPin1, 255), analogWrite (ledPin2, 0);// включаем светодиод 1 и 2, выход 13 отключаем
delay (1000); // время горения диода
if (digitalRead(inPin) == HIGH ) // если на пин 2 подано напряжение
{
goto lab ;
}
[/code]
Я еще трехколесный не осилил а Вы уже на титановом предлагаете ;)
еще вариант придумал (самый простой на мой взгляд), но он почему то не работает
если вариант не работает, значит это не вариант :)
Почему не работает? ведь логично, программа прошла один оператор ничего не совпало, перешла к другому и т.д. Почему по времени отрабатывает а перейти не хочет?
Alexandr0202, примете как данность: оператор delay() несовместим с быстрым опросом кнопок. Чтобы вы там не комбинировали с кучей условий или переходами по меткам - работать не будет
Alexandr0202, примете как данность: оператор delay() несовместим с быстрым опросом кнопок. Чтобы вы там не комбинировали с кучей условий или переходами по меткам - работать не будет
А куда вы дели паузу в 5 сек во время которой опрос кнопок невозможен ? Ждете 5 сек и нажимаете ? Так то да , можно конечно.
Вы правы, жду 5 сек и нажимаю(так задумано). Раньше нужно было ждать пока функция отработает а сейчас в любое время срабатывает. Правда код не так красив и в длину раза в 3-4 вытянулся, зато простенько и понятненько.
Александр, себя-то не обманывайте... никакой задержки 5 сек в исходном ТЗ не было - это вы теперь придумали по лени, чтобы не разбираться с рекомендованными вам примерами.
Не должно оно было никуда вытянуться, что то намудрили там. А как вы делаете "если ничего не нажали определенное время, то зажигаем все три" ?
Я 50 раз написал одно и тоже, что бы уменьшить время горения диода и увеличить частоту опроса кнопки.
Если раньше было так :
delay (5000); // время горения диода
if (digitalRead(inPin) == HIGH ) // если на пин 2 подано напряжение
{
goto lab ;
}
то теперь стало так :
delay (1000); // время горения диода
if (digitalRead(inPin) == HIGH ) // если на пин 2 подано напряжение
{
goto lab ;
}
delay (1000); // время горения диода
if (digitalRead(inPin) == HIGH ) // если на пин 2 подано напряжение
{
goto lab ;
}
delay (1000); // время горения диода
if (digitalRead(inPin) == HIGH ) // если на пин 2 подано напряжение
{
goto lab ;
}
delay (1000); // время горения диода
if (digitalRead(inPin) == HIGH ) // если на пин 2 подано напряжение
{
goto lab ;
}delay (1000); // время горения диода
if (digitalRead(inPin) == HIGH ) // если на пин 2 подано напряжение
{
goto lab ;
}
т.е. раньше после 5 секунд был опрос входного пина, то во втором случае опрос происходит каждую секунду в течении 5 секунд. В дальнейшем ввел переменную в паузу и теперь меняю время одним вводом.
Все три зажигаются в конце программы если пропустили операторы if.
Александр, себя-то не обманывайте... никакой задержки 5 сек в исходном ТЗ не было - это вы теперь придумали по лени, чтобы не разбираться с рекомендованными вам примерами.
Ну да дело ваше, вы же в этой ветке учитесь...
Исходное ТЗ уже существенно продвинулось и образовала 2 проекта....
Исходное ТЗ уже существенно продвинулось и образовала 2 проекта....
да ну? :) вчера только спрашивали "как остановить цикл" - а теперь уже два проекта? :)))))
Я бы вам все-таки советовал разобраться в примере "блинк без делей". который вам уже раза три посоветовали. Он делает ровно то, чего вы пытаетесь добиться, размножая свои IF со все меньшими и меньшими задержками. Только делает он это в пять строк и реакция кнопок мгновенная
Я бы вам все-таки советовал разобраться в примере "блинк без делей". который вам уже раза три посоветовали. Он делает ровно то, чего вы пытаетесь добиться, размножая свои IF со все меньшими и меньшими задержками. Только делает он это в пять строк и реакция кнопок мгновенная
Собираюсь в ближайшее время, пусть мозг пока остынет.
Посмотрел в примерах, там нет входного пин-а просто мигает диод по присвоенной паузе, которая через тот же if работает.
[code]
void loop() {
// here is where you'd put code that needs to be running all the time.
// check to see if it's time to blink the LED; that is, if the difference
// between the current time and last time you blinked the LED is bigger than
// the interval at which you want to blink the LED.
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
// if the LED is off turn it on and vice-versa:
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
[/code]
Собираюсь в ближайшее время, пусть мозг пока остынет.
Хорошая мысль... вообще, без учителя или помощника, который знает хоть немного, стартовать в программировании очень сложно. Для меня, это как учить китайски по словарю... что-то может и получится, вот только кода и что - вопрос.
Так там же millis используется он время задает и от него все отталкивается. Как этот принцип вписать в мой код я не могу даже вообразить, а что я не могу представить для меня не понятно. С delay я четко знаю что делает и где может работать, это как таймер в LD.
Гриша пишет:
Alexandr0202 пишет:
Собираюсь в ближайшее время, пусть мозг пока остынет.
Хорошая мысль... вообще, без учителя или помощника, который знает хоть немного, стартовать в программировании очень сложно. Для меня, это как учить китайски по словарю... что-то может и получится, вот только кода и что - вопрос.
Пожелание: надеюсь это единственная, первая и последняя программа в которой вы используете "goto" . Не вникайте сейчас по какой причине, просто поверьте. Для вас сейчас доступны только "for" и "if", пока вы не научитесь писать мелкие программы (кодовый замок, светофор и подобное) лучше ничего более не использовать, а если очень хочется - значит у вас ошибка в логике решения поставленной задачи.
Так там же millis используется он время задает и от него все отталкивается. Как этот принцип вписать в мой код я не могу даже вообразить, а что я не могу представить для меня не понятно.
Думайте, умение составлять алгоритмы, гораздо важнее чем уметь печатать в слепую
void loop() { // выполняется постоянно, как и положено петле
unsigned long currentMillis = millis(); //переменная, в которую записываем значение внутренних часов.
// обновляется при каждом витке программы
//это таймер
if (currentMillis - previousMillis >= interval) { // проверяем, что заданное время вышло и выполняем....
// при каждом витке программы
// save the last time you blinked the LED
previousMillis = currentMillis; // точка перезапуска таймера
// if the LED is off turn it on and vice-versa:
if (ledState == LOW) { ledState = HIGH; }
else { ledState = LOW; }
}}
Пожелание: надеюсь это единственная, первая и последняя программа в которой вы используете "goto" . Не вникайте сейчас по какой причине, просто поверьте. Для вас сейчас доступны только "for" и "if", пока вы не научитесь писать мелкие программы (кодовый замок, светофор и подобное) лучше ничего более не использовать, а если очень хочется - значит у вас ошибка в логике решения поставленной задачи.
Брюс Ли говорил : Я не боюсь человека, отработавшего 1000 приемов один раз, я боюсь человека, отработавшего один прием 1000 раз.
Я не собираюсь быть профессиональным программистом Ардуино, я хочу освоить написания мелких программ, но так что бы не лазить каждый раз в книжки и на форумы.
Так там же millis используется он время задает и от него все отталкивается. Как этот принцип вписать в мой код я не могу даже вообразить, а что я не могу представить для меня не понятно. С delay я четко знаю что делает и где может работать, это как таймер в LD.
Именно поэтому я Вам и посоветовал внимательно разобраться с двумя примерами.
Поверьте, полчаса/час/три часа/сутки, потраченные на разбор этих пяти строчек, дадут Вам больше, чем десятки и сотни строчек кода, написанные Вами с Вашими нынешними познаниями.
Брюс Ли говорил : Я не боюсь человека, отработавшего 1000 приемов один раз, я боюсь человека, отработавшего один прием 1000 раз.
не рекомендую отрабатывать прием удара в пах и удар мизинцем по хвосту врага. Собственно вам потом бы все одно сказали много ласковых про goto . если оно будет это будущее.
еще раз - настоятельно рекомендую забыть про goto прямо сейчас, несколько позже забыть про delay но пока пробовать с ним.
Думайте, умение составлять алгоритмы, гораздо важнее чем уметь печатать в слепую
void loop() { // выполняется постоянно, как и положено петле
unsigned long currentMillis = millis(); //переменная, в которую записываем значение внутренних часов.
// обновляется при каждом витке программы
//это таймер
if (currentMillis - previousMillis >= interval) { // проверяем, что заданное время вышло и выполняем....
// при каждом витке программы
// save the last time you blinked the LED
previousMillis = currentMillis; // точка перезапуска таймера
// if the LED is off turn it on and vice-versa:
if (ledState == LOW) { ledState = HIGH; }
else { ledState = LOW; }
}}
Мне не понятно, зачем программировать по времени если можно по условию в чем выгода?
Мне не понятно, зачем программировать по времени если можно по условию в чем выгода?
Если захотите это понять, могу повторить: попытайтесь в качестве учебной задачки сделать сформулированную в последнем предложении 38-го сообщения в этой теме - с двумя светодиодами.
Если захотите это понять, могу повторить: попытайтесь в качестве учебной задачки сделать сформулированную в последнем предложении 38-го сообщения в этой теме - с двумя светодиодами.
Если захотите это понять, могу повторить: попытайтесь в качестве учебной задачки сделать сформулированную в последнем предложении 38-го сообщения в этой теме - с двумя светодиодами.
Я не могу этого сделать.
Правильно.Ппотому, что Вы еще не разобрали, чем blink отличается от blink without delay.
Сколько Вам нужно времени, чтобы разобраться в пяти строчках? Даже если несколько дней (по дню на строчку) - оно того стоит.
Правильно. Потому, что Вы еще не разобрали, чем blink отличается от blink without delay.
Сколько Вам нужно времени, чтобы разобраться в пяти строчках? Даже если несколько дней (по дню на строчку) - оно того стоит.
Алгоритм работы blink мне понятен и на его примере я могу строить простые схемы и программы, blink without delay некоторые моменты не понятны, например где указано сколько светится и не светится диоду в этих строках?
// if the LED is off turn it on and vice-versa:
if (ledState == LOW) // если диод отключен ;
{
ledState = HIGH; // включаем ;
} else
{
ledState = LOW; // или отключаем;
}
Бред какой то, то есть время задано в начале программы а непосредственно включением ничто не руководит...
// if the LED is off turn it on and vice-versa:
if (ledState == LOW) // если диод отключен ;
{
ledState = HIGH; // включаем ;
} else
{
ledState = LOW; // или отключаем;
}
Бред какой то, то есть время задано в начале программы а непосредственно включением ничто не руководит...
Если бы две ключевые строки (те, что перед приведенными) не выкинули, то смысл был бы, а бреда не было.
Я 50 раз написал одно и тоже, что бы уменьшить время горения диода и увеличить частоту опроса кнопки.
Подозревал что то подобное :) Ваша мысль идет в обычном таком направлении, напишите и нормально в конце концов если еще время потратите на опыты.
Alexandr0202 пишет:
Я не собираюсь быть профессиональным программистом Ардуино, я хочу освоить написания мелких программ, но так что бы не лазить каждый раз в книжки и на форумы.
Никуда вы не денетесь от этой темы, шаг влево шаг вправо и постоянно будете натыкаться, да и не так это сложно, как только в голове щелкнет - все станет понятно и просто. Надо перейти от линейного выполнения действий одного за другим к обработке событий. Ничего прям уж таки нового, вот нажатие кнопки у вас - это событие, по нему можно зажечь светодиод, но и включение 3х светодиодов - тоже событие, но его условие - это не нажатие кнопки, а 5 секунд от начала опроса, просто засекаете время начала и проверяете таким же if как у кнопок, только (время текущее - время начала) > 5000мс. На таком принципе делаете все действия и они начинает работать без delay, параллельно друг другу. Можете про конечные автоматы почитать, но лучше после того, как свой пример так сделаете - понятнее будет.
Я не собираюсь быть профессиональным программистом ... что бы не лазить каждый раз в книжки
В таком случае (если цель "не лазить в книжки") бросьте это дело и займите чем-нибудь другим. Потому как без лазания в книжки не обходятся никакие программисты - ни профессиональные, ни непрофессиональные.
Я не собираюсь быть профессиональным программистом ... что бы не лазить каждый раз в книжки
В таком случае (если цель "не лазить в книжки") бросьте это дело и займите чем-нибудь другим. Потому как без лазания в книжки не обходятся никакие программисты - ни профессиональные, ни непрофессиональные.
Я имел ввиду, что простейшие программы писать без книжки (как бы читать книжки без букваря).
Возник следующий вопрос: byte, int, long, float как определить какой тип данных применять в каждом конкретном случае? Я понимаю что это объем данных но как высчитать какой нужен. Например здесь почему применен long, как определили что нужно именно long а не например int?
[code]
unsigned long previousMillis = 0; // will store last time LED was updated
// constants won't change:
const long interval = 1000; // interval at which to blink (milliseconds)
[/code]
Возник следующий вопрос: byte, int, long, float как определить какой тип данных применять в каждом конкретном случае?
Определять исходя из того, что именно и какого размера ты собираешься хранить в переменных. Описание каждого типа данных содержится в умных книжках или статьях по С/С++
Alexandr0202 пишет:
Например здесь почему применен long, как определили что нужно именно long а не например int?
[code]
unsigned long previousMillis = 0; // will store last time LED was updated
// constants won't change:
const long interval = 1000; // interval at which to blink (milliseconds)
[/code]
unsigned long previousMillis = 0; - Определили из описания функции millis(), которая возвращает long. const long interval = 1000; - А здесь long выбран неверно. Исходя из размера константы достаточно int.
А как определили, где написано, что функция millis может занимать от 2147383647 до -2147383648 ?
Скажите, Александр, Вы в школе арифметику проходили?
Операции умножения/деления знаете?
Так почему не хотите воспользоваться своими знаниями?
Вот в качестве упражнения посчитайте, сколько времени пройдет до переполнения переменных типа long и типа int, если каждая из них изменяется 1000 раз в секунду?
PS. Кстати. в вашем утверждении ошибка. Сами найдете или подсказать?
А как определили, где написано, что функция millis может занимать от 2147383647 до -2147383648 ?
Функция millis() возвращает не long, a unsigned long (в сообщении #92 я ошибся). Это разные типы данных, поэтому функция возвращает другие значения.
Как определили тип данных: например открываем и смотрим файл wiring.c в папке c Arduino IDE. Либо гуглим и попадаем на сайт arduino.cc со справочной информацией.
А как определили, где написано, что функция millis может занимать от 2147383647 до -2147383648 ?
Скажите, Александр, Вы в школе арифметику проходили?
Операции умножения/деления знаете?
Так почему не хотите воспользоваться своими знаниями?
Вот в качестве упражнения посчитайте, сколько времени пройдет до переполнения переменных типа long и типа int, если каждая из них изменяется 1000 раз в секунду?
PS. Кстати. в вашем утверждении ошибка. Сами найдете или подсказать?
Арифметика была на 5 о вот с алгеброй только 3(трудно а + b было складывать).
int наверное за 65,535 сек. long за 4 294 767,295 сек ?
Больше того, хватит и байта и даже бита. Можно в одном байте сохранить восемь разных LedState. А в int вообще 16. Использовать int для хранения одного статуса это форменное расточительство.
Больше того, хватит и байта и даже бита. Можно в одном байте сохранить восемь разных LedState. А в int вообще 16. Использовать int для хранения одного статуса это форменное расточительство.
А почему тогда используют int? Причем в учебниках в примерах и в самой программе.
Вот в качестве упражнения посчитайте, сколько времени пройдет до переполнения переменных типа long и типа int, если каждая из них изменяется 1000 раз в секунду?
А почему 1000 раз в секунду? Это быстродействие процессора (частота Atmega)?
Осталось разобраться как не ждать когда подойдет очередь кнопки а нажать и отпустить ее в момент горения диода.
Боюсь Вас разочаровать, но это невозможно. Тут надо выбирать, либо вставлять паузы, либо обрабатывать кнопки. А Вы хотите всё и сразу - так не бывает :-)
Буду опрашивать кнопки (попытаюсь по крайней мере )
Осталось разобраться как не ждать когда подойдет очередь кнопки а нажать и отпустить ее в момент горения диода.
Боюсь Вас разочаровать, но это невозможно. Тут надо выбирать, либо вставлять паузы, либо обрабатывать кнопки. А Вы хотите всё и сразу - так не бывает :-)
варианты:
1) флаг. а) по фронту б) по лог уровню в) с перезапуском таймера г) без перезапуска
2) после события всегда выполняется только одно условие по таймеру (или задержке).
3) он всегда есть, просто не все его могут заметить...
возможно это рановато... класс титановый велосипед для delay без delay() ;
класс титановый велосипед для тактовой кнопки ... но почитать рекомендую, все же рановато еще
варианты:
1) флаг. а) по фронту б) по лог уровню в) с перезапуском таймера г) без перезапуска
2) после события всегда выполняется только одно условие по таймеру (или задержке).
3) он всегда есть, просто не все его могут заметить...
возможно это рановато... класс титановый велосипед для delay без delay() ;
класс титановый велосипед для тактовой кнопки ... но почитать рекомендую, все же рановато еще
Я еще вариант придумал (самый простой на мой взгляд), но он почему то не работает (нигде не написано что нельзя делать повторение одной и той же функции). Т.е. горят диоды и идет опрос на HIGH входного пина, как только пин получил питание, переход по goto. Почему то с одним разом работает а с множеством нет....
Я еще трехколесный не осилил а Вы уже на титановом предлагаете ;)
.
еще вариант придумал (самый простой на мой взгляд), но он почему то не работает
если вариант не работает, значит это не вариант :)
еще вариант придумал (самый простой на мой взгляд), но он почему то не работает
если вариант не работает, значит это не вариант :)
Почему не работает? ведь логично, программа прошла один оператор ничего не совпало, перешла к другому и т.д. Почему по времени отрабатывает а перейти не хочет?
Alexandr0202, примете как данность: оператор delay() несовместим с быстрым опросом кнопок. Чтобы вы там не комбинировали с кучей условий или переходами по меткам - работать не будет
Alexandr0202, примете как данность: оператор delay() несовместим с быстрым опросом кнопок. Чтобы вы там не комбинировали с кучей условий или переходами по меткам - работать не будет
Понял, спасибо.
Ура, работает мой вариант! Я старый пень провод не на тот пин подключил.
Работает с паузой 0,05 секунды, меньше не пробовал, нет нужды.
А куда вы дели паузу в 5 сек во время которой опрос кнопок невозможен ? Ждете 5 сек и нажимаете ? Так то да , можно конечно.
Вы правы, жду 5 сек и нажимаю(так задумано). Раньше нужно было ждать пока функция отработает а сейчас в любое время срабатывает. Правда код не так красив и в длину раза в 3-4 вытянулся, зато простенько и понятненько.
Не должно оно было никуда вытянуться, что то намудоили там. А как вы делаете "если ничего не нажали определенное время, то зажигаем все три" ?
Вы правы, жду 5 сек и нажимаю(так задумано).
Александр, себя-то не обманывайте... никакой задержки 5 сек в исходном ТЗ не было - это вы теперь придумали по лени, чтобы не разбираться с рекомендованными вам примерами.
Ну да дело ваше, вы же в этой ветке учитесь...
Я 50 раз написал одно и тоже, что бы уменьшить время горения диода и увеличить частоту опроса кнопки.
Если раньше было так :
то теперь стало так :
т.е. раньше после 5 секунд был опрос входного пина, то во втором случае опрос происходит каждую секунду в течении 5 секунд. В дальнейшем ввел переменную в паузу и теперь меняю время одним вводом.
Все три зажигаются в конце программы если пропустили операторы if.
Вы правы, жду 5 сек и нажимаю(так задумано).
Александр, себя-то не обманывайте... никакой задержки 5 сек в исходном ТЗ не было - это вы теперь придумали по лени, чтобы не разбираться с рекомендованными вам примерами.
Ну да дело ваше, вы же в этой ветке учитесь...
Исходное ТЗ уже существенно продвинулось и образовала 2 проекта....
Исходное ТЗ уже существенно продвинулось и образовала 2 проекта....
да ну? :) вчера только спрашивали "как остановить цикл" - а теперь уже два проекта? :)))))
Я бы вам все-таки советовал разобраться в примере "блинк без делей". который вам уже раза три посоветовали. Он делает ровно то, чего вы пытаетесь добиться, размножая свои IF со все меньшими и меньшими задержками. Только делает он это в пять строк и реакция кнопок мгновенная
Я бы вам все-таки советовал разобраться в примере "блинк без делей". который вам уже раза три посоветовали. Он делает ровно то, чего вы пытаетесь добиться, размножая свои IF со все меньшими и меньшими задержками. Только делает он это в пять строк и реакция кнопок мгновенная
Собираюсь в ближайшее время, пусть мозг пока остынет.
Посмотрел в примерах, там нет входного пин-а просто мигает диод по присвоенной паузе, которая через тот же if работает.
главное -принцип отсчета времени без delay.
Ваша задача - внедрить этот принцип в свой код
Хорошая мысль... вообще, без учителя или помощника, который знает хоть немного, стартовать в программировании очень сложно. Для меня, это как учить китайски по словарю... что-то может и получится, вот только кода и что - вопрос.
главное -принцип отсчета времени без delay.
Ваша задача - внедрить этот принцип в свой код
Так там же millis используется он время задает и от него все отталкивается. Как этот принцип вписать в мой код я не могу даже вообразить, а что я не могу представить для меня не понятно. С delay я четко знаю что делает и где может работать, это как таймер в LD.
Хорошая мысль... вообще, без учителя или помощника, который знает хоть немного, стартовать в программировании очень сложно. Для меня, это как учить китайски по словарю... что-то может и получится, вот только кода и что - вопрос.
Очень точное сравнение.
Пожелание: надеюсь это единственная, первая и последняя программа в которой вы используете "goto" . Не вникайте сейчас по какой причине, просто поверьте. Для вас сейчас доступны только "for" и "if", пока вы не научитесь писать мелкие программы (кодовый замок, светофор и подобное) лучше ничего более не использовать, а если очень хочется - значит у вас ошибка в логике решения поставленной задачи.
Так там же millis используется он время задает и от него все отталкивается. Как этот принцип вписать в мой код я не могу даже вообразить, а что я не могу представить для меня не понятно.
Думайте, умение составлять алгоритмы, гораздо важнее чем уметь печатать в слепую
Пожелание: надеюсь это единственная, первая и последняя программа в которой вы используете "goto" . Не вникайте сейчас по какой причине, просто поверьте. Для вас сейчас доступны только "for" и "if", пока вы не научитесь писать мелкие программы (кодовый замок, светофор и подобное) лучше ничего более не использовать, а если очень хочется - значит у вас ошибка в логике решения поставленной задачи.
Брюс Ли говорил : Я не боюсь человека, отработавшего 1000 приемов один раз, я боюсь человека, отработавшего один прием 1000 раз.
Я не собираюсь быть профессиональным программистом Ардуино, я хочу освоить написания мелких программ, но так что бы не лазить каждый раз в книжки и на форумы.
Так там же millis используется он время задает и от него все отталкивается. Как этот принцип вписать в мой код я не могу даже вообразить, а что я не могу представить для меня не понятно. С delay я четко знаю что делает и где может работать, это как таймер в LD.
Поверьте, полчаса/час/три часа/сутки, потраченные на разбор этих пяти строчек, дадут Вам больше, чем десятки и сотни строчек кода, написанные Вами с Вашими нынешними познаниями.
Брюс Ли говорил : Я не боюсь человека, отработавшего 1000 приемов один раз, я боюсь человека, отработавшего один прием 1000 раз.
не рекомендую отрабатывать прием удара в пах и удар мизинцем по хвосту врага. Собственно вам потом бы все одно сказали много ласковых про goto . если оно будет это будущее.
еще раз - настоятельно рекомендую забыть про goto прямо сейчас, несколько позже забыть про delay но пока пробовать с ним.
Думайте, умение составлять алгоритмы, гораздо важнее чем уметь печатать в слепую
Мне не понятно, зачем программировать по времени если можно по условию в чем выгода?
еще раз - настоятельно рекомендую забыть про goto прямо сейчас, несколько позже забыть про delay но пока пробовать с ним.
В таком случае это нужно чем то заменить, а чем?
Мне не понятно, зачем программировать по времени если можно по условию в чем выгода?
еще раз - настоятельно рекомендую забыть про goto прямо сейчас, несколько позже забыть про delay но пока пробовать с ним.
В таком случае это нужно чем то заменить, а чем?
Если захотите это понять, могу повторить: попытайтесь в качестве учебной задачки сделать сформулированную в последнем предложении 38-го сообщения в этой теме - с двумя светодиодами.
Я не могу этого сделать.
обратите внимание на булевый тип данных, для вас это проще понять, удобно для создания флагов.
флаг - это некая переменная, что-то делаем пока она true в нужном месте ее делаем false используется вместе с if.
Нажил кнопку - true , что-то сделали или вышел таймер она false .
Я не могу этого сделать.
это пока не можете - знаний не хватает.
читайте полностью эту тему, она старая, в ней у автора явные проблемы с написанием алгоритма, как и у вас. В ней в кодах комментарии.
Датчик препятствий и серво(бесполезная коробка)
Если захотите это понять, могу повторить: попытайтесь в качестве учебной задачки сделать сформулированную в последнем предложении 38-го сообщения в этой теме - с двумя светодиодами.
Я не могу этого сделать.
Сколько Вам нужно времени, чтобы разобраться в пяти строчках? Даже если несколько дней (по дню на строчку) - оно того стоит.
Правильно. Потому, что Вы еще не разобрали, чем blink отличается от blink without delay.
Сколько Вам нужно времени, чтобы разобраться в пяти строчках? Даже если несколько дней (по дню на строчку) - оно того стоит.
Алгоритм работы blink мне понятен и на его примере я могу строить простые схемы и программы, blink without delay некоторые моменты не понятны, например где указано сколько светится и не светится диоду в этих строках?
Бред какой то, то есть время задано в начале программы а непосредственно включением ничто не руководит...
читайте полностью эту тему, она старая, в ней у автора явные проблемы с написанием алгоритма, как и у вас. В ней в кодах комментарии.
Датчик препятствий и серво(бесполезная коробка)
Для меня там слишком много переменных и прочих функций. Там человек опытный писал.
Бред какой то, то есть время задано в начале программы а непосредственно включением ничто не руководит...
Если бы две ключевые строки (те, что перед приведенными) не выкинули, то смысл был бы, а бреда не было.
Я не могу этого сделать.
Это неправильный настрой ))
Я 50 раз написал одно и тоже, что бы уменьшить время горения диода и увеличить частоту опроса кнопки.
Подозревал что то подобное :) Ваша мысль идет в обычном таком направлении, напишите и нормально в конце концов если еще время потратите на опыты.
Я не собираюсь быть профессиональным программистом Ардуино, я хочу освоить написания мелких программ, но так что бы не лазить каждый раз в книжки и на форумы.
Никуда вы не денетесь от этой темы, шаг влево шаг вправо и постоянно будете натыкаться, да и не так это сложно, как только в голове щелкнет - все станет понятно и просто. Надо перейти от линейного выполнения действий одного за другим к обработке событий. Ничего прям уж таки нового, вот нажатие кнопки у вас - это событие, по нему можно зажечь светодиод, но и включение 3х светодиодов - тоже событие, но его условие - это не нажатие кнопки, а 5 секунд от начала опроса, просто засекаете время начала и проверяете таким же if как у кнопок, только (время текущее - время начала) > 5000мс. На таком принципе делаете все действия и они начинает работать без delay, параллельно друг другу. Можете про конечные автоматы почитать, но лучше после того, как свой пример так сделаете - понятнее будет.
Я не собираюсь быть профессиональным программистом ... что бы не лазить каждый раз в книжки
В таком случае (если цель "не лазить в книжки") бросьте это дело и займите чем-нибудь другим. Потому как без лазания в книжки не обходятся никакие программисты - ни профессиональные, ни непрофессиональные.
Я не собираюсь быть профессиональным программистом ... что бы не лазить каждый раз в книжки
В таком случае (если цель "не лазить в книжки") бросьте это дело и займите чем-нибудь другим. Потому как без лазания в книжки не обходятся никакие программисты - ни профессиональные, ни непрофессиональные.
Я имел ввиду, что простейшие программы писать без книжки (как бы читать книжки без букваря).
Возник следующий вопрос: byte, int, long, float как определить какой тип данных применять в каждом конкретном случае? Я понимаю что это объем данных но как высчитать какой нужен. Например здесь почему применен long, как определили что нужно именно long а не например int?
Возник следующий вопрос: byte, int, long, float как определить какой тип данных применять в каждом конкретном случае?
Определять исходя из того, что именно и какого размера ты собираешься хранить в переменных. Описание каждого типа данных содержится в умных книжках или статьях по С/С++
Например здесь почему применен long, как определили что нужно именно long а не например int?
unsigned long previousMillis = 0; - Определили из описания функции millis(), которая возвращает long.
const long interval = 1000; - А здесь long выбран неверно. Исходя из размера константы достаточно int.
unsigned long previousMillis = 0; - Определили из описания функции millis(), которая возвращает long.
А как определили, где написано, что функция millis может занимать от 2147383647 до -2147383648 ?
А как определили, где написано, что функция millis может занимать от 2147383647 до -2147383648 ?
Операции умножения/деления знаете?
Так почему не хотите воспользоваться своими знаниями?
Вот в качестве упражнения посчитайте, сколько времени пройдет до переполнения переменных типа long и типа int, если каждая из них изменяется 1000 раз в секунду?
PS. Кстати. в вашем утверждении ошибка. Сами найдете или подсказать?
А как определили, где написано, что функция millis может занимать от 2147383647 до -2147383648 ?
Функция millis() возвращает не long, a unsigned long (в сообщении #92 я ошибся). Это разные типы данных, поэтому функция возвращает другие значения.
Как определили тип данных: например открываем и смотрим файл wiring.c в папке c Arduino IDE. Либо гуглим и попадаем на сайт arduino.cc со справочной информацией.
А как определили, где написано, что функция millis может занимать от 2147383647 до -2147383648 ?
Операции умножения/деления знаете?
Так почему не хотите воспользоваться своими знаниями?
Вот в качестве упражнения посчитайте, сколько времени пройдет до переполнения переменных типа long и типа int, если каждая из них изменяется 1000 раз в секунду?
PS. Кстати. в вашем утверждении ошибка. Сами найдете или подсказать?
Арифметика была на 5 о вот с алгеброй только 3(трудно а + b было складывать).
int наверное за 65,535 сек. long за 4 294 767,295 сек ?
Подсказать!
С цифрами вроде понятно, а как определили что int хватит для LOW в этой строчке?
Больше того, хватит и байта и даже бита. Можно в одном байте сохранить восемь разных LedState. А в int вообще 16. Использовать int для хранения одного статуса это форменное расточительство.
А почему тогда используют int? Причем в учебниках в примерах и в самой программе.
Вот в качестве упражнения посчитайте, сколько времени пройдет до переполнения переменных типа long и типа int, если каждая из них изменяется 1000 раз в секунду?
А почему 1000 раз в секунду? Это быстродействие процессора (частота Atmega)?