Запись массива

Andrushka
Offline
Зарегистрирован: 24.11.2015

У меня такой вопрос. Мне нужно записать в массив последовательность нажатий кнопок.

Например, есть 5 кнопок. Нажали их в таком порядке - 1.4.3.5.2. Как мне занести эти числа в массив?

vvadim
Offline
Зарегистрирован: 23.05.2012

объявляете массив на 5 элементов
заводите переменную счётчик равный 0

с каждым нажатием кнопок переменная меняется до 4 и обнуляется
записываете в массив элемент с номером счётчика

Andrushka
Offline
Зарегистрирован: 24.11.2015
int button[4];
int i = 0;

if (!digitalRead(pin) == true)
{
button[i] = pin;
i++;
} 
вот так?

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Andrushka, если это какой-то пароль, то можно взять одну переменную int, записывать в неё пришедший номер, и сдвигать на 3 бита. Как раз хватит на 5 цифр. При последовательности 1,4,3,5,2 проверочное знаечние инта будет 0x18EA.

Andrushka
Offline
Зарегистрирован: 24.11.2015

Нет, это не пароль. Я делаю игру на подобии "Саймон сказал".

Моя идея в чем:

1)рандомно загорается 1 светодиод

2)номер светодиода записывается в массив скажем led[sv] sv - количество загоревшихся светодиодов

3)нажимаются кнопки. их последовательность записывается в массив, например, button[sv]

4)сравниваются 2 массива. если она равны, то sv++  и уже 2 светодиода загорается.

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

vvadim
Offline
Зарегистрирован: 23.05.2012

кнопки как подключены

Andrushka
Offline
Зарегистрирован: 24.11.2015

вот такая схема у меня сейчас

vvadim
Offline
Зарегистрирован: 23.05.2012

вот я когда то игрался с аналоговыми кнопками, может пригодится

//////////////////////////////////////////////////////
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

byte count = 0;
byte flag = 0;
int myInts[5];


void setup() 
{
  Serial.begin(9600); 
}

void loop() 
{ 
  if(read_LCD_buttons() >= 0 && read_LCD_buttons() <= 4 && flag ==0 )
  {
    count ++;  
    flag = 1;
    myInts[count - 1] = read_LCD_buttons();
    if(count < 4)
    {
      Serial.print(count);
      Serial.print("      ");
      Serial.println(read_LCD_buttons());
    }
  }
  if(read_LCD_buttons() == 5 && flag ==1 )
  {
    flag = 0;
  }
  if(count >= 5)
  {
    count = 0;
  }
  if(count == 4)
  {
    Serial.print(myInts[0]);
    Serial.print(myInts[1]);
    Serial.print(myInts[2]);
    Serial.println(myInts[3]);
  }
}
byte read_LCD_buttons()
{
  int adc_key_in = analogRead(0);     
  delay(5); 
  int k = (analogRead(0) - adc_key_in);
  if (5 < abs(k)) return 5; 

  if (adc_key_in > 1000) return 5;
  if (adc_key_in < 50)   return 0;  
  if (adc_key_in < 180)  return 1; 
  if (adc_key_in < 350)  return 2; 
  if (adc_key_in < 500)  return 3; 
  if (adc_key_in < 800)  return 4;   
  return 5;  
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

где-то , когда-то на этих просторах тупее и тупой ( я ) - примерно такую игрушку уже делали

"повторить порядок зажигания светодиодов" - найду-вспомню будет ссылка или сам по темам пошарься :)

Andrushka
Offline
Зарегистрирован: 24.11.2015

сложновато пока что для меня))

почему не работает такой код?

int led1 = 4;
int led2 = 5;
int led3 = 6;
int b1 = 1;
int b2 = 2;
int b3 = 3;
int i = 0;
int flag = 0;
int button[3];
void setup() {
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT);
  pinMode(b1,INPUT);
  pinMode(b2,INPUT);
  pinMode(b3,INPUT);
}

void loop() {
  
  if (!digitalRead(b1)==true)
  {
    flag=1;
    button[i]=flag;
    i++;
  }
  if (!digitalRead(b2)==true)
  {
    flag=2;
    button[i]=flag;
    i++;
  }
  if (!digitalRead(b3)==true)
  {
    flag=3; 
    button[i]=flag; 
    i++;
  }
  if (i==2)
  {
    digitalWrite(led1,HIGH);
  }
}

у меня загорается светодиод при первом же нажатии

vvadim
Offline
Зарегистрирован: 23.05.2012

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

изучаем тему http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku

Andrushka
Offline
Зарегистрирован: 24.11.2015

ничего похожего не нашел. буду очень благодарен за ссылочку)

Andrushka
Offline
Зарегистрирован: 24.11.2015

эту тему я читал несколько раз... для моей цели там нужной информации нету...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Andrushka пишет:

ничего похожего не нашел. буду очень благодарен за ссылочку)

тоже пока не нашёл :(
видимо , где-то в середине чужой темы шло обсуждение-написание....

три светика , три кнопки
суть :
в зависимости от уровня задания - повторить кнопками порядок включения светиков
- один из трёх , 2 , 3 , 4 , 5 , ....... вспышек ( порядок случайный )
- два из трёх , 2 , 3 , 4 , 5 , ....... вспышек ( порядок случайный )

угадал - жизнь++ , если жизней > 10 то уровень++
не угадал - 
жизнь-- , если жизней меньше 1 ещё и минус уровень с восстановлением жизней = 3

...похоже на твою задумку и сделано до конца , НО - не могу найти пока :(

Andrushka
Offline
Зарегистрирован: 24.11.2015

вот мне бы понять, как записать последовательность эту... для led такой-же код будет, а остальное все легко

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

да , действительно в "середине" темы не про это оказалось.....
:)
http://arduino.ru/forum/programmirovanie/pomogite-pozhaluista-s-kodom-dl...
выделять не буду - сам ищи что тибе надо от первого поста до крайнего :)-

Sindbad
Offline
Зарегистрирован: 08.12.2015

 

Andrushka пишет:

эту тему я читал несколько раз... для моей цели там нужной информации нету...

Как так нету? А где в вашей проге защита от дребезга?

Вот этот, например, фрагмент:

if (!digitalRead(b1)==true)
  {
    flag=1;
    button[i]=flag;
    i++;
  }

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

Поэтому, собственно, светодиод и загорается, т.к. третий проход Loop() при нажатии любой клавиши дает i==2.

Sindbad
Offline
Зарегистрирован: 08.12.2015

Andrushka пишет:

 

от такая схема у меня сейчас

Вот прям без токоограничивающего резистора для светодиода?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Sindbad пишет:

Andrushka пишет:

 

от такая схема у меня сейчас

Вот прям без токоограничивающего резистора для светодиода?


ДА , спалим все СД !

Andrushka
Offline
Зарегистрирован: 24.11.2015

То есть дребезг это когда во время нажатия кнопки происходит повтор цикла много раз, а не то, что я думал - если человек пальцем касается деталей и от него дополнительно сопротивление идет или еще что-то?

Клапауций 123
Offline
Зарегистрирован: 06.12.2015

Andrushka пишет:

То есть дребезг это когда во время нажатия кнопки происходит повтор цикла много раз, а не то, что я думал - если человек пальцем касается деталей и от него дополнительно сопротивление идет или еще что-то?

нет - дребезг это когда контакты кнопки не замыкаются сразу, а подпрыгивают от удара несколько раз.

Andrushka
Offline
Зарегистрирован: 24.11.2015

Большое спасибо за ссылку, буду разбираться))

В той теме написано, что задержку необходимо увеличивать в соответствии с уровнем для ввода ответа #56

А можно ведь поставить задержку сразу 1мин на все уровни. Ведь, как мне кажется, это будет проще - не нужно увеличивать переменную, писать доп. код. Так на каждом уровне будет 1 минута, чтобы ввести ответ...

Andrushka
Offline
Зарегистрирован: 24.11.2015

Значит, когда я нажимаю на кнопку, то хоть она и нажата, а контакты внутри колеблсятся очень быстро и получается, что кнопка с очень большой частотой включается и выключается до тех пор, пока контакт не перестанет колебаться?

Клапауций 123
Offline
Зарегистрирован: 06.12.2015

Andrushka пишет:

Значит, когда я нажимаю на кнопку, то хоть она и нажата, а контакты внутри колеблсятся очень быстро и получается, что кнопка с очень большой частотой включается и выключается до тех пор, пока контакт не перестанет колебаться?

кароче, возьми молоток и ударь по наковальне.

знаешь, что такое "молоток"?

Sindbad
Offline
Зарегистрирован: 08.12.2015

 

Andrushka пишет:

То есть дребезг это когда во время нажатия кнопки происходит повтор цикла много раз, а не то, что я думал - если человек пальцем касается деталей и от него дополнительно сопротивление идет или еще что-то?

Про дребезг вам ответили. А повтор обеспечивает функция loop(). Она повторяется бесконечно пока включен микроконтроллер. Т.е. после последней команды этой функции сразу начинает выполнятся первая.

"Человек от которого идет сопротивление". Хм. Все что нужно знать о сопротивлении сводится к закону Ома. Объяснять собственное непонимание подобной хренью - тупиковый путь.

Sindbad
Offline
Зарегистрирован: 08.12.2015

Andrushka пишет:

А можно ведь поставить задержку сразу 1мин на все уровни. Ведь, как мне кажется, это будет проще - не нужно увеличивать переменную, писать доп. код. Так на каждом уровне будет 1 минута, чтобы ввести ответ...

Во-первых задержка для подавления дребезга нужна ровно такая, сколько длится дребезг. А длится он примерно 0,01 сек.

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

int flag = 0;

  if (!digitalRead(b1)==true)
  {
    flag=1;
    button[i]=flag;
    i++;
  }

Эквивалент вот этого:

  if (!digitalRead(b1))
    button[i++]=1