Go Down

Topic: Donde esta el error... (Read 4429 times) previous topic - next topic

American2020

Fijate también que veo que en AnalogPin el Serial te está imprimiendo 14 y 15

¿No debería ser 0 y 1?

Probá este código a ver que pasa.

Code: [Select]
const int analogInPin = A0;
const int analogInPin1 = A1;

int sensorValue = 0;
int sensorValue1 = 0;

float temperatura = 0;
float temperatura1 = 0);


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

// read the analog in value:
sensorValue = (analogRead (analogInPin);
sensorValue1 = (analogRead (analogInPin1);

temperatura = (-.54054*sensorValue+375.675); // convierte a grados
temperatura1 = (-.54054*sensorValue1+375.675);

// print the results to the serial monitor:

Serial.print("sensorValue ");
Serial.print(sensorValue);
Serial.print(" AnalogInPin  = " );
Serial.print(analogInPin );
Serial.print("  Temp0 = " );
Serial.print(temperatura);
Serial.print("  ");
Serial.print(" sensorValue1 ");
Serial.print(sensorValue1);
Serial.print(" AnalogInPin1  = " );
Serial.print(analogInPin1 );
Serial.print("  ");
Serial.print("  Temp1 = ");
Serial.println(temperatura1);
// wait 1 seconds before the next loop
delay(1000);
}
My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

American2020


Guauu!!! Cheyenne tiene razón, solo anda en la entrada A0, en cualquiera otra no responde!! no creo que este frita la placa (espero porque solo tengo una) alguna idea?


No, no es eso.... Lo que cheyenne te dijo fue esto

¿Por qué no haces simplemente read de AnalogPin0 y el 1 e imprimes lo que recibes?
My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

American2020

Acá está de donde habías tomado el código.

http://anajesusa.wordpress.com/2011/07/06/la-placa-arduino/

Por eso no es bueno copiar así nomás, sino que está bueno investigar uno mismo lo que necesitamos que nuestro código haga, para así poder revisarlo y entender por que es que las cosas no funcionan.

A él simplemente le funcionó por casualidad, y solo para el Pin 0, porque esa división errónea siempre le da 0, por eso que cuando tu quisiste probar con el pin 1 te daba "error" y te seguía leyendo los datos del pin 0

My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

CesarCarlos

Es que no copié, el dueño de ese blog soy yo  :* :*
La función que aplico es debido a que el 0 grado me da en una lectura en mV de algo 690 y los 100 grados 500 y pico, hice la gráfica y saqué la función para que me de en grados, de ahi vienen los números en esta entrada esta http://anajesusa.wordpress.com/2007/05/12/termometro-electronico-de-facil-construccion-con-sonda/
Saludos
César
http://anajesusa.wordpress.com/

American2020

#19
Apr 26, 2013, 01:39 am Last Edit: Apr 26, 2013, 08:07 pm by American2020 Reason: 1
Perfecto. Probá entonces eso de corregir simplemente la forma en que la ecuación es llevada a cabo...

Osea esta corrección.

sensorValue = ((analogRead (analogInPin)/1024)*4.9); // convierte a mV

O puedes hacer, que ayuda a no liarse con los () muchas veces, es hacer algo así.

int pin0read = analogRead (analogInPin);

sensorValue = (pin0read/1024)*4.9;

;) De seguro con lo de arriba ya solucionas el código y funcionará para más de 1 sensor. Lo que no me queda claro es lo de dividirlo por 1024 y multiplicarlo por 4.9 (Esto nos dará sólo valores de 0 a 4.9) y nos los mV que haces referencia.

¿Tenés el nombre o código del sensor que usas? Me gustaría saber eso, para saber cuál es la fórmula a usar en Arduino para transformar sus lecturas en Temperatura.

My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

CesarCarlos

sensorValue = ((analogRead (analogInPin)/1024)*4.9); // convierte a mV
Esto lo copie de este video http://www.youtube.com/watch?v=eN4oN5lbdIo en el minuto 5 hace eso de dividir
el 4.9 que multiplica es la tensión con que alimento el diodo de la sonda. Ahora cuando llegue a casa hago la prueba. El código que me pasaste antes no me da lectura de las variables, es decir suma 0 en esto
float temperatura1 = (-.54054*sensorValue1+375.675);
y temperatura 1 siempre da el valor del sumando 375.675 igual para la otra variable
Saludos
César
http://anajesusa.wordpress.com/

American2020

Dale, probalo y nos contás.

Ahí corregí algunos () que me dejé sueltos que no eran necesarios.

Ya te digo, primero prueba simplemente hacer lectura de los inputs y mandarlos al Serial, sin ecuaciones ni nada en el medio. Para comprobar que ambas lecturas obtenidas son correctas y no siempre la 0 a causa del error que te decía.

Por cierto, estuve mirando el blog y está muy bueno, veo muchos proyectos interesantes y en muchos reciclando cosas, como un mouse :) Le echaré un vistazo a ese proyecto que tengo 2 mouse desarmados que pensaba usar con el Arduino, pero no sabía para que, así que de seguro ahora me daré alguna idea.

Todo lo relacionado con la fotografía, muy bueno también, que no lo vea mi papá que va a querer que le arme todo, ya que de joven estudió fotografía y le gusta mucho todo eso.
My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

CesarCarlos

#22
Apr 26, 2013, 08:54 pm Last Edit: Apr 26, 2013, 08:56 pm by CesarCarlos Reason: 1
Anoche justamente hice algunas pruebas con el código ese y monitoreando cada paso, si faltaban 3 parentesis o sobraban, ahora los input funcionan, cada uno varía cuando les pongo el dedo arriba, por separado como debe pero no hace la cuenta, cuando le mando que divida por 1024, y multiplique por la tensión eso ya da cero por tanto la otra cuenta que convierte a grados no me da tampoco. Pongo el codigo


Code: [Select]

const int analogInPin = A0;
const int analogInPin1 = A1;

int sensorValue = 0;
int sensorValue1 = 0;


void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
//pinMode (13, OUTPUT);
}
void loop() {
 
 // read the analog in value:
 int pin0read = (analogRead (analogInPin));
 int pin1read = (analogRead (analogInPin1));
float sensorValue = ((pin0read/1023)*4.9);
float sensorValue1 = ((pin1read/1023)*4.9);

float temperatura = (-.54054*sensorValue +375.675); // convierte a grados
float temperatura1 = (-.54054*sensorValue1+375.675);

// print the results to the serial monitor:

Serial.print ("pin0read ");
Serial.print (pin0read);
Serial.print(" Pin1read = " );
Serial.print(pin1read );
Serial.print("  sensorValue = " );
Serial.print(sensorValue);
Serial.print("  ");
Serial.print (" sensorValue1 ");
Serial.println(sensorValue1);

delay(1000);
}


Esto lo hace bien,
Code: [Select]
int pin0read = (analogRead (analogInPin));
 int pin1read = (analogRead (analogInPin1));

en el monitor da valores de 130 y baja cuando aumenta la temperatura
Code: [Select]
float sensorValue = ((pin0read/1023)*4.9);
float sensorValue1 = ((pin1read/1023)*4.9);

Esta cuenta ya no la hace, supongo algo mal con las variables debería esperar valores de 0.622 y da cero

Me alegro te haya gustado el blog.

Saludos
César
http://anajesusa.wordpress.com/

CesarCarlos

#23
Apr 26, 2013, 09:03 pm Last Edit: Apr 26, 2013, 09:11 pm by CesarCarlos Reason: 1
Uuuuu!!! ya me di cuenta
Code: [Select]
int pin0read = (analogRead (analogInPin));
 int pin1read = (analogRead (analogInPin1));

Aca va float!!! ahora lee esa cuenta voy por la otra
Lo tengo!!!! falta ajustar las ecuaciones.
Gracias muchachos
Saludos
César
http://anajesusa.wordpress.com/

CesarCarlos

Necesito otra ayuda, la variable float me da solo con dos decimales, para calibrar las sondas necesito 3 o 4 si se pudiera, como se puede hacer?
Saludos
César
http://anajesusa.wordpress.com/

American2020

Yo usé int, porque en realidad, la lectura que devuelve será siempre un número entero entre 0 y 1023

Creo que puedes obviar los ( ) externos y debería funcionar también.

int pin0read = analogRead (analogInPin);
int pin1read = analogRead (analogInPin1);

Pero bueno, si esos 2 ya te dan valores distintos, entonces vamos por buen camino y confirmas que si, que los inputs están funcionando correctamente.
My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

American2020


Necesito otra ayuda, la variable float me da solo con dos decimales, para calibrar las sondas necesito 3 o 4 si se pudiera, como se puede hacer?


Prueba con:

  int sensorValue = 500; //Lo pongo yo a mano, para la prueba, tu valor llegaría desde el A0 o A1

  Serial.println(sensorValue); //Lo vemos en pantalla
 
  float newValue = sensorValue/1024.00; //Al parecer para dividir un float, se debe usar el .00 sino dará error
 
  Serial.println(newValue,6); //Esto nos imprime el valor con 6 decimales en pantalla.

  Serial.println(newValue); //Esto nos imprime el valor con 2 decimales en pantalla.

  float otherValue = newValue*1000.00; //Lo multiplico por 1000 (de nuevo pongo el .00)
 
  Serial.println(otherValue,6); Acá compruebo que aunque por pantalla nos salga con sólo 2 decimales por defecto, en realidad todos los decimales están ahí al momento de usarlo en otras ecuaciones.

Lo que esto me devuelve es:

Code: [Select]
500
0.488281
0.49
488.281250


Osea que aunque en pantalla veamos el 0.49 al hacer su llamada común, el float igualmente tiene todos sus decimales ahí para cuando lo usemos.
My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

CesarCarlos

Ya están andando 4 sondas dando valores aceptables, el problema es que al parecer redondea en las cuentas y no salta de grado en grado de temperatura o fracción de este, me salta de a 2 o mas.
Con los datos que me diste ya veo 3 o mas dígitos en el  monitor, pero no logro darme cuenta porque los grados saltan
Saludos
César
http://anajesusa.wordpress.com/

American2020

Bueno, pasa como te quedó el código final, a ver si se me ocurre algo.

Quizás se podría implementar que antes de hacer la ecuación y mandar la temperatura, haga 10 lecturas y saque un promedio.

Algo así hice yo para que los movimientos de un potenciómetro sean más estables y me ha resultado perfectamente.
My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

CesarCarlos

#29
Apr 27, 2013, 05:58 pm Last Edit: Apr 27, 2013, 06:38 pm by CesarCarlos Reason: 1
Así quedó el codigo
Code: [Select]

const int analogInPin = A0;
const int analogInPin1 = A1;
const int analogInPin2 = A2;
const int analogInPin3 = A3;
const int analogInPin4 = A4;
int sensorValue = 0;
int sensorValue1 = 0;
int sensorValue2 = 0;
int sensorValue3 = 0;
int sensorValue4 = 0;

void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
//pinMode (13, OUTPUT);
}
void loop() {
 
 // read the analog in value:
 float pin0read = (analogRead (analogInPin));
float pin1read = (analogRead (analogInPin1));
 float pin2read = (analogRead (analogInPin2));
  float pin3read = (analogRead (analogInPin3));
   float pin4read = (analogRead (analogInPin4));
float sensorValue = ((pin0read/1023)*4.9);
float sensorValue1 = ((pin1read/1023)*4.9);
float sensorValue2 = ((pin2read/1023)*4.9);
float sensorValue3 = ((pin3read/1023)*4.9);
float sensorValue4 = ((pin4read/1023)*4.9);

float temperatura = (-(541*sensorValue) +360.19); //357.30); // convierte a grados
float temperatura1 = (-(541*sensorValue1)+360.19);
float temperatura2 = (-(541*sensorValue2)+360.19);
float temperatura3 = (-(541*sensorValue3)+360.19);
float temperatura4 = (-(541*sensorValue4)+360.19);

// print the results to the serial monitor:

//Serial.print ("pin0read ");
//Serial.print (pin0read);
//Serial.print(" Pin1read = " );
//Serial.print(pin1read );
//Serial.print("  sensorValue = " );
//Serial.print(sensorValue);
//Serial.print("  ");
//Serial.print (" sensorValue1 ");
//Serial.print(sensorValue1);
Serial.print (" Temp0 = ");
Serial.print (temperatura,3);
Serial.print (" Temp1 = ");
Serial.print (temperatura1,3);
Serial.print (" Temp2 = ");
Serial.print (temperatura2,3);
Serial.print (" Temp3 = ");
Serial.print (temperatura3,3);
Serial.print (" Temp4 = ");
Serial.println (temperatura4,3);

delay(1000);
}

Pero no es por la precisión de lectura el problema, hay algún error porque los saltos de una temperatura a otra siempre son de 2.59, tiene que haber alguna falla en los cálculos
Saludos
César
http://anajesusa.wordpress.com/

Go Up