Você está na página 1de 21

#include <16F887.

h>

#device adc=10

#FUSES NOWDT //No Watch Dog Timer

#FUSES HS //Low power osc > 200 khz

#use delay(clock=20000000)

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#include "definicoes.h"

#include <stdio.h>

#include <stdlib.h>

///////////////////////////////////////////////////////////////////////VARIAVEIS

int16 status1=0; //Modo operante: Automtico

int16 status2=0; //Modo operante: Manual

int16 temperatura1=0; //SENSOR DE ENTRADA

int16 temperatura2=0; //SENSOR DA MASSA

int16 umidade1=0; //SENSOR DE UMIDADE

unsigned int16 Pseg=0; //TEMPORIZADOR CONT Segundos

unsigned int16 seg=0; //Segundos

unsigned int16 min=0; //Minutos

unsigned int16 hor=0; //Horas

unsigned int16 selecao=1; //Modo operante

unsigned int16 Umidade=0; //Valor de setpoint para umidade

unsigned int16 Temp1=0; //Valor de setpoint para temperatura de


inicio(Entrada)

unsigned int16 Temp2=0; //Valor de setpoint para temperatura da Massa

unsigned int16 Tempo1=0; //Valor de setpoint para tempo de secagem

unsigned int16 Temporeg=0; //Valor de setpoint para tempo de secagem

int16 i=0; //Rampa de Temperatura inicial

int16 a=0; //Loop de finalizao

int16 b=0; //loop sensor de movimento das esteiras


int16 T1=0; //Tempo Rampa de Temperatura inicial

//////////////////////////////////////////////////////////////////////SUBROTINAS

void resetvariaveis()

desliga(BUZZ);

status1=0;

status2=0;

temperatura1=0;

temperatura2=0;

umidade1=0;

Pseg=0;

seg=0;

min=0;

hor=0;

selecao=1;

Umidade=0;

Temp1=0;

Temp2=0;

Tempo1=0;

Temporeg=0;

i=0;

a=0;

b=0;

T1=0;

////////////////////////////////////////////////////////CONTROLE DE TEMPERATURA

void controletemp ()

{
setup_adc_ports(sAN0|sAN1|sAN2|sAN3|VSS_VDD);

setup_adc(ADC_CLOCK_INTERNAL);

setup_timer_2(T2_DIV_BY_16, 240, 1);

setup_ccp2(ccp_pwm);

desliga(PWM);

set_pwm2_duty(T1);

enable_interrupts(GLOBAL);

set_adc_channel(2); //SENSOR DE UMIDADE

delay_ms(100);

temperatura2=read_adc();

delay_ms(100);

if ((temperatura2)>(Temp2))

T1=T1-1;

delay_ms(100);

set_pwm2_duty(T1);

if ((temperatura2)<(Temp2))

T1=T1+1;

delay_ms(100);

set_pwm2_duty(T1);

if ((T1)>(1023)) //Setar diferena Maxima TM e SPT

T1=0;

set_pwm2_duty(T1);

}
if ((selecao)==3)

if (entrada(F4)==0)

T1=0;

set_pwm2_duty(T1);

status1=30;

//////////////////////////////////////////////////////////////////////RESET LCD

void resetlcd()

// limpa memria display

printf("\x07");

delay_ms(100);

// envia "@" 0linha 1 coluna 1 = Coluna 5 Linha 2 , caracter @ = 0x40

printf("\x40\x01\x01");

delay_ms(6);

// e envia linha em branco

printf("[ ]");

delay_ms(12);

// mesmo para linha 2

printf("\x40\x01\x02");

delay_ms(6);

printf("[ ]");

delay_ms(12);

}
//////////////////////////////////////////////////////////////////////////TIMER

#int_timer0

void trata_timer (void)

Pseg++;

if ((Pseg)>=3){seg=seg+1;Pseg=0;}

if ((seg)>=54){min=min+1;seg=0;}

//if ((min)>=60){hor=hor+1;min=0;}

set_timer0 (61);

void Tempo_1() { delay_ms(100);}

void Tempo_2() {delay_ms(1000);}

void inicio()

while(TRUE)

// Posio: coluna 01 e linha 01

printf("\x40\x01\x01");

delay_ms(6);

printf("[ CONTROLE PID ]");

delay_ms(12);

// Posio: coluna 01 e linha 02

printf("\x40\x01\x02");

delay_ms(6);

printf("[ EMPRESA ]");

delay_ms(12);

if ((entrada(F1)==0)||(entrada(F2)==0)||(entrada(F3)==0))

{
resetlcd();

break;

////////////////////////////////////SUBROTINA PARA TRABALHAR COM O


SUPERVISRIO

void supervisorio(void)

//////////////////////////////////////////////////////////////////SETPOINT MASSA

void tempmassa()

// Posio: coluna 01 e linha 02

printf("\x40\x01\x02");

delay_ms(6);

printf("[ ]");

delay_ms(12);

printf("[T.Massa: ]");

delay_ms(500);

status1=5;

for(;;)

printf("\x40\x9\x02");

delay_ms(6);

printf("[%lu Graus ]",Temp2);

delay_ms(12);
if (entrada(F1)==1) //Boto para somar valores no display

if ((Temp2)<=500){Temp2=Temp2+1; Tempo_1();}

if (entrada(F2)==1) //Boto para subtrair valores no display

if ((Temp2)>1){Temp2=Temp2-1; Tempo_1();}

if (entrada(F3)==0) //Boto para confirmar valores no display

printf("\x40\x01\x02");

delay_ms(6);

printf("[ ]");

delay_ms(12);

break;

/////////////////////////////////////////ESPERA SINAL DO SENSOR DE MOVIMENTO

void sensmovimento()

for (b=1;b<=100;++b)

if (entrada(XIN2)==1){status1=7; break;}

if ((b)>=90) { status1=11;}

delay_ms(110);

}
/////////////////////////////////////////////////////////////////SENSOR DE FOGO

void fogo()

if (entrada(XIN3)==1)

resetvariaveis();

set_pwm2_duty(T1);

status1=12;

////////////////////////////////////////////////////////////////////AQUECIMENTO

void aquecimento()

for (;;)

set_adc_channel(0);

Tempo_1();

temperatura1=read_adc();

// Posio: coluna 01 e linha 02

printf("\x40\x01\x02");

delay_ms(12);

printf("[Temp.Entrada:%lu ]",temperatura1);

// Configura PWM - Rampa de Aquecimento

set_pwm2_duty(T1);

delay_ms(100);

if ((T1>=0)&(T1<100)){T1=(T1)+1;delay_ms(100);}

if ((T1>=100)&(T1<300)){T1=(T1)+2;}

if ((T1>=300)&(T1<500)){T1=(T1)+3;}
if ((T1>=500)&(T1<700)){T1=(T1)+4;}

if ((T1>=700)&(T1<900)){T1=(T1)+10;}

if ((T1>=900)&(T1<1023)){T1=(T1)+20;}

delay_ms(1000);//Tempo par controle da Rampa

if (temperatura1>=Temp1){ resetlcd();

// Posio: coluna 01 e linha 01

printf("\x40\x01\x01");

delay_ms(6);

printf("[ EM OPERACAO]");

delay_ms(12);

if (((selecao)==1)||((selecao)==3)){ status1=8;break;}

if ((selecao)==2){ status1=10;break;}

fogo();

/////////////////////////////////////////////////////////////FIM DO AQUECIMENTO

/////////////////////////////////////////////////////////////PROGRAMA PRINCIPAL

void main()

inicio();

setup_adc_ports(sAN0|sAN1|sAN2|sAN3|VSS_VDD);

setup_adc(ADC_CLOCK_INTERNAL);

setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_16);//prescaller

enable_interrupts(INT_TIMER0);

set_timer0(61);

setup_timer_2(T2_DIV_BY_16, 240, 1);

setup_ccp2(ccp_pwm);
set_pwm2_duty(0);

enable_interrupts(GLOBAL);

///////////////////////////PROGRAMA PRINCIPAL \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

while(true)

//MODO AUTOMTICO

if (entrada(XIN1)==0)

switch (status1)

case 0:

liga(Y1);

resetlcd();

// Posio: coluna 01 e linha 01

printf("\x40\x01\x01");

delay_ms(6);

printf("[ MODO AUTO ]");

delay_ms(12);

status2=0;

printf("MA \n ");

delay_ms(250);

status1=1;

break;

case 1:

// Posio: coluna 01 e linha 02

printf("\x40\x01\x02");

delay_ms(6);

printf("[MODO:]");
delay_ms(12);

status1=2;

break;

case 2:

if (entrada(F1)==1) //Boto para somar valores no display

if ((selecao)<=3){selecao=selecao+1; Tempo_1();}

if (entrada(F2)==1) //Boto para subtrair valores no display

if ((selecao)>1){selecao=selecao-1; Tempo_1();}

printf("\x40\x06\x02");

delay_ms(6);

printf("[ %lu SECAGEM ]",selecao);

delay_ms(12);

if (entrada(F3)==0) //Boto para confirmar valores no display

status1=3;

break;

case 3:

if ((selecao)==1) {status1=4;}

if ((selecao)==2) {umidade=1;status1=9;}

if ((selecao)==3) {umidade=1;status1=4;}

break;

//MODOS DE OPERAO

//SELEO 1- COM SENSOR DE UMIDADE / SEM TEMPORIZADOR


//SELEO 2- COM TEMPORIZADOR /SEM SENSOR DE UMIDADE

//SELEO 3- SEM SENSOR DE UMIDADE/TEMPORIZADOR

case 4:

if ((Umidade)==0)

// Posio: coluna 01 e linha 02

printf("\x40\x01\x02");

delay_ms(6);

printf("[ ]");

delay_ms(12);

printf("[Umidade: ]");

delay_ms(500);

status1=5;

if ((Umidade)>0)

// Posio: coluna 01 e linha 02

tempmassa();

printf("\x40\x01\x02");

delay_ms(6);

printf("[ ]");

delay_ms(12);

printf("[T.Entr.: ]");

delay_ms(500);

status1=6;

break;

case 5:
printf("\x40\x09\x02");

delay_ms(6);

printf("[%lu%c ]",Umidade,0X25);

delay_ms(12);

if (entrada(F1)==1) //Boto para somar valores no display

if ((Umidade)<=500){Umidade=Umidade+1; Tempo_1();}

if (entrada(F2)==1) //Boto para subtrair valores no display

if ((Umidade)>1){Umidade=Umidade-1; Tempo_1();}

if (entrada(F3)==0) //Boto para confirmar valores no display

status1=4;

break;

case 6:

printf("\x40\x9\x02");

delay_ms(6);

printf("[%lu Graus ]",Temp1);

delay_ms(12);

if (entrada(F1)==1) //Boto para somar valores no display

if ((Temp1)<=500){Temp1=Temp1+1; Tempo_1();}

if (entrada(F2)==1) //Boto para subtrair valores no display

{
if ((Temp1)>1){Temp1=Temp1-1; Tempo_1();}

if (entrada(F3)==0) //Boto para confirmar valores no display

// Posio: coluna 01 e linha 02

printf("\x40\x01\x02");

delay_ms(6);

printf("[ ]");

delay_ms(12);

printf("[Inicializando... ]");

Tempo_2();

liga(Y2); //LIGA SECADOR

Tempo_2(); Tempo_2(); Tempo_2(); Tempo_2(); Tempo_2();

liga(Y3); //LIGA EXAUSTOR

sensmovimento();

break;

//SAIDA PWM AQUECIMENTO

case 7:

aquecimento();

fogo();

break;

//(OPO_1)

////////////////////////////////////////////////////////////INICIO CICLO UMIDADE

case 8:

set_adc_channel(0); //SENSOR DE ENTRADA

Tempo_1();

temperatura1=read_adc();
set_adc_channel(1); //SENSOR DE UMIDADE

Tempo_1();

umidade1=read_adc();

set_adc_channel(2); //SENSOR DE UMIDADE

Tempo_1();

temperatura2=read_adc();

Tempo_1();

// Posio: coluna 01 e linha 02

printf("\x40\x01\x02");

delay_ms(6);

printf("[U%lu E%lu M
%lu ]}",umidade1,temperatura1,temperatura2);

delay_ms(50);

if (((umidade1)<(Umidade))||((selecao)==3))

controletemp ();

if (((umidade1)>=(Umidade))&&((selecao)==1))

status1=30;

fogo();

break;

//////////////////////////////////////////////////////////////FIM CICLO UMIDADE

//(OPO_2)

/////////////////////////////////////////////////////////////INICIO CICLO TEMPO

case 9:

// Posio: coluna 01 e linha 02


printf("\x40\x01\x02");

delay_ms(6);

printf("[Tempo/Min:%lu ]",Tempo1);

Tempo_1();

if (entrada(F1)==1) //Boto para somar valores no display

if ((Tempo1)<=500){Tempo1=Tempo1+1; Tempo_1();}

if (entrada(F2)==1) //Boto para subtrair valores no display

if ((Tempo1)>1){Tempo1=Tempo1-1; Tempo_1();}

if (entrada(F3)==0) //Boto para confirmar valores no display

status1=4;

break;

case 10:

Temporeg=((Tempo1)-(min));

if ((Temporeg)>0)

trata_timer ();

// Posio: coluna 01 e linha 02

printf("\x40\x01\x02");

delay_ms(6);

printf("[TEMPO:%lu SP:%lu ]",Temporeg,Tempo1);

delay_ms(50);

}
if ((Temporeg)<=0)

status1=30;

controletemp ();

fogo();

break;

////////////////////////////////////////////////////////////////FIM CICLO TEMPO

///////////////////////////////////////////////////////////////FALHA NA CORREIA

case 11:

desliga(Y3); //LIGA EXAUSTOR

Tempo_2();

desliga(Y2); //LIGA SECADOR

Tempo_2();

resetvariaveis();

T1=0;

set_pwm2_duty(T1);

for(;;)

printf("\x40\x01\x02");

delay_ms(6);

printf("[FALHA MOVIMENTO!]");

delay_ms(500);

liga(BUZZ);

printf("\x40\x01\x02");

delay_ms(6);

printf("[ ]");

delay_ms(500);
desliga(BUZZ);

if (entrada(F4)==0) //Boto para confirmar valores no display

break;

break;

///////////////////////////////////////////////////////////////////////////FOGO

case 12:

desliga(Y3); //LIGA EXAUSTOR

Tempo_2();

desliga(Y2); //LIGA SECADOR

Tempo_2();

resetvariaveis();

T1=0;

set_pwm2_duty(T1);

for(;;)

printf("\x40\x01\x02");

delay_ms(6);

printf("[ FOGO! ]");

delay_ms(500);

liga(BUZZ);

printf("\x40\x01\x02");

delay_ms(6);

printf("[ ]");

delay_ms(500);

desliga(BUZZ);
if (entrada(F4)==0) //Boto para confirmar valores no display

break;

break;

////////////////////////////////////////////////////////////////FIM DE OPERAO

case 30:

desliga(Y3); //LIGA EXAUSTOR

Tempo_2();

desliga(Y2); //LIGA SECADOR

Tempo_2();

resetvariaveis();

T1=0;

set_pwm2_duty(T1);

resetlcd();

// Posio: coluna 01 e linha 01

printf("\x40\x01\x01");

delay_ms(6);

printf("[ Finalizado! ]");

delay_ms(12);

// Posio: coluna 01 e linha 02

printf("\x40\x01\x02");

delay_ms(6);

printf("[Ciclo Concluido]");

delay_ms(12);

status1=31;

break;
case 31:

if ((a) < 3)

liga(BUZZ);

Tempo_2();

desliga(BUZZ);

Tempo_2();

a=a+1;

if ((a) >= 3) {;}

break;

//MODO MANUAL

if ((entrada(XIN1)==1)||(entrada(F4)==0))

switch (status2)

case 0:

resetvariaveis();

desliga(Y1);

desliga(Y2);

desliga(Y3);

resetlcd();

// Posio: coluna 01 e linha 01

if (entrada(XIN1)==1)

printf("\x40\x01\x01");
printf("[ MODO MANUAL ]");

if (entrada(F4)==0)

printf("\x40\x01\x01");

printf("[ RESET ]");

delay_ms(12);

// Posio: coluna 01 e linha 02

printf("\x40\x01\x02");

delay_ms(6);

printf("[ AUTOMAO PID ]");

delay_ms(12);

Tempo_2();

status1=0;

printf("MM \n ");

Tempo_1();

status2=1;

break;

case 1:

break;