Запись массива
- Войдите на сайт для отправки комментариев
Пнд, 07/12/2015 - 08:45
У меня такой вопрос. Мне нужно записать в массив последовательность нажатий кнопок.
Например, есть 5 кнопок. Нажали их в таком порядке - 1.4.3.5.2. Как мне занести эти числа в массив?
объявляете массив на 5 элементов
заводите переменную счётчик равный 0
с каждым нажатием кнопок переменная меняется до 4 и обнуляется
записываете в массив элемент с номером счётчика
int button[4]; int i = 0; if (!digitalRead(pin) == true) { button[i] = pin; i++; } вот так?Andrushka, если это какой-то пароль, то можно взять одну переменную int, записывать в неё пришедший номер, и сдвигать на 3 бита. Как раз хватит на 5 цифр. При последовательности 1,4,3,5,2 проверочное знаечние инта будет 0x18EA.
Нет, это не пароль. Я делаю игру на подобии "Саймон сказал".
Моя идея в чем:
1)рандомно загорается 1 светодиод
2)номер светодиода записывается в массив скажем led[sv] sv - количество загоревшихся светодиодов
3)нажимаются кнопки. их последовательность записывается в массив, например, button[sv]
4)сравниваются 2 массива. если она равны, то sv++ и уже 2 светодиода загорается.
и вот моя проблема - я не могу записать последовательность нажатий кнопок. я начинающий и опыта у меня очень мало, все способы, которые я пробовал не работают.
кнопки как подключены
вот такая схема у меня сейчас
вот я когда то игрался с аналоговыми кнопками, может пригодится
////////////////////////////////////////////////////// #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; }где-то , когда-то на этих просторах тупее и тупой ( я ) - примерно такую игрушку уже делали
"повторить порядок зажигания светодиодов" - найду-вспомню будет ссылка или сам по темам пошарься :)
сложновато пока что для меня))
почему не работает такой код?
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); } }у меня загорается светодиод при первом же нажатии
ну раз сложновато, то сначала учимся просто работать с кнопкой с учётом дребезга
изучаем тему http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku
ничего похожего не нашел. буду очень благодарен за ссылочку)
эту тему я читал несколько раз... для моей цели там нужной информации нету...
ничего похожего не нашел. буду очень благодарен за ссылочку)
тоже пока не нашёл :(
видимо , где-то в середине чужой темы шло обсуждение-написание....
три светика , три кнопки
суть :
в зависимости от уровня задания - повторить кнопками порядок включения светиков
- один из трёх , 2 , 3 , 4 , 5 , ....... вспышек ( порядок случайный )
- два из трёх , 2 , 3 , 4 , 5 , ....... вспышек ( порядок случайный )
угадал - жизнь++ , если жизней > 10 то уровень++
не угадал - жизнь-- , если жизней меньше 1 ещё и минус уровень с восстановлением жизней = 3
...похоже на твою задумку и сделано до конца , НО - не могу найти пока :(
вот мне бы понять, как записать последовательность эту... для led такой-же код будет, а остальное все легко
да , действительно в "середине" темы не про это оказалось.....
:)
http://arduino.ru/forum/programmirovanie/pomogite-pozhaluista-s-kodom-dl...
выделять не буду - сам ищи что тибе надо от первого поста до крайнего :)-
эту тему я читал несколько раз... для моей цели там нужной информации нету...
Как так нету? А где в вашей проге защита от дребезга?
Вот этот, например, фрагмент:
if (!digitalRead(b1)==true) { flag=1; button[i]=flag; i++; }При нажатии на кнопку выполнится несколько раз, с одного нажатия произойтет выход за границы массива и запись будет происходить куда-то в память, затирая другую информацию. Loop() вызывается постоянно и пока нажата кнопка будет выполняться этот участок кода. А микроконтроллер работает очень быстро, миллионы элементарных операций в секунду.
Поэтому, собственно, светодиод и загорается, т.к. третий проход Loop() при нажатии любой клавиши дает i==2.
от такая схема у меня сейчас
Вот прям без токоограничивающего резистора для светодиода?
от такая схема у меня сейчас
Вот прям без токоограничивающего резистора для светодиода?
ДА , спалим все СД !
То есть дребезг это когда во время нажатия кнопки происходит повтор цикла много раз, а не то, что я думал - если человек пальцем касается деталей и от него дополнительно сопротивление идет или еще что-то?
То есть дребезг это когда во время нажатия кнопки происходит повтор цикла много раз, а не то, что я думал - если человек пальцем касается деталей и от него дополнительно сопротивление идет или еще что-то?
нет - дребезг это когда контакты кнопки не замыкаются сразу, а подпрыгивают от удара несколько раз.
Большое спасибо за ссылку, буду разбираться))
В той теме написано, что задержку необходимо увеличивать в соответствии с уровнем для ввода ответа #56
А можно ведь поставить задержку сразу 1мин на все уровни. Ведь, как мне кажется, это будет проще - не нужно увеличивать переменную, писать доп. код. Так на каждом уровне будет 1 минута, чтобы ввести ответ...
Значит, когда я нажимаю на кнопку, то хоть она и нажата, а контакты внутри колеблсятся очень быстро и получается, что кнопка с очень большой частотой включается и выключается до тех пор, пока контакт не перестанет колебаться?
Значит, когда я нажимаю на кнопку, то хоть она и нажата, а контакты внутри колеблсятся очень быстро и получается, что кнопка с очень большой частотой включается и выключается до тех пор, пока контакт не перестанет колебаться?
кароче, возьми молоток и ударь по наковальне.
знаешь, что такое "молоток"?
То есть дребезг это когда во время нажатия кнопки происходит повтор цикла много раз, а не то, что я думал - если человек пальцем касается деталей и от него дополнительно сопротивление идет или еще что-то?
Про дребезг вам ответили. А повтор обеспечивает функция loop(). Она повторяется бесконечно пока включен микроконтроллер. Т.е. после последней команды этой функции сразу начинает выполнятся первая.
"Человек от которого идет сопротивление". Хм. Все что нужно знать о сопротивлении сводится к закону Ома. Объяснять собственное непонимание подобной хренью - тупиковый путь.
А можно ведь поставить задержку сразу 1мин на все уровни. Ведь, как мне кажется, это будет проще - не нужно увеличивать переменную, писать доп. код. Так на каждом уровне будет 1 минута, чтобы ввести ответ...
Во-первых задержка для подавления дребезга нужна ровно такая, сколько длится дребезг. А длится он примерно 0,01 сек.
Во-вторых код для подавления дребезга это всего несколько строчек. Признались бы честно, вам лень думать над алгоритмом. Где лишний код, так это здесь:
int flag = 0; if (!digitalRead(b1)==true) { flag=1; button[i]=flag; i++; }Эквивалент вот этого:
if (!digitalRead(b1)) button[i++]=1