Go Down

Topic: Error almacenamiento matriz NxM (Read 99 times) previous topic - next topic

cesar021

Hola buenas tardes, quisiera saber si alguien detecta el error en el siguiente codigo, debido a que almacena los valores correctamente en las variables, pero a la hora de almacenar en la matriz almacena cualquier dato. ejemplo con valores almacenados
pin=2; horaPinOn=10;minOn=0;horaPinOff=12;minOff=0;

Me muestra en pantalla lo siguiente
DATO: 45
DATO: 18
DATO: 17
DATO: 2
DATO: 10
DATO: 0
DATO: 20
DATO: 16
DATO: 0
DATO: 6
DATO: 544
DATO: 6
DATO: 864
DATO: 2286
DATO: 31
DATO: -18248
DATO: 16312
DATO: 3855
DATO: 48

Adjunto Codigo
Code: [Select]
#include <SoftwareSerial.h>
#include <SPI.h>      // incluye libreria bus SPI
#include <RTClib.h>

SoftwareSerial miBT(6,7);


int dato;
int pin;
int vuelta;
int horaPinOn;
int minutoPinOn;
int horaPinOff;
int minutoPinOff;
int automatiza[4][5]={{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};
int cont=0;
RTC_DS1307 RTC;
char sale;
String readString;
char c=miBT.read();

void setup() {
  Serial.begin(9600);
  miBT.begin(38400);
  RTC.begin();

}

//INICIO DEL PROGRAMA
void loop() {

  c="";
  readString="";
 
  while(miBT.available()){
    c=miBT.read();
    readString+=c;
  }
   if(readString.length()>0){
           
    if (readString =="UNO"){
       pin=1;
       vuelta++;}
    if (readString =="DOS"){
       pin=2;
       vuelta++;}
    if (readString =="TRES"){
       pin=3;
       vuelta++;}
    if (readString =="CUATRO"){
       pin=4;
       vuelta++;}
    if (readString =="CINCO"){
       pin=5;
       vuelta++;}
    if (readString =="SEIS"){
       pin=6;
       vuelta++;}
    if (readString =="SIETE"){
       pin=7;
       vuelta++;}
    if (readString =="OCHO"){
       pin=8;
       vuelta++;}
    if (readString =="NUEVE"){
       pin=9;
       vuelta++;}
    if (readString =="DIEZ"){
       pin=10;
       vuelta++;}
    if (readString =="ONCE"){
       pin=11;
       vuelta++;}
    if (readString =="DOCE"){
       pin=12;
       vuelta++;}
    if (readString =="TRECE"){
       pin=13;
       vuelta++;}
    if (readString =="CATORCE"){
       pin=14;
       vuelta++;}
    if (readString =="QUINCE"){
       pin=15;
       vuelta++;}
    if (readString =="DIECISEIS"){
       pin=16;
       vuelta++;}
    if (readString =="DIECISIETE"){
       pin=17;
       vuelta++;}
    if (readString =="DIECIOCHO"){
       pin=18;
       vuelta++;}
    if (readString =="DIECINUEVE"){
       pin=19;
       vuelta++;}
    if (readString =="VEINTE"){
       pin=20;
       vuelta++;}
    if (readString =="VEINTIUNO"){
       pin=21;
       vuelta++;}
    if (readString =="VEINTIDOS"){
       pin=22;
       vuelta++;}
    if (readString =="VEINTITRES"){
       pin=23;
       vuelta++;}
    if (readString =="VEINTICUATRO"){
       pin=24;
       vuelta++;}
    if (readString =="TREINTA"){
       pin=30;
       vuelta++;}
    if (readString =="CUACINCO"){
       pin=45;
       vuelta++;}
    if (readString =="CERO"){
       pin=0;
       vuelta++;}
    }
   if(vuelta==1){
     dato=pin;

   }else if(vuelta==2){
     horaPinOn=pin;

   }else if(vuelta==3){
     minutoPinOn=pin; 

   }else if(vuelta==4){
     horaPinOff=pin;

   }else if(vuelta==5){
     minutoPinOff=pin;
     cont++;
     vuelta=0;
     comparaPin(cont,dato,horaPinOn,minutoPinOn,horaPinOff,minutoPinOff,automatiza[4][5]);
   }
     delay(200);
 }



void comparaPin(int cont,int dato,int horaPinOn,int minutoPinOn,int horaPinOff,int minutoPinOff, int automatiza[4][5]){
  char p;
  int listo;
   for(int i=0;i<4;i++){
    if(dato==automatiza[i][0]){
      automatiza[i][0]=dato;
      automatiza[i][1]=horaPinOn;
      automatiza[i][2]=minutoPinOn;
      automatiza[i][3]=horaPinOff;
      automatiza[i][4]=minutoPinOff;
      sale=1;
      p='A';//DEVUELVE ACTUALIZA
    }
  }
  if(cont==1 && sale==0){
    automatiza[0][0]=dato;
    automatiza[0][1]=horaPinOn;
    automatiza[0][2]=minutoPinOn;
    automatiza[0][3]=horaPinOff;
    automatiza[0][4]=minutoPinOff;
    sale=1; //DEVUELVE OK
    p='B';
    }
  if (cont==2 && sale==0){
    automatiza[1][0]=dato;
    automatiza[1][1]=horaPinOn;
    automatiza[1][2]=minutoPinOn;
    automatiza[1][3]=horaPinOff;
    automatiza[1][4]=minutoPinOff;
    sale=1; //DEVUELVE OK
    p='B';
    }
  if (cont==3 && sale==0){
    automatiza[2][0]=dato;
    automatiza[2][1]=horaPinOn;
    automatiza[2][2]=minutoPinOn;
    automatiza[2][3]=horaPinOff;
    automatiza[2][4]=minutoPinOff;
    sale=1; //DEVUELVE OK
    p='B';
    }
  if (cont==4 && sale==0){
    automatiza[3][0]=dato;
    automatiza[3][1]=horaPinOn;
    automatiza[3][2]=minutoPinOn;
    automatiza[3][3]=horaPinOff;
    automatiza[3][4]=minutoPinOff;
    sale=1; //DEVUELVE OK
    p='B';
    }
    if (cont==5 && sale==0){
    automatiza[0][0]=dato;
    automatiza[0][1]=horaPinOn;
    automatiza[0][2]=minutoPinOn;
    automatiza[0][3]=horaPinOff;
    automatiza[0][4]=minutoPinOff;
    sale=1; //PIN 1 REEMPLAZADO
    cont--;
    p='C';
    }
   sale=0;
   Serial.print("PIN: ");Serial.println(dato);
   Serial.print("HORAON: ");Serial.println(horaPinOn);
   Serial.print("MINON: ");Serial.println(minutoPinOn);
   Serial.print("HORAOFF: ");Serial.println(horaPinOff);
   Serial.print("MINOFF: ");Serial.println(minutoPinOff);
   for(int a=0;a<4;a++){
    for(int b=0;b<5;b++){
         Serial.print("DATO: ");Serial.println(automatiza[a][b]);
    }
   }

   miBT.write(p);
}



surbyte

#1
Oct 22, 2019, 01:39 am Last Edit: Oct 22, 2019, 01:41 am by surbyte
Bueno el pasaje de un multiarray a una función no es tan simple como lo que has hecho.
Te dejo como debe ser

Code: [Select]
#include <SoftwareSerial.h>
#include <SPI.h>      // incluye libreria bus SPI
#include <RTClib.h>

SoftwareSerial miBT(6,7);


int dato;
int pin;
int vuelta;
int horaPinOn;
int minutoPinOn;
int horaPinOff;
int minutoPinOff;

int automata[][5] = {{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};

int cont=0;
RTC_DS1307 RTC;
char sale;
String readString;
char c;

void setup() {
  Serial.begin(9600);
  miBT.begin(38400);
  RTC.begin();

}

//INICIO DEL PROGRAMA
void loop() {

  c = 0;  // Esto me daba error tal como lo definiste.
  readString="";
 
  while(Serial.available()){
    c = miBT.read();
    readString+=c;
  }
   if(readString.length()>0){
           
    if (readString =="UNO"){
       pin=1;
       vuelta++;}
    if (readString =="DOS"){
       pin=2;
       vuelta++;}
    if (readString =="TRES"){
       pin=3;
       vuelta++;}
    if (readString =="CUATRO"){
       pin=4;
       vuelta++;}
    if (readString =="CINCO"){
       pin=5;
       vuelta++;}
    if (readString =="SEIS"){
       pin=6;
       vuelta++;}
    if (readString =="SIETE"){
       pin=7;
       vuelta++;}
    if (readString =="OCHO"){
       pin=8;
       vuelta++;}
    if (readString =="NUEVE"){
       pin=9;
       vuelta++;}
    if (readString =="DIEZ"){
       pin=10;
       vuelta++;}
    if (readString =="ONCE"){
       pin=11;
       vuelta++;}
    if (readString =="DOCE"){
       pin=12;
       vuelta++;}
    if (readString =="TRECE"){
       pin=13;
       vuelta++;}
    if (readString =="CATORCE"){
       pin=14;
       vuelta++;}
    if (readString =="QUINCE"){
       pin=15;
       vuelta++;}
    if (readString =="DIECISEIS"){
       pin=16;
       vuelta++;}
    if (readString =="DIECISIETE"){
       pin=17;
       vuelta++;}
    if (readString =="DIECIOCHO"){
       pin=18;
       vuelta++;}
    if (readString =="DIECINUEVE"){
       pin=19;
       vuelta++;}
    if (readString =="VEINTE"){
       pin=20;
       vuelta++;}
    if (readString =="VEINTIUNO"){
       pin=21;
       vuelta++;}
    if (readString =="VEINTIDOS"){
       pin=22;
       vuelta++;}
    if (readString =="VEINTITRES"){
       pin=23;
       vuelta++;}
    if (readString =="VEINTICUATRO"){
       pin=24;
       vuelta++;}
    if (readString =="TREINTA"){
       pin=30;
       vuelta++;}
    if (readString =="CUACINCO"){
       pin=45;
       vuelta++;}
    if (readString =="CERO"){
       pin=0;
       vuelta++;}
    }
   if(vuelta==1){
     dato=pin;

   }else if(vuelta==2){
     horaPinOn=pin;

   }else if(vuelta==3){
     minutoPinOn=pin;

   }else if(vuelta==4){
     horaPinOff=pin;

   }else if(vuelta==5){
     minutoPinOff=pin;
     cont++;
     vuelta=0;
     comparaPin(cont,dato,horaPinOn,minutoPinOn,horaPinOff,minutoPinOff,automata);
   }
     delay(200);
 }



void comparaPin(int cont,int dato,int horaPinOn,int minutoPinOn,int horaPinOff,int minutoPinOff, int automatiza[][5]){

  char p;
  int listo;
   for(int i=0;i<sizeof(automatiza)/sizeof(automatiza[0]);i++){
    if(dato==automatiza[i][0]){
      automatiza[i][0]=dato;
      automatiza[i][1]=horaPinOn;
      automatiza[i][2]=minutoPinOn;
      automatiza[i][3]=horaPinOff;
      automatiza[i][4]=minutoPinOff;
      sale=1;
      p='A';//DEVUELVE ACTUALIZA
    }
  }
  if(cont==1 && sale==0){
    automatiza[0][0]=dato;
    automatiza[0][1]=horaPinOn;
    automatiza[0][2]=minutoPinOn;
    automatiza[0][3]=horaPinOff;
    automatiza[0][4]=minutoPinOff;
    sale=1; //DEVUELVE OK
    p='B';
    }
  if (cont==2 && sale==0){
    automatiza[1][0]=dato;
    automatiza[1][1]=horaPinOn;
    automatiza[1][2]=minutoPinOn;
    automatiza[1][3]=horaPinOff;
    automatiza[1][4]=minutoPinOff;
    sale=1; //DEVUELVE OK
    p='B';
    }
  if (cont==3 && sale==0){
    automatiza[2][0]=dato;
    automatiza[2][1]=horaPinOn;
    automatiza[2][2]=minutoPinOn;
    automatiza[2][3]=horaPinOff;
    automatiza[2][4]=minutoPinOff;
    sale=1; //DEVUELVE OK
    p='B';
    }
  if (cont==4 && sale==0){
    automatiza[3][0]=dato;
    automatiza[3][1]=horaPinOn;
    automatiza[3][2]=minutoPinOn;
    automatiza[3][3]=horaPinOff;
    automatiza[3][4]=minutoPinOff;
    sale=1; //DEVUELVE OK
    p='B';
    }
    if (cont==5 && sale==0){
    automatiza[0][0]=dato;
    automatiza[0][1]=horaPinOn;
    automatiza[0][2]=minutoPinOn;
    automatiza[0][3]=horaPinOff;
    automatiza[0][4]=minutoPinOff;
    sale=1; //PIN 1 REEMPLAZADO
    cont--;
    p='C';
    }
   sale=0;
   Serial.print("PIN: ");Serial.println(dato);
   Serial.print("HORAON: ");Serial.println(horaPinOn);
   Serial.print("MINON: ");Serial.println(minutoPinOn);
   Serial.print("HORAOFF: ");Serial.println(horaPinOff);
   Serial.print("MINOFF: ");Serial.println(minutoPinOff);
   for(int a=0;a<4;a++){
    for(int b=0;b<5;b++){
         Serial.print("DATO: ");Serial.println(automatiza[a][b]);
    }
   }

   miBT.write(p);
}

cesar021

Modifique lo que me sugeriste, pero sigo con el mismo problema..

surbyte

La matriz asi pasa debidamente sus datos.

Pero explica porque no entendí el problema entonces.

cesar021

Explico mas detallado, tengo una app, donde tengo números del 0 al 24 ademas el 30 y 45.
Al accionar un botón, envía el numero indicado, lo compara, y lo va almacenando según el numero de veces que se ingreso el dato.
1ro lee el pin con el cual va a trabajar dato;
2do lee la hora de encendido horaPinOn;
3ro lee minuto de encendido minOn;
4to lee hora apagado horaPinOn;
5to lee minto apagado minOff;

Esto se va almacenando respectivamente en cada variable según el dato ingresado.
Hasta ahi todo correcto, puedo almacenar y ver los datos correctamente
El problema es cuando paso los datos a la matriz.

cuando ingreso por ejemplo
pin 1;
horaPinOn 3;
minOn 0;
horaPinOff 5;
minOff 0;

Me muestra lo siguiente
PIN: 1
HORAON: 3
MINON: 0
HORAOFF: 5
MINOFF: 0           ----------- HASTA ACA TODO OK
                               
DATO: 244
DATO: 0
DATO: 12
DATO: 0
DATO: 1
DATO: 3
DATO: 0
DATO: 20
DATO: 16
DATO: 0
DATO: 6
DATO: 544
DATO: 6
DATO: 864
DATO: 2287
DATO: 31
DATO: -18248
DATO: 12216
DATO: 3855
DATO: 48



cesar021

Ya pude solucionar, creo que el problema estaba en el llamado a la funcion

Code: [Select]
comparaPin(cont,dato,horaPinOn,minutoPinOn,horaPinOff,minutoPinOff,automatiza);

y esta linea
Code: [Select]

void comparaPin(int cont,int dato,int horaPinOn,int minutoPinOn,int horaPinOff,int minutoPinOff, int automatiza[4][5]){


Muchas gracias por las respuestas

Go Up