Последовательное нажатие кнопки.

evil eyes
Offline
Зарегистрирован: 18.07.2011

Подскажите как должен  выглядеть код ддя такого действия:

 

Нажатие кнопки первый раз выполняется одно действие,

Следующее нажатие(2), выполняеться другое действие,

Следующее нажатие(3), выполняеться другое действие,

Следующее нажатие(4), выполняеться другое действие,

и потом заново.

 

 

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

легко. Желательно через прерывание, потом

делается так при нажатии на кнопку в глобальной переменной +1, а дальше case() с выбором функций и когда эта глобальная переменная достигает нужной цифры допустим 4 то этой переменной присваиваем 0 и так по кругу

evil eyes
Offline
Зарегистрирован: 18.07.2011
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);

}

что не так? 

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

нужно сюда вклеить код антидребезга кнопки.  

evil eyes
Offline
Зарегистрирован: 18.07.2011

все, нашел ошибку))  

evil eyes
Offline
Зарегистрирован: 18.07.2011

я пропустил

break;  

 

исправил и все пашет)

 

спасибо)

Fluffy
Offline
Зарегистрирован: 01.06.2011

Adessit, а почему желательно через прерывание?

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

Потому что когда делаешь с прерыванием то:

-по нажатию кнопки программа останавливается и делает нужную функцию;

-не надо ждать и делать лишнюю работу МК пока код в новом цикле программы дойдёт до пункта проверки нажатия клавиши.

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

evil eyes
Offline
Зарегистрирован: 18.07.2011

а как это реализовать програмно?

что-то у меня не получаеться адекватно...  

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

да легко всё.

Надо собрать правильную кнопку с подтяжкой к земле или к +(я сделал подтяжку к земле на 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;
}
}

 

accente
Offline
Зарегистрирован: 18.09.2011

 А можно этот же пример но на 2 кнопки? :-) чтобы сформировалась картинка окончательная :-)