Arduino Forum

International => Español => Topic started by: PascuaL on Mar 11, 2013, 04:35 pm

Title: Comparación datos de cadena con EEPROM (SOLUCIONADO)
Post by: PascuaL on Mar 11, 2013, 04:35 pm
Buenas.
Vuelvo a tener un pequeño problema con comparar unos datos.

Este código si recibe 1111 entra en modo cambiar clave. Los siguiente 4 números que vuelvas a introducir, son la nueva clave y por tanto los guarda en la EEPROM.

Quote

#include <EEPROM.h>
char cadena[5];
byte contador=0;

   int valor='valor-48';
   int valor1='valor1-48';
   int valor2='valor2-48';//Conversión ASCII a entero
   int valor3='valor3-48';
   
   

boolean cambioclave=false;

char usuario[5]={valor,valor1,valor2,valor3};
char cambio[5]={'1','1','1','1'};

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

void loop()
{
 if(Serial.available())
  {
    while (Serial.available()>0)
    {
    delay(5);
    cadena[contador]=Serial.read();
    contador++;
    }
   
    contador=0;
   
     if (cadena[0]==cambio[0]&&cadena[1]==cambio[1]&&cadena[2]==cambio[2]&&cadena[3]==cambio[3])
      { cambioclave=true;
      }
   
   
   
   
   

if (cambioclave==true){

      Serial.print("Introduce la nueva clave.");

      EEPROM.write(0, cadena[0]);
      EEPROM.write(1, cadena[1]);//Guardo cada uno en cada posicion
      EEPROM.write(2, cadena[2]);
      EEPROM.write(3, cadena[3]);
         
       valor =EEPROM.read(0);
       valor =EEPROM.read(1);
       valor =EEPROM.read(2);
       valor =EEPROM.read(3);
       
       cambioclave=false;

       
       }
}



   if (cadena[0]==usuario[0]&&cadena[1]==usuario[1]&&cadena[2]==usuario[2]&&cadena[3]==usuario[3])//si la clave es correcta...
      { Serial.print("Acceso aceptado");
      }else{
        Serial.print("Acceso denegado");
      }
       



   


  }



El problema viene cuando meto la nueva clave para que me salga Acceso aceptado, no funciona.
Gracias por su ayuda y atención.
Title: Re: Comparación datos de cadena con EEPROM
Post by: curro92 on Mar 11, 2013, 05:15 pm
Hola,

Creo que no has corregido esto, que tendría que empezar desde cero:
if (cadena[1]==cambio[1]&&cadena[2]==cambio[2]&&cadena[3]==cambio[3]&&cadena[4]==cambio[4])
 
Y para comparar dos cadenas tienes una función strcmp()

En lugar de
if (cadena[0]==usuario[0]&&cadena[1]==usuario[1]&&cadena[2]==usuario[2]&&cadena[3]==usuario[3])
puedes hacer
if(strcmp(cadena, usuario) == 0)
Title: Re: Comparación datos de cadena con EEPROM
Post by: PascuaL on Mar 11, 2013, 05:20 pm
Perdón, sí estaba corregido, pero he copiado y pegado del foro...en cuanto a esa función quiero usarla más adelante una vez tenga claro esto.

¿Se te ocurre por qué no funciona? Yo creo que es por las ' ' que llevan... pero son necesarias ya que es una cadena. Digo que son las ' ' porque si hago un Serial.print  de los valores, me salen muchísimos números.
Title: Re: Comparación datos de cadena con EEPROM
Post by: PascuaL on Mar 11, 2013, 05:28 pm
Por ejemplo introduzco 4578 y me imprime 2853029233292342923.
Title: Re: Comparación datos de cadena con EEPROM
Post by: PascuaL on Mar 11, 2013, 05:44 pm
Vamos a ver.

Recibo por serie 4 números y los meto en estas variables:
Quote


int numero1=cadena[0];
int numero2=cadena[1];
int numero3=cadena[2];
int numero4=cadena[3];



EEPROM.write(0, numero1);
EEPROM.write(1, numero2);
EEPROM.write(2,numero3);
EEPROM.write(3, numero4);



Ahora los leo con serial y me salen en ASCII, les resto 48 para que sean enteros y los mando a comparar...

...y lo que pasa es, que al poner ' 'aquí -> char usuario[5]={'numero1','numero2','numero3','numero4'};  SE LÍA PARDA, porque esas' ' hacen algún tipo de conversión, y al condicional en vez de llegarle el código correcto le llegan muchísimos números, y claro, pues no lo acepta como válido.
Title: Re: Comparación datos de cadena con EEPROM
Post by: PascuaL on Mar 11, 2013, 06:33 pm
En Adafruit comentaban el caso..he probado y nada =(
http://translate.google.es/translate?hl=es&sl=en&u=http://forums.adafruit.com/viewtopic.php%3Ff%3D25%26t%3D25264&prev=/search%3Fq%3Dadafruit%2Bstring%2Bto%2Bint%26hl%3Des%26client%3Dsafari%26rls%3Den&sa=X&ei=0BI-Uee6OOSP7AaNz4DYBw&ved=0CDQQ7gEwAA (http://translate.google.es/translate?hl=es&sl=en&u=http://forums.adafruit.com/viewtopic.php%3Ff%3D25%26t%3D25264&prev=/search%3Fq%3Dadafruit%2Bstring%2Bto%2Bint%26hl%3Des%26client%3Dsafari%26rls%3Den&sa=X&ei=0BI-Uee6OOSP7AaNz4DYBw&ved=0CDQQ7gEwAA)
Quote


num = num * 10 + (cadena[0] - '0');
           EEPROM.write(0, num);
           
           num1 = num1 * 10 + (cadena[1] - '0');
           EEPROM.write(0, num);
           
           num2 = num2 * 10 + (cadena[2] - '0');  //ES LO MISMO QUE USAR atoi...
           EEPROM.write(0, num);
           
           num3 = num3 * 10 + (cadena[3] - '0');
           EEPROM.write(0, num);
     



Quote

           char usuario[5]={'num','num1','num2','num3'};

Title: Re: Comparación datos de cadena con EEPROM
Post by: noter on Mar 11, 2013, 07:01 pm
¿Quizás así?
Code: [Select]
void setup() {
  Serial.begin(9600);

}

void loop() {
  int recibido;
  if(Serial.available()){
      recibido=Serial.parseInt();
      if(recibido=1111)
        Serial.print("Recibido entero 1111");
  }
}
Title: Re: Comparación datos de cadena con EEPROM
Post by: PascuaL on Mar 11, 2013, 07:14 pm

¿Quizás así?
Code: [Select]
void setup() {
  Serial.begin(9600);

}

void loop() {
  int recibido;
  if(Serial.available()){
      recibido=Serial.parseInt();
      if(recibido=1111)
        Serial.print("Recibido entero 1111");
  }
}




Es que si hago eso ya tendría que remodificar todo el código. Además quiero que compare digito a dígito.
¿Qué opinas?
Title: Re: Comparación datos de cadena con EEPROM
Post by: PascuaL on Mar 11, 2013, 07:18 pm
Si yo hago así, me acepta el código:
Quote

int t='0';
int t1='0';
int t2='0';
int t3='0';
unsigned long num = t;
unsigned long num1 = t1;
unsigned long num2 = t2;
unsigned long num3 = t3;
char usuario[5]={num,num1,num2,num3};


En cambio, si hago así no:(lógico porque lo convierto a char...entonces,¿qué hago?)
Quote

int t=0;
int t1=0;
int t2=0;
int t3=0;
unsigned long num = 't';
unsigned long num1 = 't1';
unsigned long num2 = 't2';
unsigned long num3 = 't3';
char usuario[5]={num,num1,num2,num3};



El error es ese, que el char no pilla los 't', 't1','t2' y 't3'.
Title: Re: Comparación datos de cadena con EEPROM
Post by: PascuaL on Mar 11, 2013, 08:53 pm
Vale, la solución es hacer una función que cuando le metas un número te devuelva el número entre ' ', así ya lo reconoce el array.
¿Alguna sugerencia?
Title: Re: Comparación datos de cadena con EEPROM
Post by: noter on Mar 11, 2013, 09:08 pm
¿Qué se supone que hace este comando, por ejemplo?
unsigned long num1 = 't1';
Title: Re: Comparación datos de cadena con EEPROM
Post by: PascuaL on Mar 11, 2013, 10:04 pm

¿Qué se supone que hace este comando, por ejemplo?
unsigned long num1 = 't1';

' Yo suponía ' que ese comando iba a convertir en char lo que contuviera t1.
Title: Re: Comparación datos de cadena con EEPROM
Post by: noter on Mar 11, 2013, 11:06 pm
Ese comando, convierte a unsigned long no sé muy bien el qué. Yo el único uso que conozco de las comillas simples es el de asignar el valor de un caracter a algo, es decir, su valor ascii. En tu primer ejemplo:
Quote
int t='0';
int t1='0';
int t2='0';
int t3='0';
unsigned long num = t;
unsigned long num1 = t1;
unsigned long num2 = t2;
unsigned long num3 = t3;
char usuario[5]={num,num1,num2,num3};


Podrías, perfectamente, haber asignado directamente char usuario[5]={t,t1,t2,t3} (por cierto, usuario[4] no lo usas) y el array contendría los valores ascii de t-t3. Sin pasos intermedios, podrías almacenar directamente char usuario[5]={'0','0','0','0'} y contendría lo mismo, y si lo que quieres es almacenar directamente un valor, en lugar de caracteres ascii, char usuario[5]={0,0,0,0} (sin las comillas simples).
A partir de aquí, ¿Qué vas a comparar? Si vas a cotejar byte a byte caracteres, no es necesario hacer conversiones, ya que si, por ejemplo char a='8', a=='8' independientemente de que en la memoria no haya un 8, sino el valor ascii de '8'. Si lo que deseas es obtener el valor 'puro' del dígito para realizar algún cálculo, deberás restar del ascii del dígito el valor ascii del cero, osea int x=a-'0', pero esto no tiene mucho sentido, a no ser que quieras crear una función para convertir varios dígitos en un int, que se haría más o menos así:
int valor;
char digitos[]={'1','7','6','8'};
valor=(digitos[0]-'0')*1000;
valor+=(digitos[1]-'0')*100;
valor+=(digitos[2]-'0')*10;
valor+=(digitos[1]-'0'); // Aquí valor contendría 1768
Title: Re: Comparación datos de cadena con EEPROM
Post by: PascuaL on Mar 11, 2013, 11:26 pm
Todo lo que has puesto lo he intentado. He convertido a ASCII por una función, luego por atoi.....Al final he hecho una función que devuelve el número que meto pero con 'x', que es lo que la string necesita.
Pero muchas gracias por tu ayuda, ahora necesito simplificar la función(ya que es muy extensa).
Title: Re: Comparación datos de cadena con EEPROM
Post by: PascuaL on Mar 11, 2013, 11:31 pm
Quote

por cierto, usuario[4] no lo usas)

Es obligatorio.
Title: Re: Comparación datos de cadena con EEPROM
Post by: noter on Mar 11, 2013, 11:56 pm

Todo lo que has puesto lo he intentado. He convertido a ASCII por una función, luego por atoi.....Al final he hecho una función que devuelve el número que meto pero con 'x', que es lo que la string necesita.
Pero muchas gracias por tu ayuda, ahora necesito simplificar la función(ya que es muy extensa).

Perdona, pero me está constando a veces bastante entenderte. En el código de tu primer post, comienzas con unas declaraciones "raras", del tipo

    int valor='valor-48';
¿Quiero entender que tienes valores de dígito directamente y quieres convertirlos a su caracter ascii?
en ese caso, si suponemos que tienes
int a= 1; int b=5; int c=8; int d=0;
podrías pasarlos a sus dígitos correspondientes así:
char micadena[4]={a+'0',b+'0',c+'0',d+'0']; // Mi cadena contendrá {'1','5','8','0'}

Title: Re: Comparación datos de cadena con EEPROM
Post by: PascuaL on Mar 12, 2013, 12:21 am
Después del primer post he ido actualizando el código para que se viera el progreso, y alguien que supiera, pudiera ayudarme.

En cuanto a las cadenas, hay que dejar una posición más para el carácter NULL.(http://arduino.cc/es/Reference/String)
Lo digo por,
Quote
char micadena[4]={a+'0',b+'0',c+'0',d+'0']; // Mi cadena contendrá {'1','5','8','0'}
Title: Re: Comparación datos de cadena con EEPROM
Post by: PascuaL on Mar 12, 2013, 10:40 am
Quote
Perdona, pero me está constando a veces bastante entenderte. En el código de tu primer post, comienzas con unas declaraciones "raras", del tipo

    int valor='valor-48';


Como bien he dicho, era para hacer la conversión de ASCII.
Title: Re: Comparación datos de cadena con EEPROM
Post by: noter on Mar 12, 2013, 04:16 pm

Quote
Perdona, pero me está constando a veces bastante entenderte. En el código de tu primer post, comienzas con unas declaraciones "raras", del tipo

    int valor='valor-48';


Como bien he dicho, era para hacer la conversión de ASCII.

Entonces no te compliques la vida; quita las comillas simples:
Valor de dígito a caracter:
char caracter=valor+48; // O char caracter=valor+'0'; pues supongo que 48 es el código ascii de '0'

Caracter de dígito a valor:
int valor=caracter-48; // O int valor=caracter-'0';
Title: Re: Comparación datos de cadena con EEPROM
Post by: PascuaL on Mar 12, 2013, 05:19 pm
LO TENGO.
Me habéis abierto los ojos entre los dos...con lo de la conversión estaba todo bien, pero a la hora de comparar no le restaba 48!!!!
Quote
if(cadena[0]-48==usuario[0]&&cadena[1]-48==usuario[1]&&cadena[2]-48==usuario[2]&&cadena[3]-48==usuario[3])





@noter y @curro92, muchas gracias a los dos! +1