Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

25/02/2015 #1

Avatar de Dan2013

Problema con control de temperatura con Arduino
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. ...
26/02/2015 #2


Que tipo de error?
26/02/2015 #3

Avatar de Dan2013

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.
26/02/2015 #4

Avatar de Scooter

Si pero ¿QUE tipo de error?
26/02/2015 #5

Avatar de Dan2013

Para que puedan ver el problema sera mejor que hagan el circuito y vean que pasa en la seccion de "Tactual".
26/02/2015 #6
Moderador general

Avatar de Fogonazo

Dan2013 dijo: Ver Mensaje
Para que puedan ver el problema sera mejor que hagan el circuito y vean que pasa en la seccion de "Tactual".


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

Si deseas ayuda publica tu simulación completa.

Comprimes el archivo con WinRAR o WinZip y lo subes al Foro
26/02/2015 #7

Avatar de Nuyel

Fogonazo dijo: Ver Mensaje


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

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

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.
26/02/2015 #8

Avatar de Dan2013

Nuyel dijo: Ver Mensaje
Sobre todo por que tengo un Arduino, LM35 y LCD al alcance

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.
26/02/2015 #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
26/02/2015 #10

Avatar de Dan2013

jonathanriv dijo: Ver Mensaje
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.
27/02/2015 #11


Le agregué unas cosas. Pruébalo, espero te sirva.

Código 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(8OUTPUT);          // 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(8HIGH);
    }
    else{
         
digitalWrite(8LOW);
    }
    
   
    
Var1=String(tempDEC);  // 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(tmaxDEC);
    
milcd.print(tmax);
    
    
milcd.clear();
    
delay(300); 
27/02/2015 #12

Avatar de Dan2013

Todavia me crea un error de calculo.
27/02/2015 #13


Dan2013 dijo: Ver Mensaje
todavia me crea un error de calculo.
Salen numeros aleatorios???
27/02/2015 #14

Avatar de bivalvo

Pon una captura del error para que veamos qué ocurre.

Si deseas ayuda publica tu simulación completa.
¿Se puede hacer simulación con el entorno Arduino?
27/02/2015 #15

Avatar de JoaquinFerrero

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.
27/02/2015 #16

Avatar de Dan2013

bivalvo dijo: Ver Mensaje
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_kgqiHAizqhTF5FxCIHOb6 dA1M

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.

JoaquinFerrero dijo: Ver Mensaje
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).
27/02/2015 #17

Avatar de Nuyel

JoaquinFerrero dijo: Ver Mensaje
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
27/02/2015 #18

Avatar de Dan2013

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.
27/02/2015 #19

Avatar de Nuyel

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.
Imágenes Adjuntas
Tipo de Archivo: png Captura de pantalla (123).png (9,8 KB (Kilobytes), 135 visitas)
27/02/2015 #20

Avatar de Dan2013

Nuyel dijo: Ver Mensaje
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.
http://www.forosdeelectronica.com/at...1&d=1425061917
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.
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Arduino y Raspberry Pi

Cerrar
Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.