Обнуление массива, запутался.

Илья73
Offline
Зарегистрирован: 06.09.2013

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

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

const int StD=17;        
const int Q[4]={3,4,19,18};          
int key;
int n =0;
int led = 13;
int k[10];  //массив ключа
int z[9];   // массив замка
int pos = 0;
int var=0;

void setup()
{
  Serial.begin(9600);
  
  for(int i=0;i<4;i++)
  pinMode(Q[i],INPUT); 
  pinMode (17,INPUT); 
  pinMode (13,1);
  z[0]=1;
  z[1]=2;
  z[2]=3;
  z[3]=4; //0
  z[4]=5; //#
  z[5]=6;
  z[6]=7;
  z[7]=8;
  z[8]=9;
  
}

void loop()
{
  key=0;
  for(int i=0;i<4;i++)
  key+=digitalRead(Q[i])<<i; 
  if(digitalRead(17)==1 && var==0)
    {
      var=1;     //записываем в массив код
      k[pos] = key;
      pos++;            
    }
    if(digitalRead(17)==0) {var=0;}
    if(key==11) for (int n=0; n <9; n++) { k[n] = 0;  } //если запутались с вводом нажимаем (*) и обнуляем массив
     
      if(k[0]==z[0]&&k[1]==z[1]&&k[2]==z[2]&&k[3]==z[3]&&k[4]==z[4]&&k[5]==z[5]&&k[6]==z[6]&&k[7]==z[7]&&k[8]==z[8])
     {
        digitalWrite(13,1);
        Serial.println("open");
        delay(3000);
        digitalWrite(13,0);
        for (int n=0; n <9; n++) { k[n] = 0;  } //правильный код получен теперь обнуляем массив
     }
 
       
        int i;
      for (i = 0; i < 9; i = i + 1) 
      { Serial.println(k[i]);}   //смотрим все что творится в массиве через монитор.
}   

 

maksim
Offline
Зарегистрирован: 12.02.2012

Необходимо обнулять переменную pos.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

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

 

Илья73
Offline
Зарегистрирован: 06.09.2013

на счет переполнения pos понял, исправлю. Но пока проблема осталась, не пишет после сброса.

 

const int StD=17;        
const int Q[4]={3,4,19,18};          
int key;
int n =0;
int led = 13;
int k[10];  //массив ключа
int z[9];   // массив замка
int pos;
int var=0;

void setup()
{
  Serial.begin(9600);
  
  for(int i=0;i<4;i++)
  pinMode(Q[i],INPUT); 
  pinMode (17,INPUT); 
  pinMode (13,1);
  z[0]=1;
  z[1]=2;
  z[2]=3;
  z[3]=4; //0
  z[4]=5; //#
  z[5]=6;
  z[6]=7;
  z[7]=8;
  z[8]=9;
  
}

void loop()
{
  key=0;
  for(int i=0;i<4;i++)
  key+=digitalRead(Q[i])<<i; 
  if(digitalRead(17)==1 && var==0)
  
    {
      var=1;     
      k[pos] = key;  //записываем в массив код
      pos++;      
    }
    if(digitalRead(17)==0) {var=0;}   
    {     
      if(key==11) for (pos=0; pos <9; pos++) { k[pos] = 0;  } //если запутались с вводом нажимаем (*) и обнуляем массив
      if(k[0]==z[0]&&k[1]==z[1]&&k[2]==z[2]&&k[3]==z[3]&&k[4]==z[4]&&k[5]==z[5]&&k[6]==z[6]&&k[7]==z[7]&&k[8]==z[8])
     {
        digitalWrite(13,1);
        Serial.println("open");
        delay(3000);
        digitalWrite(13,0);
        for (pos=0; pos <9; pos++) { k[pos] = 0;  } //правильный код получен теперь обнуляем массив
     }
       int i;
       for (i = 0; i < 9; i = i + 1) 
      { Serial.println(k[i]);}   //смотрим все что творится в массиве через монитор.
      
     } 
  } 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Илья73 пишет:

на счет переполнения pos понял, исправлю. Но пока проблема осталась, не пишет после сброса.

Проблема осталась, потому что не поняли.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Не рекомендую одну и ту же переменную использовать для разных целей, это грабли

maksim
Offline
Зарегистрирован: 12.02.2012
const byte StD = 17;        
const byte Q[4] = {3,4,19,18}; 
const byte led = 13;

byte key = 0, var = 0, pos = 0;
byte k[9];  // массив ключа
byte z[9] = {1,2,3,4,5,6,7,8,9};  // массив замка

void setup()
{
  Serial.begin(9600);
  for(byte i = 0; i < 4; i++) pinMode(Q[i],INPUT); 
  pinMode (StD, INPUT); 
  pinMode (led, OUTPUT);
}

void loop()
{
  if(digitalRead(StD) == 1  && var == 0)
  {
    key = 0;
    for(byte i = 0; i < 4; i++) key += digitalRead(Q[i]) << i;
    k[pos] = key;
    pos++;
    Serial.println(key);
    
    if(key == 11) //если запутались с вводом нажимаем (*)
    {
      memset(k, 0, 9); // обнуляем массив
      pos = 0;
    }

    if(pos == 9)
    {
      if(!memcmp(k, z, 9)) // правильный код получен
      {
        digitalWrite(led, 1);
        Serial.println("open");
        delay(3000);
        digitalWrite(led, 0);
      }
      memset(k, 0, 9); // обнуляем массив
      pos = 0;
    }
    var = 1;
  }
  else if(digitalRead(StD) == 0) var = 0;
}   

 

Илья73
Offline
Зарегистрирован: 06.09.2013

maksim, спасибо за готовый код! Все заработало как и положено.

А что это такое    memset(k, 0, 9); ни где не видел такой записи в массив

Илья73
Offline
Зарегистрирован: 06.09.2013

Нашел, это функция из С. Теперь понятно.