Go Down

Topic: problemas trabajando con numeros de 5 decimales (Read 316 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.

_jose_

No te da avisos de falta de ram al compilar? sin entrar en el codigo de tu sketch,solo los arrays de 70 posiciones ya son 1680 bytes  mas las demas variables que usas , la libreria softwareserial y el uso del serial monitor me da que vas muy justo de ram  (no digo que ese sea el error ,solo lo he mirado por encima)

surbyte

#2
Mar 27, 2019, 11:53 pm Last Edit: Mar 27, 2019, 11:53 pm by surbyte
No doble postees el mismo tema!!!
Lee las normas del foro, por favor.
El otro hilo será borrado en cuanto respondas este.


http://forum.arduino.cc/index.php?topic=606149.new#new

Go Up