Помогите пожалуйста с кодом для Ардуино. Запутался..

guliyev34
Offline
Зарегистрирован: 17.03.2015


 level = 1
1 0 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
...allotted time has expired !
1 0 0 0 0 0 0 0 0 0 
************************
 level = 2
2 1 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
...allotted time has expired !
2 0 1 0 0 0 0 0 0 0 
************************
 level = 2
1 2 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
...allotted time has expired !
1 2 0 0 0 0 0 0 0 0 
************************
 level = 3
2 4 1 0 0 0 0 0 0 0 
 GO ! Push button !!!
...allotted time has expired !
2 4 1 0 0 0 0 0 0 0 
************************
 level = 4
4 2 1 4 0 0 0 0 0 0 
 GO ! Push button !!!
...allotted time has expired !
2 4 1 2 0 0 0 0 0 0 
************************
 level = 4
4 2 4 1 0 0 0 0 0 0 
 GO ! Push button !!!
...allotted time has expired !
4 2 0 4 0 1 0 0 0 0 
************************

Так. Спасибо большое , заработало) Теперь вопрос. Вот он иногда выдает 0. Например в 4 лвл. ( 4 2 0 4 0 1 0 0 0 0). Почему может быть это? 

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

в строках 70...92 в массив может записаться только ИЛИ 1,2,4..... странно.... где-то косяк засел :(

guliyev34
Offline
Зарегистрирован: 17.03.2015
#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("************************");
}
//=========================================================================

Вот такой получился код

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

все кнопки так переделай и дай распечатку 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
        }

 

guliyev34
Offline
Зарегистрирован: 17.03.2015
#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("************************");
}
//=========================================================================
 level = 1
1 0 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
0
1
...allotted time has expired !
1 0 0 0 0 0 0 0 0 0 
************************
 level = 2
2 1 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
0
1
1
2
...allotted time has expired !
2 1 0 0 0 0 0 0 0 0 
************************
 level = 3
1 2 4 0 0 0 0 0 0 0 
 GO ! Push button !!!
0
1
1
2
2
3
...allotted time has expired !
1 2 4 0 0 0 0 0 0 0 
************************
 level = 4
4 2 1 2 0 0 0 0 0 0 
 GO ! Push button !!!
0
1
1
2
2
3
3
4
4
5
...allotted time has expired !
4 0 2 1 2 0 0 0 0 0 
************************
 level = 4
2 1 4 2 0 0 0 0 0 0 
 GO ! Push button !!!
0
1
1
2
2
3
3
4
4
5
...allotted time has expired !
2 1 4 2 0 0 0 0 0 0 
************************
 level = 5
2 4 1 4 1 0 0 0 0 0 
 GO ! Push button !!!
0
1
1
2
2
3
3
4
4
5
...allotted time has expired !
2 4 1 4 1 0 0 0 0 0 
************************
 level = 6
4 2 4 2 4 1 0 0 0 0 
 GO ! Push button !!!
0
1
1
2
2
3
3
4
4
5
5
6
6
7
...allotted time has expired !
4 2 4 2 0 4 1 0 0 0 
************************
 level = 6
1 2 4 1 4 2 0 0 0 0 
 GO ! Push button !!!
0
1
1
2
2
3
3
4
4
5
5
6
...allotted time has expired !
1 4 1 0 2 4 0 0 0 0 
************************

 

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

этот..... и снова сериал...

#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("************************");
}
//=========================================================================

 

guliyev34
Offline
Зарегистрирован: 17.03.2015
 level = 1
2 0 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
...allotted time has expired !
0 0 0 0 0 0 0 0 0 0 
************************
 level = 1
2 0 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
0
1
...allotted time has expired !
2 0 0 0 0 0 0 0 0 0 
************************
 level = 2
4 1 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
0
1
1
2
...allotted time has expired !
4 1 0 0 0 0 0 0 0 0 
************************
 level = 3
2 4 2 0 0 0 0 0 0 0 
 GO ! Push button !!!
0
1
1
2
2
3
3
4
4
5
...allotted time has expired !
2 0 4 2 0 0 0 0 0 0 
************************
 level = 3
1 4 1 0 0 0 0 0 0 0 
 GO ! Push button !!!
0
1
1
2
2
3
...allotted time has expired !
1 4 1 0 0 0 0 0 0 0 
************************
 level = 4
2 4 1 2 0 0 0 0 0 0 
 GO ! Push button !!!
0
1
1
2
2
3
3
4
4
5
...allotted time has expired !
2 0 4 1 2 0 0 0 0 0 
************************
 level = 4
1 4 2 1 0 0 0 0 0 0 
 GO ! Push button !!!
0
1
1
2
2
3
3
4
4
5
...allotted time has expired !
1 4 2 0 1 0 0 0 0 0 
************************
 level = 4
2 1 2 1 0 0 0 0 0 0 
 GO ! Push button !!!
0
1
1
2
2
3
3
4
4
5
5
6
...allotted time has expired !
2 0 1 0 2 1 0 0 0 0 
************************

 

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

это распечатка не для крайнего кода :(

guliyev34
Offline
Зарегистрирован: 17.03.2015
live = 3
 level = 1
4 0 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
knopka3 = 0 >>> 1
...allotted time has expired !
4 0 0 0 0 0 0 0 0 0 
************************
live = 3
 level = 2
2 4 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
knopka2 = 0 >>> 1
knopka3 = 1 >>> 2
...allotted time has expired !
2 4 0 0 0 0 0 0 0 0 
************************
live = 3
 level = 3
2 4 2 0 0 0 0 0 0 0 
 GO ! Push button !!!
knopka2 = 0 >>> 1
knopka3 = 1 >>> 2
knopka2 = 2 >>> 3
knopka2 = 3 >>> 4
...allotted time has expired !
2 4 2 0 0 0 0 0 0 0 
************************
live = 3
 level = 4
4 2 4 1 0 0 0 0 0 0 
 GO ! Push button !!!
knopka3 = 0 >>> 1
knopka2 = 1 >>> 2
knopka2 = 2 >>> 3
knopka3 = 3 >>> 4
knopka1 = 4 >>> 5
...allotted time has expired !
4 2 0 4 1 0 0 0 0 0 
************************
live = 2
 level = 4
1 2 4 1 0 0 0 0 0 0 
 GO ! Push button !!!
knopka1 = 0 >>> 1
knopka2 = 1 >>> 2
knopka2 = 2 >>> 3
knopka3 = 3 >>> 4
knopka1 = 4 >>> 5
...allotted time has expired !
1 2 0 4 1 0 0 0 0 0 
************************

Что-то со 2 кнопкой

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

в строке 75 и др. - поставь задержку 200.... и всё снова.....
да, глюк изредка появляется после кнопки 2.... контакты может хреновые ( сильно дребезжат ) , замени её

guliyev34
Offline
Зарегистрирован: 17.03.2015

Заменил кнопку

live = 3
 level = 1
1 0 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
knopka1 = 0 >>> 1
...allotted time has expired !
1 0 0 0 0 0 0 0 0 0 
************************
live = 3
 level = 2
2 1 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
knopka2 = 0 >>> 1
knopka1 = 1 >>> 2
...allotted time has expired !
2 1 0 0 0 0 0 0 0 0 
************************
live = 3
 level = 3
2 4 2 0 0 0 0 0 0 0 
 GO ! Push button !!!
knopka2 = 0 >>> 1
knopka3 = 1 >>> 2
knopka2 = 2 >>> 3
...allotted time has expired !
2 4 2 0 0 0 0 0 0 0 
************************
live = 3
 level = 4
1 2 1 2 0 0 0 0 0 0 
 GO ! Push button !!!
knopka1 = 0 >>> 1
knopka2 = 1 >>> 2
knopka1 = 2 >>> 3
knopka2 = 3 >>> 4
...allotted time has expired !
1 2 1 2 0 0 0 0 0 0 
************************
live = 3
 level = 5
1 4 1 2 1 0 0 0 0 0 
 GO ! Push button !!!
knopka1 = 0 >>> 1
knopka1 = 1 >>> 2
knopka3 = 2 >>> 3
knopka1 = 3 >>> 4
knopka2 = 4 >>> 5
knopka1 = 5 >>> 6
...allotted time has expired !
1 0 4 1 2 1 0 0 0 0 
************************
live = 2
 level = 5
4 2 4 1 4 0 0 0 0 0 
 GO ! Push button !!!
knopka3 = 0 >>> 1
knopka2 = 1 >>> 2
knopka3 = 2 >>> 3
knopka1 = 3 >>> 4
knopka3 = 4 >>> 5
...allotted time has expired !
4 2 4 1 4 0 0 0 0 0 
************************
live = 2
 level = 6
1 4 2 4 1 4 0 0 0 0 
 GO ! Push button !!!
knopka1 = 0 >>> 1
knopka3 = 1 >>> 2
knopka2 = 2 >>> 3
knopka3 = 3 >>> 4
knopka1 = 4 >>> 5
knopka3 = 5 >>> 6
...allotted time has expired !
1 4 2 4 1 4 0 0 0 0 
************************
live = 2

 

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

если кнопки на макетке - то от нажатий-отпусканий может контакт пропадать от кнопок - переставь кнопку 2 в другие дырдочки на макетке

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

#311 - теперь глюкнула кнопка 1 - это макетка и проводки виноваты :(

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

в строке 75 и др. - поставь задержку 200.... и всё снова.....

делал ?

guliyev34
Offline
Зарегистрирован: 17.03.2015

Заменил все кнопки. Все равно иногда проскакивают

live = 3
 level = 1
1 0 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
knopka1 = 0 >>> 1
...allotted time has expired !
1 0 0 0 0 0 0 0 0 0 
************************
live = 3
 level = 2
2 1 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
knopka2 = 0 >>> 1
knopka1 = 1 >>> 2
...allotted time has expired !
2 1 0 0 0 0 0 0 0 0 
************************
live = 3
 level = 3
2 1 4 0 0 0 0 0 0 0 
 GO ! Push button !!!
knopka2 = 0 >>> 1
knopka1 = 1 >>> 2
knopka3 = 2 >>> 3
...allotted time has expired !
2 1 4 0 0 0 0 0 0 0 
************************
live = 3
 level = 4
4 1 2 1 0 0 0 0 0 0 
 GO ! Push button !!!
knopka3 = 0 >>> 1
knopka1 = 1 >>> 2
knopka2 = 2 >>> 3
knopka1 = 3 >>> 4
...allotted time has expired !
4 1 2 1 0 0 0 0 0 0 
************************
live = 3
 level = 5
4 2 1 4 2 0 0 0 0 0 
 GO ! Push button !!!
knopka3 = 0 >>> 1
knopka2 = 1 >>> 2
knopka1 = 2 >>> 3
knopka1 = 3 >>> 4
knopka3 = 4 >>> 5
knopka2 = 5 >>> 6
...allotted time has expired !
4 2 1 0 4 2 0 0 0 0 
************************
live = 2
 level = 5
4 1 4 2 1 0 0 0 0 0 
 GO ! Push button !!!
knopka3 = 0 >>> 1
knopka1 = 1 >>> 2
knopka3 = 2 >>> 3
knopka2 = 3 >>> 4
knopka1 = 4 >>> 5
...allotted time has expired !
4 1 4 2 1 0 0 0 0 0 
************************
live = 2
 level = 6
1 4 2 1 4 2 0 0 0 0 
 GO ! Push button !!!
knopka1 = 0 >>> 1
knopka3 = 1 >>> 2
knopka2 = 2 >>> 3
knopka1 = 3 >>> 4
knopka3 = 4 >>> 5
knopka2 = 5 >>> 6
knopka2 = 6 >>> 7
...allotted time has expired !
1 4 2 1 4 2 0 0 0 0 
************************
live = 2

 

guliyev34
Offline
Зарегистрирован: 17.03.2015

Поставил 200. ЧТо-то не то..

live = 3
 level = 1
4 0 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
knopka3 = 0 >>> 1
...allotted time has expired !
4 0 0 0 0 0 0 0 0 0 
************************
live = 3
 level = 2
2 1 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
knopka2 = 0 >>> 1
knopka1 = 1 >>> 2
...allotted time has expired !
0 0 0 0 0 0 0 0 0 0 
************************
live = 2
 level = 2
1 4 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
knopka1 = 0 >>> 1
knopka3 = 1 >>> 2
...allotted time has expired !
0 0 0 0 0 0 0 0 0 0 
************************

 

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

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

guliyev34
Offline
Зарегистрирован: 17.03.2015

SU-27-16 пишет:

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

Все, понял, спасибо большое . Завтра займусь) Так оставить 200 или 50? И еще вопрос. Вот чтобы постоянно горел индикация жизни. Ты говорил вывести функцию     showLive(); в лооп. Но не получается. Загорается и потом гаснет

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

#306 - строки 315,316,317 убрать и будет постоянно колво жизней гореть...
оставь 50, нормально же с такой задержкой работает :) 

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

блок нажатия кнопок смотри....

#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("************************");
}
//=========================================================================

загораются ли светики на время нажатия кнопок ?

guliyev34
Offline
Зарегистрирован: 17.03.2015

Убрал строки 315 - 317. Так же убрал 307-313, чтобы не моргал. А просто постоянно горело текущее значение жизней. Так же саму функцию вынес в луп. Не работает...

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

guliyev34 пишет:

Убрал строки 315 - 317. Так же убрал 307-313, чтобы не моргал. А просто постоянно горело текущее значение жизней. Так же саму функцию вынес в луп. Не работает...

она уже давно в строке 55 сидит ( из крайнего кода )

guliyev34
Offline
Зарегистрирован: 17.03.2015

Так она же в секции.. Когда будет эта секция, будет и она. А если во всех секциях? Надо во все секции ф-цию вставить? 

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

нет , зачем ? 
один раз высветили в секции_1 и хватит... в секции_3 решение оставить или минусовать колво жизней, вот на следПроходе лупа и высветится новое значение....
а если функция выродилась в одну строку - то функцию эту надо убить и вместо её вызова записать эту строку :)

guliyev34
Offline
Зарегистрирован: 17.03.2015

Честно? Я так и не понял почему вместо 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;
    }
  }
}

 

guliyev34
Offline
Зарегистрирован: 17.03.2015

Все работает отлично))) Спасибо большое за помощь)) Завтра буду делать инжикацию и все остальное, чтобы игрок понимал что от него требуется и в какой момент времени)) 

live = 3
 level = 1
1 0 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
...allotted time has expired !
0 0 0 0 0 0 0 0 0 0 
************************
live = 2
 level = 1
4 0 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
...allotted time has expired !
0 0 0 0 0 0 0 0 0 0 
************************
live = 1
 level = 1
4 0 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
...allotted time has expired !
0 0 0 0 0 0 0 0 0 0 
************************
live = 0
 level = 1
2 0 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
...allotted time has expired !
0 0 0 0 0 0 0 0 0 0 
************************
live = 255
 level = 1
1 0 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
live = 3
 level = 1
2 0 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
...allotted time has expired !
0 0 0 0 0 0 0 0 0 0 
************************
live = 2
 level = 1
4 0 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
...allotted time has expired !
0 0 0 0 0 0 0 0 0 0 
************************
live = 1
live = 3
 level = 1
4 0 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
knopka3 = 0 >>> 1
...allotted time has expired !
4 0 0 0 0 0 0 0 0 0 
************************
live = 3
 level = 2
1 4 0 0 0 0 0 0 0 0 
 GO ! Push button !!!
knopka1 = 0 >>> 1
knopka3 = 1 >>> 2
...allotted time has expired !
1 4 0 0 0 0 0 0 0 0 
************************
live = 3
 level = 3
1 4 2 0 0 0 0 0 0 0 
 GO ! Push button !!!
knopka1 = 0 >>> 1
knopka3 = 1 >>> 2
knopka2 = 2 >>> 3
...allotted time has expired !
1 4 2 0 0 0 0 0 0 0 
************************
live = 3
 level = 4
2 4 1 4 0 0 0 0 0 0 
 GO ! Push button !!!
knopka2 = 0 >>> 1
knopka3 = 1 >>> 2
knopka1 = 2 >>> 3
...allotted time has expired !
2 4 1 0 0 0 0 0 0 0 
************************
live = 2
 level = 4
4 2 1 4 0 0 0 0 0 0 
 GO ! Push button !!!
knopka3 = 0 >>> 1
knopka1 = 1 >>> 2
knopka2 = 2 >>> 3
knopka1 = 3 >>> 4
...allotted time has expired !
4 1 2 1 0 0 0 0 0 0 
************************
live = 1
 level = 4
4 1 2 4 0 0 0 0 0 0 
 GO ! Push button !!!
knopka3 = 0 >>> 1
knopka1 = 1 >>> 2
knopka2 = 2 >>> 3
knopka3 = 3 >>> 4
...allotted time has expired !
4 1 2 4 0 0 0 0 0 0 
************************
live = 1
 level = 5
1 2 1 2 1 0 0 0 0 0 
 GO ! Push button !!!
knopka1 = 0 >>> 1
knopka2 = 1 >>> 2
knopka1 = 2 >>> 3
knopka2 = 3 >>> 4
knopka1 = 4 >>> 5
...allotted time has expired !
1 2 1 2 1 0 0 0 0 0 
************************
live = 1
 level = 6
4 1 4 2 1 2 0 0 0 0 
 GO ! Push button !!!
knopka2 = 0 >>> 1
knopka1 = 1 >>> 2
knopka3 = 2 >>> 3
knopka2 = 3 >>> 4
...allotted time has expired !
2 1 4 2 0 0 0 0 0 0 
************************
live = 0

 

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

guliyev34 пишет:

Я сейчас хочу чтобы у меня высвечивалась индикация постоянно. Начальное значени жизней 3. Но СД не горят, так как в функции только (1, 2, 4, 7)... 

.....нууууу, добавь вывод "3" , это я копировал с СД_задание и забыл про состояние ТРИ :)-

guliyev34
Offline
Зарегистрирован: 17.03.2015

SU-27-16 пишет:

guliyev34 пишет:

Я сейчас хочу чтобы у меня высвечивалась индикация постоянно. Начальное значени жизней 3. Но СД не горят, так как в функции только (1, 2, 4, 7)... 

.....нууууу, добавь вывод "3" , это я копировал с СД_задание и забыл про состояние ТРИ :)-

А я то думал))) Смотрю что-то не то, но никак не пойму)) Вот видео, посмотри))) https://vk.com/video?z=video241015053_171357613%2Falbum241015053 только качество плохое(( Снимал HD, при загрузке испортилось

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

Честно? Я так и не понял почему вместо 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

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

кидай на ютуб , с vk у миня не грузится :(

загораются ли светики на время нажатия кнопок ?

guliyev34
Offline
Зарегистрирован: 17.03.2015

SU-27-16 пишет:

кидай на ютуб , с vk у миня не грузится :(

загораются ли светики на время нажатия кнопок ?

неа, не загораются. В коде этого же нет вроде. сейчас загружу

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

строки 75 и 84 , и ............ , и ..........................

guliyev34
Offline
Зарегистрирован: 17.03.2015
guliyev34
Offline
Зарегистрирован: 17.03.2015

SU-27-16 пишет:

строки 75 и 84 , и ............ , и ..........................

по-моему что-то не то...

guliyev34
Offline
Зарегистрирован: 17.03.2015

Это все я понимаю про двоичную систему! Но. Мы функцией записывает в переменную типа byte значени выбранное случайным образом. byte принимает значение от 0 до 255. Рандом выбрал 1, мы и записываем 1. Не 001, а именно 1. Рандом выбрал 2, мы записали 2, а не 010. И потом, когда мы уже запускаем светодиоды. Мы проверяем case 1:, case2. Вот я даже поменял сейчас.. вместо 4, поставил 3. и все работает отлично, никакие 2 Сд не загораются... Я не прав? 

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

а ты кнопки подольше удерживай :)

guliyev34
Offline
Зарегистрирован: 17.03.2015

SU-27-16 пишет:

а ты кнопки подольше удерживай :)

Удерживаю дольше, отнимается жизнь(( 

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

guliyev34 пишет:

Это все я понимаю про двоичную систему! Но. Мы функцией записывает в переменную типа 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

guliyev34
Offline
Зарегистрирован: 17.03.2015

SU-27-16 пишет:

guliyev34 пишет:

Это все я понимаю про двоичную систему! Но. Мы функцией записывает в переменную типа 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


Ура, все же я был прав) А вот тепеРь еще важнее вопрос... Почему если долго удерживаю кнопку, не работает? Это из-за задержки? Так что же поставить? Или что делать? Ведь люди то разные)

guliyev34
Offline
Зарегистрирован: 17.03.2015

SU-27-16 пишет:

guliyev34 пишет:

Это все я понимаю про двоичную систему! Но. Мы функцией записывает в переменную типа 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


Ура, все же я был прав) А вот тепеРь еще важнее вопрос... Почему если долго удерживаю кнопку, не работает? Это из-за задержки? Так что же поставить? Или что делать? Ведь люди то разные)

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

рандом(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 - но все эти значения не нужны по задаче :)

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

во вторник посмотрим.....

guliyev34
Offline
Зарегистрирован: 17.03.2015

SU-27-16 пишет:

рандом(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. Это не будет оошибкой)

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

ошибкой это не будет... можно отобразить любое число на любые СД
- 0000 = зажечь четыре СД
- 1011 = зажечь первый и четвёртый
..........и получить в дальнейшем геморрой :(

основное - привязка-отображение СД к номеру бита в байте ! этому надо следовать всегда, даже при простоте вашей игрушки....
.....перейдёте на управление СД через последПараллельнРегистр или введёте семисегментные индикаторы для отображения колва жизней и номера текущего уровня - запутаетесь сразу :(

не проще ли сразу следовать логике битового отображения СД для любых задач ?

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

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

guliyev34
Offline
Зарегистрирован: 17.03.2015

SU-27-16 пишет:

ошибкой это не будет... можно отобразить любое число на любые СД
- 0000 = зажечь четыре СД
- 1011 = зажечь первый и четвёртый
..........и получить в дальнейшем геморрой :(

основное - привязка-отображение СД к номеру бита в байте ! этому надо следовать всегда, даже при простоте вашей игрушки....
.....перейдёте на управление СД через последПараллельнРегистр или введёте семисегментные индикаторы для отображения колва жизней и номера текущего уровня - запутаетесь сразу :(

не проще ли сразу следовать логике битового отображения СД для любых задач ?

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

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

Кошмар) Ну я понимаю о чем ты) Семисегментный индикатор по тому же принципу делается? У меня есть индикатор такой от стратого компьютера. Можно же сделать отображение на нем уровня( или жизней)? Это надо через микросхему драйвера делать ? НУ и еще, к нашей задаче. Почему если держать долго кнопку, он не сработает как надо? Задержка?  

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

Ну а вот я поставлю 4 светодиода. Я же могу выбрать значения от 1 до 4 и все

о чём и речь.... пишем функцию вывода байта ( 8 СД ) или 2-ух байтов ( 16 СД ) для всех значений.... и забываем о ней ( об её реализации ) , кстати через swith-case - устанете прописывать все 256 комбинаций для байта и 65535 комбинаций для двух байтов :)-
а через порты - легко и быстро

ничто не мешает в нужном месте вызывать функцию вкл СД с нужным параметром
- один из четырёх - 0001   0010   0100   1000
- один из восьми - 00000001   00000010   00000100   00001000   00010000   00100000   01000000   10000000

нет ?

guliyev34
Offline
Зарегистрирован: 17.03.2015

SU-27-16 пишет:

Ну а вот я поставлю 4 светодиода. Я же могу выбрать значения от 1 до 4 и все

о чём и речь.... пишем функцию вывода байта ( 8 СД ) или 2-ух байтов ( 16 СД ) для всех значений.... и забываем о ней ( об её реализации ) , кстати через swith-case - устанете прописывать все 256 комбинаций для байта и 65535 комбинаций для двух байтов :)-
а через порты - легко и быстро

ничто не мешает в нужном месте вызывать функцию вкл СД с нужным параметром
- один из четырёх - 0001   0010   0100   1000
- один из восьми - 00000001   00000010   00000100   00001000   00010000   00100000   01000000   10000000

нет ?

Ну да, ты прав) 

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

Кошмар) Ну я понимаю о чем ты) Семисегментный индикатор по тому же принципу делается? У меня есть индикатор такой от стратого компьютера. Можно же сделать отображение на нем уровня( или жизней)? Это надо через микросхему драйвера делать ?

ничё сложного....

НУ и еще, к нашей задаче. Почему если держать долго кнопку, он не сработает как надо? Задержка?

с суток... посплю, соберу, протестю....

guliyev34
Offline
Зарегистрирован: 17.03.2015

SU-27-16 пишет:

Кошмар) Ну я понимаю о чем ты) Семисегментный индикатор по тому же принципу делается? У меня есть индикатор такой от стратого компьютера. Можно же сделать отображение на нем уровня( или жизней)? Это надо через микросхему драйвера делать ?

ничё сложного....

НУ и еще, к нашей задаче. Почему если держать долго кнопку, он не сработает как надо? Задержка?

с суток... посплю, соберу, протестю....

Спасибо) 

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