в строке 75 и др. - поставь задержку 200.... и всё снова.....
да, глюк изредка появляется после кнопки 2.... контакты может хреновые ( сильно дребезжат ) , замени её
блок кнопок нужно спаять на отдельной плате, чтобы исключить шевеления контактов кнопок и проводов к макетке при нажатиях на кнопки
Все, понял, спасибо большое . Завтра займусь) Так оставить 200 или 50? И еще вопрос. Вот чтобы постоянно горел индикация жизни. Ты говорил вывести функцию showLive(); в лооп. Но не получается. Загорается и потом гаснет
Убрал строки 315 - 317. Так же убрал 307-313, чтобы не моргал. А просто постоянно горело текущее значение жизней. Так же саму функцию вынес в луп. Не работает...
Убрал строки 315 - 317. Так же убрал 307-313, чтобы не моргал. А просто постоянно горело текущее значение жизней. Так же саму функцию вынес в луп. Не работает...
она уже давно в строке 55 сидит ( из крайнего кода )
нет , зачем ?
один раз высветили в секции_1 и хватит... в секции_3 решение оставить или минусовать колво жизней, вот на следПроходе лупа и высветится новое значение....
а если функция выродилась в одну строку - то функцию эту надо убить и вместо её вызова записать эту строку :)
Честно? Я так и не понял почему вместо 3 используем 4... Я понимаю как это все выглядет в двоичной системе.. Но все же.. Какая тут связь? Вот например. Я сейчас хочу чтобы у меня высвечивалась индикация постоянно. Начальное значени жизней 3. Но СД не горят, так как в функции только (1, 2, 4, 7)...
void OutByteLive(byte _n)
{
switch (_n)
{
case 0 : // для выключения всех трёх СД_жизнь
{
digitalWrite(ledLive1,LOW);
digitalWrite(ledLive2,LOW);
digitalWrite(ledLive3,LOW);
break;
}
case 1 :
{
digitalWrite(ledLive1,HIGH);
digitalWrite(ledLive2,LOW);
digitalWrite(ledLive3,LOW);
break;
}
case 2 :
{
digitalWrite(ledLive1,HIGH);
digitalWrite(ledLive2,HIGH);
digitalWrite(ledLive3,LOW);
break;
}
case 4 :
{
digitalWrite(ledLive1,HIGH);
digitalWrite(ledLive2,HIGH);
digitalWrite(ledLive3,HIGH);
break;
}
case 7 : // для включения всех трёх СД_жизнь
{
digitalWrite(ledLive1,HIGH);
digitalWrite(ledLive2,HIGH);
digitalWrite(ledLive3,HIGH);
break;
}
}
}
Все работает отлично))) Спасибо большое за помощь)) Завтра буду делать инжикацию и все остальное, чтобы игрок понимал что от него требуется и в какой момент времени))
Честно? Я так и не понял почему вместо 3 используем 4...
чтобы случайно подсветить один из трёх светодиодов нужно передать в функцию подсветки коды ИЛИ 001 , 010 , 100....
это числа 1 , 2 , 4 - сгенерить их случайно не получится , т.к. ещё и 3 будет проскакивать.... 001 , 010 , 011 , 100
генерим случайно 1 , 2 , 3..... , но 3 это 011 - подсветятся два светодиода, а этого нельзя по заданию....
генерим случайно 1 , 2 , 3..... , а 3 принудительно переделываем в 4 - получаем случайные значения 1 , 2 , 4
Это все я понимаю про двоичную систему! Но. Мы функцией записывает в переменную типа byte значени выбранное случайным образом. byte принимает значение от 0 до 255. Рандом выбрал 1, мы и записываем 1. Не 001, а именно 1. Рандом выбрал 2, мы записали 2, а не 010. И потом, когда мы уже запускаем светодиоды. Мы проверяем case 1:, case2. Вот я даже поменял сейчас.. вместо 4, поставил 3. и все работает отлично, никакие 2 Сд не загораются... Я не прав?
Это все я понимаю про двоичную систему! Но. Мы функцией записывает в переменную типа byte значени выбранное случайным образом. byte принимает значение от 0 до 255. Рандом выбрал 1, мы и записываем 1. Не 001, а именно 1. Рандом выбрал 2, мы записали 2, а не 010. И потом, когда мы уже запускаем светодиоды. Мы проверяем case 1:, case2. Вот я даже поменял сейчас.. вместо 4, поставил 3. и все работает отлично, никакие 2 Сд не загораются... Я не прав?
прав :) , но - мой подход нужен для дальнейшей модернизации кода с использованием прямого доступа к регистрам МК... при этом вывод байта на СД превратится всего в одну строку типа
PORTC=liveCurrent;
PORTD="случайныйБайт";
Это все я понимаю про двоичную систему! Но. Мы функцией записывает в переменную типа byte значени выбранное случайным образом. byte принимает значение от 0 до 255. Рандом выбрал 1, мы и записываем 1. Не 001, а именно 1. Рандом выбрал 2, мы записали 2, а не 010. И потом, когда мы уже запускаем светодиоды. Мы проверяем case 1:, case2. Вот я даже поменял сейчас.. вместо 4, поставил 3. и все работает отлично, никакие 2 Сд не загораются... Я не прав?
прав :) , но - мой подход нужен для дальнейшей модернизации кода с использованием прямого доступа к регистрам МК... при этом вывод байта на СД превратится всего в одну строку типа
PORTC=liveCurrent;
PORTD="случайныйБайт";
Ура, все же я был прав) А вот тепеРь еще важнее вопрос... Почему если долго удерживаю кнопку, не работает? Это из-за задержки? Так что же поставить? Или что делать? Ведь люди то разные)
Это все я понимаю про двоичную систему! Но. Мы функцией записывает в переменную типа byte значени выбранное случайным образом. byte принимает значение от 0 до 255. Рандом выбрал 1, мы и записываем 1. Не 001, а именно 1. Рандом выбрал 2, мы записали 2, а не 010. И потом, когда мы уже запускаем светодиоды. Мы проверяем case 1:, case2. Вот я даже поменял сейчас.. вместо 4, поставил 3. и все работает отлично, никакие 2 Сд не загораются... Я не прав?
прав :) , но - мой подход нужен для дальнейшей модернизации кода с использованием прямого доступа к регистрам МК... при этом вывод байта на СД превратится всего в одну строку типа
PORTC=liveCurrent;
PORTD="случайныйБайт";
Ура, все же я был прав) А вот тепеРь еще важнее вопрос... Почему если долго удерживаю кнопку, не работает? Это из-за задержки? Так что же поставить? Или что делать? Ведь люди то разные)
рандом(1,4) выбирает только
1 = 00000001 = 01 ( десятичное , двоичное , 16-ричное представление одного и тогоже )
2 = 00000010 = 02
3 = 00000011 = 03 , которое мы переделываем в 4 = 00000100 = 04
рандом(1,256) выберет случайно из всех значений
1 = 00000001 = 01 ( десятичное , двоичное , 16-ричное представление одного и тогоже )
2 = 00000010 = 02
3 = 00000011 = 03
...................
255 = 11111111 = FF - но все эти значения не нужны по задаче :)
рандом(1,4) выбирает только
1 = 00000001 = 01 ( десятичное , двоичное , 16-ричное представление одного и тогоже )
2 = 00000010 = 02
3 = 00000011 = 03 , которое мы переделываем в 4 = 00000100 = 04
рандом(1,256) выберет случайно из всех значений
1 = 00000001 = 01 ( десятичное , двоичное , 16-ричное представление одного и тогоже )
2 = 00000010 = 02
3 = 00000011 = 03
...................
255 = 11111111 = FF - но все эти значения не нужны по задаче :)
Да это в принципе понятно)) Ну а вот я поставлю 4 светодиода. Я же могу выбрать значения от 1 до 4 и все. 3 -это будет 3 сд. 4- четвертый. Но вот по ттвоим словам. Я должен буду описать 4 числа. 1-0001, 2-0010, 4-0100, 7- 1000. Так?) но все же если я сделаю по своему, ну без дальнейших планов на мк) все таки это же простая игра для проверки памяти) и поставлю для каждого Сд значение соответствующее его номеру: 1сд - 1, 2с2сд-2,3с
-3, 4сд-4. Это не будет оошибкой)
ошибкой это не будет... можно отобразить любое число на любые СД
- 0000 = зажечь четыре СД
- 1011 = зажечь первый и четвёртый
..........и получить в дальнейшем геморрой :(
основное - привязка-отображение СД к номеру бита в байте ! этому надо следовать всегда, даже при простоте вашей игрушки....
.....перейдёте на управление СД через последПараллельнРегистр или введёте семисегментные индикаторы для отображения колва жизней и номера текущего уровня - запутаетесь сразу :(
не проще ли сразу следовать логике битового отображения СД для любых задач ?
при управлении портами через регистры МК - всё поставит сразу на свои места ( основное - привязка-отображение СД к номеру бита в байте ) - когда ты придёшь к этому моя не знает :( , но придёшь.....
сколько времени ты отвёл на реализацию своего проекта ? мало - можно делать как ты решил.... много - надо сразу всё продумать....
....переделывать потОм проект с одной доктрины на другую - сибе дороже, переделка займёт больше времени чем написание нового кода :(
ошибкой это не будет... можно отобразить любое число на любые СД
- 0000 = зажечь четыре СД
- 1011 = зажечь первый и четвёртый
..........и получить в дальнейшем геморрой :(
основное - привязка-отображение СД к номеру бита в байте ! этому надо следовать всегда, даже при простоте вашей игрушки....
.....перейдёте на управление СД через последПараллельнРегистр или введёте семисегментные индикаторы для отображения колва жизней и номера текущего уровня - запутаетесь сразу :(
не проще ли сразу следовать логике битового отображения СД для любых задач ?
при управлении портами через регистры МК - всё поставит сразу на свои места ( основное - привязка-отображение СД к номеру бита в байте ) - когда ты придёшь к этому моя не знает :( , но придёшь.....
сколько времени ты отвёл на реализацию своего проекта ? мало - можно делать как ты решил.... много - надо сразу всё продумать....
....переделывать потОм проект с одной доктрины на другую - сибе дороже, переделка займёт больше времени чем написание нового кода :(
Кошмар) Ну я понимаю о чем ты) Семисегментный индикатор по тому же принципу делается? У меня есть индикатор такой от стратого компьютера. Можно же сделать отображение на нем уровня( или жизней)? Это надо через микросхему драйвера делать ? НУ и еще, к нашей задаче. Почему если держать долго кнопку, он не сработает как надо? Задержка?
Ну а вот я поставлю 4 светодиода. Я же могу выбрать значения от 1 до 4 и все
о чём и речь.... пишем функцию вывода байта ( 8 СД ) или 2-ух байтов ( 16 СД ) для всех значений.... и забываем о ней ( об её реализации ) , кстати через swith-case - устанете прописывать все 256 комбинаций для байта и 65535 комбинаций для двух байтов :)-
а через порты - легко и быстро
ничто не мешает в нужном месте вызывать функцию вкл СД с нужным параметром
- один из четырёх - 0001 0010 0100 1000 - один из восьми - 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
Ну а вот я поставлю 4 светодиода. Я же могу выбрать значения от 1 до 4 и все
о чём и речь.... пишем функцию вывода байта ( 8 СД ) или 2-ух байтов ( 16 СД ) для всех значений.... и забываем о ней ( об её реализации ) , кстати через swith-case - устанете прописывать все 256 комбинаций для байта и 65535 комбинаций для двух байтов :)-
а через порты - легко и быстро
ничто не мешает в нужном месте вызывать функцию вкл СД с нужным параметром
- один из четырёх - 0001 0010 0100 1000 - один из восьми - 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
Кошмар) Ну я понимаю о чем ты) Семисегментный индикатор по тому же принципу делается? У меня есть индикатор такой от стратого компьютера. Можно же сделать отображение на нем уровня( или жизней)? Это надо через микросхему драйвера делать ?
ничё сложного....
НУ и еще, к нашей задаче. Почему если держать долго кнопку, он не сработает как надо? Задержка?
Кошмар) Ну я понимаю о чем ты) Семисегментный индикатор по тому же принципу делается? У меня есть индикатор такой от стратого компьютера. Можно же сделать отображение на нем уровня( или жизней)? Это надо через микросхему драйвера делать ?
ничё сложного....
НУ и еще, к нашей задаче. Почему если держать долго кнопку, он не сработает как надо? Задержка?
Так. Спасибо большое , заработало) Теперь вопрос. Вот он иногда выдает 0. Например в 4 лвл. ( 4 2 0 4 0 1 0 0 0 0). Почему может быть это?
в строках 70...92 в массив может записаться только ИЛИ 1,2,4..... странно.... где-то косяк засел :(
#define DEBUG 1 #define knopka1 2 #define knopka2 3 #define knopka3 4 #define ledLive1 10 #define ledLive2 9 #define ledLive3 8 #define ledAssignment1 5 #define ledAssignment2 6 #define ledAssignment3 7 #define ledBlockButtons 11 byte levelCurrent=1; byte levelMax=10; byte liveCurrent=3; enum SECTION{sectionOut,sectionIn,sectionResult}; SECTION section=sectionOut; unsigned long oldMillis; byte assignment[10]; byte reply[10]; byte countKnopka; //========================================================================= void setup() { #ifdef DEBUG Serial.begin (9600); #endif pinMode (knopka1,INPUT); digitalWrite(knopka1,HIGH); pinMode (knopka2 ,INPUT); digitalWrite(knopka2,HIGH); pinMode (knopka3,INPUT); digitalWrite(knopka3,HIGH); pinMode (ledAssignment1,OUTPUT); pinMode (ledAssignment2,OUTPUT); pinMode (ledAssignment3,OUTPUT); OutByteAssignment(0); pinMode (ledLive1,OUTPUT); pinMode (ledLive2,OUTPUT); pinMode (ledLive3,OUTPUT); OutByteLive(0); pinMode (ledBlockButtons,OUTPUT); digitalWrite(ledBlockButtons,LOW); randomSeed (analogRead(0)); oldMillis=millis(); } //========================================================================= void loop() { // sectionOut if(section==sectionOut) { ClearAssignment(); // очистить массив fillAssignment(); // заполнить массив showLive(); // показать жизни showAssignment(); // показать задание digitalWrite(ledBlockButtons,HIGH); // вкл подсветки блока кнопок #ifdef DEBUG controlAssignment(); // функция просмотра задания #endif ClearReply(); // очистить массив countKnopka=0; // обнулить колво нажатий section=sectionIn; // смена флага секции oldMillis=millis(); // вкл секундомер } // sectionIn if(section==sectionIn) { if((millis()-oldMillis)<(2000+levelCurrent*500)) { if(countKnopka<10) { if(!digitalRead(knopka1)) { delay(75); while(!digitalRead(knopka1)) reply[countKnopka]=1; countKnopka++; } if(!digitalRead(knopka2)) { delay(75); while(!digitalRead(knopka2)) reply[countKnopka]=2; countKnopka++; } if(!digitalRead(knopka3)) { delay(75); while(!digitalRead(knopka3)) reply[countKnopka]=4; countKnopka++; } } } else { digitalWrite(ledBlockButtons,LOW); // выкл подсветки блока кнопок #ifdef DEBUG Serial.println("...allotted time has expired !"); #endif section=sectionResult; // смена флага секции } } // sectionResult if(section==sectionResult) { #ifdef DEBUG controlReply(); // функция просмотра ответов #endif CompareArray(); // сравнить массивы, принять решение // showResult(); // ещё не написана :) section=sectionOut; // смена флага секции } } //========================================================================= //====== функции ========================================================== //========================================================================= // фунцция получения случайного байта - 001 , 010 , 100 //========================================================================= byte RandomByte() { byte tempByte=random(1,4); if(tempByte==3) tempByte=4; return tempByte; } //========================================================================= // фунцция очистки массива "задание" //========================================================================= void ClearAssignment() { for(byte i=0;i<10;i++) { assignment[i]=0; }; } //========================================================================= // фунцция очистки массива "ответ" //========================================================================= void ClearReply() { for(byte i=0;i<10;i++) { reply[i]=0; }; } //========================================================================= // фунцция вывода байта на СД "задание" //========================================================================= void OutByteAssignment(byte _n) { switch (_n) { case 0 : // для выключения всех трёх СД_задание { digitalWrite(ledAssignment1,LOW); digitalWrite(ledAssignment2,LOW); digitalWrite(ledAssignment3,LOW); break; } case 1 : { digitalWrite(ledAssignment1,HIGH); digitalWrite(ledAssignment2,LOW); digitalWrite(ledAssignment3,LOW); break; } case 2 : { digitalWrite(ledAssignment1,LOW); digitalWrite(ledAssignment2,HIGH); digitalWrite(ledAssignment3,LOW); break; } case 4 : { digitalWrite(ledAssignment1,LOW); digitalWrite(ledAssignment2,LOW); digitalWrite(ledAssignment3,HIGH); break; } case 7 : // для включения всех трёх СД_задание { digitalWrite(ledAssignment1,HIGH); digitalWrite(ledAssignment2,HIGH); digitalWrite(ledAssignment3,HIGH); break; } } } //========================================================================= // фунцция вывода байта на СД "жизнь" //========================================================================= void OutByteLive(byte _n) { switch (_n) { case 0 : // для выключения всех трёх СД_жизнь { digitalWrite(ledLive1,LOW); digitalWrite(ledLive2,LOW); digitalWrite(ledLive3,LOW); break; } case 1 : { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,LOW); digitalWrite(ledLive3,LOW); break; } case 2 : { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,HIGH); digitalWrite(ledLive3,LOW); break; } case 4 : { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,HIGH); digitalWrite(ledLive3,HIGH); break; } case 7 : // для включения всех трёх СД_жизнь { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,HIGH); digitalWrite(ledLive3,HIGH); break; } } } //========================================================================= // функция сравнения массивов "задание" и "ответ" //========================================================================= void CompareArray() { boolean error=0; for(byte i=0;i<10;i++) { if(assignment[i]!=reply[i]) { error=1; break; } } if (error) { liveCurrent--; } else { levelCurrent++; } } //========================================================================= // функция заполнения массива "задание" //========================================================================= void fillAssignment() { for(byte i=0;i<levelCurrent;i++) { if(i==0) assignment[0]=RandomByte(); if(i>0) { byte tempByte=RandomByte(); while(assignment[i-1]==tempByte) { tempByte=RandomByte(); } assignment[i]=tempByte; } } } //========================================================================= // функция показать жизни //========================================================================= void showLive() { for(int i=0;i<5;i++) { OutByteLive(7); delay(100); OutByteLive(0); delay(100); } OutByteLive(liveCurrent); delay(1000); OutByteLive(0); delay(1000); } //========================================================================= // функция показать задание //========================================================================= void showAssignment() { OutByteAssignment(7); delay(1000); OutByteAssignment(0); delay(1000); byte n=0; // начало миганий задания while((assignment[n]!=0)&&(n<10)) { OutByteAssignment(assignment[n]); // вкл случСД delay(500); // пауза OutByteAssignment(0); // выкл случСД delay(500); // пауза n++; } // окончание миганий задания delay(500); OutByteAssignment(7); delay(500); OutByteAssignment(0); delay(500); } //========================================================================= // функция просмотра задания //========================================================================= void controlAssignment() { Serial.print(" level = "); Serial.println(levelCurrent); for(byte i=0;i<10;i++) { Serial.print(assignment[i]); Serial.print(" "); } Serial.println(""); Serial.println(" GO ! Push button !!!"); } //========================================================================= // функция просмотра ответов //========================================================================= void controlReply() { for(byte i=0;i<10;i++) { Serial.print(reply[i]); Serial.print(" "); } Serial.println(""); Serial.println("************************"); } //=========================================================================Вот такой получился код
все кнопки так переделай и дай распечатку Serial-a , кнопки тоже нажимай
if(countKnopka<10) { if(!digitalRead(knopka1)) { delay(50); while(!digitalRead(knopka1)) reply[countKnopka]=1; #ifdef DEBUG Serial.println(countKnopka); #endif countKnopka++; #ifdef DEBUG Serial.println(countKnopka); #endif }#define DEBUG 1 #define knopka1 2 #define knopka2 3 #define knopka3 4 #define ledLive1 10 #define ledLive2 9 #define ledLive3 8 #define ledAssignment1 5 #define ledAssignment2 6 #define ledAssignment3 7 #define ledBlockButtons 11 byte levelCurrent=1; byte levelMax=10; byte liveCurrent=3; enum SECTION{sectionOut,sectionIn,sectionResult}; SECTION section=sectionOut; unsigned long oldMillis; byte assignment[10]; byte reply[10]; byte countKnopka; //========================================================================= void setup() { #ifdef DEBUG Serial.begin (9600); #endif pinMode (knopka1,INPUT); digitalWrite(knopka1,HIGH); pinMode (knopka2 ,INPUT); digitalWrite(knopka2,HIGH); pinMode (knopka3,INPUT); digitalWrite(knopka3,HIGH); pinMode (ledAssignment1,OUTPUT); pinMode (ledAssignment2,OUTPUT); pinMode (ledAssignment3,OUTPUT); OutByteAssignment(0); pinMode (ledLive1,OUTPUT); pinMode (ledLive2,OUTPUT); pinMode (ledLive3,OUTPUT); OutByteLive(0); pinMode (ledBlockButtons,OUTPUT); digitalWrite(ledBlockButtons,LOW); randomSeed (analogRead(0)); oldMillis=millis(); } //========================================================================= void loop() { // sectionOut if(section==sectionOut) { ClearAssignment(); // очистить массив fillAssignment(); // заполнить массив showLive(); // показать жизни showAssignment(); // показать задание digitalWrite(ledBlockButtons,HIGH); // вкл подсветки блока кнопок #ifdef DEBUG controlAssignment(); // функция просмотра задания #endif ClearReply(); // очистить массив countKnopka=0; // обнулить колво нажатий section=sectionIn; // смена флага секции oldMillis=millis(); // вкл секундомер } // sectionIn if(section==sectionIn) { if((millis()-oldMillis)<(2000+levelCurrent*500)) { if(countKnopka<10) { if(!digitalRead(knopka1)) { delay(50); while(!digitalRead(knopka1)) reply[countKnopka]=1; #ifdef DEBUG Serial.println(countKnopka); #endif countKnopka++; #ifdef DEBUG Serial.println(countKnopka); #endif } if(!digitalRead(knopka2)) { delay(50); while(!digitalRead(knopka2)) reply[countKnopka]=2; #ifdef DEBUG Serial.println(countKnopka); #endif countKnopka++; #ifdef DEBUG Serial.println(countKnopka); #endif } if(!digitalRead(knopka3)) { delay(50); while(!digitalRead(knopka3)) reply[countKnopka]=4; #ifdef DEBUG Serial.println(countKnopka); #endif countKnopka++; #ifdef DEBUG Serial.println(countKnopka); #endif } } } else { digitalWrite(ledBlockButtons,LOW); // выкл подсветки блока кнопок #ifdef DEBUG Serial.println("...allotted time has expired !"); #endif section=sectionResult; // смена флага секции } } // sectionResult if(section==sectionResult) { #ifdef DEBUG controlReply(); // функция просмотра ответов #endif CompareArray(); // сравнить массивы, принять решение // showResult(); // ещё не написана :) section=sectionOut; // смена флага секции } } //========================================================================= //====== функции ========================================================== //========================================================================= // фунцция получения случайного байта - 001 , 010 , 100 //========================================================================= byte RandomByte() { byte tempByte=random(1,4); if(tempByte==3) tempByte=4; return tempByte; } //========================================================================= // фунцция очистки массива "задание" //========================================================================= void ClearAssignment() { for(byte i=0;i<10;i++) { assignment[i]=0; }; } //========================================================================= // фунцция очистки массива "ответ" //========================================================================= void ClearReply() { for(byte i=0;i<10;i++) { reply[i]=0; }; } //========================================================================= // фунцция вывода байта на СД "задание" //========================================================================= void OutByteAssignment(byte _n) { switch (_n) { case 0 : // для выключения всех трёх СД_задание { digitalWrite(ledAssignment1,LOW); digitalWrite(ledAssignment2,LOW); digitalWrite(ledAssignment3,LOW); break; } case 1 : { digitalWrite(ledAssignment1,HIGH); digitalWrite(ledAssignment2,LOW); digitalWrite(ledAssignment3,LOW); break; } case 2 : { digitalWrite(ledAssignment1,LOW); digitalWrite(ledAssignment2,HIGH); digitalWrite(ledAssignment3,LOW); break; } case 4 : { digitalWrite(ledAssignment1,LOW); digitalWrite(ledAssignment2,LOW); digitalWrite(ledAssignment3,HIGH); break; } case 7 : // для включения всех трёх СД_задание { digitalWrite(ledAssignment1,HIGH); digitalWrite(ledAssignment2,HIGH); digitalWrite(ledAssignment3,HIGH); break; } } } //========================================================================= // фунцция вывода байта на СД "жизнь" //========================================================================= void OutByteLive(byte _n) { switch (_n) { case 0 : // для выключения всех трёх СД_жизнь { digitalWrite(ledLive1,LOW); digitalWrite(ledLive2,LOW); digitalWrite(ledLive3,LOW); break; } case 1 : { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,LOW); digitalWrite(ledLive3,LOW); break; } case 2 : { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,HIGH); digitalWrite(ledLive3,LOW); break; } case 4 : { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,HIGH); digitalWrite(ledLive3,HIGH); break; } case 7 : // для включения всех трёх СД_жизнь { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,HIGH); digitalWrite(ledLive3,HIGH); break; } } } //========================================================================= // функция сравнения массивов "задание" и "ответ" //========================================================================= void CompareArray() { boolean error=0; for(byte i=0;i<10;i++) { if(assignment[i]!=reply[i]) { error=1; break; } } if (error) { liveCurrent--; } else { levelCurrent++; } } //========================================================================= // функция заполнения массива "задание" //========================================================================= void fillAssignment() { for(byte i=0;i<levelCurrent;i++) { if(i==0) assignment[0]=RandomByte(); if(i>0) { byte tempByte=RandomByte(); while(assignment[i-1]==tempByte) { tempByte=RandomByte(); } assignment[i]=tempByte; } } } //========================================================================= // функция показать жизни //========================================================================= void showLive() { for(int i=0;i<5;i++) { OutByteLive(7); delay(100); OutByteLive(0); delay(100); } OutByteLive(liveCurrent); delay(1000); OutByteLive(0); delay(1000); } //========================================================================= // функция показать задание //========================================================================= void showAssignment() { OutByteAssignment(7); delay(1000); OutByteAssignment(0); delay(1000); byte n=0; // начало миганий задания while((assignment[n]!=0)&&(n<10)) { OutByteAssignment(assignment[n]); // вкл случСД delay(500); // пауза OutByteAssignment(0); // выкл случСД delay(500); // пауза n++; } // окончание миганий задания delay(500); OutByteAssignment(7); delay(500); OutByteAssignment(0); delay(500); } //========================================================================= // функция просмотра задания //========================================================================= void controlAssignment() { Serial.print(" level = "); Serial.println(levelCurrent); for(byte i=0;i<10;i++) { Serial.print(assignment[i]); Serial.print(" "); } Serial.println(""); Serial.println(" GO ! Push button !!!"); } //========================================================================= // функция просмотра ответов //========================================================================= void controlReply() { for(byte i=0;i<10;i++) { Serial.print(reply[i]); Serial.print(" "); } Serial.println(""); Serial.println("************************"); } //=========================================================================этот..... и снова сериал...
#define DEBUG 1 #define knopka1 2 #define knopka2 3 #define knopka3 4 #define ledLive1 10 #define ledLive2 9 #define ledLive3 8 #define ledAssignment1 5 #define ledAssignment2 6 #define ledAssignment3 7 #define ledBlockButtons 11 byte levelCurrent=1; byte levelMax=10; byte liveCurrent=3; enum SECTION{sectionOut,sectionIn,sectionResult}; SECTION section=sectionOut; unsigned long oldMillis; byte assignment[10]; byte reply[10]; byte countKnopka; //========================================================================= void setup() { #ifdef DEBUG Serial.begin (9600); #endif pinMode (knopka1,INPUT); digitalWrite(knopka1,HIGH); pinMode (knopka2 ,INPUT); digitalWrite(knopka2,HIGH); pinMode (knopka3,INPUT); digitalWrite(knopka3,HIGH); pinMode (ledAssignment1,OUTPUT); pinMode (ledAssignment2,OUTPUT); pinMode (ledAssignment3,OUTPUT); OutByteAssignment(0); pinMode (ledLive1,OUTPUT); pinMode (ledLive2,OUTPUT); pinMode (ledLive3,OUTPUT); OutByteLive(0); pinMode (ledBlockButtons,OUTPUT); digitalWrite(ledBlockButtons,LOW); randomSeed (analogRead(0)); oldMillis=millis(); } //========================================================================= void loop() { // sectionOut if(section==sectionOut) { ClearAssignment(); // очистить массив fillAssignment(); // заполнить массив showLive(); // показать жизни #ifdef DEBUG Serial.print("live = "); Serial.println(liveCurrent); #endif showAssignment(); // показать задание digitalWrite(ledBlockButtons,HIGH); // вкл подсветки блока кнопок #ifdef DEBUG controlAssignment(); // функция просмотра задания #endif ClearReply(); // очистить массив countKnopka=0; // обнулить колво нажатий section=sectionIn; // смена флага секции oldMillis=millis(); // вкл секундомер } // sectionIn if(section==sectionIn) { if((millis()-oldMillis)<(2000+levelCurrent*500)) { if(countKnopka<10) { if(!digitalRead(knopka1)) { delay(50); while(!digitalRead(knopka1)) reply[countKnopka]=1; #ifdef DEBUG Serial.print("knopka1 = "); Serial.print(countKnopka); #endif countKnopka++; #ifdef DEBUG Serial.print(" >>> "); Serial.println(countKnopka); #endif } if(!digitalRead(knopka2)) { delay(50); while(!digitalRead(knopka2)) reply[countKnopka]=2; #ifdef DEBUG Serial.print("knopka2 = "); Serial.print(countKnopka); #endif countKnopka++; #ifdef DEBUG Serial.print(" >>> "); Serial.println(countKnopka); #endif } if(!digitalRead(knopka3)) { delay(50); while(!digitalRead(knopka3)) reply[countKnopka]=4; #ifdef DEBUG Serial.print("knopka3 = "); Serial.print(countKnopka); #endif countKnopka++; #ifdef DEBUG Serial.print(" >>> "); Serial.println(countKnopka); #endif } } } else { digitalWrite(ledBlockButtons,LOW); // выкл подсветки блока кнопок #ifdef DEBUG Serial.println("...allotted time has expired !"); #endif section=sectionResult; // смена флага секции } } // sectionResult if(section==sectionResult) { #ifdef DEBUG controlReply(); // функция просмотра ответов #endif CompareArray(); // сравнить массивы, принять решение // showResult(); // ещё не написана :) section=sectionOut; // смена флага секции } } //========================================================================= //====== функции ========================================================== //========================================================================= // фунцция получения случайного байта - 001 , 010 , 100 //========================================================================= byte RandomByte() { byte tempByte=random(1,4); if(tempByte==3) tempByte=4; return tempByte; } //========================================================================= // фунцция очистки массива "задание" //========================================================================= void ClearAssignment() { for(byte i=0;i<10;i++) { assignment[i]=0; }; } //========================================================================= // фунцция очистки массива "ответ" //========================================================================= void ClearReply() { for(byte i=0;i<10;i++) { reply[i]=0; }; } //========================================================================= // фунцция вывода байта на СД "задание" //========================================================================= void OutByteAssignment(byte _n) { switch (_n) { case 0 : // для выключения всех трёх СД_задание { digitalWrite(ledAssignment1,LOW); digitalWrite(ledAssignment2,LOW); digitalWrite(ledAssignment3,LOW); break; } case 1 : { digitalWrite(ledAssignment1,HIGH); digitalWrite(ledAssignment2,LOW); digitalWrite(ledAssignment3,LOW); break; } case 2 : { digitalWrite(ledAssignment1,LOW); digitalWrite(ledAssignment2,HIGH); digitalWrite(ledAssignment3,LOW); break; } case 4 : { digitalWrite(ledAssignment1,LOW); digitalWrite(ledAssignment2,LOW); digitalWrite(ledAssignment3,HIGH); break; } case 7 : // для включения всех трёх СД_задание { digitalWrite(ledAssignment1,HIGH); digitalWrite(ledAssignment2,HIGH); digitalWrite(ledAssignment3,HIGH); break; } } } //========================================================================= // фунцция вывода байта на СД "жизнь" //========================================================================= void OutByteLive(byte _n) { switch (_n) { case 0 : // для выключения всех трёх СД_жизнь { digitalWrite(ledLive1,LOW); digitalWrite(ledLive2,LOW); digitalWrite(ledLive3,LOW); break; } case 1 : { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,LOW); digitalWrite(ledLive3,LOW); break; } case 2 : { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,HIGH); digitalWrite(ledLive3,LOW); break; } case 4 : { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,HIGH); digitalWrite(ledLive3,HIGH); break; } case 7 : // для включения всех трёх СД_жизнь { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,HIGH); digitalWrite(ledLive3,HIGH); break; } } } //========================================================================= // функция сравнения массивов "задание" и "ответ" //========================================================================= void CompareArray() { boolean error=0; for(byte i=0;i<10;i++) { if(assignment[i]!=reply[i]) { error=1; break; } } if (error) { liveCurrent--; } else { levelCurrent++; } } //========================================================================= // функция заполнения массива "задание" //========================================================================= void fillAssignment() { for(byte i=0;i<levelCurrent;i++) { if(i==0) assignment[0]=RandomByte(); if(i>0) { byte tempByte=RandomByte(); while(assignment[i-1]==tempByte) { tempByte=RandomByte(); } assignment[i]=tempByte; } } } //========================================================================= // функция показать жизни //========================================================================= void showLive() { for(int i=0;i<5;i++) { OutByteLive(7); delay(100); OutByteLive(0); delay(100); } OutByteLive(liveCurrent); delay(1000); OutByteLive(0); delay(1000); } //========================================================================= // функция показать задание //========================================================================= void showAssignment() { OutByteAssignment(7); delay(1000); OutByteAssignment(0); delay(1000); byte n=0; // начало миганий задания while((assignment[n]!=0)&&(n<10)) { OutByteAssignment(assignment[n]); // вкл случСД delay(500); // пауза OutByteAssignment(0); // выкл случСД delay(500); // пауза n++; } // окончание миганий задания delay(500); OutByteAssignment(7); delay(500); OutByteAssignment(0); delay(500); } //========================================================================= // функция просмотра задания //========================================================================= void controlAssignment() { Serial.print(" level = "); Serial.println(levelCurrent); for(byte i=0;i<10;i++) { Serial.print(assignment[i]); Serial.print(" "); } Serial.println(""); Serial.println(" GO ! Push button !!!"); } //========================================================================= // функция просмотра ответов //========================================================================= void controlReply() { for(byte i=0;i<10;i++) { Serial.print(reply[i]); Serial.print(" "); } Serial.println(""); Serial.println("************************"); } //=========================================================================это распечатка не для крайнего кода :(
Что-то со 2 кнопкой
в строке 75 и др. - поставь задержку 200.... и всё снова.....
да, глюк изредка появляется после кнопки 2.... контакты может хреновые ( сильно дребезжат ) , замени её
Заменил кнопку
если кнопки на макетке - то от нажатий-отпусканий может контакт пропадать от кнопок - переставь кнопку 2 в другие дырдочки на макетке
#311 - теперь глюкнула кнопка 1 - это макетка и проводки виноваты :(
в строке 75 и др. - поставь задержку 200.... и всё снова.....
делал ?
Заменил все кнопки. Все равно иногда проскакивают
Поставил 200. ЧТо-то не то..
блок кнопок нужно спаять на отдельной плате, чтобы исключить шевеления контактов кнопок и проводов к макетке при нажатиях на кнопки
блок кнопок нужно спаять на отдельной плате, чтобы исключить шевеления контактов кнопок и проводов к макетке при нажатиях на кнопки
Все, понял, спасибо большое . Завтра займусь) Так оставить 200 или 50? И еще вопрос. Вот чтобы постоянно горел индикация жизни. Ты говорил вывести функцию showLive(); в лооп. Но не получается. Загорается и потом гаснет
#306 - строки 315,316,317 убрать и будет постоянно колво жизней гореть...
оставь 50, нормально же с такой задержкой работает :)
блок нажатия кнопок смотри....
#define DEBUG 1 #define knopka1 2 #define knopka2 3 #define knopka3 4 #define ledLive1 10 #define ledLive2 9 #define ledLive3 8 #define ledAssignment1 5 #define ledAssignment2 6 #define ledAssignment3 7 #define ledBlockButtons 11 byte levelCurrent=1; byte levelMax=10; byte liveCurrent=3; enum SECTION{sectionOut,sectionIn,sectionResult}; SECTION section=sectionOut; unsigned long oldMillis; byte assignment[10]; byte reply[10]; byte countKnopka; //========================================================================= void setup() { #ifdef DEBUG Serial.begin (9600); #endif pinMode (knopka1,INPUT); digitalWrite(knopka1,HIGH); pinMode (knopka2 ,INPUT); digitalWrite(knopka2,HIGH); pinMode (knopka3,INPUT); digitalWrite(knopka3,HIGH); pinMode (ledAssignment1,OUTPUT); pinMode (ledAssignment2,OUTPUT); pinMode (ledAssignment3,OUTPUT); OutByteAssignment(0); pinMode (ledLive1,OUTPUT); pinMode (ledLive2,OUTPUT); pinMode (ledLive3,OUTPUT); OutByteLive(0); pinMode (ledBlockButtons,OUTPUT); digitalWrite(ledBlockButtons,LOW); randomSeed (analogRead(0)); oldMillis=millis(); } //========================================================================= void loop() { // sectionOut if(section==sectionOut) { ClearAssignment(); // очистить массив fillAssignment(); // заполнить массив showLive(); // показать жизни showAssignment(); // показать задание digitalWrite(ledBlockButtons,HIGH); // вкл подсветки блока кнопок #ifdef DEBUG controlAssignment(); // функция просмотра задания #endif ClearReply(); // очистить массив countKnopka=0; // обнулить колво нажатий section=sectionIn; // смена флага секции oldMillis=millis(); // вкл секундомер } // sectionIn if(section==sectionIn) { if((millis()-oldMillis)<(2000+levelCurrent*500)) { if(countKnopka<levelMax) { if(!digitalRead(knopka1)) { digitalWrite(ledAssignment1,HIGH); // визуализация нажатой кноки delay(50); while(!digitalRead(knopka1)) reply[countKnopka]=1; #ifdef DEBUG Serial.print("knopka1 = "); Serial.print(countKnopka); #endif countKnopka++; digitalWrite(ledAssignment1,LOW); // визуализация нажатой кноки #ifdef DEBUG Serial.print(" >>> "); Serial.println(countKnopka); #endif } if(!digitalRead(knopka2)) { digitalWrite(ledAssignment2,HIGH); // визуализация нажатой кноки delay(50); while(!digitalRead(knopka2)) reply[countKnopka]=2; #ifdef DEBUG Serial.print("knopka2 = "); Serial.print(countKnopka); #endif countKnopka++; digitalWrite(ledAssignment2,LOW); // визуализация нажатой кноки #ifdef DEBUG Serial.print(" >>> "); Serial.println(countKnopka); #endif } if(!digitalRead(knopka3)) { digitalWrite(ledAssignment3,HIGH); // визуализация нажатой кноки delay(50); while(!digitalRead(knopka3)) reply[countKnopka]=4; #ifdef DEBUG Serial.print("knopka3 = "); Serial.print(countKnopka); #endif countKnopka++; digitalWrite(ledAssignment3,LOW); // визуализация нажатой кноки #ifdef DEBUG Serial.print(" >>> "); Serial.println(countKnopka); #endif } } } else { digitalWrite(ledBlockButtons,LOW); // выкл подсветки блока кнопок #ifdef DEBUG Serial.println("...allotted time has expired !"); #endif section=sectionResult; // смена флага секции } } // sectionResult if(section==sectionResult) { #ifdef DEBUG controlReply(); // функция просмотра ответов #endif CompareArray(); // сравнить массивы, принять решение // showResult(); // ещё не написана :) section=sectionOut; // смена флага секции } } //========================================================================= //====== функции ========================================================== //========================================================================= // фунцция получения случайного байта - 001 , 010 , 100 //========================================================================= byte RandomByte() { byte tempByte=random(1,4); if(tempByte==3) tempByte=4; return tempByte; } //========================================================================= // фунцция очистки массива "задание" //========================================================================= void ClearAssignment() { for(byte i=0;i<10;i++) { assignment[i]=0; }; } //========================================================================= // фунцция очистки массива "ответ" //========================================================================= void ClearReply() { for(byte i=0;i<10;i++) { reply[i]=0; }; } //========================================================================= // фунцция вывода байта на СД "задание" //========================================================================= void OutByteAssignment(byte _n) { switch (_n) { case 0 : // для выключения всех трёх СД_задание { digitalWrite(ledAssignment1,LOW); digitalWrite(ledAssignment2,LOW); digitalWrite(ledAssignment3,LOW); break; } case 1 : { digitalWrite(ledAssignment1,HIGH); digitalWrite(ledAssignment2,LOW); digitalWrite(ledAssignment3,LOW); break; } case 2 : { digitalWrite(ledAssignment1,LOW); digitalWrite(ledAssignment2,HIGH); digitalWrite(ledAssignment3,LOW); break; } case 4 : { digitalWrite(ledAssignment1,LOW); digitalWrite(ledAssignment2,LOW); digitalWrite(ledAssignment3,HIGH); break; } case 7 : // для включения всех трёх СД_задание { digitalWrite(ledAssignment1,HIGH); digitalWrite(ledAssignment2,HIGH); digitalWrite(ledAssignment3,HIGH); break; } } } //========================================================================= // фунцция вывода байта на СД "жизнь" //========================================================================= void OutByteLive(byte _n) { switch (_n) { case 0 : // для выключения всех трёх СД_жизнь { digitalWrite(ledLive1,LOW); digitalWrite(ledLive2,LOW); digitalWrite(ledLive3,LOW); break; } case 1 : { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,LOW); digitalWrite(ledLive3,LOW); break; } case 2 : { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,HIGH); digitalWrite(ledLive3,LOW); break; } case 4 : { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,HIGH); digitalWrite(ledLive3,HIGH); break; } case 7 : // для включения всех трёх СД_жизнь { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,HIGH); digitalWrite(ledLive3,HIGH); break; } } } //========================================================================= // функция сравнения массивов "задание" и "ответ" //========================================================================= void CompareArray() { boolean error=0; for(byte i=0;i<10;i++) { if(assignment[i]!=reply[i]) { error=1; break; } } if (error) { liveCurrent--; } else { levelCurrent++; } } //========================================================================= // функция заполнения массива "задание" //========================================================================= void fillAssignment() { for(byte i=0;i<levelCurrent;i++) { if(i==0) assignment[0]=RandomByte(); if(i>0) { byte tempByte=RandomByte(); while(assignment[i-1]==tempByte) { tempByte=RandomByte(); } assignment[i]=tempByte; } } } //========================================================================= // функция показать жизни //========================================================================= void showLive() { for(int i=0;i<5;i++) { OutByteLive(7); delay(100); OutByteLive(0); delay(100); } OutByteLive(liveCurrent); delay(1000); OutByteLive(0); delay(1000); } //========================================================================= // функция показать задание //========================================================================= void showAssignment() { OutByteAssignment(7); delay(1000); OutByteAssignment(0); delay(1000); byte n=0; // начало миганий задания while((assignment[n]!=0)&&(n<10)) { OutByteAssignment(assignment[n]); // вкл случСД delay(500); // пауза OutByteAssignment(0); // выкл случСД delay(500); // пауза n++; } // окончание миганий задания delay(500); OutByteAssignment(7); delay(500); OutByteAssignment(0); delay(500); } //========================================================================= // функция просмотра задания //========================================================================= void controlAssignment() { Serial.print(" level = "); Serial.println(levelCurrent); Serial.print("live = "); Serial.println(liveCurrent); for(byte i=0;i<10;i++) { Serial.print(assignment[i]); Serial.print(" "); } Serial.println(""); Serial.println(" GO ! Push button !!!"); } //========================================================================= // функция просмотра ответов //========================================================================= void controlReply() { for(byte i=0;i<10;i++) { Serial.print(reply[i]); Serial.print(" "); } Serial.println(""); Serial.println("************************"); } //=========================================================================загораются ли светики на время нажатия кнопок ?
Убрал строки 315 - 317. Так же убрал 307-313, чтобы не моргал. А просто постоянно горело текущее значение жизней. Так же саму функцию вынес в луп. Не работает...
Убрал строки 315 - 317. Так же убрал 307-313, чтобы не моргал. А просто постоянно горело текущее значение жизней. Так же саму функцию вынес в луп. Не работает...
она уже давно в строке 55 сидит ( из крайнего кода )
Так она же в секции.. Когда будет эта секция, будет и она. А если во всех секциях? Надо во все секции ф-цию вставить?
нет , зачем ?
один раз высветили в секции_1 и хватит... в секции_3 решение оставить или минусовать колво жизней, вот на следПроходе лупа и высветится новое значение....
а если функция выродилась в одну строку - то функцию эту надо убить и вместо её вызова записать эту строку :)
Честно? Я так и не понял почему вместо 3 используем 4... Я понимаю как это все выглядет в двоичной системе.. Но все же.. Какая тут связь? Вот например. Я сейчас хочу чтобы у меня высвечивалась индикация постоянно. Начальное значени жизней 3. Но СД не горят, так как в функции только (1, 2, 4, 7)...
void OutByteLive(byte _n) { switch (_n) { case 0 : // для выключения всех трёх СД_жизнь { digitalWrite(ledLive1,LOW); digitalWrite(ledLive2,LOW); digitalWrite(ledLive3,LOW); break; } case 1 : { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,LOW); digitalWrite(ledLive3,LOW); break; } case 2 : { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,HIGH); digitalWrite(ledLive3,LOW); break; } case 4 : { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,HIGH); digitalWrite(ledLive3,HIGH); break; } case 7 : // для включения всех трёх СД_жизнь { digitalWrite(ledLive1,HIGH); digitalWrite(ledLive2,HIGH); digitalWrite(ledLive3,HIGH); break; } } }Все работает отлично))) Спасибо большое за помощь)) Завтра буду делать инжикацию и все остальное, чтобы игрок понимал что от него требуется и в какой момент времени))
Я сейчас хочу чтобы у меня высвечивалась индикация постоянно. Начальное значени жизней 3. Но СД не горят, так как в функции только (1, 2, 4, 7)...
.....нууууу, добавь вывод "3" , это я копировал с СД_задание и забыл про состояние ТРИ :)-
Я сейчас хочу чтобы у меня высвечивалась индикация постоянно. Начальное значени жизней 3. Но СД не горят, так как в функции только (1, 2, 4, 7)...
.....нууууу, добавь вывод "3" , это я копировал с СД_задание и забыл про состояние ТРИ :)-
А я то думал))) Смотрю что-то не то, но никак не пойму)) Вот видео, посмотри))) https://vk.com/video?z=video241015053_171357613%2Falbum241015053 только качество плохое(( Снимал HD, при загрузке испортилось
Честно? Я так и не понял почему вместо 3 используем 4...
чтобы случайно подсветить один из трёх светодиодов нужно передать в функцию подсветки коды ИЛИ 001 , 010 , 100....
это числа 1 , 2 , 4 - сгенерить их случайно не получится , т.к. ещё и 3 будет проскакивать.... 001 , 010 , 011 , 100
генерим случайно 1 , 2 , 3..... , но 3 это 011 - подсветятся два светодиода, а этого нельзя по заданию....
генерим случайно 1 , 2 , 3..... , а 3 принудительно переделываем в 4 - получаем случайные значения 1 , 2 , 4
кидай на ютуб , с vk у миня не грузится :(
загораются ли светики на время нажатия кнопок ?
кидай на ютуб , с vk у миня не грузится :(
загораются ли светики на время нажатия кнопок ?
неа, не загораются. В коде этого же нет вроде. сейчас загружу
строки 75 и 84 , и ............ , и ..........................
http://www.youtube.com/watch?v=JIOsn-xnx4c&feature=youtu.be
строки 75 и 84 , и ............ , и ..........................
по-моему что-то не то...
Это все я понимаю про двоичную систему! Но. Мы функцией записывает в переменную типа byte значени выбранное случайным образом. byte принимает значение от 0 до 255. Рандом выбрал 1, мы и записываем 1. Не 001, а именно 1. Рандом выбрал 2, мы записали 2, а не 010. И потом, когда мы уже запускаем светодиоды. Мы проверяем case 1:, case2. Вот я даже поменял сейчас.. вместо 4, поставил 3. и все работает отлично, никакие 2 Сд не загораются... Я не прав?
а ты кнопки подольше удерживай :)
а ты кнопки подольше удерживай :)
Удерживаю дольше, отнимается жизнь((
Это все я понимаю про двоичную систему! Но. Мы функцией записывает в переменную типа byte значени выбранное случайным образом. byte принимает значение от 0 до 255. Рандом выбрал 1, мы и записываем 1. Не 001, а именно 1. Рандом выбрал 2, мы записали 2, а не 010. И потом, когда мы уже запускаем светодиоды. Мы проверяем case 1:, case2. Вот я даже поменял сейчас.. вместо 4, поставил 3. и все работает отлично, никакие 2 Сд не загораются... Я не прав?
прав :) , но - мой подход нужен для дальнейшей модернизации кода с использованием прямого доступа к регистрам МК... при этом вывод байта на СД превратится всего в одну строку типа
PORTC=liveCurrent;
PORTD="случайныйБайт";
изучай - http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry
Это все я понимаю про двоичную систему! Но. Мы функцией записывает в переменную типа byte значени выбранное случайным образом. byte принимает значение от 0 до 255. Рандом выбрал 1, мы и записываем 1. Не 001, а именно 1. Рандом выбрал 2, мы записали 2, а не 010. И потом, когда мы уже запускаем светодиоды. Мы проверяем case 1:, case2. Вот я даже поменял сейчас.. вместо 4, поставил 3. и все работает отлично, никакие 2 Сд не загораются... Я не прав?
прав :) , но - мой подход нужен для дальнейшей модернизации кода с использованием прямого доступа к регистрам МК... при этом вывод байта на СД превратится всего в одну строку типа
PORTC=liveCurrent;
PORTD="случайныйБайт";
изучай - http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry
Ура, все же я был прав) А вот тепеРь еще важнее вопрос... Почему если долго удерживаю кнопку, не работает? Это из-за задержки? Так что же поставить? Или что делать? Ведь люди то разные)
Это все я понимаю про двоичную систему! Но. Мы функцией записывает в переменную типа byte значени выбранное случайным образом. byte принимает значение от 0 до 255. Рандом выбрал 1, мы и записываем 1. Не 001, а именно 1. Рандом выбрал 2, мы записали 2, а не 010. И потом, когда мы уже запускаем светодиоды. Мы проверяем case 1:, case2. Вот я даже поменял сейчас.. вместо 4, поставил 3. и все работает отлично, никакие 2 Сд не загораются... Я не прав?
прав :) , но - мой подход нужен для дальнейшей модернизации кода с использованием прямого доступа к регистрам МК... при этом вывод байта на СД превратится всего в одну строку типа
PORTC=liveCurrent;
PORTD="случайныйБайт";
изучай - http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry
Ура, все же я был прав) А вот тепеРь еще важнее вопрос... Почему если долго удерживаю кнопку, не работает? Это из-за задержки? Так что же поставить? Или что делать? Ведь люди то разные)
рандом(1,4) выбирает только
1 = 00000001 = 01 ( десятичное , двоичное , 16-ричное представление одного и тогоже )
2 = 00000010 = 02
3 = 00000011 = 03 , которое мы переделываем в 4 = 00000100 = 04
рандом(1,256) выберет случайно из всех значений
1 = 00000001 = 01 ( десятичное , двоичное , 16-ричное представление одного и тогоже )
2 = 00000010 = 02
3 = 00000011 = 03
...................
255 = 11111111 = FF - но все эти значения не нужны по задаче :)
во вторник посмотрим.....
рандом(1,4) выбирает только
1 = 00000001 = 01 ( десятичное , двоичное , 16-ричное представление одного и тогоже )
2 = 00000010 = 02
3 = 00000011 = 03 , которое мы переделываем в 4 = 00000100 = 04
рандом(1,256) выберет случайно из всех значений
1 = 00000001 = 01 ( десятичное , двоичное , 16-ричное представление одного и тогоже )
2 = 00000010 = 02
3 = 00000011 = 03
...................
255 = 11111111 = FF - но все эти значения не нужны по задаче :)
Да это в принципе понятно)) Ну а вот я поставлю 4 светодиода. Я же могу выбрать значения от 1 до 4 и все. 3 -это будет 3 сд. 4- четвертый. Но вот по ттвоим словам. Я должен буду описать 4 числа. 1-0001, 2-0010, 4-0100, 7- 1000. Так?) но все же если я сделаю по своему, ну без дальнейших планов на мк) все таки это же простая игра для проверки памяти) и поставлю для каждого Сд значение соответствующее его номеру: 1сд - 1, 2с2сд-2,3с
-3, 4сд-4. Это не будет оошибкой)
ошибкой это не будет... можно отобразить любое число на любые СД
- 0000 = зажечь четыре СД
- 1011 = зажечь первый и четвёртый
..........и получить в дальнейшем геморрой :(
основное - привязка-отображение СД к номеру бита в байте ! этому надо следовать всегда, даже при простоте вашей игрушки....
.....перейдёте на управление СД через последПараллельнРегистр или введёте семисегментные индикаторы для отображения колва жизней и номера текущего уровня - запутаетесь сразу :(
не проще ли сразу следовать логике битового отображения СД для любых задач ?
при управлении портами через регистры МК - всё поставит сразу на свои места ( основное - привязка-отображение СД к номеру бита в байте ) - когда ты придёшь к этому моя не знает :( , но придёшь.....
сколько времени ты отвёл на реализацию своего проекта ? мало - можно делать как ты решил.... много - надо сразу всё продумать....
....переделывать потОм проект с одной доктрины на другую - сибе дороже, переделка займёт больше времени чем написание нового кода :(
ошибкой это не будет... можно отобразить любое число на любые СД
- 0000 = зажечь четыре СД
- 1011 = зажечь первый и четвёртый
..........и получить в дальнейшем геморрой :(
основное - привязка-отображение СД к номеру бита в байте ! этому надо следовать всегда, даже при простоте вашей игрушки....
.....перейдёте на управление СД через последПараллельнРегистр или введёте семисегментные индикаторы для отображения колва жизней и номера текущего уровня - запутаетесь сразу :(
не проще ли сразу следовать логике битового отображения СД для любых задач ?
при управлении портами через регистры МК - всё поставит сразу на свои места ( основное - привязка-отображение СД к номеру бита в байте ) - когда ты придёшь к этому моя не знает :( , но придёшь.....
сколько времени ты отвёл на реализацию своего проекта ? мало - можно делать как ты решил.... много - надо сразу всё продумать....
....переделывать потОм проект с одной доктрины на другую - сибе дороже, переделка займёт больше времени чем написание нового кода :(
Кошмар) Ну я понимаю о чем ты) Семисегментный индикатор по тому же принципу делается? У меня есть индикатор такой от стратого компьютера. Можно же сделать отображение на нем уровня( или жизней)? Это надо через микросхему драйвера делать ? НУ и еще, к нашей задаче. Почему если держать долго кнопку, он не сработает как надо? Задержка?
Ну а вот я поставлю 4 светодиода. Я же могу выбрать значения от 1 до 4 и все
о чём и речь.... пишем функцию вывода байта ( 8 СД ) или 2-ух байтов ( 16 СД ) для всех значений.... и забываем о ней ( об её реализации ) , кстати через swith-case - устанете прописывать все 256 комбинаций для байта и 65535 комбинаций для двух байтов :)-
а через порты - легко и быстро
ничто не мешает в нужном месте вызывать функцию вкл СД с нужным параметром
- один из четырёх - 0001 0010 0100 1000
- один из восьми - 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
нет ?
Ну а вот я поставлю 4 светодиода. Я же могу выбрать значения от 1 до 4 и все
о чём и речь.... пишем функцию вывода байта ( 8 СД ) или 2-ух байтов ( 16 СД ) для всех значений.... и забываем о ней ( об её реализации ) , кстати через swith-case - устанете прописывать все 256 комбинаций для байта и 65535 комбинаций для двух байтов :)-
а через порты - легко и быстро
ничто не мешает в нужном месте вызывать функцию вкл СД с нужным параметром
- один из четырёх - 0001 0010 0100 1000
- один из восьми - 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
нет ?
Ну да, ты прав)
Кошмар) Ну я понимаю о чем ты) Семисегментный индикатор по тому же принципу делается? У меня есть индикатор такой от стратого компьютера. Можно же сделать отображение на нем уровня( или жизней)? Это надо через микросхему драйвера делать ?
ничё сложного....
НУ и еще, к нашей задаче. Почему если держать долго кнопку, он не сработает как надо? Задержка?
с суток... посплю, соберу, протестю....
Кошмар) Ну я понимаю о чем ты) Семисегментный индикатор по тому же принципу делается? У меня есть индикатор такой от стратого компьютера. Можно же сделать отображение на нем уровня( или жизней)? Это надо через микросхему драйвера делать ?
ничё сложного....
НУ и еще, к нашей задаче. Почему если держать долго кнопку, он не сработает как надо? Задержка?
с суток... посплю, соберу, протестю....
Спасибо)
читал http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry ?