Donde esta el error...

Hola gente, quiero hacer un termómetro con 4 o 5 sondas distintas, todas a distinta entrada analógica y en el monitor quiero ver las temperaturas de cada una.
Soy bien tronco en programación lo hago todo medio en forma intuitiva hice este código

const int analogInPin = A0; // Analog input pin that the potentiometer is attached to
const int analogInPin1 = A1;

int sensorValue = 0; 
int sensorValue1 = 0;
int outputValue = 0; 
int outputValue1 = 0;

void setup() {
 // initialize serial communications at 9600 bps:
 Serial.begin(9600); 
 //pinMode (13, OUTPUT);
}
void loop() {
  
  // read the analog in value:
 sensorValue = analogRead (analogInPin/1024)*4.9; // convierte a mV 
 sensorValue1 = analogRead (analogInPin1/1024)*4.9;
 // map it to the range of the analog out:
 outputValue = map(sensorValue, 0, 1023, 0, 255); 
 outputValue1 = map(sensorValue1, 0, 1023, 0, 255); 
 // change the analog out value:
 //analogWrite(analogOutPin, outputValue); 
int temperatura = (-.54054*sensorValue+375.675);
int temperatura1 = (-.54054*sensorValue1+375.675);

 // print the results to the serial monitor:
 Serial.print("Temp0 = " ); 
 //Serial.print (sensorValue);
 Serial.print (" ");
 Serial.print(temperatura);
 //Serial.print(sensorValue); 
 Serial.print(" Temp1 = "); 
 //Serial.print (sensorValue1);
 Serial.print (" ");
 Serial.println(temperatura1);
// wait 1 seconds before the next loop
 delay(1000); 
}

Esta solo para 2 sondas, pero solo me lee la primera, en la columna donde debe aparecer la tempertura de la segunda sonda parece copiar el dato de la primera (mismo valor)
Desde ya gracias por las respuestas

Mirando rapidamente, este es uno de los problemas.

int temperatura = (-.54054sensorValue+375.675);
int temperatura1 = (-.54054
sensorValue1+375.675);

int son numeros enteros y estas multiplicando etc por constants de puntos flotantes

float temperatura = (-.54054sensorValue+375.675);
float temperatura1 = (-.54054
sensorValue1+375.675);

A no ser que pretendas convertir el resultado en un numero entero; pero en ese caso:

int temperatura = int(-.54054sensorValue+375.675);
int temperatura1 = int(-.54054
sensorValue1+375.675);

pierdes la precision flotante de las variables.

En realidad no tengo idea de que son esas constantes (-0.54054 y 375.675)?????

Podrias aclarar?

Suerte.

No estoy seguro pero....

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

analogInPin vas a ser un valor entre 0 y 1023, dividirlo por 1024, sólo te devolverá 0 porque int sensorValue = 0;

prueba llamando "float" y no "int"

Sino usa la función "map"

Hola, gracias por las respuestas tan veloces, tal parece que no es el error, he puesto el float y ahora me da el resultado con dos decimales, pero siguen siendo ambos valores iguales, por ejemplo si toco con los dedos la sonda de A0 ésta empieza a aumentar su valor de temperatura y en el monitor lo refleja pero el valor de la sonda 2 conectada a A1 se copia el valor, la sonda 2 directamente no responde a los cambios, el valor en el monitor es el de la sonda A0.
Los números que multiplican son la función que me convierte los mV en grados celcius. Estoy usando simples diodos 1N4148 como sensores son muy lineales a los cambios

Hola, gracias por las respuestas tan veloces, tal parece que no es el error, he puesto el float y ahora me da el resultado con dos decimales, pero siguen siendo ambos valores iguales, por ejemplo si toco con los dedos la sonda de A0 ésta empieza a aumentar su valor de temperatura y en el monitor lo refleja pero el valor de la sonda 2 conectada a A1 se copia el valor, la sonda 2 directamente no responde a los cambios, el valor en el monitor es el de la sonda A0.
Los números que multiplican son la función que me convierte los mV en grados celcius. Estoy usando simples diodos 1N4148 como sensores son muy lineales a los cambios

Estás leyendo siempre la misma entrada ya que (analogInPin/1024) al ser int siempre es cero.

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

En su lugar creo que lo que quieres hacer es

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

El código entero está mal... ¿De dónde lo tomaste?

Al menos, creo que será mejor, explica exactamente que quieres lograr y te ayudamos con un código nuevo, porque ahora que sigo leyendo...

outputValue = map(sensorValue, 0, 1023, 0, 255);

Pero primero sensorValue pasó por la conversión anterior, dónde en el mejor de los casos, lo que te devuelve es un 4.9 y nunca 1023, entonces ese mapeo entre 0 y 1023, realmente solo será entre 0 y 4.9

¿Qué sonda usas? A ver si veo las especificaciones de la misma y te puedo ayudar con cual sería el mejor código para interpretar las temperaturas desde ellas...

Este código es el mismo que uso para una sola sonda y funciona, puede estar mal pero para una sola anda.
La sonda es muy simple

Ahora estoy preparando un práctico para mis alumnos de calor y temperatura y quiero tener 4 sondas y que cada una me de de su temperatura simultaneamente.
Hice los cambios que me indicaron, pero el problema persiste, solo lee la sonda que esta en A0, la otra sonda no trabaja, aunque caliente el diodo con un soplete.

La primera sonda responde a los cambios de temperatura perfectamente. La segunda no anda y en el monitor se copia la lectura de la otra, no entiendo nada.
American2020 lo mio es muy básico por eso meto las de andar.

La verdad es que son unas cuantas cosas las que tienes que cambiar, si dices que las has cambiado pon el código que tienes ahora.

Pon el código que usas que dices sí te funciona para una sonda. Prueba sobre ese código a cambiar la entrada A0 por la A1 a ver si te funciona. Si no funciona hay que investigar por qué. Si funciona, amplía el código a las dos entradas.

¿Y la sonda A0 cambia si la calientas o la enfrías? Osea, estaba realmente a 39º mientras hacías la prueba.

Intenta copiarte el código, y borrarle todo, menos la lectura que recibes desde los inputs, y manda esos valores al monitor Serial, para ver si los que imprimes para A0 varían de los que son para A1

Luego si sigue agregando el resto del código, con las ecuaciones y demás, y ve haciendo Serial.print de cada dato obtenido, para poder controlar en que momento tu código hace que ambos resultado por algún motivo pasen a ser iguales.

Y si, pega el código actual, el que te tiró esos resultados, el que ya tienes con los valores como "float"

El código tal cual esta ahora

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:
 sensorValue = (analogRead (analogInPin/1024)*4.9); // convierte a mV 
 sensorValue1 = (analogRead (analogInPin1/1024)*4.9);
 // map it to the range of the analog out:
 //outputValue = map(sensorValue, 0, 1023, 0, 255); 
 //outputValue1 = map(sensorValue1, 0, 1023, 0, 255); 
 // change the analog out value:
 //analogWrite(analogOutPin, outputValue); 
float temperatura = (-.54054*sensorValue+375.675); // convierte a grados
float 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); 
}

esto me tira el monitor:

La sonda que esta en A0 trabaja, cuando la caliento aumenta la temperatura, la sonda que esta en A1 si la caliento no modifica nada en el monitor, no anda. Una cosa curiosa, cuando caliento la sonda de A0 varía la temperatura de "Temp" pero tambien me modifica el valor de "Temp1" y el sensorValue1 que adopta los valores de Temp y sensorValue.

La fotico que no salió

No has hecho el cambio que te indiqué.

El error está acá.

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

Prueba algo como

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

Creo que ya te lo había sugerido eso. Con el código como lo tienes, lo que esta haciendo es (analogRead (analogInPin/1024) que sería (analogRead (0/1024) Osea, lee pin 0, pero para pin1 tambien da 0 y te lee cero, en otras palabras, estás dividiendo antes de tiempo.

Y ahí entonces, me da la sensación que lo que estas haciendo es, el valor que llega, multiplicado por 4.9, y nunca se divide.

Supongamos que la lectura que recibes es 500. que se multiplica por 4.9

float temperatura1 = (-.54054*sensorValue1+375.675);

float temperatura1 = (-.54054*2450+375.675); Esto sería igual a -949.32

Supongamos que el valor que recibes es 500 y lo divides en 1024, y luego por 4.9 quedaría así

float temperatura1 = (-.54054*2.39+375.675); Esto da 374,11

De ahí que te digo, que nos digas que sonda usas, y de donde sacas que la ecuación que hay que hacer es (-.54054*sensorValue1+375.675);

Si fuera así, tomando simplemente el valor recibido, entonces obtendríamos esto

(-.54054*500+375.675); Daría 105.40

Esta última sería la más lógica, pero no es la que estás usando.

No entiendo...

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?

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.

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); 
}

CesarCarlos:
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?

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

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

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 Termómetro electrónico de fácil construcción con sonda – Espacio de Cesar

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;

:wink: 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.