Последовательное нажатие кнопки.
- Войдите на сайт для отправки комментариев
Пт, 19/08/2011 - 12:20
Подскажите как должен выглядеть код ддя такого действия:
Нажатие кнопки первый раз выполняется одно действие,
Следующее нажатие(2), выполняеться другое действие,
Следующее нажатие(3), выполняеться другое действие,
Следующее нажатие(4), выполняеться другое действие,
и потом заново.
легко. Желательно через прерывание, потом
делается так при нажатии на кнопку в глобальной переменной +1, а дальше case() с выбором функций и когда эта глобальная переменная достигает нужной цифры допустим 4 то этой переменной присваиваем 0 и так по кругу
int i = 0; int k = 0; int val = 0; int state = 0; int old_val = 0; void setup() { Serial.begin(9600); pinMode(9, OUTPUT); pinMode(13, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(6, OUTPUT); pinMode(7, INPUT); } void loop(){ digitalWrite(13, HIGH); val = digitalRead(7); if ((val == HIGH) && (old_val == LOW)){ state = 1 - state; k++; delay(10); } old_val = val; // val is now old, let's store it if (state == 1) { digitalWrite(6, HIGH); // turn LED ON } else { digitalWrite(6, LOW); } //здесь все выполняеться корректно switch (k) { case 0: digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(11, LOW); case 1: digitalWrite(10, LOW); digitalWrite(9, HIGH); digitalWrite(11, LOW); break; case 2: digitalWrite(10, HIGH); digitalWrite(11, LOW); digitalWrite(9, LOW); break; case 3: digitalWrite(11, HIGH); digitalWrite(10, LOW); digitalWrite(9, LOW); break; case 4: digitalWrite(9, HIGH); digitalWrite(11, HIGH); digitalWrite(10, LOW); delay(50); digitalWrite(11, LOW); break; default: k=0; break; } // все бы хорошо.. но когда выполняеться 1 раз, все шикарно. Но когда по второму кругу идет то не смотря на то что в case 0 все пины выключены. горит аналогично case 1. case 2 выполняесться уже нормально. Serial.print("Knopka= " ); Serial.print(k); Serial.println(""); digitalWrite(13, LOW); delay(50); }что не так?
нужно сюда вклеить код антидребезга кнопки.
все, нашел ошибку))
я пропустил
break;
исправил и все пашет)
спасибо)
Adessit, а почему желательно через прерывание?
Потому что когда делаешь с прерыванием то:
-по нажатию кнопки программа останавливается и делает нужную функцию;
-не надо ждать и делать лишнюю работу МК пока код в новом цикле программы дойдёт до пункта проверки нажатия клавиши.
-делается всё просто и легко, боятся нечего, зато в длительно работающих программах с большими задержками и прочими тягомотинами это самый лучший способ использовать кнопку(датчик и т.п.)
а как это реализовать програмно?
что-то у меня не получаеться адекватно...
да легко всё.
Надо собрать правильную кнопку с подтяжкой к земле или к +(я сделал подтяжку к земле на 10К резистором).
А дальше код программы:
........
#include<avr/interrupt.h>
int swpin1 = 2; // пин кнопки 1
int buttonState; //состояние кнопки
int buttonPress = 0; //значеня для выбора функций
void setup(){
attachInterrupt(0,switch1,CHANGE);//прерывания 0 (на цифровом пине 2) на функцию switch1
void loop()
{
switch (buttonstate) {
case 0:
что то делаем;
break;
case 1:
что то делаем;
break;
и так далее
}
}
void switch1()
{
buttonState = digitalRead(swpin1);
delayMicroseconds(300);
buttonPress++;
if (buttonPress == 3)
{
buttonPress = 0;
}
}
А можно этот же пример но на 2 кнопки? :-) чтобы сформировалась картинка окончательная :-)