Problema con control de temperatura con Arduino

#1
Bueno la cosa va de que estoy haciendo un proyecto con arduino de un control de temperatura. Pero tengo un problema cuando muevo el potenciometro, que si tmax es mayor que temp, en la seccion del lcd que llame Tactual me sale un error al visualizar el valor de este.

El proyecto lo hago con un sensor LM35, un LED, un potenciometro, un arduino UNO y un lcd 16x2. El codigo es el siguiente:

Código:
#include <LiquidCrystal.h>

LiquidCrystal milcd(2,3,4,5,6,7);

byte grado[8] = {    //Creamos el simbolo de grado
    B00010,
    B00101,
    B00010,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
};

long milivolts;
int temp;
int tmax;

void setup() {
    milcd.begin(16,2);
    milcd.createChar(0,grado);   //El signo grado
    pinMode(8, OUTPUT);          // Led indicador de tmax
}

void loop() {
    milcd.setCursor(0,0);
    milcd.write("Tactual : ");
    
    milivolts = (analogRead(A0) * 5000L) / 1023;     //Convertimos la escala a milivoltios
    temp = milivolts / 10;        //Ajustamos la escala a grados celcius
    tmax = analogRead(A1) / 16;       //Leemos el valor del potenciometro tmax
    
    if(tmax >= temp) {
         digitalWrite(8, HIGH);
    }
    else{
         digitalWrite(8, LOW);
    }
    
    milcd.print(temp);
    milcd.setCursor(13,0);
    milcd.print((char)0);
    milcd.write("C");
    
    milcd.setCursor(0,1);
    milcd.write("Tmax : ");
    milcd.print(tmax);
    
    milcd.clear();
    delay(300);
}
Espero que me puedan ayudar, saludos. ...
 
Última edición:
#3
Como he dicho el error me lo da durante la ejecucion del programa cuando muevo el potenciometro a un nivel mas alto que el marcado por el sensor.
 
Última edición por un moderador:
#5
Para que puedan ver el problema sera mejor que hagan el circuito y vean que pasa en la seccion de "Tactual".
 
Última edición por un moderador:

Fogonazo

Exorcista & Moderador eventual
#6
Para que puedan ver el problema sera mejor que hagan el circuito y vean que pasa en la seccion de "Tactual".
:confused::confused::confused::confused:

:eek: ¿ Además de ayudarte hay que realizar el circuito ? :eek:

Si deseas ayuda publica tu simulación completa.

Comprimes el archivo con WinRAR o WinZip y lo subes al Foro
 
#7
:confused::confused::confused::confused:

:eek: ¿ Además de ayudarte hay que realizar el circuito ? :eek:

Si deseas ayuda publica tu simulación completa.

Comprimes el archivo con WinRAR o WinZip y lo subes al Foro
Sobre todo por que tengo un Arduino, LM35 y LCD al alcance :rolleyes:

Pero otro consejo, en tu línea milivolts = (analogRead(A0) * 5000L) / 1023; podrías hacer división entre 500 y eliminar la siguiente línea de código, no tiene caso agregar una división tras otra.

Sobre tu problema, ¿si al cambiar Tmax por un valor inferior sigue presentándose cuando se supera?
No me parece que influya, a menos de que haya un error a tratar con los datos, pero si pruebas con valores más bajos y sigue presentándose solo me queda pensar que tu LCD está conectado al D8 y lo controla de cierta forma.
 
#8
Sobre todo por que tengo un Arduino, LM35 y LCD al alcance :rolleyes:

Pero otro consejo, en tu línea milivolts = (analogRead(A0) * 5000L) / 1023; podrías hacer división entre 500 y eliminar la siguiente línea de código, no tiene caso agregar una división tras otra.

Sobre tu problema, ¿si al cambiar Tmax por un valor inferior sigue presentándose cuando se supera?
No me parece que influya, a menos de que haya un error a tratar con los datos, pero si pruebas con valores más bajos y sigue presentándose solo me queda pensar que tu LCD está conectado al D8 y lo controla de cierta forma.
Gracias por el aviso, pero cuando hice lo que me dijiste sobre el calculo de milivolts, el error era peor. Ademas el led esta en D8.
 
#9
seria un buen ejercicio si mostraras las temperaturas después de las operaciones y no hasta al final para que veas que es lo que estas comparando podría hacer el circuito pero en lugar de LM 35 tengo unos AD590

Linea1 Temp
Linea2 Tmax

antes del if así sabes que es lo que comparas

Saludos
 
#10
seria un buen ejercicio si mostraras las temperaturas después de las operaciones y no hasta al final para que veas que es lo que estas comparando podría hacer el circuito pero en lugar de LM 35 tengo unos AD590

Linea1 Temp
Linea2 Tmax

antes del if así sabes que es lo que comparas

Saludos
He hecho lo que me dijiste, pero todavia sigue haciendo lo mismo, cuando Tmax cambia de valor, en el LCD en la seccion Tactual sigue presentando numeros aleatorios.
 
#11
Le agregué unas cosas. Pruébalo, espero te sirva.

PHP:
#include <LiquidCrystal.h>

LiquidCrystal milcd(2,3,4,5,6,7);

byte grado[8] = {    //Creamos el simbolo de grado
    B00010,
    B00101,
    B00010,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
};

long milivolts;
int temp;
int tmax;
String Var1; //
String Var2; //


void setup() {
    milcd.begin(16,2);
    milcd.createChar(0,grado);   //El signo grado
    pinMode(8, OUTPUT);          // Led indicador de tmax
}

void loop() {
    milcd.setCursor(0,0);
    milcd.write("Tactual : ");
    
    milivolts = (analogRead(A0) * 5000L) / 1023;     //Convertimos la escala a milivoltios
    temp = milivolts / 10;        //Ajustamos la escala a grados celcius
    tmax = analogRead(A1) / 16;       //Leemos el valor del potenciometro tmax
    
    if(tmax >= temp) {
         digitalWrite(8, HIGH);
    }
    else{
         digitalWrite(8, LOW);
    }
    
   
    Var1=String(temp, DEC);  // para convertirlo a string
    milcd.print(temp);
    milcd.setCursor(13,0);
    milcd.print((char)0);
    milcd.write("C");
    
    milcd.setCursor(0,1);
    milcd.write("Tmax : ");
    Var2=String(tmax, DEC);
    milcd.print(tmax);
    
    milcd.clear();
    delay(300);
 
Última edición por un moderador:
#15
La variable milivolts está declarada como long.

¿Cuántos bytes son esos?

Porque en el programa realizas la operación

milivolts = (analogRead(A0) * 5000L) / 1023;

Si analogRead(A0) vale el máximo (1023), la multiplicación por 5000 resulta en 5 115 000, que ocupa al menos 24 bits.
 
#16
Pon una captura del error para que veamos qué ocurre.

¿Se puede hacer simulación con el entorno Arduino?
Ok, vere que hago.

Aqui esta el video de demostracion del error. El video esta en un archivo comprimido Zip:

https://mega.co.nz/#!cQRDiQ4Z!r4d64i0f_jcwIWtku_kgqiHAizqhTF5FxCIHOb6dA1M

El error, como les dije es en el calculo de la seccion "if". Ademas de que en la seccion "Tactual" en el lcd muestra un error de calculo. Espero que me puedan ayudar.:cry:

La variable milivolts está declarada como long.

¿Cuántos bytes son esos?

Porque en el programa realizas la operación

milivolts = (analogRead(A0) * 5000L) / 1023;

Si analogRead(A0) vale el máximo (1023), la multiplicación por 5000 resulta en 5 115 000, que ocupa al menos 24 bits.
Bueno, pero como puedes notar el sensor es un LM35 que da 10mV por grado celcius. Esto significa que es imposible que llegue a los 5V (osea 1023).
 
Última edición por un moderador:
#17
La variable milivolts está declarada como long.

¿Cuántos bytes son esos?

Porque en el programa realizas la operación

milivolts = (analogRead(A0) * 5000L) / 1023;

Si analogRead(A0) vale el máximo (1023), la multiplicación por 5000 resulta en 5 115 000, que ocupa al menos 24 bits.
Según la definición una variable Long corresponde a 32bits, la int debe corresponder a aquella en la que es más eficiente operar, creo que a menos de que se base en el ARM (Arduino Due) sería de 16bits, en tal caso si suponemos que el error viene por conversiones implícitas, entonces con cambiar a esto debería corregirse
Código:
milivolts = (long(analogRead(A0)) * 5000L) / 1023L;     //Convertimos la escala a milivoltios
    temp = int(milivolts / 10L);        //Ajustamos la escala a grados celcius
    tmax = analogRead(A1) / 16;       //Leemos el valor del potenciometro tmax
 
#18
El problema sigue siendo igual. Digo que seria extraño que el arduino UNO no pueda correr una variable de tipo long, ya que todas las placas son compatibles con esta variable.
 
Última edición por un moderador:
#19
Viendo el video... si persiste el problema, no creo que esté en el software.
Realmente no hay líneas raras, los números aparecen y todo bien, pero veo que oscila el valor, no puedo decir que son aleatorios, sino que simplemente el valor del LM35 comienza a oscilar, para intentar estabilizarlos podrías agregar unos cuantos capacitores como esto.
Captura de pantalla (123).png
 
#20
Viendo el video... si persiste el problema, no creo que esté en el software.
Realmente no hay líneas raras, los números aparecen y todo bien, pero veo que oscila el valor, no puedo decir que son aleatorios, sino que simplemente el valor del LM35 comienza a oscilar, para intentar estabilizarlos podrías agregar unos cuantos capacitores como esto.
Ver el archivo adjunto 125855
Y esta modificacion no da problemas en la presicion de lectura?

He hecho el circuito con la resistencia y el capacitor adicional, la lectura es mucho mas estables pero la presicion es reducida.

He visto una opcion que se llama "analogReference" que cambia el voltaje de referencia de las entradas analogicas, y vi que puedo usar la opcion "INTERNAL", pero el problema es que aplica para todas las entradas analogicas y yo uso un potenciometro para cambiar a "Tmax".

Quisiera saber si hay una forma de solucionarlo.:confused:
 
Última edición por un moderador: