Problema de codigo localizado pero no encuentro solucion.

-Por el puerto serie pasa al ordenador una letra seguida del valor de cada sensor multiplicado por 100 y la suma de todos, y tambien guarda en la tarjeta de memoria los valores de los sensores.

-La variable luxes es la que utiliza para guardar ese valor en la tarjeta SD. La variable luz es esa varible pero multiplicada por 100 para enviar por puerto serie sin decimales. Aqui esta el fallo, cuando ese valor pasa de 300 y poco la variable luxes guarda en la tarjeta sd el valor correcto pero la variable luz se vuelve loca y pasa a ser negativa.

-Por lo que descarto que el sensor y la transformacion con la formula mediante el If esta mal por lo que el fallo solo puede estar en la zona roja.

Si alguien sabe por que puede pasar le agradeceria que me ayudase. :slight_smile: (si no colorea en rojo lo que os quiero enseñar decir que es desde el inicio del voi_loop hasta el delay de 1000)

#include <SD.h>
#include <Time.h>
int analogPin0=0;
int analogPin1=1;
int analogPin2=2;
int t1;
int t2;
int luz;
int suma;
float luxes;
float pin0;
float pin1;
float pin2;
void setup()
{

// Abrir comunicaciones serie y dejar a la espera:
Serial.begin(9600);
Serial.print("Initializing SD card...");

// estar completamente seguro de que el pin esta seleccionado como
// salida, sino no funcionára:

pinMode(4, OUTPUT);

// Buscando la tarjeta SD:

if (!SD.begin(4)) {
Serial.println("Card failed, or not present");

// no hace nada más:

return;
}
Serial.println("card initialized.");
}


void loop()
{

pin0=(analogRead(0)*5.0*100.0)/1023.0;

pin1=((analogRead(1)-502)*5.0*100.0)/1023.0;

[color=red] pin2= analogRead(2);

if( pin2 < 83 )
{ 
luxes=(pin2*4.6678)+2.1104;
}
else
if(pin2 > 83)
{
luxes=(pin2*28.283)-2062.6;
}

//como daba problemas en labview metemos el dato en esta variable 
//para q se refresque cada 1s.

t1=pin0*100; 
t2=pin1*100; 
luz=luxes*100;
suma=t1+t2+luz;


// imprimir por puerto serie del PC:

Serial.print ("A");
Serial.print (t1,DEC);
Serial.print ("B");
Serial.print (t2,DEC);
Serial.print ("C"); 
Serial.print (luz,DEC);
Serial.print ("D");
Serial.println (suma,DEC);

delay(1000);[/color]

String dataString = "Posiciones sobre 1024 Bits: T1, ";
// Lectura de los tres sensores para su introduccion en el String:

for (int analogPin = 0; analogPin < 3; analogPin++) {
int sensor = analogRead(analogPin);
dataString += String(sensor);
if (analogPin <1) {

dataString += " ;T2, "; 
}
else

if (analogPin <2) {
dataString += " ;LUZ, "; 

}
}


// Abrir el archivo de texto, solo se puede abrir un archivo a la vez:

File dataFile = SD.open("datalog.txt", FILE_WRITE);
// si el archivo se ha abierto correctamente escribe lo siguiente:

if (dataFile) {
dataFile.print("Tiempo transcurrido desde el inicio de la medicion");
dataFile.print(hour());
dataFile.print(":");
dataFile.print(minute());
dataFile.print(":");
dataFile.print(second());
dataFile.println(" ");
dataFile.println(dataString);
dataFile.print ("T1");
dataFile.print (" ");
dataFile.print (pin0);
dataFile.print (" ");
dataFile.print ("Grados Celsius");

dataFile.println("");
dataFile.print ("T2");
dataFile.print (" ");
dataFile.print (pin1);
dataFile.print (" ");
dataFile.print ("Grados Celsius");
dataFile.println("");
dataFile.print (luxes);
dataFile.print (" ");
dataFile.print ("W/m^2");

dataFile.println("");
dataFile.println("");
dataFile.close();
}

// si el archivo no se ha abierto correctamente muestra el error:

else {
Serial.println("error opening datalog.txt");
}


//Dato para cambiar el tiempo de envio al puerto serie.

delay(30000);

}

Mmmmmm... espera que adivino, ¿te da el error justo a partir de 327? Estás desbordando la variable "luz" que al ser int su valor máximo es 32.768. Si el valor de luxes vale 328 el valor de luz sería 32.800 que está fuera de su rango.

JUSTOOOOO un rato despues de escribir la duda encontre el error, sabia que el fallo venia en la variable de luz porque la de luxes los da bien y lo unico que cambiaba era que se multiplicaba por 100 asi que me dio por mirar los tamaños del int y el float y entonces me di cuenta, sobre todo cuando vi que cuando llegaba al limite te marcaba con signo menos como a mi me pasaba asi que los hice long y listo problema solucionado.

T1 y T2 no los e hecho long ya que el float que me va a aparacer no va a llegar nunca a 100.00ºC, ya que si no estariamos todos fritos, asi que al multiplicarlo por 100 el int en ningun caso va a llegar a 10000. En cambio la irradiancia si me puede llegar a unos 1500.00W/m^2 y al multiplicarlo por 100 el int se me desborda, otra de las cosas que me salto al ojo cuando vi lo de -32,768 a 32,768 fue que a mi se me aturullaba justo cuando la irradiancia llegaba sobre los 315.00 o 320.00 W/m^2.