Go Down

Topic: problemas trabajando con numeros de 5 decimales (Read 152 times) previous topic - next topic

emifassero

Buenas tardes:

Soy nuevo en el foro, y novato con arduino.

Tengo varios problemas con mi programa, quizas todos vienen del mismo origen.

Estoy trabajando con un arduino UNO.

Mi programa lo que deberia hacer es, a partir de dos coordenadas (latitud, y longitud) debo calcular una "linea" que una estos dos puntos. A su vez, debe crear una linea con los puntos consecutivos ( a todas las coordenadas (4) les sumo 1, y les resto 1).

1_ Uno de los problemas es que ingreso las coordenadas,  y cuando las quiero mostrar por el monitor serie, veo que difiere en su valor, SIN REALIZAR NINGUNA OPERACION.

2_ Luego al querer mostrar todos los puntos de la primer linea generada me aparecen 0,0. Pero al mirar el contenido del arreglo si tienen valor. reutilizando la misma funcion para calcular los valores son distintos de 0 

3_ Otro problema es que al modificar los valores para obtener un punto consecutivo, no se realiza la operacion igual en todas las coordenadas.

4_ Cuando quiero utilizar las 3 funciones "for" para mostrar el contenido de los arreglos, el monitor serie me mustra unos signos de pregunta y el programa termina ahi, pero utilizando dos funciones el programa corre "correctamente" por eso es que esta comentado.

En el archivo adjunto esta una imagen de lo que me muestra el monitor serie.

mi codigo.
Code: [Select]

#include <SoftwareSerial.h>//incluimos SoftwareSerial


float largadax1[70];
float largaday1[70];
float largadax10[70];
float largaday10[70];
float largadax12[70];
float largaday12[70];

long xo, yo, xi, yi, px, py;
int entx, enty, i, largadamax, largadamaxx1, largadamaxx2, x, y, entrada;
float lat0, lat1, lon0, lon1;

void crearlinea() {         // encargada de crear la linea de largada - engloba entero-bresenham-largada

  int j;

  entero();

  if (entrada == 0) {

    largadamaxx1 = bresenham();

    for (i = 0; i <= largadamaxx1; i++) {
      largadax10[i] = largadax1[i];
      largaday10[i] = largaday1[i];
    }

  }
  else {

    if (entrada == 1) {

      largadamaxx2 = bresenham();

      for (i = 0; i <= largadamaxx2; i++) {
        largadax12[i] = largadax1[i];
        largaday12[i] = largaday1[i];
      }

    }
    else {
      if (entrada == 2) {
        largadamax = bresenham();
      }
    }
  }

}

int bresenham() {          // crea la linea de largada
  int dy, dx, incyi, incxi, incyr, incxr, k, avr, av, avi, i;
  int x0, y0, x1, y1;
  i = 0;

  x0 = 0;
  y0 = 0;
  x1 = px;
  y1 = py;

  dy = (y1 - y0);
  dx = (x1 - x0);
  if (dy >= 0) {
    incyi = 1;
  }
  else {
    dy = -dy;
    incyi = -1;
  }
  if (dx >= 0) {
    incxi = 1;
  }
  else {
    dx = -dx;
    incxi = -1;
  }
  if (dx >= dy) {
    incyr = 0;
    incxr = incxi;
  }
  else {
    incxr = 0;
    incyr = incyi;
    k = dx;
    dx = dy;
    dy = k;
  }
  x = x0;
  y = y0;
  avr = 2 * dy;
  av = avr - dx;
  avi = av - dx;

  while ((x != x1)) {
    Serial.print(largadax1[i]);
    Serial.print(",");
    Serial.println(largaday1[i]);
    largadax1[i] = x + xo;
    largaday1[i] = y + yo;
    i++;
    if (av >= 0) {
      x = x + incxi;
      y = y + incyi;
      av = av + avi;
    }
    else {
      x = x + incxr;
      y = y + incyr;
      av = av + avr;
    }

  }

  largadax1[i] = x + xo;
  largaday1[i] = y + yo;
  Serial.print(largadax1[i]);
  Serial.print(",");
  Serial.println(largaday1[i]);
  largadamax = i;
  Serial.print("cantidad de posiciones: ");
  Serial.println(i);
  return (largadamax);
}

void entero() {             // convierte los valores para poder operar en bresenham

  xo = (int(lat0) - lat0) * 100000;
  yo = (int(lon0) - lon0) * 100000;
  xi = (int(lat1) - lat1) * 100000;
  yi = (int(lon1) - lon1) * 100000;

  px = xi - xo;
  py = yi - yo;

}

void setup() {
  Serial.begin(9600);//Iniciamos el puerto serie

}

void loop() {
  int i;
  float dif = 0.00001;

  entrada = 0;
  lat0 = -33.29253;
  lon0 = -66.32865;
  lat1 = -33.29262;
  lon1 = -66.32858;
  Serial.println(lat0,5);
  Serial.println(lon0,5);
  Serial.println(lat1,5);
  Serial.println(lon1,5);
  crearlinea();
 
  entrada = 1;
  lat0 = lat0 + 1 * dif;
  lon0 = lon0 + 1 * dif;
  lat1 = lat1 + 1 * dif;
  lon1 = lon1 + 1 * dif;
  Serial.println(lat0,5);
  Serial.println(lon0,5);
  Serial.println(lat1,5);
  Serial.println(lon1,5);
  crearlinea();

  entrada = 2;
  lat0 = lat0 - 2 * dif;
  lon0 = lon0 - 2 * dif;
  lat1 = lat1 - 2 * dif;
  lon1 = lon1 - 2 * dif;
  Serial.println(lat0,5);
  Serial.println(lon0,5);
  Serial.println(lat1,5);
  Serial.println(lon1,5);
  crearlinea();
 
  i = 0;
  Serial.println(largadax1[i]);
  Serial.println(largadax10[i]);
  Serial.println(largadax12[i]);

  Serial.println("menos 1");
  for (i = 0; i <= largadamax; i++) {
    Serial.print(largadax1[i]);
    Serial.print(",");
    Serial.println(largaday1[i]);
  }
  //      Serial.println("original");
  //  for (i = 0; i <= largadamaxx1; i++) {
  //    Serial.print(largadax10[i]);
  //    Serial.print(",");
  //    Serial.println(largaday10[i]);
  //  }
  Serial.println("mas 1");
  for (i = 0; i <= largadamaxx2; i++) {
    Serial.print(largadax12[i]);
    Serial.print(",");
    Serial.println(largaday12[i]);
  }

  while (1);
}



Desde ya muchas gracias por su tiempo.

surbyte

No doble postees.
Si ya tienes un hilo no repitas otro similar.

Hilo cerrado y luego borrado, pero lo dejo para que te informes


Go Up