Ya lo he solucionado, me he buscado por todo internet durante varios dias y no pude encontrar absolutamente ningun ejemplo ni tampoco que nadie requiera " medir temperatura PERfectamente" y los valores escalonados sin "saltear numeros" como burro arrepentido
Porque hasta muy buenos programadores en videos de youtube con un codigo magistral se les piantan las unidades en lecturas extremadamente rapidas.
Tambien el tema de ruidos hasta cuando permanecia en temperatura ambiente oscilaba 0.5 a 0.75 y eso hacia que la lectura se lea en oscilacion 1°c.
La solucion es NO utilizar la variable que toma la temperatura para mostrar en display o lcd, sino otra variable aparte e igualarla solo que con retraso. Leer la temperatura cada 200ms o un poco más por medio del timer0. Y el hadware Filtrar correctamente segun hoja de datos. Tambien ver el tema de tierra analogica y digital
Utilizar una variable llamemosle buffer y actualizarla unicamente si la lectura da un valor mayor (puede ser a 2 minimo).
Bueno sin más publico el "rebuscado codigo todo desordenado descomentado en prueba empírica" hay que pasarlo en limpio, mejorarlo y demas hierbas. que probando aqui con una maquina con resistencias termicas conectadas a un rele de estado solido controlado por el pic. en total las resistencias dan 16 Amp en 220v. Probado en temperatura ambiente como asi tambien hasta los 300.
da exactamente muy buena lectura Consisa, sin oscilaciones.
No es un medidor de la farsa digo de la Nasa.. pero camina.....
espero que alguien más le sirva.
Agradezco enormeente a Thulsa Doom el cual me ayudó muchisimo gracias!!
do{
if(i==1){
leer_temperatura();
}
if(temp2<temp_final){ // si la nueva lectura es menor que la vieja.. entonces DISMINUYE:: Cuanto?
temp_temporal=temp_final-temp2;
if(temp_final!=temp2){
temp_final--;
}
//delay_ms(1);
}else if(temp2>temp_final){ // si la nueva lectura es mayor que la vieja.. entonces AUMENTA:: Cuanto?
temp_temporal=temp2-temp_final;
//if(temp_final!=temp2){
if(temp_temporal>=3){
temp_final++;
delay_ms(1);
}
}
if(item==0){
int firstdig = temp_final / 100;
int seconddig = (temp_final - (firstdig * 100))/ 10;
int thirddig = temp_final - (firstdig * 100) - (seconddig*10);
TM1637_display_digit(TM1637_SET_ADR_00H, (firstdig) % 0x10);
TM1637_display_digit(TM1637_SET_ADR_01H, (seconddig) % 0x10);
TM1637_display_digit(TM1637_SET_ADR_02H, (thirddig) % 0x10);
}
if(temp_final<=Temperatura_deseada-2){ //Si Alcanzo la temperatura deseada Apago Rele_temperatura de lo cotnario Lo enciendo.
if(temp_final!=0){
Encend(Rele_temperatura); // Enciendo el Relay de calentamiento
}
if(item==0){
lcd_gotoxy(1,3);
printf(lcd_putc," Calentando.. "); // Escribo la temperatura actual de la termocupla
}
}else{
Apag(Rele_temperatura); //Apago el rele de calentamiento.
if(item==0){
lcd_gotoxy(1,3);
printf(lcd_putc," Calor deseado. "); // Escribo la temperatura actual de la termocupla
}
}
#include <menu_item.c>
}
while(TRUE);
}
//Guido Batan Maquinarias
y en el void de temperatura:
void leer_temperatura(){
int16 temp;
int cadena1,cadena2; //declaramos las variables donde se guardaran el dato que viene del max6675
output_low(CS_max6675); //Se activa la señal de bit_select(CS) a 0 para que el max se active
cadena1 = spi_read(0); //Lee el primer byte que viene del max6675
cadena2 = spi_read(0); //Lee el segundo byte, con eso ya tenemos los 16bits de la lectura del max7765
output_high(CS_max6675); //Se pone a 1 la señal de bit_select(CS) para que el max tome otra lectura
// buffer = ((cadena1 * 256) + cadena2); //Se unen las dos cadenas de 1 byte que viene del max6675 y se
//guardan en una variable int16 llamada buffer de 16 bits
buffer = cadena2; // Cargo Byte LB
*((char *)&buffer+1)=cadena1; // Cargo Byte HB. y los uno los dos en una palabra de 16 bits que se llama buffer
temp = (buffer & 0b0111111111111000)>>3; //Seleccionamos los bits que nos interesan haciéndole lo que se llama
//Una máscara, se le hace un AND al dato con un número en binario, los unos significan los bits que queremos utilizar y los 0 los que desechamos
//Luego le hacemos un >>3 que significa que rodamos los 1 a la derecha 3 posiciones para eliminar los 0 del final
temp2 = (temp * 0.25); //12 bits en decimal equivalen a 4095, para que de los 1023,75 ºC se tiene que multiplicar por 0.25 que es la resolución de cada bit del MAX6675
if(temp2!=0 && temp_test==0){
temp_final=temp2;
//temperatura=temp2;
//lcd_clear();
temp_test=1;
}
//Guido Batan Maquinarias
}