Cambiar de sensor con PIC

Hola:

Pues usemos el CCS con el 16F886.

Si en C hay que empezar desde cero, prefiero usar ya los tres sensores DS1820 independiente, por ejemplo, como el ejemplo del 16F84A.
Fig2808_DS18B20.gif


Al pulsar un pulsador se activa el Modo 1 que es el de un térmometro normal con un mensaje de publicidad arriba que dice Termómetro pero puedo poner "Foros de Electrónica" por poner un ejemplo.

Modo 2
ajusta los valores del termoestato para el sensor, mínimo 20ºC y máximo 36ºC por poner un ejemplo y se guarda en la EEPROM interna.

Modo 3, ya en el termoestato le afecta los valores añadidos, si al detectar la temperatura de 36ºC que hemos indicado actica un Led, un pitido con un zumbador y activa un relé, de sesactiva cuando baje los 36ºC que hemos indicado.

Si nosotros queremos que sean para tres sensores, cada uno se muestre en un LCD 20x4 por línea.

Línea 1: Termoestato
Línea 2: Sensor 1: -01.5 ºC
Línea 3: Sensor 2: 18.0 ºC
Línea 4: Sensor 3: 39.5 ºC *

Si te fijas en la Línea 4, al final tiene un asterisco (*) que indica relé activado. Cuando baje la temperatura y se desactive el relé, el * se quita.

En una placa electrónica tiene un disipador con su ventilador siempre funcionando a 7.5Vdc con 12Vdc máximo. Otro ventilador como extractor de aire caliente también funcionando a 7.5Vdc a velocidad medie, en paralelo otro ventilador como entrada de aire frío.

El sensor 1 controla el ventilador del disipador, el sensor 2 dos ventiladores en paralelo como entrada y salida de aire y el tercer sensor es el que apaga el equipo por si se recaliente mucho.

El tema de los ventiladores ya me encargaré de hacerlo por mi mismo. Tengo más ideas en mente, como, que al apagarse el equipo, sigan los ventiladores sigan funcionando durante 20 segundos más y luego se detienen así nos aseguramos que se enfría bien si lo volvemos a encender de golpe. A parte de ello que haré un mini circuito independiente, que los ventiladores tienen tacómetro y otro PIC ya con el 16F84A o el 16F88 que tengo por aquí, puedo saber si están funcionado o no.

¿Se entiende hasta ahí?

¿Complicado hacer estas cosas en C con CCS?
 
Meta con esas librerias y un poco de conocimiento de CCS no es un programa difícil de hacer. Si necesitas ayuda no dudes en consultarme.

Tenés algún conocimiento de C ?

Saludos ! :)
 
Ok mira te pongo algo de código por ahora como para que te guíes, ando algo apretado con los tiempos, en cuanto me haga un claro me pongo un poco más, ya con esto podrías empezar algo tal vez:

Código:
#include	<16F886.h>		//PIC a usar
#use delay	(clock = 4M)	//Cristal
#fuses	XT,NOWDT,NOPROTECT,NOBROWNOUT

#include <lcd420.c>			//librería para el LCD de 4x20
#include <one_wire.c>		//aca incluís la libreria de One Wire no se cual usarás :P

void main (void){			//incio del programa

int	n;
float temp[3];

	lcd_init();				//inicio el LCD
	one_wire_init();		//las funciones de one_wire hay que reemplazarlas depende la librería que uses
	lcd_putc("Termostato");	
	
	while(TRUE){			//bucle infinito
	
		for(n=0;n<=3;++n){	//leo todos los sensores
			temp[n] = one_wire_read(n);		//leo el canal correspondiente de One Wire (primer sensor)
											//Matemática para transformar lo leído a temperatura
		}

		lcd_gotoxy(0,1);					//segunda línea del LCD (x = 0 ; y = 1)
		for(n=0;n<=3;++n){
			printf("Sensor %u: %f.2\n",n,temp[n]);
		}
		
	}
	
}

Bueno este código básicamente lee tres sensores cada uno conectado a un pin diferente y los muestra en el LCD así:

Termostato
Sensor 1: 3.23
Sensor 2: 10.02
Sensor 3: 20.56

Es algo básico como para que veas que es muy sencillo escribirlo, a partir de ahí habría que agregarle todo el resto.
La librería del OneWire (bus de 1 línea) habría que hacerle una pequeña modificación para que pueda leer varios canales porque vienen echas para usarlas sobre un solo pin nomas tendría que analizarla un poco para ver que se le puede hacer.
Espero te sirva de ayuda :).

Saludos !!! :)
 
¡¡¡Holaaaaaaa!!!

No tienes ni idea la cantidad de código en ASM para hacer sólo el vídeo que mostré indicado en el libro, a parte de las librerías. El C te ahorra muchísimo tiempo y en pocas líenas.

Me imagino que el C es del CCS. Lo voy a descargar, voy a encontrarlo.

En el LCD, preferiblemente así con los grados centígrados. ºC. Este es el tercer modo llamado Termostato.

Termostato:
Sensor 1: -3.23 ºC
Sensor 2: 10.02 ºC
Sensor 3: 20.56 ºC

El primer modo se llama Termómetro, sólo mide las temperaturas, el segundo modo si conoces bien el del libro probando con el simulador, ajustas un mínimo y un máximo. Por ejemplo, poner el modo 2 Sensor 2, ajusta la temperatura a 11.5 ºC, como actualmente está a 10.02 ºC no se activa el relé del Sensor 2 y el Led del relé. Cuando iguale la temperatura o lo supere, se activa el relé. Cuando sea inferior a lo indicado, se desactiva el relé. Según vayas seleccionando el sensor en el menú, cada sensor tiene su temperatura grabada en la EEPROM.

Modo 1.
Temperatura:
Sensor 1: -3.23
Sensor 2: 10.02
Sensor 3: 20.56

Modo 2.
Termoestato: 24 ºC
Sensor 1: -3.23

Modo 3.
Termoestato: 11 ºC
Sensor 2: 10.02

Modo 4.
Termoestato: 25 ºC
Sensor 3: 20.56

Modo 5.
Termostato:
Sensor 1: -3.23 ºC
Sensor 2: 10.02 ºC
Sensor 3: 20.56 ºC

Un cosa que tengo duda en el código como indica abajo.
Código:
for(n=0;n<=3;++n){ 
  	temp[n] = one_wire_read(n);

La variable n se declara como 0. Luego pones N<=3 (0 es menor o igual a 3).
¿Realmente cuenta del 0 al 3 o del 1 al 3?
En algunos lenguajes del 0 al 3 se cuenta como 4 posiciones o en este caso, 4 sensores, es decir, que el 0 tambiuén se cuenta como 1, el 3 como 4.

Parece que debería ir así el código:

Código:
for(n=0;n<=2;++n){ 
   temp[n] = one_wire_read(n);

Así como indica arriba cuenta del 0 al 2 con untotal de 3 posiciones.

¿Entiendes lo que quiero decir?

Buen trabajo.
 
Meta, discúlpame si tienes razón lo correcto es n<=2.

Lo de los modos te voy dejando una ayuda si quieres, puedes periódicamente testear un pulsador y cuanto sea apretado incrementas una variable y con otro pulsador la decrementas, de acuerdo al número de la variable vas a un programa o otro por ejemplo con while:

Código:
void test (void){
   if(pulsaldor1_apretado) ++n;
   if(pulsador2_apretado) --n;
}

while(n == 0){

    _programa 1 
    test();

}

while(n == 1){

    _programa 2
    test();

}

....

De esa manera ejecutas varios programas, debes asegurarte que la variable se mantenga dentro de ciertos valores para que no se pasa por ejemplo:

Código:
if(n == 4) n = 0;
else ++n;

Espero te sea de ayuda :)

Saludos !! :)
 
Atrás
Arriba