# Termometro digital en C



## paaco123 (Oct 27, 2013)

que tal foro como estan  ?  
 bueno lo que pasa es que quiero hacer un termometro digital con barrido estoy utilizando un mc9s08se8 freescale motorola como microcontrolador, Transistores NPN y un LM35 como sensor de temperatura, tmabien un Driver ULN2803 y display Anodo comun

lo que pasa es que quiero hacer un termometro mas o menos exacto programandolo en C el microcontrolador esto es lo que llevo del programa, hasta ahoar solo es un convertidor analogico digital


```
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
void main(void){    PTADD = 0x00;  
PTAPE = 0xFF;  PTBDD = 0xFF;  // Initialise ADC:  ADCCFG = 0x00;
// 8-bit mode, short sample  ADCSC2 = 0x00;   // Software trigger  APCTL1 = 0x01;  
// Channel 0 input  EnableInterrupts;    for( ; ; ) {    __RESET_WATCHDOG();    ADCSC1 = 0x00;   
// Start conversion on channel 0  
while (ADCSC1_COCO == 0); 
// Wait until conversion is complete    PTBD = ADCRL;  }}
}
```

no se si alguien me pudiera ayudar para ese convertidor analogico digital imprimir lo que me diga en un display con barrido muchas gracias de antemano a todos ...


----------



## Urbito (Oct 28, 2013)

Yo quiero hacer lo mismo.

Quiero hacer un termometro digital con un pic 16f877a y un LM35. La presicion de 0,1 y que vaya de 00.1 a 99.9 mostrando los valores por un LCD 16x2

Este es mi codigo.

//

ADC=read_adc(); 
conv= (float)ADC;
conv=(conv*0.005850)/(0.01);
lcd_gotoxy(1,1);
printf(lcd_putc, "temp %3.1f C"conv); 

//

Estoy utilizando un tamaño de paso de 1.5v 

Mi problema es que la presicion es de 0.6 y nunca llega a 99.9 sino a 100.0

Me gustaria que alguien me ayudara en ajustar la presicion a 0.1! Gracias!


----------



## Sebastian1989 (Oct 28, 2013)

Para convertir el valor medido por el ADC a temperatura usas (conv*0.005850)/(0.01) suponiendo que conv aumente en 1 la temperatura aumentaría en 0.585 °C aprox. 0.6°C, para poder aumentar la precisión necesitas poner a la salida del LM35 un AO como amplificador no inversor, para calcular la ganancia ves cual es la máxima temperatura que vas a medir, calculas el voltaje de salida del LM35 y ves por cuanto hay que multiplicarlo para llegar al Vref+ del micro. Debes considerar que si el AO lo alimentas con 5V la salida del mismo nunca va a llegar a ese voltaje.


----------



## Urbito (Oct 28, 2013)

Ahi esta listo ! La parte del amplificador claro! Jajajajaja dure un buen rato en eso.

Al inicio entre 0 y 10v tiene un error de precisión de 0.2 y 0.3, luego a medida que sube el voltaje la precision se logra de 0.1

Espero a alguien le sirve !!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Ahora me pondre a trabajar en lo que seria el sensor que muestre lo que tiene que mostrar, que ya deberia xd


----------



## cosmefulanito04 (Oct 28, 2013)

Subrayo lo que puso arriba *Sebastian1989*:



Sebastian1989 dijo:


> Debes considerar que si el AO lo alimentas con 5V la salida del mismo nunca va a llegar a ese voltaje.



Esto quiere decir que si alimentás al operacional con por ej. 12v y a la salida tenés más de 5v, podés dañar al ADC del uC.

Por otro lado, no existen las resistencias de 13,425k, usá valores comerciales cuando diseñás.


----------



## Urbito (Oct 28, 2013)

eso fue para la presicion, seria un potenciometro de presicion de 20k o 2 en serie de 10k.

Por otro lado me di cuenta que cometi un error, al amplificar la señal consegui lo que queria. convertir 1mV en 10mV, pero con esto alcanze mi TOPE de 5v en 50ºC. 

Luego me mate la cabeza pq dije "QUE DIANTRES HAGO? UN AMPLIFICADOR QUE REDUSCA LA SEÑAL?" 

Y no, la solucion fue muy sencilla.

Tengo un numero de 1024 Cambios y quiero que haya un cambio cada 1mV.

1mV * 1024 = 1.024Volts == TAMAÑO DE PASO .... Listo.

Claro sin ninguna operacion matematica cada 1mV el registro sumara 1.

entonces la rutina quedaria:

//
ADC=read_adc(); 
conv= (float)ADC;
conv=conv*0.1;
//

Y listo, ya se tiene un cambio cada 1mV y se lleva a la presicion de 0.1ºC.

El tope maximo del termometro seria 102.4ºC

Aunque me contre con que en el 0 Absoluto del LM35 marca 1.12mV entonces esto hace que haya un error de precision en mi termometro durante unos 40º... ya no le dare mucha importancia  

Muchas gracias a los que aportaron y me ayudaron! Ahora continuare con mi proyecto y luego lo publico !!! 

Aca dejo la imagen y arriba obvio esta la rutina.


----------



## cosmefulanito04 (Oct 28, 2013)

Urbito dijo:


> eso fue para la presicion, seria un potenciometro de presicion de 20k o 2 en serie de 10k.



¿Un potenciómetro de precisión para un LM35?

Amigo la cosa es bastante más sencilla de lo que pensas, si el ADC puede bancarse 5v máximo, el LM35 te garantiza que podés ver variaciones de 10mV por c/ºC y si tu temperatura máxima es de 40ºC:

[LATEX]V_{ADC-max}=5v \rightarrow Ganancia=\frac{V_{ADC-max}}{10mV/C.40C}=12,5 veces[/LATEX]

En valores comerciales el no inversor quedará con R1=1kOhm y R2=10kOhm (por ejemplo), dando una ganancia de 11 y un margen de 0,6v antes de llegar a los 5v del ADC.

Luego al medir con el ADC deberá hacer esta cuenta:

[LATEX]Temperatura=\frac{N_{Adc}.\frac{V_{Adc-ref}}{1024 cuentas}}{10mV/C.Ganancia}=N_{Adc}0,04438 C/cuentas[/LATEX]

En estas condiciones tu ºT máxima a medir será de 45ºC.


----------



## Urbito (Oct 28, 2013)

Muchas gracias por la ayuda! Realmente aprendi bastante hoy de converitdores y amplificadores en cuanto a practica se refiere.

Ahora lo que me esta rompiendo el coco es que quiero ahora, agregarle a este sensor de temperatura una salida PWM con un lazo de corriente de 4 a 20mA.

Ya implemente el lazo de corriente que aca mismo encontre. Fuente de Corriente

Ahora lo que no se muy bien es como usar el PWM.

Por teoria se que el Pic 16f877a tiene 2 el CCP1 y el CCP2.

Supongo que debo usar solo 1 de ellos 2. Asi que uso el CCP1 y a continuacion dejo lo que seria mi nueva rutina.


> ADC=read_adc();
> conv= (float)ADC;
> conv2=conv*0.1;
> lcd_gotoxy(1,1);
> ...



Explicando lo que quiero hacer en pocas palabras es:

Para un valor de 0.0ºC == Corriente igual 4mA
Para un Valor de 99.9ºC == Corriente igual 20mA

Entonces ya con el lazo de corriente funcional, espero que alguien pueda ayudarme con lo que seria el arreglo final de la rutina para el PIC.

Entonces, ahora se que para un valor de 0ºC de entrada en pocas palabras el pulso de salida del PWM seria tambien de 0, ahi es donde debo agregar un convertidor sumador, sumando entonces los 4mA que necesito y empezando asi lo que seria el recorrido de 4 hasta 20mA.

Espero alguien pueda guiarme un poco mejor y ayudarme en lo que se pueda.

Anexo diagrama del lazo de corriente






Salu2


----------



## cosmefulanito04 (Oct 28, 2013)

Sobre lo anterior.

Repito la idea del potenciómetro de precisión, le estas pidiendo demasiado a ese pobre LM35, nunca vas a conseguir una resolución de 0,1ºC por un tema de linealidad (ver hojas de datos).

Otra gran error es no tener en cuenta la resolución del ADC que es de 4,8mV (con 5v con Vref) y hacer la conversión sin usar amplificador.

Te recomiendo que veas esos errores antes de seguir con el proyecto.


----------



## Urbito (Oct 28, 2013)

Ya cambie la resolucion del ADC. 

Use:

Vref a 1.027v

Resolucion de aproximadamente 1mV

Cada 1mV hay un cambio de 1 en el termometro, para logra la precision lineal de 0.1 
agregue la linea: "conv2=conv*0.1;" y ahi quedo listo el termometro de preciosion 0.1 de 00.0 a 99.9.


Lo que no se, o ignoro es si puedo usar ese Vref


----------



## cosmefulanito04 (Oct 28, 2013)

Urbito dijo:


> Ya cambie la resolucion del ADC.
> 
> Use:
> 
> ...



Creo que zener de referencia de 1.024v podés llegar a encontrar, pero deberías ver lo que dice la hoja de datos del uC.

Pero sigo insistiendo, mirá la hoja de datos el LM35, ¿qué dice respecto a la linealidad?

Otra cosa a tener en cuenta, si vas a trabajar con esos niveles de tensión, el ruido puede molestar y mucho.


----------



## Urbito (Oct 28, 2013)

La temperatura es directamente proporcional al voltaje xd


Edit: Respecto al ruido, pues jajajaja espero a la hora de implementarlo no encontrarme con ese problema, pero muchas gracias por ese detalle!


----------



## cosmefulanito04 (Oct 28, 2013)

Urbito dijo:


> La temperatura es directamente proporcional al voltaje xd



Falta leer hoja de datos ahí .



Urbito dijo:


> Edit: Respecto al ruido, pues jajajaja espero a la hora de implementarlo no encontrarme con ese problema, pero muchas gracias por ese detalle!



Con esos niveles que manejas....  ... suerte!.


----------



## Urbito (Oct 28, 2013)

Bueno, ya tengo lo que seria bien configurado el PWM. Tengo una salida de 1 a 5v pero cuando le pongo una resistencia de 250ohms para medir los 4 a 20ma o cuando pongo el circuito ya armado mas arriba en este tema, sufre una caida de tension muy alta y nunca marca mas de 4mA y jamas pasa siquiera los 3Volts.

Espero alguien pueda ayudarm.

Anexo la imagen del circuito


----------



## Chico3001 (Oct 28, 2013)

Urbito dijo:


> Ya cambie la resolucion del ADC.
> 
> Use:
> 
> ...



Si se puede usar ese Vref... pero yo recomendaria mas 2048 o incluso 4196mV asi te separas mas del ruido y solo haces divisiones entre 2 que son 2 corrimientos a la izquierda... 

Lo puedes implementar con un TL431

http://www.fairchildsemi.com/ds/TL/TL431A.pdf


----------



## Urbito (Oct 29, 2013)

Buenas tardes a todos y todas! Un saludo desde Venezuela.

Estoy con este proyectito de Microcontroladores y Instrumentacion juntos. Consiste en un medidor de temperatura universal que involucra el ya conocido LM35, que pase a travez de un PIC 16F877A y produsca una salida de 4 a 20mA. Dichos valores, de corriente y temperatura deben mostrarse por una LCD. La precisión debe ser de 0.1, partiendo de 00.0 a 99.9.

Ya esta realizado lo que seria el sensor de temperatura y la salida de 1 a 5Volts. 

Estoy usando un Vref = 1.027Volts y un tamaño de paso de 1mV.

El programa en pocas palabras se resume en lo que a continuacion anexo:



> ADC=read_adc();
> conv= (float)ADC;
> conv2=conv*0.1;
> lcd_gotoxy(1,1);
> ...



Usando un divisor de timer2 de 125. Esto me estaria dando la salida de 1 a 5V.

A continuacion anexo imagen del circuito.






Entonces el problema radica en que cuando anexo este otro circuito al filtro de R=1k y C=1000uF se produce lo que no se si es una perdida de voltaje o que. pase de producir 1 a 5v a siquiera llegar a 3v :s

El circuito que estoy usando para pasar de 4 a 20mA es el siguiente:






Espero alguien pueda ayudarme a solucionar este problema que realmente no se le ha dado una solucion exacta en el foro.

Salu2

EDIT: Lo mismo ocurre si le coloco una resistencia de 250 Ohms en paralelo a el capacitor de 1000uF.


----------



## Urbito (Oct 30, 2013)

Y Esta listo el sensor de temperatura! pasaba que como antes del opam habia una carga (las resistencias de 10 y 39k, estas se consumian todo el voltaje y jamas entraba el voltaje que era al opam.

El circuito final es el siguiente.


----------



## Antaresis (Jun 22, 2015)

me pareció interesante lo que comentaban...
yo tengo un caso similar...
hice un termómetro con pic 16F88; todo funciona correctamente en la simulación y los códigos.
ahora el detalle es cuando lo armo tal cual como dejaré en la imagen el circuito, al probar en el protoboard no funciona como debería de funcionar...
según el lcd me muestra una temperatura ambiente de 15ºC luego al poner el sensor cerca de una lámpara incadescente, no sube mucho que digamos la temperatura; cuando en realidad pues el calor que irradia dicha lámpara es mayor, a lo que se muestra en el lcd.
he aquí les adjunto el circuito y el código...
el pic funciona con oscilador interno...
los códigos están echo en mikroc compiler...


----------



## D@rkbytes (Jun 22, 2015)

¿Y si en vez de imágenes, subes tu proyecto completo dentro de un archivo comprimido (Winzip o WinRAR)?
Los proyectos de mickroC usan varias configuraciones y librerías que es necesario saber.


----------



## Antaresis (Jun 23, 2015)

aquí está el archivo rar del termometro...
como les dije el detalle está en la parte práctica es ahí donde no cambia mucho la temperatura al calentar el ambiente...
probe con termometro normal y me daba una temperatura de 40ºC...
mientras el que hice me daba una temperatura de 17ºC...


----------



## D@rkbytes (Jun 23, 2015)

Antaresis dijo:


> Probé con termómetro normal y me daba una temperatura de 40ºC,
> mientras el que hice me daba una temperatura de 17ºC.


Compilé tu programa, monté el circuito en un protoboard y funciona bien.
Aquí una foto de la visualización en pantalla sobre la temperatura actual: 
Los cambios se realizan normalmente al acercar fuentes de calor.

Posiblemente tengas mal conectado el sensor o puede estar dañado.
Mira las conexiones: 

Yo realicé la prueba con un LM35 de encapsulado TO-92, el que se encuentra hasta abajo de la imagen.


----------



## ruben90 (Jun 24, 2015)

Prueba con este, yo lo hice con un PIC16F819, pero tu lo puedes adaptar al PIC16F877, y como son con registros, así como esta lo pones (ojo solo cambia los valores del ADCON0 y ADCON1 para el PIC16F877).


```
unsigned int valor_adc;
unsigned short unidad, decena;
float temperatura;

const unsigned short digito[] = {
0x3F,
0x06,
0x5B,
0x4F,
0x66,
0x6D,
0x7D,
0x07,
0x7F,
0x6F,
};


void main(void) {

ADCON0 = 0b11000000;
ADCON1 = 0b10000101;

TRISA.f0 = 1;
TRISA.f3 = 1;
TRISA.f1 = 0;
TRISA.f2 = 0;

TRISB = 0;
PORTB = 0;


while(1) {
ADCON0.ADON = 1;
Delay_us(40);
ADCON0.GO = 1;
while(ADCON0.GO == 1);
valor_adc = (ADRESH << 8) + ADRESL;

temperatura = 0.125 * valor_adc;

decena = temperatura / 10;
unidad = temperatura - (decena * 10);

PORTB = digito[unidad];
PORTA.f1 = 1;
Delay_ms(100);
PORTA = 0;

PORTB = digito[decena];
PORTA.f2 = 1;
Delay_ms(100);
PORTA = 0;

Delay_us(12);

}
}
```

*Los inversores solo son 2 transistores configurados como interruptores.*


----------



## Antaresis (Jun 24, 2015)

D@rkbytes dijo:


> Compilé tu programa, monté el circuito en un protoboard y funciona bien.
> Aquí una foto de la visualización en pantalla sobre la temperatura actual: Ver el archivo adjunto 131194
> Los cambios se realizan normalmente al acercar fuentes de calor.
> 
> ...



entiendo...
puede que esté fallando el sensor...
y vos lo hiciste funcionar con oscilador interno o externo?...


----------



## D@rkbytes (Jun 24, 2015)

Antaresis dijo:


> ¿Y vos lo hiciste funcionar con oscilador interno o externo?


Con el interno a 4 MHz. Tal cual y como está tu programa.
No realicé ninguna modificación. Puedes ver que la pantalla sigue mostrando "atual" en vez de "actual"

Y aún lo tengo conectado y funcionando. 

Esta es la otra parte del protoboard.


----------



## Antaresis (Jun 24, 2015)

D@rkbytes dijo:


> Con el interno a 4 MHz. Tal cual y como está tu programa.
> No realicé ninguna modificación. Puedes ver que la pantalla sigue mostrando "atual" en vez de "actual"
> 
> Y aún lo tengo conectado y funcionando. Ver el archivo adjunto 131217
> ...



ok!
gracias lo probaré nuevamente...


----------



## luchonsn (Jun 24, 2015)

Buenas tardes mis estimados amigos

el proyecto consta con los siguientes características:
termistor NTC de 50 k , 
ventilador de 12 v
pic 16f877a .
lcd 4x16

adjunto la simulación y programación en ccs


1. quiero que la temperatura me muestre en un lcd 4x16 
2. cuando la temperatura aumente los leds se encenderán descendente mente,y cuando la temperatura baje se apagara los leds acendentemente.
3. de la misma manera la ventiladora que esta en el puerto C , aumentara su velocidad conforme la temperatura y disminuirá su velocidad conforme este bajando la temperatura


1. la temperatura me muestra en el lcd
2. los leds se prenden secuencialmente cuando la temperatura sube y se apagan cuando la temperatura baja


* lo que tengo problemas es con el ventilador de 12v o motor?
 he estado utilizando  PWM.pero no he podido que  gire motor o ventiladora


----------



## AleSergi (Jun 24, 2015)

Ché Antaresis, para que lo tengas en cuenta, resulta ser que el LM35 es bastante malo.... 
 cuando le pones cables largos, de más de 20cm en mi caso, o sea CUIDADO con la longitud de tus cables.

Seguramente terminás empleando unos de esos IC DS18S20, que son 100% digitales, y el cable puede ser más largo.

Y por si fuera poco siempre podés probar tu circuito ADC del pic conectando un simple potenciometro a ese pin de unos 5kohm , y hará lo mísmo que el LM35 que termina funcionando como una pequeña fuente de tensión.


----------



## Antaresis (Jun 24, 2015)

D@rkbytes dijo:


> Con el interno a 4 MHz. Tal cual y como está tu programa.
> No realicé ninguna modificación. Puedes ver que la pantalla sigue mostrando "atual" en vez de "actual"
> 
> Y aún lo tengo conectado y funcionando. Ver el archivo adjunto 131217
> ...



por cierto cuento de voltaje lo estás poniendo al LM35?
quizás sea por que no funca en mi caso...


----------



## luchonsn (Jun 24, 2015)

alguien puede revisar mi  proyecto tengo problemas , con el ventilador que no gira.


----------



## cosmefulanito04 (Jun 24, 2015)

luchonsn dijo:


> alguien puede revisar mi  proyecto tengo problemas , con el ventilador que no gira.



Usá una configuración emisor común, en modo saturado/corte.


----------



## luchonsn (Jun 24, 2015)

cosmefulanito04 dijo:


> Usá una configuración emisor común, en modo saturado/corte.



en la imagen esta con un potencio metro  y me funciona , lo que yo quiero es un termistor ntc
y cuando lo remplazo el potenciometro por un  termistor ntc no pasa nada... no me muestra nada





			
				luchonsn dijo:
			
		

> en la imagen esta con un potencio metro  y me funciona , lo que yo quiero es un termistor ntc
> y cuando lo remplazo el potenciometro por un  termistor ntc no pasa nada... no me muestra nada



 solo falta el  timer y la interrupcion
 donde se genera el pwm


no entiendo muy bien la teoria de pwm


----------



## miglo (Jun 24, 2015)

luchonsn dijo:


> * lo que tengo problemas es con el ventilador de 12v o motor?
> he estado utilizando  PWM.pero no he podido que  gire motor o ventiladora



Hola luchonsn, he realizado unas pequeñas modificaciones, dime si es eso lo que buscas.


----------



## luchonsn (Jun 24, 2015)

miglo dijo:


> Hola luchonsn, he realizado unas pequeñas modificaciones, dime si es eso lo que buscas.



lo que quiero es controlar la velocidad de la ventiladora o motor mediante un termistor ntc y que segun aumente la temperatura me muetre en el lcd  y prendan los leds desendentemente cuando aumente la temperatura y cuando disminuye la temperatura se apaguen acendentemente.


----------



## cosmefulanito04 (Jun 24, 2015)

luchonsn dijo:


> en la imagen esta con un potencio metro  y me funciona , lo que yo quiero es un termistor ntc
> y cuando lo remplazo el potenciometro por un  termistor ntc no pasa nada... no me muestra nada



En la imagen lo estás usando como colector común y en forma lineal, mucha potencia disipada sin sentido.


----------



## miglo (Jun 24, 2015)

luchonsn dijo:


> lo que quiero es controlar la velocidad de la ventiladora o motor mediante un termistor ntc y que segun aumente la temperatura me muetre en el lcd  y prendan los leds desendentemente cuando aumente la temperatura y cuando disminuye la temperatura se apaguen acendentemente.



has mirado el archivo, creo que es lo que vuscas


----------



## ruben90 (Jun 24, 2015)

El motor debes colocarlo así cuando usas transistores NPN (imagen) y para protección del transistor, colocas un diodo polarizado a la inversa en paralelo del motor.


----------



## D@rkbytes (Jun 24, 2015)

Antaresis dijo:


> ¿Cuanto de voltaje le estás poniendo al LM35?
> Quizás sea por que no funca en mi caso.


5 Voltios. El mismo voltaje que tiene el PIC.


----------



## ruben90 (Jun 24, 2015)

y el termistor ntc de cuanto es? 1k, 10k, 100k? porque para conectarlo al pic pues se utiliza un divisor de tensión y la salida de este a un seguidor de tensión (si te preocupa el pin del pic) y ya...


----------



## luchonsn (Jun 24, 2015)

ruben90 dijo:


> y el termistor ntc de cuanto es? 1k, 10k, 100k? porque para conectarlo al pic pues se utiliza un divisor de tensión y la salida de este a un seguidor de tensión (si te preocupa el pin del pic) y ya...




el termistor  es de 10k


----------



## Antaresis (Jun 25, 2015)

D@rkbytes dijo:


> 5 Voltios. El mismo voltaje que tiene el PIC.



ya veo quizás sea por eso...
porque lo estuve haciendo funcionar con 4.3 voltios...
bueno será de probar entonces...
con 5 voltios...
gracias...


----------



## D@rkbytes (Jun 25, 2015)

Antaresis dijo:


> Ya veo, quizás sea por eso, porque lo estuve haciendo funcionar con 4.3 voltios.


No creo que sea por eso.
Hice una prueba alimentando al LM35 con una fuente variable, y por abajo de 3 voltios ya empezó a fallar.
De 3 voltios para arriba hasta el máximo soportado de 35 V. no hubo problemas y las lecturas fueron normales y constantes.

Cambia el sensor LM35 por uno nuevo, pero trata de conseguirlo en otra tienda.


----------



## lee (Ene 1, 2016)

Estimados.
realice un programa de lectura analogica con un pic16f877a en mikroc... la cosa es que estoy hasta el momento leyendo dos lm35 y dos sensores de corriene, la cosa es que al momento de leer los sensores de corriente el display ya no muestra nada. y debo agregarle dos lecturas mas de unos divisores de tension. me pueden ayudar a detectar el problema.

Adjunto un rar con archivo y simulacion.

*[Edita tus comentarios en lugar de crear nuevos]*​
Estimados no tengo problemas con la lectura de lm35 tampoco con los sensores de corriente solo que luego e un momento el display ya no muestra nada. no se porque movieron a este tema.


----------



## Saint_ (Ene 1, 2016)

hola lee, viendo el programa que subiste puedo comentarte que tienes código innecesario en la rutina principal y en la interrupción no hiciste el uso adecuado del la lectura del adc.
la funcion _adc_read();_ configura, inicia espera a que termine la convercion y lee el adc por o cual el uso de esa función dentro de la interrupción es innecesaria.
Detalles como estos pudieron causar que el compilador no haga una buena gestión del LCD.
Te te muestro este código que puede ayudarte a conseguir lo que necesitas.

```
//DEFINICION PINES LCD
    sbit LCD_RS at RC3_bit;
    sbit LCD_EN at RC5_bit;
    sbit LCD_D7 at RD7_bit;
    sbit LCD_D6 at RD6_bit;
    sbit LCD_D5 at RD5_bit;
    sbit LCD_D4 at RD4_bit;
//DFINICION TRIS LCD
    sbit LCD_RS_Direction at TRISC3_bit;
    sbit LCD_EN_Direction at TRISC5_bit;
    sbit LCD_D7_Direction at TRISD7_bit;
    sbit LCD_D6_Direction at TRISD6_bit;
    sbit LCD_D5_Direction at TRISD5_bit;
    sbit LCD_D4_Direction at TRISD4_bit;

void main()
{
   //DEFINICION VARIABLES
   unsigned int adc_value1;
   unsigned int adc_value2;
   signed int adc_value3;
   signed int adc_value4;
   unsigned char texto1[15];
   unsigned char texto2[15];
   unsigned char texto3[15];
   unsigned char texto4[15];
   float Mv1;
   float Mv2;
   float Mv3;
   float Mv4;
   
   TRISA=0XFF;
   PORTA=0X00;

   Lcd_Init();
   Lcd_Cmd(_LCD_CURSOR_OFF);
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Out(1,2,"INVERSOR DC/AC");
   Lcd_Out(2,4,"1500 WATT");
   Delay_ms(2000);
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Out(1,3,"INICIANDO...");
   Delay_ms(2000);
   Lcd_Cmd(_LCD_CLEAR);
   while(1)
   {
         adc_value1=ADC_read(0);
         Mv1 = adc_value1*0.488;
         FloatToStr(Mv1,texto1);
         //texto1[4]=0;
         Lcd_Out(1,10,texto1);
         Lcd_Out(1,1,"T.IGBT1:");
         Lcd_Chr(1,15,223);
         Lcd_Chr(1,16, 'C');


         adc_value2=ADC_read(1);
         Mv2 = adc_value2*0.488;
         FloatToStr(Mv2,texto2);
         //texto2[4]=0;
         Lcd_Out(2,10,texto2);
         Lcd_Out(2,1,"T.IGBT2:");
         Lcd_Chr(2,15,223);
         Lcd_Chr(2,16, 'C');


         Delay_ms(3000);
         Lcd_Cmd(_LCD_CLEAR);

         adc_value3=ADC_read(2);
         Mv3 =(adc_value3-512)*0.0586;
         FloatToStr(Mv3,texto3);
         //texto3[4]=0;
         Lcd_Out(1,7,texto3);
         Lcd_Out(1,1,"I.DC:");
         Lcd_Out(1,12,"AMP ");

         adc_value4=ADC_read(3);
         Mv4 =(adc_value4-512)*0.0586;
         FloatToStr(Mv4,texto4);
         //texto4[4]=0;
         Lcd_Out(2,7,texto4);
         Lcd_Out(2,1,"I.DC:");
         Lcd_Out(2,12, "AMP ");

         Delay_ms(3000);
         Lcd_Cmd(_LCD_CLEAR);
   }
}
```
PD. Existe un problema con la funcion que convierte un numero real a cadena de texto y es que cuando el valor es pequeño ejemplo 0.00012xx la convercion lo  expresa como 1.2xxe-4.


----------



## lee (Ene 2, 2016)

Muchas gracias Saint_ por responder... realizare dichos cambios y te comento como me va. 
saludos

Muchas gracias Saint_ por responder... realizare dichos cambios y te comento como me va. 
saludos



Saint_ Gracias, efectivamente el programa funciona ala perfección, y me e dado cuenta los errores que tenia mi código... ahora solo le agregare las entradas análogas que me falta y lo terminare para cargarlo.

Gracias y saludos.


----------



## lee (Ene 3, 2016)

Estuve realizando agregándoles los nuevos sensores a dicho programa y aun sigue el problema al agregarle nuevas lecturas análogas... e tenido cuidado con la transformación y no entiendo que pasa? me pueden guiar porfa....


```
//DEFINICION PINES LCD
    sbit LCD_RS at RC3_bit;
    sbit LCD_EN at RC5_bit;
    sbit LCD_D7 at RD7_bit;
    sbit LCD_D6 at RD6_bit;
    sbit LCD_D5 at RD5_bit;
    sbit LCD_D4 at RD4_bit;
//DFINICION TRIS LCD
    sbit LCD_RS_Direction at TRISC3_bit;
    sbit LCD_EN_Direction at TRISC5_bit;
    sbit LCD_D7_Direction at TRISD7_bit;
    sbit LCD_D6_Direction at TRISD6_bit;
    sbit LCD_D5_Direction at TRISD5_bit;
    sbit LCD_D4_Direction at TRISD4_bit;

void main()
{
   //DEFINICION VARIABLES
   unsigned int adc_value1;
   unsigned int adc_value2;
   signed int adc_value3;
   signed int adc_value4;
   unsigned int adc_value5;
   unsigned int adc_value6,x,z;
    char texto1[16];
    char texto2[16];
    char texto3[16];
    char texto4[16];
    char texto5[16];
    char texto6[16];
   float Mv1;
   float Mv2;
   float Mv3;
   float Mv4;
   float Mv5;
   float Mv6;

   TRISA=0XFF;
   PORTA=0X00;

   Lcd_Init();
   Lcd_Cmd(_LCD_CURSOR_OFF);
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Out(1,2,"INVERSOR DC/AC");
   Lcd_Out(2,4,"1500 WATT");
   Delay_ms(2000);
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Out(1,3,"INICIANDO...");
   Delay_ms(2000);
   Lcd_Cmd(_LCD_CLEAR);
   
   while(1)
   {
         adc_value1=ADC_read(0);//TEMPERATURA 1°
         Mv1 = adc_value1*0.488;
         FloatToStr(Mv1,texto1);
         Lcd_out(1,10,texto1);
         Lcd_Out(1,1,"T.IGBT1:");
         Lcd_Chr(1,15,223);
         Lcd_Chr(1,16, 'C');

         adc_value2=ADC_read(1);//TEMPERATURA 2°
         Mv2 = adc_value2*0.488;
         FloatToStr(Mv2,texto2);
         Lcd_out(2,10,texto2);
         Lcd_Out(2,1,"T.IGBT2:");
         Lcd_Chr(2,15,223);
         Lcd_Chr(2,16, 'C');

         Delay_ms(2000);
         Lcd_Cmd(_LCD_CLEAR);

         adc_value3=ADC_read(2);//CORRIENTE BATERIA
         Mv3 =(adc_value3-512)*0.0586;
         FloatToStr(Mv3,texto3);
         Lcd_Out(1,7,texto3);
         Lcd_Out(1,1,"I.DC:");
         Lcd_Out(1,14,"AMP ");

         adc_value4=ADC_read(3);//CORRIENTE SALIDA INVERSOR
         Mv4 =(adc_value4-512)*0.0586;
         FloatToStr(Mv4,texto4);
         Lcd_out(2,7,texto4);
         Lcd_Out(2,1,"I.AC:");
         Lcd_Out(2,14, "AMP");
         
            Delay_ms(2000);
         Lcd_Cmd(_LCD_CLEAR);

         adc_value5=ADC_read(4);//VOLATAJE BATERIA
         Mv5 =(adc_value5*49)/1024.0;
         FloatToStr(Mv5,texto5);
         Lcd_Out(1,7,texto5);
         Lcd_Out(1,1,"V.DC:");
         Lcd_Out(1,13, "VOLTS");

         adc_value6=ADC_read(5);//VOLTAJE SALIDA INVERSOR
         Mv6 =(adc_value6*462)/1024.0;
         FloatToStr(Mv6,texto6);
         Lcd_Out(2,7,texto6);
         Lcd_Out(2,1,"V.AC:");
         Lcd_Out(2,13, "VOLTS");

         Delay_ms(2000);
         Lcd_Cmd(_LCD_CLEAR);
         

   }
}
```


----------



## D@rkbytes (Ene 4, 2016)

Como usas mikroC, seguramente tendrás un problema con los bancos de memoria.
Este problema no lo resuelve el compilador automáticamente como lo hacen otros.

Declara los arreglos de tus variables en un banco de memoria, de ésta forma:
*char texto1[16] absolute 0x20;
*Así para todos tus arreglos.
No importa que uses la misma dirección, porque sólo usas los arreglos para mostrar texto.
Y si quieres ahorrar memoria, es mejor que uses un único arreglo.

Lo que importa son las variables que usarás para retener valores.
Declarando un único arreglo de conversión, optimizas la memoria del microcontrolador.


----------



## lee (Ene 4, 2016)

Estimado D@rkbyte, e realizados dichos cambios en las variables y ahora si se muestran todos los resultados en el lcd, pero sin mentirte aun no estoy 100% claro con el problema... seguiré leyendo y estudiando para comprender bien el compilador.

muchas gracias D@rkbytes  

Saludos


----------



## albertoxx (Ene 9, 2016)

Yo lo pondria asi para sacar las rutinas de lectura de las de display si con esos cambios aun no muestra nada quita las rutinas de lectura y prueba de nuevo si aun asi no muestra ni el hola revisa las rutinas de display


```
//DEFINICION PINES LCD
    sbit LCD_RS at RC3_bit;
    sbit LCD_EN at RC5_bit;
    sbit LCD_D7 at RD7_bit;
    sbit LCD_D6 at RD6_bit;
    sbit LCD_D5 at RD5_bit;
    sbit LCD_D4 at RD4_bit;
//DFINICION TRIS LCD
    sbit LCD_RS_Direction at TRISC3_bit;
    sbit LCD_EN_Direction at TRISC5_bit;
    sbit LCD_D7_Direction at TRISD7_bit;
    sbit LCD_D6_Direction at TRISD6_bit;
    sbit LCD_D5_Direction at TRISD5_bit;
    sbit LCD_D4_Direction at TRISD4_bit;

void main()
{
   //DEFINICION VARIABLES
   unsigned int adc_value1;
   unsigned int adc_value2;
   signed int adc_value3;
   signed int adc_value4;
   unsigned int adc_value5;
   unsigned int adc_value6,x,z;
    char texto1[16];
    char texto2[16];
    char texto3[16];
    char texto4[16];
    char texto5[16];
    char texto6[16];
   float Mv1;
   float Mv2;
   float Mv3;
   float Mv4;
   float Mv5;
   float Mv6;

   TRISA=0XFF;
   PORTA=0X00;

   Lcd_Init();
   Lcd_Cmd(_LCD_CURSOR_OFF);
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Out(1,2,"INVERSOR DC/AC");
   Lcd_Out(2,4,"1500 WATT");
   Delay_ms(2000);
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Out(1,3,"INICIANDO...");
   Delay_ms(2000);
   Lcd_Cmd(_LCD_CLEAR);
   
   while(1)
   {
         adc_value1=ADC_read(0);//TEMPERATURA 1°
         adc_value2=ADC_read(1);//TEMPERATURA 2°
         adc_value3=ADC_read(2);//CORRIENTE BATERIA
         adc_value4=ADC_read(3);//CORRIENTE SALIDA INVERSOR
         adc_value5=ADC_read(4);//VOLATAJE BATERIA
         adc_value6=ADC_read(5);//VOLTAJE SALIDA INVERSOR

         Mv1 = adc_value1*0.488;
         FloatToStr(Mv1,texto1);
         Lcd_out(1,10,texto1);
         Lcd_Out(1,1,"T.IGBT1:");
         Lcd_Chr(1,15,223);
         Lcd_Chr(1,16, 'C');

         Mv2 = adc_value2*0.488;
         FloatToStr(Mv2,texto2);
         Lcd_out(2,10,texto2);
         Lcd_Out(2,1,"T.IGBT2:");
         Lcd_Chr(2,15,223);
         Lcd_Chr(2,16, 'C');

         Delay_ms(2000);
         Lcd_Cmd(_LCD_CLEAR);

         Mv3 =(adc_value3-512)*0.0586;
         FloatToStr(Mv3,texto3);
         Lcd_Out(1,7,texto3);
         Lcd_Out(1,1,"I.DC:");
         Lcd_Out(1,14,"AMP ");

         Mv4 =(adc_value4-512)*0.0586;
         FloatToStr(Mv4,texto4);
         Lcd_out(2,7,texto4);
         Lcd_Out(2,1,"I.AC:");
         Lcd_Out(2,14, "AMP");
         
            Delay_ms(2000);
         Lcd_Cmd(_LCD_CLEAR);

         Mv5 =(adc_value5*49)/1024.0;
         FloatToStr(Mv5,texto5);
         Lcd_Out(1,7,texto5);
         Lcd_Out(1,1,"V.DC:");
         Lcd_Out(1,13, "VOLTS");

         Mv6 =(adc_value6*462)/1024.0;
         FloatToStr(Mv6,texto6);
         Lcd_Out(2,7,texto6);
         Lcd_Out(2,1,"V.AC:");
         Lcd_Out(2,13, "VOLTS");

         Delay_ms(2000);
         Lcd_Cmd(_LCD_CLEAR);
         Delay_ms(10);

   }
}
```


----------



## lee (Ene 24, 2016)

Estimados Amigos del foro retomando mi proyecto, ahora cada ves que las variables leídas superen un valor x necesito que me enciendan un led rojo que indica alguna avería y caso contrario un led verde el cual señala todo ok. el ema es que no me funciona correctamente, por eso este mensaje.


```
//DEFINICION PINES LCD
    sbit LCD_RS at RC3_bit;
    sbit LCD_EN at RC5_bit;
    sbit LCD_D7 at RD7_bit;
    sbit LCD_D6 at RD6_bit;
    sbit LCD_D5 at RD5_bit;
    sbit LCD_D4 at RD4_bit;
//DFINICION TRIS LCD
    sbit LCD_RS_Direction at TRISC3_bit;
    sbit LCD_EN_Direction at TRISC5_bit;
    sbit LCD_D7_Direction at TRISD7_bit;
    sbit LCD_D6_Direction at TRISD6_bit;
    sbit LCD_D5_Direction at TRISD5_bit;
    sbit LCD_D4_Direction at TRISD4_bit;
    #define LEDVERDE PORTB.RB6
    #define LEDROJO PORTB.RB7
    #define ON 1
    #define OFF 0

void main()
{
   //DEFINICION VARIABLES
   unsigned int adc_value1;
   unsigned int adc_value2;
   signed int adc_value3;
   signed int adc_value4;
   unsigned int adc_value5;
   unsigned int adc_value6;
   char texto1[16]absolute 0x20;
   char texto2[16]absolute 0x21;
   char texto3[16]absolute 0x22;
   char texto4[16]absolute 0x23;
   char texto5[16]absolute 0x24;
   char texto6[16]absolute 0x25;
   char texto7[16]absolute 0x26;
   float Mv1 absolute 0x26;
   float Mv2 absolute 0x26;
   float Mv3 absolute 0x28;
   float Mv4 absolute 0x29;
   float Mv5 absolute 0x30;
   float Mv6 absolute 0x31;
   float Mv7 absolute 0x32;

   TRISA=0XFF;
   PORTA=0X00;
   TRISB=0;
   PORTB=0;


   Lcd_Init();
   Lcd_Cmd(_LCD_CURSOR_OFF);
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Out(1,2,"INVERSOR DC/AC");
   Lcd_Out(2,4,"1500 WATT");
   Delay_ms(2000);
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Out(1,3,"INICIANDO...");
   Delay_ms(2000);
   Lcd_Cmd(_LCD_CLEAR);


   while(1)
   {

         adc_value1=ADC_read(0);//TEMPERATURA 1°
         Mv1 = adc_value1*0.488;
         FloatToStr(Mv1,texto1);
         if ( Mv1 > 70.0 )
         {
         LEDROJO = ON;
         LEDVERDE = OFF;
         }
         else
         {
         LEDROJO = OFF;
         LEDVERDE = ON;
         }
         Lcd_out(1,10,texto1);
         Lcd_Out(1,1,"T.IGBT1:");
         Lcd_Chr(1,15,223);
         Lcd_Chr(1,16, 'C');

         adc_value2=ADC_read(1);//TEMPERATURA 2°
         Mv2 = adc_value2*0.488;
         FloatToStr(Mv2,texto2);
         if ( Mv2 > 70.0 )
         {
         LEDROJO = ON;
         LEDVERDE = OFF;
         }
         else
         {
         LEDROJO = OFF;
         LEDVERDE = ON;
         }
         Lcd_out(2,10,texto2);
         Lcd_Out(2,1,"T.IGBT2:");
         Lcd_Chr(2,15,223);
         Lcd_Chr(2,16, 'C');


         delay_ms(2000);
         Lcd_Cmd(_LCD_CLEAR);

         adc_value3=ADC_read(2);//CORRIENTE BATERIA
         Mv3 =((adc_value3-512)*0.0586);
         FloatToStr(Mv3,texto3);
         if ( Mv3 > 20.0 )
         {
         LEDROJO = ON;
         LEDVERDE = OFF;
         }
         else
         {
         LEDROJO = OFF;
         LEDVERDE = ON;
         }
         Lcd_Out(1,7,texto3);
         Lcd_Out(1,1,"I.DC:");
         Lcd_Out(1,14,"AMP ");

         adc_value4=ADC_read(3);//CORRIENTE SALIDA INVERSOR
         Mv4 =((adc_value4-512)*0.0586);
         FloatToStr(Mv4,texto4);
         if ( Mv4 > 20.0 )
         {
         LEDROJO = ON;
         LEDVERDE = OFF;
         }
         else
         {
         LEDROJO = OFF;
         LEDVERDE = ON;
         }
         Lcd_out(2,7,texto4);
         Lcd_Out(2,1,"I.AC:");
         Lcd_Out(2,14, "AMP");

         Delay_ms(2000);
         Lcd_Cmd(_LCD_CLEAR);

         adc_value5=ADC_read(4);//VOLATAJE BATERIA
         Mv5 =((adc_value5*49.0)/1024.0);
         FloatToStr(Mv5,texto5);
         if ( Mv5 < 24.0 )
         {
         LEDROJO = ON;
         LEDVERDE = OFF;
         }
         else
         {
         LEDROJO = OFF;
         LEDVERDE = ON;
         }
         Lcd_Out(1,7,texto5);
         Lcd_Out(1,1,"V.DC:");
         Lcd_Out(1,13, "VOLTS");

         adc_value6=ADC_read(5);//VOLTAJE SALIDA INVERSOR
         Mv6 =(adc_value6*462.9)/1024.0;
         FloatToStr(Mv6,texto6);
         if ( Mv6 < 200.0 )
         {
         LEDROJO = ON;
         LEDVERDE = OFF;
         }
         else
         {
         LEDROJO = OFF;
         LEDVERDE = ON;
         }
         Lcd_Out(2,7,texto6);
         Lcd_Out(2,1,"V.AC:");
         Lcd_Out(2,13, "VOLTS");

         Delay_ms(2000);
         Lcd_Cmd(_LCD_CLEAR);

   }
}
```


----------



## D@rkbytes (Ene 25, 2016)

Anteriormente te mencioné que podías usar un único arreglo para mostrar las conversiones.
Esto es porque solo se usa para mostrar texto en pantalla, no para retener valores.

O sea que puedes usar el mismo arreglo para todas las conversiones que vayas a mostrar.

Ejemplo:

```
char texto[16] absolute 0x20;

    Mv1 = adc_value1*0.488;
    FloatToStr(Mv1,texto);
    Lcd_out(1,10,texto);
    // Etc.
    Mv2 = adc_value2*0.488;
    FloatToStr(Mv2,texto);
    Lcd_out(2,10,texto);
    //Etc.
    Mv3 =((adc_value3-512)*0.0586);
    FloatToStr(Mv3,texto);
    Lcd_Out(1,7,texto);
    // Etc.
    Mv4 =((adc_value4-512)*0.0586);
    FloatToStr(Mv4,texto);
    Lcd_out(2,7,texto);
    // Etc.
```
Y las variables "Float" no las declares para código absoluto. (En un único banco de memoria)


lee dijo:


> Estimados amigos del foro, retomando mi proyecto,  ahora cada vez que las variables leídas superen un valor x, necesito que  me enciendan un led rojo que indica alguna avería y caso contrario, un  led verde el cual señala todo ok.


Puedes usar algo así, por ejemplo:

```
if(Var1 < 0xXX && Var2 > 0xXX && Var3 < 0xXX)
    {
        // Código a ejecutar.
    }
    {
    else
    {
        // Código a ejecutar.
    }
```


----------



## lee (Ene 25, 2016)

Estimado D@rkbytes gracias por siempre ayudar, te comento que e realizado los cambios y ya todo funciona ok, pero tuve que cambiar los pines del lcd del puerto d al puerto b, por el diseño de la placa y al simularlo ya no me funciona. E revisado todo y no encuentro nada extraño. me puedes dar alguna sugerencia...

```
//DEFINICION PINES LCD
    sbit LCD_RS at RB0_bit;
    sbit LCD_EN at RB1_bit;
    sbit LCD_D7 at RB2_bit;
    sbit LCD_D6 at RB3_bit;
    sbit LCD_D5 at RB4_bit;
    sbit LCD_D4 at RB5_bit;
//DFINICION TRIS LCD
    sbit LCD_RS_Direction at TRISB0_bit;
    sbit LCD_EN_Direction at TRISB1_bit;
    sbit LCD_D7_Direction at TRISB2_bit;
    sbit LCD_D6_Direction at TRISB3_bit;
    sbit LCD_D5_Direction at TRISB4_bit;
    sbit LCD_D4_Direction at TRISB5_bit;
    
    #define LEDVERDE PORTD.RD2
    #define LEDROJO PORTD.RD3
    #define FALLA PORTD.RD4
    #define ON 1
    #define OFF 0

void main()
{
   //DEFINICION VARIABLES
   unsigned int adc_value1;
   unsigned int adc_value2;
   signed int adc_value3;
   signed int adc_value4;
   unsigned int adc_value5;
   unsigned int adc_value6;
   char texto1[16]absolute 0x20;
   char texto2[16]absolute 0x21;
   char texto3[16]absolute 0x22;
   char texto4[16]absolute 0x23;
   char texto5[16]absolute 0x24;
   char texto6[16]absolute 0x25;
   char texto7[16]absolute 0x26;
   float Mv1 ;
   float Mv2 ;
   float Mv3 ;
   float Mv4 ;
   float Mv5 ;
   float Mv6 ;
   int bandera1;
   int bandera2;


   TRISA=0XFF;
   PORTA=0X00;
   TRISD=0x00;
   PORTD=0x00;
   INTCON = 0;
   Lcd_Init();
   Lcd_Cmd(_LCD_CURSOR_OFF);
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Out(1,2,"INVERSOR DC/AC");
   Lcd_Out(2,4,"1500 WATT");
   Delay_ms(2000);
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Out(1,3,"INICIANDO...");
   Delay_ms(2000);
   Lcd_Cmd(_LCD_CLEAR);


   while(1)
   {
         bandera1=0;
         adc_value1=ADC_read(0);//TEMPERATURA 1°
         Mv1 = adc_value1*0.488;
         FloatToStr(Mv1,texto1);
         Lcd_out(1,10,texto1);
         Lcd_Out(1,1,"T.IGBT1:");
         Lcd_Chr(1,15,223);
         Lcd_Chr(1,16, 'C');
           if(Mv1 > 0x46 )
           {
           bandera1 = 1;
           }


         adc_value2=ADC_read(1);//TEMPERATURA 2°
         Mv2 = adc_value2*0.488;
         FloatToStr(Mv2,texto2);
         Lcd_out(2,10,texto2);
         Lcd_Out(2,1,"T.IGBT2:");
         Lcd_Chr(2,15,223);
         Lcd_Chr(2,16, 'C');
           if(Mv2 > 0x46 )
           {
           bandera1 = 2;
           }


         delay_ms(2000);
         Lcd_Cmd(_LCD_CLEAR);

         adc_value3=ADC_read(2);//CORRIENTE BATERIA
         Mv3 =((adc_value3-512)*0.0586);
         FloatToStr(Mv3,texto3);
         Lcd_Out(1,7,texto3);
         Lcd_Out(1,1,"I.DC:");
         Lcd_Out(1,14,"AMP ");
          if( Mv3 > 0x0A )
           {
           bandera1 = 3;
           }

         adc_value4=ADC_read(3);//CORRIENTE SALIDA INVERSOR
         Mv4 =((adc_value4-512)*0.0586);
         FloatToStr(Mv4,texto4);
         Lcd_out(2,7,texto4);
         Lcd_Out(2,1,"I.AC:");
         Lcd_Out(2,14, "AMP");
         if( Mv4 > 0x06 )
           {
           bandera1 = 4;
           }

         Delay_ms(2000);
         Lcd_Cmd(_LCD_CLEAR);

         adc_value5=ADC_read(4);//VOLATAJE BATERIA
         Mv5 =((adc_value5*49.0)/1024.0);
         FloatToStr(Mv5,texto5);
         Lcd_Out(1,7,texto5);
         Lcd_Out(1,1,"V.DC:");
         Lcd_Out(1,13, "VOLTS");
         if( Mv5 < 0x18 )
           {
           bandera1 = 5;
           }

         adc_value6=ADC_read(5);//VOLTAJE SALIDA INVERSOR
         Mv6 =(adc_value6*462.9)/1024.0;
         FloatToStr(Mv6,texto6);
         Lcd_Out(2,7,texto6);
         Lcd_Out(2,1,"V.AC:");
         Lcd_Out(2,13, "VOLTS");
          if( Mv5 > 0xD2 )
           {
           bandera1 = 6;
           }

         Delay_ms(1900);
         Lcd_Cmd(_LCD_CLEAR);
         

    
     if( bandera1 > 0 )
    {
      LEDROJO = ON;
      FALLA = ON;
      LEDVERDE = OFF;
    }

    else
    {
       FALLA = OFF;
       LEDROJO = OFF;
       LEDVERDE = ON;
    }
    

   }
}
```


----------



## D@rkbytes (Ene 25, 2016)

lee dijo:


> Estimado D@rkbytes, gracias por siempre ayudar.
> Te comento que he realizado los cambios y ya todo funciona ok, pero tuve que cambiar los pines del lcd del puerto d al puerto b, por el diseño de la placa y al simularlo ya no me funciona.
> He revisado todo y no encuentro nada extraño. ¿Me puedes dar alguna sugerencia?


Revisa bien las conexiones de la pantalla al puerto B, porque no debe existir otro problema.

No has realizado los cambios para usar un solo arreglo en las conversiones.


----------



## lee (Ene 26, 2016)

Sabes que e revisado las conexiones del LCD y esta todo bien además ni en el proteus me funciona el lcd! Y respecto a los arreglos, realice los cambios pero no funciona correctamente el programa!


----------



## D@rkbytes (Ene 26, 2016)

No encuentro otra cosa que pueda estar fallando, solo las conexiones.

Te adjunto la simulación que tengo funcionando para que revises las conexiones.


----------



## lee (Ene 29, 2016)

estimado, debo reconocer que tenia un problema de conexión en el lcd. Bueno ahora todo funciona de maravillas. te agradezco toda tu ayuda. y la buena onda. gracias.


----------



## mikeekim (Ene 30, 2016)

Buenas, tengo un problema con un termostato programado en mikrobasic con un 16f887, (tambien lo he probado en mikroC) el codigo lo proporciona mikrobasic en el propio manual con un DS18B20 que va desde los -55º hasta los 128º configurado el DS18B20 a 12bits que da una resolucion de 0.0625º y funciona perfecto.
Pero por mas que trato de activar o desactivar un puerto segun una temperatura determinada, no lo consigo, lo he conseguido a medias porque se produce una activacion tanto en la temperatura positiva como la negativa, es decir, si configuro los grados para que el puerto se desactive a los -5º, tambien se desactiva a los 5º y asi con cualquier condicion y temperatura, si pongo 20º tambien sucede en los -20º 
he creado una variable tipo short para trabajar desde los -127º a los 127º llamada grados que es la que decide a que temperatura se activa el puerto que quiero controlar de esta manera


```
Dim grados as short

if (temp_whole div grados) >=1
then portd.3=1
else portd.3=0
end if
grados = -5 ' Esta variable es la que determina a que temperatura se activa el puerto 
' y hay que insertarla despues de main:
```


He probado multitud de condiciones pero no soy capaz de averiguar como activarlo solo en la temperatura que quiero sin que suceda tambien en la temperatura opuesta.
Me podriais echar una mano para solucionarlo?
Tambien me seria de ayuda en Mikroc porque estoy pasando mi olvidada experiencia en pic basic pro a mikroBasic y mikroC
Os proporciono los 2 codigos, tanto en MikroBasic como en MikroC a ver si algunos de los que programais en alguno de los 2 lenguajes me puede echar una mano
Si lo probais con otro PIC, no es ningun problema ya que me es bastante sencillo adaptar un codigo de un determinado PIC a otro tipo de PIC.
Pero donde no soy capaz es en lo que os he explicado, echadme una mano plz.
Thx de antemano.

El codigo en mikrobasic es este:

```
' Cabecera******************************************************
program example_12 ' Nombre de programa

dim LCD_RS as sbit at RB4_bit ' Conexiones del módulo LCD
LCD_EN as sbit at RB5_bit
LCD_D4 as sbit at RB0_bit
LCD_D5 as sbit at RB1_bit
LCD_D6 as sbit at RB2_bit
LCD_D7 as sbit at RB3_bit
LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D4_Direction as sbit at TRISB0_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D7_Direction as sbit at TRISB3_bit ' Final de conexiones del módulo LCD

' Ajustar la constante TEMP_RESOLUTION a la resolusión correspondiente del sensor: 
' DS18x20 utilizado: 18S20: 9 (ajustes por defecto pueden ser 9,10,11 o 12); 18B20: 12

const TEMP_RESOLUTION as byte = 12 ' Constante TEMP_RESOLUTION es de tipo byte

dim text as char[9]               ' Variable text es de tipo char
temp as word                      ' Variable temp es de tipo word
sub procedure Display_Temperature( dim temp2write as word )
  const RES_SHIFT = TEMP_RESOLUTION - 8
  dim temp_whole as byte          ' Variable temp_whole rd fr tipo byte
  temp_fraction as word           ' Variable temp_fraction es de tipo word
  text = "000.0000"

  if (temp2write and 0x8000) then ' Comprobar si la temperatura es negativa 
    text[0] = "-"
    temp2write = not temp2write + 1
  end if

  temp_whole = word(temp2write >> RES_SHIFT) ' Extraer temp_whole
  
  if ( temp_whole div 100 ) then ' Convertir temp_whole en caracteres
    text[0] = temp_whole div 100 + 48
  else
    text[0] = "0"
  end if

  text[1] = (temp_whole div 10) mod 10 + 48         ' Extraer dígito de decenas
  text[2] = temp_whole mod 10 + 48                  ' Extraer dígito de unidades
  temp_fraction = word(temp2write << (4-RES_SHIFT)) ' Extraer temp_fraction
  temp_fraction = temp_fraction and 0x000F          ' y convertirlo en
  temp_fraction = temp_fraction * 625               ' unsigned int
  text[4] = word(temp_fraction div 1000) + 48       ' Extraer dígito de miles 
  text[5] = word((temp_fraction div 100) mod 10 + 48) ' Extraer dígito de centenas 
  text[6] = word((temp_fraction div 10) mod 10 + 48)  ' Extraer dígito de decenas
  text[7] = word(temp_fraction mod 10) + 48         ' Extraer dígito de unidades
  Lcd_Out(2, 5, text)                               ' Visualizar temperatura en el Lcd

end sub

main:     ' Inicio de programa
ANSEL = 0 ' Configurar pines analógicos como digitales de E/S        
ANSELH = 0

text = "000.0000"
Lcd_Init()               ' Inicializar el Lcd
Lcd_Cmd(_LCD_CLEAR)      ' Borrar el Lcd
Lcd_Cmd(_LCD_CURSOR_OFF) ' Apagar el cursor
Lcd_Out(1, 1, " Temperature: ")

Lcd_Chr(2,13,178) ' Visualizar el carácter de grado, 'C' para centígrados
' Distintos visualizadores LCD tienen diferentes códigos de caracteres para el grado 
Lcd_Chr(2,14,"C") ' si ve la letra griega Alfa, introduzca 178 en vez de 223

while 1 ' Leer la temperatura en el bucle principal
  Ow_Reset(PORTE, 2)       ' Señal de reinicio de Onewire 
  Ow_Write(PORTE, 2, 0xCC) ' Ejecutar el comando SKIP_ROM
  Ow_Write(PORTE, 2, 0x44) ' Ejecutar el comando CONVERT_T
  Delay_us(120)

  Ow_Reset(PORTE, 2)
  Ow_Write(PORTE, 2, 0xCC) ' Ejecutar el comando SKIP_ROM
  Ow_Write(PORTE, 2, 0xBE) ' Ejecutar el comando READ_SCRATCHPAD

  temp = Ow_Read(PORTE, 2)
  temp = (Ow_Read(PORTE, 2) << 8) + temp

  Display_Temperature(temp) ' Formatear y visualizar el resultado en el LCD

  Delay_ms(520)             ' Retardo de 520 ms 
wend
end.                        ' Final de programa
```

Y en mikroC es este:

```
/*Cabecera******************************************************/

// Conexiones del módulo LCD
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Final de conexiones del módulo LCD

const unsigned short TEMP_RESOLUTION = 12;
char *text = "000.0000";
unsigned temp;

void Display_Temperature(unsigned int temp2write) {
  const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
  char temp_whole;  
  unsigned int temp_fraction;
  
  // comprobar si la temperatura es negativa
  if (temp2write & 0x8000) {
  text[0] = '-';
  temp2write = ~temp2write + 1;
  }
  
  // extraer temp_whole
  temp_whole = temp2write >> RES_SHIFT ;
  
  // convertir temp_whole en caracteres
  if (temp_whole/100)
     text[0] = temp_whole/100 + 48;
  else
    text[0] = '0';
	
  text[1] = (temp_whole/10)%10 + 48;     // Extraer dígito de decenas
  text[2] = temp_whole%10 + 48;          // Extraer dígito de unidades
  
  // extraer temp_fraction y convertirlo en unsigned int
  temp_fraction = temp2write << (4-RES_SHIFT);
  temp_fraction &= 0x000F;
  temp_fraction *= 625;
  
  // convertir temp_fraction en caracteres
  text[4] = temp_fraction/1000 + 48;     // Extraer dígito de miles
  text[5] = (temp_fraction/100)%10 + 48; // Extraer dígito de centenas
  text[6] = (temp_fraction/10)%10 + 48;  // Extraer dígito de decenas
  text[7] = temp_fraction%10 + 48;       // Extraer dígito de unidades
  
  // Visualizar temperatura en el LCD
  Lcd_Out(2, 5, text);
}

void main() {
  ANSEL = 0;                // Configurar los pines AN como digitales
  ANSELH = 0;
  C1ON_bit = 0;             // Deshabilitar los comparadores
  C2ON_bit = 0;
  
  Lcd_Init();               // Inicializar el LCD
  Lcd_Cmd(_LCD_CLEAR);      // Borrar el LCD
  Lcd_Cmd(_LCD_CURSOR_OFF); // Apagar el cursor
  Lcd_Out(1, 1, " Temperatura: ");
  
  // Visualizar el carácter de grado, 'C' para centígrados
  Lcd_Chr(2,13,223); // distintos visualizadores LCD tienen diferentes códigos
  
  // de caracteres para el grado
  // si ve la letra griega Alfa, intente introducir 178 en vez de 223
  Lcd_Chr(2,14,'C');
  
  //--- bucle principal
  do {
    //--- realizar lectura de temperatura
    Ow_Reset(&PORTE, 2);       // Señal de reinicio de Onewire
    Ow_Write(&PORTE, 2, 0xCC); // Ejecutar el comando SKIP_ROM
    Ow_Write(&PORTE, 2, 0x44); // Ejecutar el comando CONVERT_T
    Delay_us(120);
    Ow_Reset(&PORTE, 2);
    Ow_Write(&PORTE, 2, 0xCC); // Ejecutar el comando SKIP_ROM
    Ow_Write(&PORTE, 2, 0xBE); // Ejecutar el comando READ_SCRATCHPAD
    temp = Ow_Read(&PORTE, 2);
    temp = (Ow_Read(&PORTE, 2) << 8) + temp;
	
    //--- Formatear y visualizar el resultado en el LCD
    Display_Temperature(temp);
    Delay_ms(500);
  } while (1);
}
```


----------



## ruben90 (Feb 1, 2016)

Hola, necesito ayuda con mi código.
Mi termómetro controla un dispositivo refrigerador con las siguientes condiciones:

```
Si la temperatura es mayor de 15 °C, el duty cycle es del 100%
Si la temperatura es igual o menor de 15 °C, el duty cycle es del 50%
```

pero al llegar a los 15 °C el valor varía entre los 16 °C y 15 °C, nunca llega a los 14 °C.
¿Cómo podría evitarlo? Lo deseado sería que al llegar a los 15 °C, el duty cycle sea del 50%, pero no varíe.

Este es el código:

```
unsigned int valor_adc;
unsigned short unidad, decena, temp, menu;

float  resolucion = 0.0;
float temperatura = 0.0;

const unsigned short digito[] =
{ 0x3F, 0x05, 0x5E, 0x4F, 0x65, 0x6B, 0x7B, 0x0D, 0x7F, 0x6F, 0x78};

bit num, bandera;

void display(void) {
decena = temperatura /10;
unidad = temperatura - (decena *10);
num++;

if(!num) {
PORTB = digito[decena] << 1;
PORTA.f2 = 1;
} 
else {
PORTB = digito[unidad] << 1;
PORTA.f4 = 1;
}
 delay_ms(1);
PORTA.f2 = 0;
PORTA.f4 = 0;
}

void main(void) {
NOT_RBPU_bit = 0;
  INTEDG_bit = 0;

TRISA = 0x09;
TRISB = 0x01;
TRISC = 0x00;

 ANSEL = 0x09;
ANSELH = 0x00;
ADCON0 = 0xC0;
ADCON1 = 0x90;

    PR2 = 0xF9;
  T2CON = 0x05;
CCP2CON = 0x0C;

PORTA = 0;
PORTB = 0;
PORTC = 0;

while(1) {
if(temp > 15) bandera = 0;                            //Aquí están las condiciones
         else bandera = 1;
if(bandera == 0) CCPR2L = 0xFA;
            else CCPR2L = 0x7D;
ADON_bit = 1;
delay_us(20);
  GO_bit = 1;
while(GO_bit == 1);
valor_adc = (ADRESH << 8) + ADRESL;

 resolucion = (2.5/1023) / 0.01;
temperatura = resolucion * valor_adc;
     delay_us(100);
temp = temperatura;

display();
}
}
```

o sí debo plantearlo de manera diferente, gracias.


----------



## dcsalg (Nov 27, 2022)

Hola a todos, tengo un problema hay ejemplos en youtube de como utilizar el NTC pero la mayoria con 10K, hay algunos con 100K pero utilizo las formulas que hay tanto en videos como algunos ejemplos y ninguno me da bien los valores de temperatura, hasta valores negativos tenfo cuando hace unos 28 Grados centigrados.

Alguien tendrá la formula para que pueda utilizar o un fragmento del programa para raspbery PI Pico W que me imagino que es igual a la Pico normal, que pueda utilizar asi mido bien la temperatura.

Ya probe con varios metodos con BETA del termistor sin utilizar eso, pero pareciera que tengo mal las formulas capaz tiene alguien un fragment de programa que esten midiendo con una PI Pico y una NTC de 100k que pueda facilitarme. para poder probar. Por favor. Gracias , Aclaro utilizo MicroPython


----------



## switchxxi (Nov 27, 2022)

dcsalg dijo:


> utilizo las formulas que hay tanto en videos....



Es que no es el método a seguir. Normalmente las hojas de datos te dan la curva característica del sensor, de ahí puedes extrapolar los valores. Sino, multímetro y termómetro en mano, se va modificando la temperatura y se crea la tabla, es tedioso pero solo se hace una vez o, al menos, hasta que se cambia a otro tipo de sensor totalmente distinto.

Hay métodos no tan "lineales" que midiendo dos puntos se traza una recta y se usa como medida, lamentablemente la respuesta es mas una curva pero es una aproximación rápida cuando no se necesita mucha precisión.


----------



## DJ T3 (Nov 28, 2022)

Aparte de lo que te dijo @switchxxi , te agrego que leas el datasheet del NTC que seguro tiene la curva de respuesta y los valores correspondientes.

Recuerda subir el código para analizarlo, aunque en este tópico se habla de C, y no de Python


----------



## dcsalg (Nov 28, 2022)

Hola, esta es la parte del código, pero no resulto, da valores como de 60 grados para arriba y segun lo que modifique por debajo de menos cero. en internet hay otros ejemploc con otras formulas pero , aqui el problema no es el datasheet, para mis es problema de formula y calculos.
 Es un divisor lo que se arma , tengo una resistencia de 100K en serie con el termistor, de ahi a la Pi Pico, cualquier cosa me da. Y lo mas triste que muestran en youtube videos con formulas y les indica en los Arduino, pero no utilizo arduino. Estoy seguro que es problema de calculos. por eso capaz alguien tiene el correcto 


```
import machine
import utime
from math import log
import tm1637

sensor_temp = machine.ADC(0)

BETA = 3950

reading = sensor_temp.read_u16()

        celsius = 1 / (log(1 / ( 65535 / reading - 1)) / BETA + 1.0 / 298.15) - 273.15
        display.temperature(int(celsius))
```


----------



## Scooter (Nov 28, 2022)

¿Pero como está conectada la NTC? Eso va a influir mucho.

Edito, se ve que te movieron la pregunta a otro hilo porque este habla de C

La pregunta, no obstante, sigue en pie. ¿Como está conectada la NTC?


----------



## dcsalg (Nov 28, 2022)

EL NTC es ese que parece una gotita de vidrio que son de dupont, de 100k que esta en serie con una resistencia de 100k,  entonces, un extremo de la resistencia esta a 3.3V, el otro extremo esta con una de las patas del termistor que de ahi tambien va a la salida del micro, y el otro extremo del termistor a masa. Creo que me explieque bien , sino tendria que subir un dibujo.
Bueno asi conectado me esta dando 60 grados.  lo que tiene de bueno la Pi pico que tambien tiene incorporado su propio medidor y me esta dando bien ese y con ese lo estoy comparando. El valor que me tendria que dar seria 28 Grados ahora. Siempre en centigrados estoy hablando


----------



## Dr. Zoidberg (Nov 28, 2022)

Y cual es el circuito original que decís que aparece en youtube????


----------



## dcsalg (Nov 28, 2022)

cualquiera hay montones de ejemplos igual son con arduinos lo habia escrito arriba de todo, en fin cual es el problema, olvidense que hable de youtube, porque sino se dispersa. ahi presente el problema y ve si me pueden ayudar


----------



## Dr. Zoidberg (Nov 28, 2022)

dcsalg dijo:


> olvidense que hable de youtube, porque sino se dispersa. ahi presente el problema y ve si me pueden ayudar


Si no ponés lo conexión del NTC que te pidió @Scooter ni decís cual circuito has usado, solo te puedo indicar que veas este video y hagas lo que dice ahí. Lo de Arduino es puramente anecdótico y el código de cálculo funciona para cualquiewr microntrolador.


----------



## dcsalg (Nov 28, 2022)

Dr. Zoidberg , no te comprendo si coloque el esquema y explique como coloque el NTC, nose que es lo que quieren saber ??
Ese video que colocaste ya lo vi y no me sirvio tampoco. Por eso estoy consultando si alguno probo para que me diga como esta el codigo que coloque. Y lo del NTC esta como figura mas arriba que coloque hasta una imagen.
Estoy seguro que el error esta en el programa, no en la electronica es sencilla la conexion. el problema estan en las lineas , algo esta mal y nose que es por eso la consulta.


----------



## Dr. Zoidberg (Nov 28, 2022)

dcsalg dijo:


> Dr. Zoidberg , no te comprendo si coloque el esquema y explique como coloque el NTC, nose que es lo que quieren saber ??


Quería ver el circuito original, por que existe la posibilidad que hayas cambiado algún valor que no debías cambiar.


dcsalg dijo:


> Ese video que colocaste ya lo vi y no me sirvio tampoco.


Que es lo que no te sirvió??? La lectura del ADC y el cálculo son completamente triviales...suponiendo que tenés correctas las constantes de Steinhart-Hart.
No hay mucha ciencia ahí...

Y esto que tiene que ver con la ecuación de Steinhart-Hart que aparece en el video????


> reading = sensor_temp.read_u16()
> 
> celsius = 1 / (log(1 / ( 65535 / reading - 1)) / BETA + 1.0 / 298.15) - 273.15
> display.temperature(int(celsius))


Los logaritmos son naturales (ln) y nó decimales (log). La ecuación es un polinomio de tercer orden y en tu ecuación no hay nada de tercer orden...o la constante asociada vale 0???
No has publicado ningun dato necesario, así que no esperes respuesta maravillosas.


----------



## Eduardo (Nov 28, 2022)

dcsalg dijo:


> ... Por eso estoy consultando si alguno probo para que me diga como esta el codigo que coloque. Y lo del NTC esta como figura mas arriba que coloque hasta una imagen.
> Estoy seguro que el error esta en el programa, no en la electronica es sencilla la conexion. el problema estan en las lineas , algo esta mal y nose que es por eso la consulta.



dcsalg:  Las respuestas de los NTC no son todas iguales,  si googleás tablas de diferentes fabricantes vas a ver que son parecidas, pero lo suficientemente diferentes para que no te sirvan unos coeficientes al azar.

Empeorando las cosas, aproximar por un logaritmo es válido alrededor de los 25°C , de 60°C para arriba necesitás mas términos (La ecuación de Steinhart-Hart a la que se refiere Dr Zoidberg)

Empeorando mas todavía, ni vos ni nosotros conocemos los coeficientes reales de TU ntc,  por lo tanto si pensás medir temperatura en un rango amplio vas a tener que hacer un ensayo para hacer una tabla T vs ADC (necesitás un termometro de referencia)


El circuito que proponés está pensado para medir temperaturas alrededor de 25° .  Para un rango 25° +-20° (5°...45°)  la respuesta es bastante lineal y no necesita corrección. Pero en un rango mas amplio sí, y además el valor de la resistencia superior debe ser igual al del NTC en el medio del rango.
Es decir, si apunto medir entre 0° y 100° , la resistencia debe tener el valor del ntc a 50°.


----------



## DJ T3 (Nov 28, 2022)

Acá publiqué una página que muestra exactamente el mismo código y muestra las salidas en ADC crudo y en Centigrado; https://www.forosdeelectronica.com/threads/limpieza.182192/post-1425815


----------



## switchxxi (Nov 28, 2022)

DJ T3 dijo:


> Acá publiqué una página que muestra exactamente el mismo código y muestra las salidas en ADC crudo y en Centigrado; https://www.forosdeelectronica.com/threads/limpieza.182192/post-1425815



Pagina la cual muestra las sospechas del Doc. Usa una resistencia de 10K para el divisor y no de 100k. Ademas que la NTC también es de 10K o al menos eso calculo yo ya que en una animación, a 24° la salida digital es 33500 que en tensión es de aproximadamente 1.6V, dado que el valor del NTC es a 25° se puede suponer de 10K (1.5V de salida a 25° dado que el divisor es con una resistencia de 10K).

Según internet: Pagina 1 y pagina 2, el beta no depende del divisor resistivo sino de la resistencia del NTC a dos temperaturas por lo que el beta de una NTC de 10K es totalmente diferente a la de una de 100K aunque la relación entre el NTC y la resistencia del divisor sea la misma.

A calcular se ha dicho!!!!!

(En la pagina 2 hay calculadoras automáticas, solo hay que ingresar los parámetros que pide ).


----------



## DJ T3 (Nov 28, 2022)

switchxxi dijo:


> Usa una resistencia de 10K para el divisor y no de 100k.


Exactamente, aparte a 3.3V me parece bastante alto el valor de 100k...


----------



## Scooter (Nov 29, 2022)

El ADC del Arduino es de 10 bits mientras que el de la PI pico es de 12, supongo que el código también estará adaptado a eso.


----------



## D@rkbytes (Nov 29, 2022)

Qué entretenido es ver tantas soluciones cuando alguien lo único que quiere es que le den el código esperado.


----------



## Scooter (Nov 29, 2022)

Así a bulto parece que el código está para un adc de 16 bits porque divide por 65535 y si no me equivoco debería de dividir por 4096 que son 12 bits.


D@rkbytes dijo:


> Qué entretenido es ver tantas soluciones cuando alguien lo único que quiere es que le den el código esperado.


Contesto y sigo el hilo porque me interesa a mí. A él ya vi hace tiempo que no le interesa lo más mínimo.


----------



## AleSergi (Nov 29, 2022)

D@rkbytes dijo:


> Qué entretenido es ver tantas soluciones cuando alguien lo único que quiere es que le den el código esperado.



O sea que todos los viejites contestones han sido  "vistimas" de la ingeniería social de un novato recién llegado muuuy pícaro...

La sigo,  pero sin código alguno. Según ví en varios foros esos ADC de los Raspberry y ESP32  de muchos bites, los últimos bits solo son ruidos, así que los programadores no los tienen en cuenta.

Pienso que un NTC de 100k, a 3v!  ya entra en conflicto con la impedancia del ADC, hay que mirar detenidamente la hoja de datos del micro en cuestión.
Esto se solucionaría con un AO seguidor, adaptando las impedancias, pero si  ni el código entiende, menos éste hardware.

Yo no usaría nada esas formulas, creo que consumen mucha memoria del programa, emplearía una tabla, seguramente en la memoria flash. Y siempre teniedo en cuenta que los NTC corrientes no son para un rango de temperatura muy grande.


----------



## dcsalg (Nov 29, 2022)

DJ T3 dijo:


> Exactamente, aparte a 3.3V me parece bastante alto el valor de 100k...


*L*o pens*é* en un momento*,* lo que sucede que ten*g*o este de 100K*Ω*, si probas con uno de 10K*Ω *se aproxima mas a los valores, lo que quiero hacer es tomar la temperatura de un compreso*r*  de una heladera me pareci*ó* una buena opci*ó*n, est*á*n los 18b20 que lo que tiene de bueno que no es como el termistor y si da los datos mas f*á*ciles. *P*ero la realidad es utilizar un termistor.
Y la verdad bastante rompe es el termistor para tomar una temperatura y si mostr*é* el c*ó*digo que mas de uno se JACTA y se r*í*e arriba de los mas viejetis que de segur*o* yo tengo mucha mas edad que ellos lo hice para ver que opinaban del c*ó*digo*,* pero Bueno pero veo que se r*í*en algunos en vez de hablar serio como puse yo pero Si no entienden de la vida algunos menos van a entender de c*ó*digo. haciendo referencia al alguien que puso *"pero si ni el código entiende, menos éste hardware.*" pero la consulta fue real no para que salgan con algo as*í* algunos.

pero DJ T3 gracias, por responder.


----------



## DJ T3 (Nov 29, 2022)

Scooter dijo:


> El ADC del Arduino es de 10 bits mientras que el de la PI pico es de 12, supongo que el código también estará adaptado a eso.


De lo que comparti que se fue al F29;


> We do have to put this formula in our code, so let's focus on understanding the two key parameters here:
> - The 'x' at the bottom refers to the value we get from the ADC.
> - The β (beta) value is different for different thermistors, and it represents a thermistor's exact relationship with temperature.
> 
> _The astute among you may have also recognized the 65535 in the denominator, which we saw in the previous tutorial. It's equivalent to (2^16 - 1), which is the maximum value that the 16-bit ADC on the Pico will output. The even more astute may recognize the number 273.15, which is the constant factor for converting temperature between Celsius and Kelvin. And the astutest of all will notice that the number 298.15 is just the temperature 25 °C converted to Kelvin. But none of that really matters for writing the MicroPython program, so don't stress _😌


----------

