Problema con DS18B20 y Arduino

Le puedes poner una resistencia o un preset para ajustar el rango, luego ya el potenciómetro ajustaría en el rango que necesitas, la a otra es conectar el por a analogReference en lugar de VDD, Claro que es posible que requiera un buffer.
 
Última edición:
Le puedes poner una resistencia o un preset para ajustar el rango, luego ya el potenciómetro ajustaría en el rango que necesitas, la a otra es conectar el por a analogReference en lugar de VDD, Claro que es posible que requiera un buffer.

Explicame lo del buffer para entenderlo, lo que pasa es que soy nuevo en la programacion de arduino. Quiero llegar despues a la programacion de PIC!!!
 
No, me refería a un buffer análogo (un amplificador operacional en modo seguidor), este lo colocas a la señal de referencia para el Arduino, y de ahí tomas el voltaje para el potenciómetro de ajuste Tmax.
Igual si tienes la posibilidad, mejor aprende a programar ATmega como el que usa el Arduino en lugar del PIC
 
El link no se enlazó bien, la clave es lo que está después del segundo '!', sería:
r4d64i0f_jcwIWtku_kgqiHAizqhTF5FxCIHOb6 dA1M
Con eso lo descargué.
 
He modificado el circuito cambiando el potenciómetro por un selector de 3 posiciones con el que cambio el valor de "Tmax", pero ahora genera un error de calculo cuando "Tactual" es mayor que "Tmax".

Aquí un vídeo del circuito operando:
https://mega.co.nz/#!pMx3yYgb!1bYuvZdrK_JRYO9--NJyzw6xNDMOlZZublwBOQ6s9pw

Aquí el nuevo código:
PHP:
#include <LiquidCrystal.h>

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

byte grado[8] = {
    B00010,
    B00101,
    B00010,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
};

float temp;
int tmax = 20;

void setup() {
    analogReference(INTERNAL);  // Referencia de 1.1v para mayor precision de lectura
    milcd.begin(16,2);
    milcd.createChar(0,grado);
    pinMode(8, INPUT);  //Boton 1
    pinMode(9, INPUT);  //Boton 2
    pinMode(10, OUTPUT);   //LED
}

void loop() {
    temp = float((analogRead(A0) * 1.0758) / 10.23);   //Escalando a grados celcius
    
    milcd.setCursor(0,0);
    milcd.write("Tactual: ");
    
    milcd.print(temp);
    milcd.setCursor(14,0);
    milcd.print((char)0);
    milcd.write("C");
    
    if(digitalRead(8) == HIGH) {
        tmax++;
    }
    if(digitalRead(9) == HIGH) {
        tmax--;
        if(tmax < 0) {
            tmax = 0;
        }
    }
    
    if(temp >= tmax) {
    digitalWrite(10, HIGH);
    }
    else {
    digitalWrite(10, LOW);
    }
    
    milcd.setCursor(0,1);
    milcd.write("Tmax: ");
    milcd.print(tmax);
    milcd.print((char)0);
    milcd.write("C");
    
    delay(300);
    milcd.clear();
}
También el circuito tiene un voltaje de referencia de 1.1v para mayor precisión de lectura, pero pasa lo que les dije anteriormente.
 
Última edición por un moderador:
dan2013 mira esto es un fragmento que tome de mi tesis que hice hace casi ya 10 años te va a servir mucho,


Acondicionadores y Procesadores de señal
No se puede hablar de los sensores, como componentes electrónicos básicos, sin ver como se pueden adaptar a un sistema de adquisición y control. Estos adaptadores, como acondicionadores de señal, son los amplificadores operacionales en sus diferentes estructuras de montaje, pasando por filtros o por procesadores analógicos, convirtiendo estas señales de analógico a digital para posteriormente ser procesados los datos con un Microcontrolador u otro dispositivo que sea capas de hacer dichos procesamientos y actuando por medio de las salidas lógicas del procesador o por medio de un convertidor digital a analógico.

3.3.1 Sensor de Temperatura
Probablemente sea la temperatura el parámetro físico más común que se mide en una aplicación electrónica, incluso en muchos casos en que el parámetro de interés no es la temperatura, ésta se ha de medir para incluir indirectamente su efecto en la medida deseada.
La diversidad de sus aplicaciones ha condicionado igualmente una gran proliferación de dispositivos sensores y transductores, desde la sencilla unión bimetálica de los termostatos, hasta los dispositivos semiconductores más complejos.

Tipos de Sensores de Temperatura
1. Termopares: Los termopares utilizan la tensión generada en la unión de dos metales en contacto térmico, debido a sus distintos comportamientos eléctricos.
2. Resistivos: Lo constituyen las RTD (Resistance Temperature Detector) basadas en la dependencia de la resistividad de un conductor con la temperatura, están caracterizadas por un coeficiente de resistividad positivo PTC (Positive Termal Coefficient). También lo son las NTC (Negative Termal Coefficient), que se llaman termistores y están caracterizadas por un coeficiente de temperatura negativo.
3. Semiconductores: Se basan en la variación de la conducción de una unión p-n polarizada directamente.

te recomendaria que ocupras un LM6081

Realmente te hace falta un circuito como el siguiente:
 

Adjuntos

  • acoplamientolm35.png
    acoplamientolm35.png
    5.9 KB · Visitas: 77
Última edición:
Entiendo tu punto(y), pero parece ser que el problema esta en el software en ves del hardware, ya que he hecho mediciones del circuito en marcha y no hay fluctuaciones de voltaje. Es mas he puesto en el circuito un filtro R-C en paralelo entre la salida y negativo.:confused:

Como he dicho es mejor que veas el video y el codigo, pero gracias de todos modos.:)
 
Última edición por un moderador:
no es tu codigo necesitas estabilizar tu circuito, ya lo mediste con el multimetro

Como he explicado he medido el voltaje de entrada y de salida del sensor, pero no hay cambios en el voltaje de entrada. Un ejemplo es el ultimo video que subi.

Ademas se puede notar que cuando bajo el valor de "Tmax a un punto mas bajo que "Tactual", este cambia de valor como por 2 grados mas mo menos.



A y una cosa, como pueden observar pongo el dedo en el sensor para calentarlo hasta el punto donde este Tmax, pero como ven enseguida sube entre 1 o 2 grados en Tactual
 
Última edición:
Es que no parece tener sentido lógico alguno asumir error en el código, la comparación no realiza ningún efecto alguno, solo encender un LED con un IF que no cambia para nada el resto del código o los datos. Me parecía que en el Proteus 8 se podría simular esos componentes, sería cosa de probar, la simulación no es la realidad así que los problemas de conexionado y oscilaciones no deberían ocurrir, para poder ayudarte ahora si que necesitaría el circuito físico, pero mi Arduino UNO R3 está a 279km de donde me encuentro y no tengo un LM35 (aparte de que el costo por uno cuando tengo otras maneras de medir temperaturas no me convence, ahora solo tengo un chip que si bien lo podría programar en el mismo lenguaje es ARM Cortex-M4F lo que tiraría resultados demasiado eficientes comparados al AVR de 8 bits.
 
Tendre que revisar mas exhaustivamente el voltaje del circuito para ver lo que pasa, porque estoy viendo que es verdad no puede ser un problema de codigo.

Ahora entiendo que pasa aqui. Fui a buscar el multimetri de un amigo que es un fluke y pude observar un cambio de 7.4 mV cuando Tactual es mayor que Tmax.

Parece ser que el causante del problema es el LED. Pero como soluciono este problema sin tener que eliminar el LED.

Ya he puesto un filtro RC y un bypass y nada.



Sobre el circuito que me planteaste, se ve borroso y no entiendo nada:confused:. Quisiera que me lo expliques mejor.:)
 
Última edición por un moderador:
Listo. Ahí está, ya no sufras.

Cambié los pines del lcd por cuestiones prácticas y el led lo puse en el pin 6, no en el ocho como tú decías.
Todo esto es porque ya tengo la placa para el arduino diseñada así.

El amplificador operacional es un LMC6081, la resistencia de retroalimentación es de 4.16K y en la entrada inversora una de 1K conectada a tierra.
Ya revisando, si te agrada el diseño lo que tendrías que hacer es sacar un promedio de las últimas 10 lecturas.

Código:
#include <LiquidCrystal.h>

LiquidCrystal milcd(12,11,5,4,3,2);

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; //
float mitemp;


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

void loop() {
    milcd.setCursor(0,0);
    milcd.write("Tactual :");
    
    
    temp=analogRead(A0);
    mitemp=temp*0.11;
//    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 >= mitemp) {
         digitalWrite(6, HIGH);
    }
    else{
         digitalWrite(6, LOW);
    }
    
   
    //Var1=String(temp, DEC);  // para convertirlo a string
    milcd.print(mitemp);
    milcd.setCursor(14,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(500);
    
}
Aquí está el diagrama en proteus.
 

Adjuntos

  • 2015-03-02_15-26-55_415.jpg
    2015-03-02_15-26-55_415.jpg
    86.9 KB · Visitas: 22
  • 2015-03-02_15-26-42_778.jpg
    2015-03-02_15-26-42_778.jpg
    97.5 KB · Visitas: 18
  • LM35.rar
    10.7 KB · Visitas: 6
Última edición por un moderador:
Quisiera que me expliques eso de el lcd, no entiendo por que cambiaste los pines del lcd. Y sobre el operacional, en mi pais no se encuentra, tengo un LM324, un LM386, un LM741 y un LM339. Cual eligirias y explicame sobre como usaste el operacional porque la imagen del circuito esta borroso.
 
Última edición por un moderador:
Dan2013

No has colocado ningún dibujo/imagen de tu esquema de conexionado, por lo cual se hace muy difícil ayudarte. Se termina tirando tiros al aire mientras pasa la bandada de pájaros :facepalm: !!!.


Un tirito más:
Puede ser que al encender el led y debido al consumo del mismo la tensión de alimentación del LM35 varíe provocando tu error de lectura.



Saludos, JuanKa.-
 
Gracias por toda la ayuda, pero pude solucionar el problema con un diodo zener com Vz de 3.3V como voltaje de referencia hacia Aref y estabilize la lectura al maximo.:D

Sobre el ultimo arreglo del codigo que me ofrecio jonathanriv es muy incomodo porque no entiendo para que un opam como amplificador inversor y ademas de que soy nuevo en arduino (comenzé hace 2 semanas y he aprendido mucho).

De igual modo quisiera que jonathanriv me conteste esa pregunta, o si no gracias de todas formas.:):apreton:
 
de nuevo el amplificador operacional es configurado como no inversor, lo puse para estabilizar la señal, la verdad solo recuerdo la mitad de las operaciones por eso no las puse completas pero así como esta es para medir de 0 a 100°C , realmente el led no tiene influencia en la salida del sensor, creo que deberías de saber que las conversiones son promedios aproximados así que considero que el diodo lejos de ayudarte puede perjudicarte porque no tendrás medidas aproximadas, o ya probaste comparando tu sensor con un medidor de temperatura y que las medidas sean aproximadas??? en conclusión como sabes si el conjunto de el sensor con el diodo están bien calibrados???



LM35.BMP
espero que este este mas claro
 
Última edición:
No lo tengo entendido, porque segun lo que tengo entendido tu configuracion hace una amplificacion en vez de una reduccion. En todo caso lo que pude ver es que el problema es que se alteraba el voltaje de referencia de las entradas analogicas cada ve que encendia el led, y por lo tanto habia una alteracion en la lectura.

Mi solucion fue crear una referencia muy estable que mande al pin aref de arduino y pude resolver el problema en su totalidad. Aqui esta el circuito que usé:
Referencia_tension_autoregulada.gif


Saludos
 
Atrás
Arriba