Удерживание кнопки, помогите чучуть
- Войдите на сайт для отправки комментариев
Чт, 05/09/2013 - 13:43
Имеется ArduinoUNO к нему подключена резистивные кнопки автомобиля для управления музыкой и круизом по схеме

Вроде бы со всем разобрался но мне необходима одна функция, которая при удерживании кнопки у которой диапазон значений от 830 до 890 включала 7 и 8 пин по очереди т.е удерживаем сигнал появляется в 8 пину, в 7 пропадает, удерживаем сиигнал появляется в 7 пину, в 8 пропадает и так по кругу. и при этом во время удерживания не появлялся сигнал на 9 пину так как она будет ставить музыку на паузу, она должна работать тока при кратковременных нажатиях.
вот скетч
int rulevieKnopki=0;
int CruisControl=0;
void setup()
{
Serial.begin(9600);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
}
void loop()
{
rulevieKnopki=analogRead(14);//считываем сигнал с пина АЦП
CruisControl=analogRead(15);//считываем сигнал с пина АЦП
//переключатель
if(rulevieKnopki>830&&rulevieKnopki<890)digitalWrite(7, HIGH);
else digitalWrite (7, LOW);
if(rulevieKnopki>830&&rulevieKnopki<890)digitalWrite(8, HIGH);
else digitalWrite (8, LOW);
//управление магнитолой
if(rulevieKnopki>500&&rulevieKnopki<650)digitalWrite(8, HIGH);
else digitalWrite (8, LOW);
if(rulevieKnopki>830&&rulevieKnopki<890)digitalWrite(9, HIGH);
else digitalWrite (9, LOW);
if(rulevieKnopki>895&&rulevieKnopki<950)digitalWrite(10, HIGH);
else digitalWrite (10, LOW);
if(rulevieKnopki>952&&rulevieKnopki<1000)digitalWrite(11, HIGH);
else digitalWrite (11, LOW);
if(rulevieKnopki>1001&&rulevieKnopki<1024)digitalWrite(12, HIGH);
else digitalWrite (12, LOW);
//управление круиз контролем
if(CruisControl>300&&CruisControl<420)digitalWrite(5, HIGH);
else digitalWrite (5, LOW);
if(CruisControl>450&&CruisControl<550)digitalWrite(4, HIGH);
else digitalWrite (4, LOW);
if(CruisControl>900&&CruisControl<1024)digitalWrite(3, HIGH);
else digitalWrite (3, LOW);
Serial.println(analogRead(14));
// Serial.println(analogRead(15));
}
Почитайте http://arduino.ru/Reference/Millis.
Имеется ArduinoUNO к нему подключена резистивные кнопки автомобиля для управления музыкой и круизом по схеме
...мне необходима одна функция, которая при удерживании кнопки...
Вы схему наверное взяли из темы "Работа с кнопками. В помощь новичку.",
в ней же есть примеры кода при удержании кнопки...
если использовать один из примеров..., то наверное код при удержании кнопки можно написать так:
long previousMillis = 0; int val=0; void setup() { ............ } void loop() { .......................... if(rulevieKnopki>830&&rulevieKnopki<890) { if (millis() -previousMillis >500) { previousMillis = millis(); val++; } } else { val=0; } if(val>=10) { digitalWrite(7,!digitalRead(7)); //инвертируем состояние пина 7 { if(digitalRead(7)==HIGH) { digitalWrite(8, LOW); } else { digitalWrite(8, HIGH); } val=0; } } else if(val>=1) { digitalWrite(9,!digitalRead(9)); //инвертируем состояние пина 9 val=0; }Спсибо что откликнулись!!!
Порадовало выражение "Нагрузки там никакой нет это просто кнопка" ))
Не понятно что именно он у вас переключает.. Питание? или на пине OUT логика какая-то с управления идет?
Доброго времени суток !
Как Вы хотите отсчитывать время нажатия ? можно одним из аппаратных таймеров, можно просто счетом вызовов loop(). В виду того что точность длительности удержания сводить к микросекундам нет необходимости, я бы просто в loop() добавил счетчик и в глобальные переменные - переменную счета. При нажатии выставляется переменная счета в 65535 и каждый вызов loop() вычитать по 1 до 0. При отпуске кнопки останавливать счет, усли разница между исходным значением и конечным достаточно велика - выставить флаг. При чтении состояния флага, флаг сбрасывается.
Вот сегодня доделал и схему и скетчь подправил теперь я думаю будет ясно что мне нужно, спасибо если ктото поможет.
int rulevieKnopki=0; int cruisecontrol = 0; boolean nexus =LOW; boolean ledOn= false; void setup() { Serial.begin(9600); pinMode(3, OUTPUT); // >>> для (pioner и android) pinMode(4, OUTPUT); // <<< для (pioner и android) pinMode(5, OUTPUT); //Mute (для Pioner), play psuse (для nexus7) pinMode(11, OUTPUT); //увеличеное громкости pioner pinMode(12, OUTPUT); //уменьшение громкости pioner //переключатель рулевых кнопок, андроид или пионер, //кнопки (<<<, >>>, play pause для nexus7) (<<<,>>>, mute для pioner) pinMode(6, OUTPUT); // включение кнопок на nexus 7 pinMode(7, OUTPUT); // включение кнопок на pioner //кнопки круиз контроля pinMode(8, OUTPUT); //UP pinMode(9, OUTPUT); //reset pinMode(10, OUTPUT); //auto } void loop() { rulevieKnopki=analogRead(14);//считываем значение резитивных кнопок мультимедия, 5-ть кнопок cruisecontrol=analogRead(15); // считываем значение резистивных кнопок круиз контроля, 3-и кнопки //////////////////////////// //ПЕРЕКЛЮЧАТЕЛЬ УПРАВЛЕНИЯ// //////////////////////////// ///Переключатель Андроид или pioner (т.е один всегда включен, при удержании один тухнет другой включаеться) // при удерживании кнопки в диапазоне от 830 до 890 в течении 2х сек if(rulevieKnopki>830&&rulevieKnopki<890)digitalWrite(6, HIGH); else digitalWrite (6, LOW); if(rulevieKnopki>830&&rulevieKnopki<890)digitalWrite(6, LOW); else digitalWrite (7, HIGH); ////////////////////////////// //УПРАВЛЕНИЕ PIONER И NEXUS7// ////////////////////////////// // >>> для (pioner и android) if(rulevieKnopki>500&&rulevieKnopki<600)digitalWrite(3, HIGH); else digitalWrite (3, LOW); // <<< для (pioner и android) if(rulevieKnopki>895&&rulevieKnopki<950)digitalWrite(4, HIGH); else digitalWrite (4, LOW); // (Mute (для Pioner), play psuse (для nexus7)) // if(rulevieKnopki>830&&rulevieKnopki<890)digitalWrite(5, HIGH); else digitalWrite (5, LOW); //увеличеное громкости pioner if(rulevieKnopki>950&&rulevieKnopki<1012)digitalWrite(11, HIGH); else digitalWrite (11, LOW); //уменьшение громкости pioner if(rulevieKnopki>1013&&rulevieKnopki<1024)digitalWrite(12, HIGH); else digitalWrite (12, LOW); ////////////////////// //Управление круизом// ////////////////////// //кнопка AUTO круиз контроль if(cruisecontrol>250&&cruisecontrol<420)digitalWrite(10, HIGH); else digitalWrite (10, LOW); //Кнопка reset круиз контроль if(cruisecontrol>440&&cruisecontrol<650)digitalWrite(9, HIGH); else digitalWrite (9, LOW); //Кнопка UP круиз контроль if(cruisecontrol>750&&cruisecontrol<1024)digitalWrite(8, HIGH); else digitalWrite (8, LOW); }Вот код считывания кнопок :
unsigned char keyBut; // нажатая кнопка или 0 старший бит - флаг нажатия unsigned int count,stopCount; void setup() { ///// это добавь в свой setup keyBut = 0; count = stopCount = 0; analogReference(DEFAULT); } void readAnalogKey(ain) { int i1; byte b1; if (keyBut & 127) if (count) count--; i1 = analogRead(ain); b1 = 0; i1 -= 250; // стартовое значение while(i1 ^ 32768) { i1 -= 200; // 200 - интервал каждой кнопки // подбери резисторы или нужные значения b1++; } if (b1 != (keyBut & 127)) { keyBut = b1 + 128; if (keyBut & 127) count = 65535; else stopCount = count; } }ain - аналоговый ввод
в keyBut код нажатой клавиши и флаг нажатия.
stopCount = длительности нажатия.
PS: отвлеченный вопрос а автомобиль случайно не субару ?
Нет шевроле, но подойдёт такая схема для любой тачилы))) единственное значение сопротивлений поменять и всё.
int rulevieKnopki=0; int cruisecontrol = 0; boolean nexus =LOW; boolean pioner =HIGH; boolean play=false; boolean first=true; long previousMillis = 0; int val=0; void setup() { Serial.begin(9600); pinMode(3, OUTPUT); // >>> для (pioner и android) pinMode(4, OUTPUT); // <<< для (pioner и android) pinMode(5, OUTPUT); //Mute (для Pioner), play psuse (для nexus7) pinMode(11, OUTPUT); //увеличеное громкости pioner pinMode(12, OUTPUT); //уменьшение громкости pioner //переключатель рулевых кнопок, андроид или пионер, //кнопки (<<<, >>>, play pause для nexus7) (<<<,>>>, mute для pioner) pinMode(6, OUTPUT); // включение кнопок на nexus 7 pinMode(7, OUTPUT); // включение кнопок на pioner //кнопки круиз контроля pinMode(8, OUTPUT); //UP pinMode(9, OUTPUT); //reset pinMode(10, OUTPUT); //auto } void loop() { rulevieKnopki=analogRead(14);//считываем значение резитивных кнопок мультимедия, 5-ть кнопок cruisecontrol=analogRead(15); // считываем значение резистивных кнопок круиз контроля, 3-и кнопки //////////////////////////// //ПЕРЕКЛЮЧАТЕЛЬ УПРАВЛЕНИЯ// //////////////////////////// ///Переключатель Андроид или pioner (т.е один всегда включен, при удержании один тухнет другой включаеться) // при удерживании кнопки в диапазоне от 830 до 890 в течении 2х сек digitalWrite(6,nexus); digitalWrite(7,pioner); if(rulevieKnopki>830&&rulevieKnopki<890) { if (millis() - previousMillis >500) { previousMillis = millis(); val++; } } else { val=0; } if(rulevieKnopki>830&&rulevieKnopki<890)digitalWrite(5, HIGH); else digitalWrite (5, LOW); if(val>=5) { nexus=!nexus; pioner=!pioner; val=0; } ////////////////////////////// //УПРАВЛЕНИЕ PIONER И NEXUS7// ////////////////////////////// // >>> для (pioner и android) if(rulevieKnopki>500&&rulevieKnopki<600)digitalWrite(3, HIGH); else digitalWrite (3, LOW); // <<< для (pioner и android) if(rulevieKnopki>895&&rulevieKnopki<950)digitalWrite(4, HIGH); else digitalWrite (4, LOW); // (Mute (для Pioner), play psuse (для nexus7)) // //увеличеное громкости pioner if(rulevieKnopki>950&&rulevieKnopki<1012)digitalWrite(11, HIGH); else digitalWrite (11, LOW); //уменьшение громкости pioner if(rulevieKnopki>1013&&rulevieKnopki<1024)digitalWrite(12, HIGH); else digitalWrite (12, LOW); ////////////////////// //Управление круизом// ////////////////////// //кнопка AUTO круиз контроль if(cruisecontrol>250&&cruisecontrol<420)digitalWrite(10, HIGH); else digitalWrite (10, LOW); //Кнопка reset круиз контроль if(cruisecontrol>440&&cruisecontrol<650)digitalWrite(9, HIGH); else digitalWrite (9, LOW); //Кнопка UP круиз контроль if(cruisecontrol>750&&cruisecontrol<1024)digitalWrite(8, HIGH); else digitalWrite (8, LOW); }Переключатель сделал, теперь надо сделать так чтобы 5-й пин не включался при удерживании кнопки.