#include <12F675.h>
#device adc=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES CPD //Data EEPROM Code Protected
#FUSES PROTECT //Code protected from reads
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES BANDGAP_HIGH
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=4M)
#include <Puertos.c>
//*******************Declaracion de Variables**********************************
signed long
Error=0, //Variable que almacena la diferencia entre el set_point y Temp
Set_Point=0,//Valor al cual deseamos poner la temperatura
Temp=0; //Valor de temperatura medida en un instante de tiempo
/***************************************************************************
Esta funcion se realiza por la interrupcion del timer0, se utiliza el
Timer0 para determinar el tiempo necesario que transcurre despues del cruce por
cero para variar el angulo de disparo del Triac
***************************************************************************/
int1 int_flag;
#int_GLOBAL
void TIMER0_isr(void){
if(int_flag){
delay_us(135);
disable_interrupts(INT_TIMER0);
}
set_timer0(0);
GP4=1; //Se pone a 0 GP4 para encender el optoacoplador
GP5=1;
delay_us(50); //Se hace que el ancho del pulso de disparo sea de 50us
GP4=0; //Se pone a 1 GP4 para apagar el optoacoplador (el Triac queda encendido)
clear_interrupt(INT_TIMER0);
//Limpiamos el flag TIMR0 para evitar reingreso a la interrupcion
int_flag=1;
}
void RA_isr(void){
if(Error>=255){ //Si Error es igual a 255 se debe encender el Triac justo despues del cruce por cero
int_flag=0;
delay_us(50);
TIMER0_isr(); //para ello saltamos a la funcion TIMER0_isr() que envia un pulso de 30us al triac
enable_interrupts(INT_TIMER0); //desabilitamos la interrupcion del timer0 para no reingresar
goto L1; //Saltamos al label L1
}
else{ //Si Error es distinto a 255
GP5=0;
setup_adc_ports(sAN0 | sAN1 | VSS_VDD); //Seleccionamos AN0 y AN1 como analogicos
}
if(Error<=0) //y si la temperatura es mayor o igual al set_point
disable_interrupts(INT_TIMER0); //Desabilitamos la Interrupcion Timer0 para apagar el Triac
else{ //de lo contrario
clear_interrupt(int_timer0); //limpiamos el flag del timer0 por seguridad
int_flag=0;
set_timer0(Error); //cargamos el valor del error en Timer0
enable_interrupts(INT_TIMER0); //Habilitamos la interrupcion Timer0
}
L1:
Delay_us(20); //Retardo de 20us para evitar errores
Temp=read_adc();
set_adc_channel(0); //Multiplexamos el ADC al canal 0 para leer Temperatura
Temp=Temp-435; //Leemos el valor de la temperatura instantanea
delay_us(40);
Set_Point=read_adc()/4; //Leemos el valor del pin correspondiente al Set_Point
set_adc_channel(1); //Multiplexamos el ADC al canal 1 para leer Temperatura
Error = Set_Point - Temp; //El error es la diferencia entre Set_point y Temp.
}
void main(){
GP4=0; //Ponemos en 1 GP4 para desactivar el optoacoplador
setup_adc_ports(sAN0 | sAN1 | VSS_VDD);
//Seleccionamos AN0 y AN1 como analogicos
setup_comparator(NC_NC); //Apagamos los comparadores
TRISIO=0B001111; //GP6 y 7 como salidas los demas como entradas.
setup_adc(ADC_CLOCK_DIV_8);//Seteamos Tadc=Tosc/8 debido a que fosc=4MHz
setup_vref(FALSE); //Apagamos el Voltaje de referencia interno
setup_timer_0(T0_INTERNAL|T0_DIV_32);
//Seteamos que el desborde ocurra (256-Timer0)*Tosc/4*32
//si Timer0=0 el desborde ocurrira a 8.192ms
setup_timer_1(T1_DISABLED);//Desabilitamos el Timer1
enable_interrupts(GLOBAL); //Habilitamos las interrupciones globales
set_adc_channel(1); //Multiplexamos el ADC al canal 1 para leer Temperatura
for(;;){
while(GP2); //Esperar que GP2 cambie de 1 a 0
delay_ms(1);
while(!GP2); //Esperar que GP2 cambie de 0 a 1
RA_isr(); //Hacer la funcion RA_isr
}
}
/*****************************************************
Autor: Luis Alberto Vargas Tijerino.
Nickname: Bigluis.
Fecha: 1/06/10
Version: 2.0
*****************************************************/
#nolist
//**********************Puertos***********************
#ifdef getenv("SFR:GPIO")
#byte GPIO = getenv("SFR:GPIO")
#bit GP0 = GPIO.0
#bit GP1 = GPIO.1
#bit GP2 = GPIO.2
#bit GP3 = GPIO.3
#bit GP4 = GPIO.4
#bit GP5 = GPIO.5
#byte TRISIO = getenv("SFR:TRISIO")
#endif
#ifdef getenv("SFR:PORTA")
#byte PORTA= getenv("SFR:PORTA")
#bit RA0 = PORTA.0
#bit RA1 = PORTA.1
#bit RA2 = PORTA.2
#bit RA3 = PORTA.3
#bit RA4 = PORTA.4
#bit RA5 = PORTA.5
#bit RA6 = PORTA.6
#bit RA7 = PORTA.7
#byte TRISA= getenv("SFR:TRISA")
#endif
#ifdef getenv("SFR:PORTB")
#byte PORTB= getenv("SFR:PORTB")
#bit RB0 = PORTB.0
#bit RB1 = PORTB.1
#bit RB2 = PORTB.2
#bit RB3 = PORTB.3
#bit RB4 = PORTB.4
#bit RB5 = PORTB.5
#bit RB6 = PORTB.6
#bit RB7 = PORTB.7
#byte TRISB= getenv("SFR:TRISB")
#endif
#ifdef getenv("SFR:PORTC")
#byte PORTC= getenv("SFR:PORTC")
#bit RC0 = PORTC.0
#bit RC1 = PORTC.1
#bit RC2 = PORTC.2
#bit RC3 = PORTC.3
#bit RC4 = PORTC.4
#bit RC5 = PORTC.5
#bit RC6 = PORTC.6
#bit RC7 = PORTC.7
#byte TRISC= getenv("SFR:TRISC")
#endif
#ifdef getenv("SFR:PORTD")
#byte PORTD= getenv("SFR:PORTD")
#bit RD0 = PORTD.0
#bit RD1 = PORTD.1
#bit RD2 = PORTD.2
#bit RD3 = PORTD.3
#bit RD4 = PORTD.4
#bit RD5 = PORTD.5
#bit RD6 = PORTD.6
#bit RD7 = PORTD.7
#byte TRISD= getenv("SFR:TRISD")
#endif
#ifdef getenv("SFR:PORTB")
#byte PORTE= getenv("SFR:PORTE")
#bit RE0 = PORTE.0
#bit RE1 = PORTE.1
#bit RE2 = PORTE.2
#bit RE3 = PORTE.3
#bit RE4 = PORTE.4
#bit RE5 = PORTE.5
#bit RE6 = PORTE.6
#bit RE7 = PORTE.7
#byte TRISE= getenv("SFR:TRISE")
#endif
#list
Controlador | Resistencia | Terminal T de 1-1/2" | Nipple de 1-1/2" por 8 a 12" | Adaptador de 1-1/2" a 1/2" |
| (http://www.homedepot.com/catalog/productImages/300/a1/a1fb2474-3a70-4f09-b694-085194ecf784_300.jpg) | (http://i.ebayimg.com/t/Camco-02223-2000W-240V-Screw-in-Water-Heater-Element-High-Watt-Density-/00/s/MjY3WDUwMA==/$(KGrHqN,!q0FBhHPcM7VBQghJdglUg~~60_12.JPG) | (http://www.homedepot.com/catalog/productImages/300/b3/b3adb018-75cc-417e-8f3c-a6d6d7dea82c_300.jpg) | (http://www.homedepot.com/catalog/productImages/300/4f/4f3c751a-bf5a-4ffe-84e3-71b0c8426149_300.jpg) | (http://www.homedepot.com/catalog/productImages/300/a8/a85ec85a-a921-4e21-bac5-144006b898c0_300.jpg) |
| Bunshing de 1-1/2" a 1/2" | ||||
| (http://www.homedepot.com/catalog/productImages/300/c4/c42e0897-0933-4bcf-8b9e-b9bf9a0d8b5c_300.jpg) | ||||
| Shower Head | ||||
| (https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQFSD8LEbZnVz6OCKBOcPEg7L2zOFbKSDEYmGEFW53SmLxXlznS) | ||||
| Tu | ||||
| (https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcRcVvo7-4ZNbUosPRPVWjVqu7oquXrC5U6YIKykAE-_g-Lb-RzQ) |
En casa poseo una ducha que calienta al instante y los contactos como la resistencia están en contacto con el agua y....no soy tan buen bailarín como los cariocas!!!!!!La ducha la usas en tipo spray o a chorro lleno? :mrgreen:
Exelente aplicacion pero creo que solo serbiria para calentar el agua pero para utilizarla tendrias que desconectar o te llevarias un buen toque que te moveria el esqueleto corrigeme si me equiboco yo tengo pensado algo paresido pero buscando la forma sin tener el problema del voltaje ac pensaba en algo dc o alguna resistencia y un abanico para tratar de calentar el agua con aire caliente
saludos
| Resistencia | Terminal T de 1-1/2" | Nipple de 1-1/2" por 8 a 12" | Adaptador de 1-1/2" a 1/2" |
| (http://i.ebayimg.com/t/Camco-02223-2000W-240V-Screw-in-Water-Heater-Element-High-Watt-Density-/00/s/MjY3WDUwMA==/$(KGrHqN,!q0FBhHPcM7VBQghJdglUg~~60_12.JPG) | (http://www.homedepot.com/catalog/productImages/300/b3/b3adb018-75cc-417e-8f3c-a6d6d7dea82c_300.jpg) | (http://www.homedepot.com/catalog/productImages/300/4f/4f3c751a-bf5a-4ffe-84e3-71b0c8426149_300.jpg) | (http://www.homedepot.com/catalog/productImages/300/a8/a85ec85a-a921-4e21-bac5-144006b898c0_300.jpg) |
| Bunshing de 1-1/2" a 1/2" | |||
| (http://www.homedepot.com/catalog/productImages/300/c4/c42e0897-0933-4bcf-8b9e-b9bf9a0d8b5c_300.jpg) |
1. lo que no se debe olvidar es conectarle la tierra al termo y tener un diferencial por si hay una deriva.
...
2. supongo que el control de temperatura lo habras hecho de forma escalonada.es decir que segun la temperatura del agua,se utilizara una carga determinada en la resistencia.
3. cuando lo tengas los datos seria bueno que los expusieras por aqui.
Bigluis.como vas a solucionar el tema del óxido?.La temperatura Recomendada para Este dispositivo es entre 38ºC a 42ºC. Temperaturas superiores podrían provocar quemaduras en la piel mientras que temperaturas inferiores provocarían la sensación de que el agua esta fría. Esto no provocaría efectos drásticos en los tubos. Es decir, no habría un aumento drástico en la oxidación del tubo. Para que esto ocurra deberíamos calentar el agua a mas de 100ºC y por supuesto no es el caso.
de que material es el depósito?
y si utilizas las piezas que has puesto en las imágenes.te sugiero que sean de
Latón.y no de hierro garbanizado.
Si no.te vas a poner de color naranja cuando te duches.
Ah.a los datos me refiero al valor de temperatura agua-valor potencia a disipar en la resistencia calefactora
Porque si el agua del depósito a bajado bruscamente de temperatura habrá que aplicarle más potencia a la Resistencia calefactora.y si por el contrario el agua esta caliente hay que aplicarle menos potencia.
L1:
Delay_us(20); //Retardo de 20us para evitar errores
Temp=read_adc();
set_adc_channel(0); //Multiplexamos el ADC al canal 0 para leer Temperatura
Temp=Temp-435; //Leemos el valor de la temperatura instantanea
delay_us(40);
Set_Point=read_adc()/4; //Leemos el valor del pin correspondiente al Set_Point
set_adc_channel(1); //Multiplexamos el ADC al canal 1 para leer Set_point
Error = Set_Point - Temp; //El error es la diferencia entre Set_point y Temp.