#1 2017-10-11 00:34:13

ForestCrow
Участник
Зарегистрирован: 2017-02-08
Сообщений: 15

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

Затея какая: от нажатия кнопки должен загореться один светодиод. По истечении 10 секунд первый светодиод должен погаснуть, а второй зажечься тоже на 10 секунд. При этом всем, нужно при нажатии второй кнопки весь этот процес прервать и вернуться в основную программу. Вот взял чужой скетч и на его основе пытаюсь реализовать. Второй LED либо совсем не зажигается, либо зажигается автоматически. Может другой подход к реализации должен быть, не через milles() ?

const int button1Pin = 5;
const int button2Pin = 3;
const int led1Pin = 13;
const int led2Pin =4 ;
unsigned long led1OnTime;
unsigned long led2OnTime;
//bool led1On;                             //Изначально было влючены везде эти переменные, но я их отключил и разницы в работе не увидел.
//bool led2On;

void setup() {                              /////////SETUP/////////
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(button1Pin, INPUT);
pinMode(button2Pin, INPUT);
//led1On = false;
//led2On = false;
}
                                       
void loop(){                                 /////////LOOP/////////

if (digitalRead(button1Pin) == HIGH) {       //Кнопка1 нажата, лед включен, статус вкл,
digitalWrite(led1Pin, HIGH);
//led1On = true;
led1OnTime = millis();
}

if (digitalRead(button2Pin) == HIGH) {       //Кнопка2 нажата, лед включен, статус вкл,
digitalWrite(led2Pin, HIGH);
//led2On = true;
led2OnTime = millis();   
}

//if(led1On)
if(millis() - led1OnTime > 10000) {
digitalWrite(led1Pin, LOW);
//led1On = false;

}

//if(led2On)
if(millis() - led2OnTime > 10000) {   
digitalWrite(led2Pin, LOW);
//led2On = false;
}
}

Редактировался ForestCrow (2017-10-11 01:08:45)

#2 2017-10-11 06:35:35

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

ForestCrow пишет:

Затея какая: от нажатия кнопки должен загореться один светодиод. По истечении 10 секунд первый светодиод должен погаснуть, а второй зажечься тоже на 10 секунд. При этом всем, нужно при нажатии второй кнопки весь этот процес прервать и вернуться в основную программу. Вот взял чужой скетч и на его основе пытаюсь реализовать. Второй LED либо совсем не зажигается, либо зажигается автоматически. Может другой подход к реализации должен быть, не через milles() ?

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

Редактировался Вячеслав Азаров (2017-10-11 06:36:00)

#3 2017-10-11 10:36:48

ForestCrow
Участник
Зарегистрирован: 2017-02-08
Сообщений: 15

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

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

P.S.

Я не программер, я самоучка, что в компьютерной тематике, что в программировании ардуины. С компьютерами я больше 15 лет работаю и было у кого спросить, то в программировании даже посоветоваться, кроме форума не с кем.  Хотя есть мысли пойти на курсы программирования и этим зарабатывать на жизнь, но это пока мысли, сейчас я битву с ардуиной проигрываю(.

#4 2017-10-11 10:59:03

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 280

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

Да простит меня, Вячеслав Азаров)

void loop(){                                 /////////LOOP/////////

if (digitalRead(button1Pin) == HIGH) {       //Кнопка1 нажата, лед включен, статус вкл,
digitalWrite(led1Pin, HIGH);
led1OnTime = millis();
}

if(led1OnTime && millis() - led1OnTime > 10000) {
digitalWrite(led1Pin, LOW);
led1OnTime = 0;
digitalWrite(led2Pin, HIGH);
led2OnTime = millis();   
}

if(led2OnTime && millis() - led2OnTime > 10000) {   
digitalWrite(led2Pin, LOW);
led2OnTime = 0;
}

if (digitalRead(button2Pin) == HIGH) {
digitalWrite(led1Pin, LOW);
led1OnTime = 0;
digitalWrite(led2Pin, LOW);
led2OnTime = 0;
}

}

Пиво?

#5 2017-10-11 12:08:35

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

Green пишет:

Да простит меня, Вячеслав Азаров)

Бог вас простит. Водка!

void loop(void) 
{
	switch (state)
	{
		LEDS_RESET: if (key_pressed(1))
				{
					led_on(1);
					state = LED1_ALIGHT;
					start_timer(10);
				} 
		break;
		LED1_ALIGHT: if (key_pressed(2))
				{ 
					state = LEDS_RESET;
					led_off(1);
				}
				else 
				if (time_elapsed())
				{
					led_off(1); led_on(2);
					state = LED2_ALIGHT;
					start_timer(10);
				}
		break;
		LED2_ALIGHT: if (key_pressed(2) || time_elapsed())
				{
					state = LEDS_RESET;
					led_off(2);
				}
		break;
		default: for(;;);
	}
}

Редактировался Вячеслав Азаров (2017-10-11 15:23:40)

#6 2017-10-11 12:17:44

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 280

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

) Осталось выбить у Лесной Вороны. Только, похоже, что там даже спасибо не дождёшься.((

#7 2017-10-11 12:27:10

ForestCrow
Участник
Зарегистрирован: 2017-02-08
Сообщений: 15

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

Уважаемый, GREEN! Я пробовал подобным способом, но у меня не получилось. Пока, что код не работает. Горит 13, при нажатии, гаснет. У меня сейчас клиент по компу, закончу посмотрю скеч, может я что то нахомутал не так. А за отзыв на пой призыв о помощи ОГРОМНОЕ СПАСИБО. А как заработает без проблем с меня пивасик)). Я обязательно отпишусь сегодня.

#8 2017-10-11 12:33:09

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 280

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

Ну надо же! Беру свои слова обратно.)
А пивасик пож. Вячеславу Азарову. А лучше водка!)

#9 2017-10-11 12:39:47

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

Green пишет:

Ну надо же! Беру свои слова обратно.)
А пивасик пож. Вячеславу Азарову. А лучше водка!)

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

#10 2017-10-11 13:32:33

ForestCrow
Участник
Зарегистрирован: 2017-02-08
Сообщений: 15

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

Уважаемый, GREEN! Вроде код работает, это я начал переводить кнопки с резисторов на INPUT_PULLUP. Но печему то отрабатывает по 15 секунд вместо 10. Опять таки пока посмотрел поверхностно.

#11 2017-10-12 20:48:04

ForestCrow
Участник
Зарегистрирован: 2017-02-08
Сообщений: 15

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

GREEN, огромное спасибо! Код работает, на его основе вроде разобрался с таймером этого типа, уже пишу сам, не подсматривая в подсказки)). Переписал его под конкретные нужны: в место леда бузер, а потом сирена. Запуск с концевика.
Теперь столкнулся с другой проблемой: нужна звук с пьезоизлучателя разных тонов в цикле, с возможностью его отключить. Не проблема его запустить чем то типа кнопка и несколько раз скопировать код, но хочу поставить эту часть кода вызывать как функцию, но не понимаю как при вызове функции, она стартовала. Как сделать в виде функции знаю.

#define button1Pin 5        
#define BUZZER 2
unsigned long interv;

void setup() {                              /////////SETUP/////////

pinMode(button1Pin, INPUT_PULLUP);
}
                                        
void loop(){                                 /////////LOOP/////////
boolean button_1 = !digitalRead(button1Pin);


if (button_1 == HIGH) {
  tone(BUZZER,600,500);
interv = millis();  
}

if(interv&&millis() - interv > 500) {
interv = 0;
tone(BUZZER, 300,500);
interv = millis();
}

if(interv&&millis() - interv > 500) {
interv = 0;
tone(BUZZER, 300);
interv = millis();
}

}

Редактировался ForestCrow (2017-10-12 20:56:32)

#12 2017-10-12 20:53:58

ForestCrow
Участник
Зарегистрирован: 2017-02-08
Сообщений: 15

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

Код Вячеслав Азарова интересный, но я его пока не понимаю. Оператор switch еще не использовал, но хочу освоить.

#13 2017-10-12 21:09:15

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

ForestCrow пишет:

Код Вячеслав Азарова интересный, но я его пока не понимаю. Оператор switch еще не использовал, но хочу освоить.

Это не код, готовый к закрузке и исполнению на Ардуино. Это программа алгоритма машины состояний вашей затеи. Константы и функции которой вам необходимо описать самостоятельно, в соответствии со смыслом вытекющим из их названий и вашей конфигурации аппаратуры. Попробуйте разобраться и доделать ее самостоятельно.

Редактировался Вячеслав Азаров (2017-10-12 21:14:11)

#14 2017-10-12 21:14:03

ForestCrow
Участник
Зарегистрирован: 2017-02-08
Сообщений: 15

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

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

Редактировался ForestCrow (2017-10-12 21:15:33)

#15 2017-10-13 09:20:33

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 280

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

Я всегда говорю что один из вариантов научиться - это посмотреть как твою задачу решают другие. Пусть даже за деньги/пиво/водку...)
Вячеслав Азаров, а я обычно пишу типа next(state), дабы не придумывать метки для каждого (следующего) состояния автомата, особенно когда их много.)

#16 2017-10-13 10:48:20

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

Green пишет:

Я всегда говорю что один из вариантов научиться - это посмотреть как твою задачу решают другие. Пусть даже за деньги/пиво/водку...)
Вячеслав Азаров, а я обычно пишу типа next(state), дабы не придумывать метки для каждого (следующего) состояния автомата, особенно когда их много.)

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

Редактировался Вячеслав Азаров (2017-10-13 10:55:35)

#17 2017-10-13 11:05:15

ForestCrow
Участник
Зарегистрирован: 2017-02-08
Сообщений: 15

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

Так с бузером мне смогут показать как выйти из ситуации? Тупо не могу запустить автоцикл. Есть еще мысль постоянно инвертировать состояние/флаг, наверное заработает, но мне кажется это будет некорректный код.  Может именно по этой теме есть у кого-то литература, статья?

#18 2017-10-13 14:07:48

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

ForestCrow пишет:

Так с бузером мне смогут показать как выйти из ситуации? Тупо не могу запустить автоцикл. Есть еще мысль постоянно инвертировать состояние/флаг, наверное заработает, но мне кажется это будет некорректный код.  Может именно по этой теме есть у кого-то литература, статья?

Так же как и со светодиодиками. Нужно хоть немного напрячь мозги. А литературы такой, как вы хотите, скорее всего, нет. Читайте учебники по методам программирования, документацию по языку C/C++ и исходные тексты библиотек Ардуино, и разберетесь.

Редактировался Вячеслав Азаров (2017-10-13 14:28:49)

#19 2017-10-14 13:14:18

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 280

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

Вячеслав Азаров пишет:

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

Согласен. Но я ленивый (как и все мы). Поэтому, зачем делать лишние телодвижения? Вопрос риторический.)

#20 2017-10-14 13:47:17

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

Green пишет:
Вячеслав Азаров пишет:

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

Согласен. Но я ленивый (как и все мы). Поэтому, зачем делать лишние телодвижения? Вопрос риторический.)

Можно, вообще, все объекты пронумеровать. Будет экстремально ленивое программирование. А можно, просто, ничего не делать, все равно это никому больше не нужно. Гусята нужны, а микроконтроллеры нет.  smile

#21 2017-10-14 13:47:35

ForestCrow
Участник
Зарегистрирован: 2017-02-08
Сообщений: 15

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

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

#22 2017-10-14 13:50:03

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

ForestCrow пишет:

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

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

#23 2017-10-14 13:58:31

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 280

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

А что делать! Это жИзнь!
- Вы знаете, что такое гусь?
- Знаю.
- Вы знаете, что такое шейка, ножка, крылышко! Вы знаете, как я люблю гуся!
))

#24 2017-10-14 14:01:01

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 280

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

Вячеслав Азаров пишет:

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

А зелёному пиво - как слону дробина!)))

Редактировался Green (2017-10-14 14:01:33)

#25 2017-10-14 14:11:14

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: Вроде с таймерами разобрался, но никак не могу реализовать задуманное.

Green пишет:

А что делать! Это жИзнь!
- Вы знаете, что такое гусь?
- Знаю.
- Вы знаете, что такое шейка, ножка, крылышко! Вы знаете, как я люблю гуся!
))

Да, вы правы, жизнь это поедание одних существ другими. Но, что бы съесть гуся его нужно пол года кормить!

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела