изменять значение delay кнопками

Viktorrr
Offline
Зарегистрирован: 07.12.2013

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

void setup() {               
pinMode(3, OUTPUT);    
}
void loop() {
digitalWrite(3, HIGH);   
delay(1);              
digitalWrite(3, LOW);    
delay(1);              
}

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

 здесь чтобы изменять значение delayMicroseconds с шагом 10 от 0 до 1000000 ? реально такое? а то может я зря только ищу :)

void setup() {               
pinMode(8, OUTPUT);
}
void loop()  {
digitalWrite(8, HIGH);
delayMicroseconds(100000);
digitalWrite(8, LOW);  
delayMicroseconds(100000);      
}

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

реально. не зря ищете.

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no... читали?

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

А в чем проблема зауинуть значение задержки в переменую?

mixail844
Offline
Зарегистрирован: 30.04.2012

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

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

com пишет:

реально. не зря ищете.

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no... читали?


По поводу Второй картинки в статье у меня возник вопрос, а при замыкании кнопки 5вольт придет на порт контроллера, он сам ток ограничит, или все таки надо резистор еще добавить?

Viktorrr
Offline
Зарегистрирован: 07.12.2013

>

Viktorrr
Offline
Зарегистрирован: 07.12.2013

mixail844 пишет:

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

а как надо правильно?

mixail844
Offline
Зарегистрирован: 30.04.2012

Viktorrr пишет:

mixail844 пишет:

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

а как надо правильно?

через прерывания

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

mixail844 пишет:

Viktorrr пишет:

mixail844 пишет:

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

а как надо правильно?

через прерывания


Прерывания это не совсем то что надо автору.

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

mixail844 пишет:

Viktorrr пишет:

mixail844 пишет:

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

а как надо правильно?

через прерывания


Прерывания это не совсем то что надо автору.

Viktorrr
Offline
Зарегистрирован: 07.12.2013

а можно готовый пример показать, а то только запутался :)

Geronimo
Offline
Зарегистрирован: 06.05.2013
//delay time
int delTm = 1*1000;
//last event
long last;

//led state 
byte ledSt = 1;
void setup() {               
pinMode(8, OUTPUT);
pinMode(9,INPUT);
pinMode(10,INPUT);
last = millis();
}
void loop()  {
// increase delay pressed
if(digitalRead(9))
{
 delTm+=1000;
}
//decrease delay pressed. check that we don't fall through zero
if(digitalRead(10) & delTm >= 1000)
{
delTm-=1000;
}

//distance between last trigger and current time greater then delay
if(millis()-last > delTM)
{
  ledSt = !ledSt; // trigger state
  last = millis(); // update time
}

digitalWrite(ledSt);
}

Примерно так, только надо добавить еще защиту от дребезга

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

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

 

Viktorrr
Offline
Зарегистрирован: 07.12.2013

Geronimo

чёта вот в этой строке не так или я может подтупливаю

if(millis()-last > delTM)

com пишет:

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

 

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

Viktorrr
Offline
Зарегистрирован: 07.12.2013

пишет вот такую бороду

sketch_apr22a.ino: In function 'void loop()':
sketch_apr22a:27: error: 'delTM' was not declared in this scope
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Arduino.h:99: error: too few arguments to function 'void digitalWrite(uint8_t, uint8_t)'
sketch_apr22a:33: error: at this point in file

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

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

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

> 'delTM' was not declared in this scope
>
 too few arguments to function 'void digitalWrite(uint8_t, uint8_t)

Для начала переведите эти сообщения об ошибках.

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

 

Viktorrr
Offline
Зарегистрирован: 07.12.2013

ну ничего не остается , придется всё сначала :(

 

а можно исправить как должно быть а я потом сам?

а ещё лучше исправить и сказать что не так :)

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

я с телефона писал, клава м большой сделала
Ну и в дигиталВрайт забыл указать первым параметром номер пина с диодом

Viktorrr
Offline
Зарегистрирован: 07.12.2013

Geronimo пишет:
я с телефона писал, клава м большой сделала Ну и в дигиталВрайт забыл указать первым параметром номер пина с диодом

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

спасиб  тебе добрый человек ) ещё не опробовал

//delay time
int delTm = 1*1000;
//last event
long last;

//led state
byte ledSt = 1;
void setup() {               
pinMode(8, OUTPUT);
pinMode(9,INPUT);
pinMode(10,INPUT);
last = millis();
}
void loop()  {
// increase delay pressed
if(digitalRead(9))
{
 delTm+=1000;
}
//decrease delay pressed. check that we don't fall through zero
if(digitalRead(10) & delTm >= 1000)
{
delTm-=1000;
}

//distance between last trigger and current time greater then delay
if(millis()-last > delTm)
{
  ledSt = !ledSt; // trigger state
  last = millis(); // update time
}

digitalWrite(8,ledSt);
}

 

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

Viktorrr пишет:

ну ничего не остается , придется всё сначала :(

 

а можно исправить как должно быть а я потом сам?

а ещё лучше исправить и сказать что не так :)


Компилятор сказал что не так

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

Вставка программного кода в тему/комментарий

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

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

Viktorrr пишет:

спасиб  тебе добрый человек ) ещё не опробовал

не надо пробовать, надо с логикой разобраться

будет работать только до первого нажатия кнопки увеличения

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

com пишет:

Viktorrr пишет:

спасиб  тебе добрый человек ) ещё не опробовал

не надо пробовать, надо с логикой разобраться

будет работать только до первого нажатия кнопки увеличения

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

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

> надо делей поставить.

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

Я вам уже намекал что чтение прикрепленных веток сеет разумное доброе вечное :)  (вижу, что поправили вставку своего кода, спасибо). Посмотрите внимательно. Там есть еще одна тема. Про кнопки. Там рассказывают как без delay() все это сделать.

Viktorrr
Offline
Зарегистрирован: 07.12.2013

да, нихрена не работаеть :)

буду читать сам, деваться некуда

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

Да не психуйте. "Нихрена не работает" это 80% времени нормального процесса разработки. 

>буду читать сам, деваться некуда

Само собой. От этого никуда не денешься.

А вообще "Нихрена не работает" - это метод. Метод - это показывать свой код. Иначе как мы узнает куда вас занес процесс размышлений/чтений?

А код из #19 - он довольно близок к правде.

Смотрите что вам нужно сделать, что-бы обойтись без delay(). Вам нужно, когда кнопка была нажата не только поменять интервал мигания (переменную delTm), но еще и запомнить время "когда кнопка была нажата".

А потом, в условии где вы проверяете "нажата-ли кнопка", добавить еще и проверку "прошло ли достаточно времени с прошлого нажатия". Скажем 0.5 сек. Если "не прошло", то ничего с delTm делать не нужно.

Как "запомнить время события" и "проверить сколько прошло времени" вы можете подсмотреть чуть ниже. Там мы переключаем состояние светика (переменная ledState), и запоминаем когда это сделали c помщью millis(). И все это обернуто if-фом, который проверяет "прошло ли достаточно времени с прошлого переключения".

Viktorrr
Offline
Зарегистрирован: 07.12.2013

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

по поводу, прошло время, ещё не понел :)  переключаем состояние светика тоже чета непонятно.

короче читаю )

а будет ли разница от того, к аналоговому входу подключена кнопка или к цифровому? и не страшно ли если подтягивающий резистор будет 9.2 килоома?

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

>а будет ли разница от того, к аналоговому входу подключена кнопка или к цифровому?

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

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Если вы сказали что пин аналоговый- значит аналоговый.

Если сказали что цифровой- значит цифровой.

Вам решать.

Да хоть 1 Ом, если ваша кнопка 5 Ампер скоммутирует и блок питания эти 5 Ампер выдаст.

Viktorrr
Offline
Зарегистрирован: 07.12.2013

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