Arduino no muestra la temperatura correcta .

Hola tengo montado un indicador de temperatura con Arduino y un display de 4 dígitos , el problema que tengo que el display se queda todos los segmentos encendidos y no muestra la temperatura correspondiente , revisado las conexiones y están bien , tengo instalada la librería Led Control , los displays son de ánodo común , puede ser por el código que tenga algo mal
 

Adjuntos

  • IMG_20211118_095123.jpg
    IMG_20211118_095123.jpg
    198.4 KB · Visitas: 27
  • IMG_20211118_095125.jpg
    IMG_20211118_095125.jpg
    209.5 KB · Visitas: 26
  • termometru_1N4148.png
    termometru_1N4148.png
    13.7 KB · Visitas: 23
  • 4-digit_7-segment_led_display_thermometer_using_1N4148_diode.rar
    2.8 KB · Visitas: 10
Si lo has conectado bien y el código está bien, es porque te tienen manía los leds. Los hay muy tozudos que se encienden siempre incluso desconectados.

Ahora en serio; algo está mal.
De momento no veo resistencias limitadoras, si aprecias el display y/o el arduino ya tardas en ponerlas.
De segundo momento no veo nada en tus fotos, no se ve el conexionado ni nada.

Lo siguiente es verificar paso a paso las cosas. Activa uno de los ánodos solamente y ve encendiendo y apagando segmentos, luego el otro y así.. de eso modo verificas las conexiones. A partir de ahí sigues.
Haz una prueba, en la función que lee la temperatura, eliminas el código y pones valores de prueba constantes de 13,6 11,8 45,5 etc y verificas que se vea bien en el display.

Otra es leer la temperatura y enviarla por el puerto serie para ajustar esa parte.

Lo mismo estás midiendo 88,8ºC y está funcionando bien, solo es que está mal el sensor. (No creo que sea esto)
 
Si el display de la 3er imagen es CATODO COMUN y uno pone uno ANODO COMUN se pueden esperar muchas cosas menos que funcione.


Para que te funcione en un AC tenés que dar vuelta las polaridades, donde te aparezca: digitalWrite(digitx, DIGIT_ON); cambialo por DIGIT_OFF) y viceversa.

Lo mismo con los segmentos: digitalWrite(segX, SEGMENT_ON); por SEGMENT_OFF y viceversa.
 
Última edición:
Mirando un poco mas el código veo que hay unos #defines para seleccionar ánodo y cátodo común pero la descripción está al revés.

C:
/*
//for common catode
#define DIGIT_ON  HIGH
#define DIGIT_OFF  LOW
#define SEGMENT_ON  LOW
#define SEGMENT_OFF HIGH
*/

// for common anode
#define DIGIT_ON  LOW
#define DIGIT_OFF  HIGH
#define SEGMENT_ON  HIGH
#define SEGMENT_OFF LOW

Debe ser:
C:
/*
// for common anode
#define DIGIT_ON  HIGH
#define DIGIT_OFF  LOW
#define SEGMENT_ON  LOW
#define SEGMENT_OFF HIGH
*/

//for common catode
#define DIGIT_ON  LOW
#define DIGIT_OFF  HIGH
#define SEGMENT_ON  HIGH
#define SEGMENT_OFF LOW

Por eso te quedó seleccionado cátodo común.
 
hola gracias por tu respuesta , te comento lo modifique el sketch como me dijiste y ahora los displays salen 88.89 , pero no es la temperatura correcta y no varían los dígitos al tocar el sensor 1N4148 , yo en programación me pierdo porque estoy empezando , si me quieres ayudar te lo agradezco quiero aprender .
 

Adjuntos

  • IMG_20211118_220047.jpg
    IMG_20211118_220047.jpg
    145.4 KB · Visitas: 1
¿Pero como modificaste el código? Porque ahi parece seguir estando para cátodo común.

Yo lo que mostré es a qué corresponden los bloques de #defines, vos lo que tenías que hacer era desmarcar/marcar como comentario el bloque correspondiente.

Es decir, para TU display debe quedar asi:
C:
// for common anode
#define DIGIT_ON  HIGH
#define DIGIT_OFF  LOW
#define SEGMENT_ON  LOW
#define SEGMENT_OFF HIGH


/*
//for common catode
#define DIGIT_ON  LOW
#define DIGIT_OFF  HIGH
#define SEGMENT_ON  HIGH
#define SEGMENT_OFF LOW
*/
 
Yo lo que no entiendo es como hacen para medir la temperatura con el diodo conectado de esa forma.

- Normalmente se usa una fuente de corriente constante alimentando al diodo y luego si, medir la tensión sobre el mismo.
- Con 0.6V aproximadamente, de todas formas, se me hace poco preciso (saltos grandes en la cuantificación), para mi le faltaría amplificación.
- El Atmega328 tiene sensor de temperatura interno, has la prueba con ese hasta que el programa ande, luego sigues con el sensor externo.
 
Yo lo que no entiendo es como hacen para medir la temperatura con el diodo conectado de esa forma.
El pin tiene activada la resistencia de pullup (20k...50k). Y como la caída de tensión en la juntura cambia aprox -2mV/°C , mide y corrige el valor.

- Normalmente se usa una fuente de corriente constante alimentando al diodo y luego si, medir la tensión sobre el mismo.
Como el nivel de continua es casi constante, es decir, como para una variación de temperatura de 50°C la corriente solo cambia ~2% , una resistencia a 5V anda perfectamente.
De todas formas la respuesta no es perfectamente lineal, así que si se es ambicioso con el rango, digamos -40°C...150°C hay que hacer una corrección elaborada.

- Con 0.6V aproximadamente, de todas formas, se me hace poco preciso (saltos grandes en la cuantificación), para mi le faltaría amplificación.
Usa la referencia interna de 1.1V, eso te da una resolución de 1mV (0.5 °C) . Y si, una amplificación con offset vendría bien.

- El Atmega328 tiene sensor de temperatura interno, has la prueba con ese hasta que el programa ande, luego sigues con el sensor externo.
También puede poner un preset y simular ademas variación de temperatura.
Pero creo que lo que mas necesita es agregar una rutina de ajuste porque los diodos tienen diferencias de milivolts en la caída (aún del mismo tipo y lote).
Las constantes del programa sirven solo de referencia, va a tener que recalcularlas para el diodo que use.
 
El pin tiene activada la resistencia de pullup (20k...50k). Y como la caída de tensión en la juntura cambia aprox -2mV/°C , mide y corrige el valor.

No sabia que se podía habilitar la resistencia pull-up cuando el pin esta configurado como entrada análoga, en general solo se puede cuando esta como digital.
 
Se puede usar siempre.
Es bueno saberlo. Con los PIC, por ejemplo, no se puede, se deshabilita cuando la entrada pasa a análogo.

Igual no estaría de mas verificar que en el diodo haya unos 0.6V para ir descartando problemas.

De hecho yo lo usé por ejemplo con un sensor onewire para no tener que poner una resistencia externa.
Si, pero con 1-wire se usa la entrada configurada en digital.
 
Última edición:
Arriba