Ir ao conteúdo

Como adicionar o sensor LM35 ao meu projeto?PIC


Duduzinho07

Posts recomendados

Postado

Saudações companheiros.

 

Estou fazendo um projeto cuja função é me informar a data e horáio atual com ajuda de um RTC 1307, através de um display LCD, além de temporizar as saidas do pic com horarios que eu escolher atraves do proprio lcd com auxilio de botões. Até então está OK.

 

Minha dificuldade é a seguinte:
Como adicionar um sensor LM35 á programação e jogar a informação do mesmo na tela principal??
Assim teria além das infromaçoes de horario também teria a temperatura ambiente no display.

 

Necessito de orientaçoes, agradeço desde já.

estou programando no ccs.



segue o codigo

#include <16F628A.h>
#use delay(clock=4000000)
#fuses NOWDT,INTRC_IO, NOPUT, NOPROTECT, NOBROWNOUT, MCLR, NOLVP, NOCPD
#use fast_io(a)
#use fast_io( B)
#ZERO_RAM


//configuração dos ports
#byte trisb = 0x86
#byte trisa = 0x85
#byte portb = 0x06
#byte porta = 0x05
//flags
#bit tmr1_if = 0x0c.0

//pinos de saída
#bit canal1 = 0x05.1 //ra1 pino 18
#bit canal2 = 0x05.0 //ra1 pino 17
#bit canal3 = 0x05.7 //ra1 pino 16
#bit canal4 = 0x05.6 //ra1 pino 15
#bit canal5 = 0x06.1 //rb1 pino 7
#bit canal6 = 0x06.0 //rb1 pino 6



// lcd e chaves
#bit en = 0x06.2 //rb2 lcd 'enable' pino 8
#bit rs = 0x06.3 //rb3 lcd 'rs' - comando/dado pino 9
#bit sw_seg = 0x06.4 //rb4 chave segundos db4 pino 10
#bit sw_min = 0x06.5 //rb5 chave minutos db5 pino 11
#bit sw_hora = 0x06.6 //rb6 chave horas db6 pino 12
#bit sw_menu = 0x06.7 //rb7 db7 pino 13
#bit sw_adj = 0x06.7 //rb7 db7 pino 13

#bit db4 = 0x06.4 //rb4 db4 pino 10
#bit db5 = 0x06.5 //rb5 db5 pino 11
#bit db6 = 0x06.6 //rb6 db6 pino 12
#bit db7 = 0x06.7 //rb7 db7 pino 13


// comunicação com o ds1307
#bit sda = 0x05.2 // ra2 sda pino 1
#bit tris_sda = 0x85.2
#bit scl = 0x05.3 // ra3 scl pino 2


//constantes de in-out
const int8 tris_out = 0x00;//db7 a db4 saidas
const int8 tris_in = 0xf0; //db7 a db4 entradas
//CONSTANTES PARA DIA DA SEMANA
const int8 semana[]={ 'D','O','M','S','E','G','T','E','R'
'Q','U','A','Q','U','I','S','E','X'
'S','A','B'};

const int8 eep_[]={ 0x24,0x17,0x1e,0x21,0x19,0x1b,0x21,0x31,
0x15,0x21,0x20,0x26,0x24,0x21,0x1e,0x1e,
0x13,0x24,0x1b,0x21,0x25,0x00,0x26,0x17,
0x15,0x20,0x21,0x1e,0x00,0x29,0x25 };
//variáveis globais
int8 cnt;
int8 r1,pos,vez,val,k,qcan;
int8 time[7];//armazena as variáveis do DS1307 após sua leitura
int8 cal[6]={0x12,0x03,0x14,0x07,0x05,0x45};
int1 f,fc;






//==============================================================================
// ROTINAS PARA DS1307
//==============================================================================


void delay_m(void){ delay_us(5);}


VOID I2C_START(VOID){//INICIA COMUNICAÇÃO 'START'
sda=0;
scl=1;
delay_m();
sda=1;
delay_m();
sda=0;
delay_m();
scl=0;
}

void I2C_STOP(void){//ENCERRA COMUNICAÇÃO I2C
sda=1;
scl=1;
delay_m();
sda=0;
delay_m();
scl=0;

}
void CLOCK(void){//CLOCK
delay_m();
scl=1;
delay_m();
scl=0;
}


void ACK(void){//envia 'ack'
sda=0;
clock();
}

void NO_ACK(void){//envia 'no ack'
sda=1;
clock();
}

void I2C_WRITE(int8 valor){//ESCREVER 8 BITS NO DS1307
int8 a;
for(a=0;a<8;a++){

if(bit_test(valor,7)){sda=1;} else{sda=0;}
clock();
valor=valor<<1;
}
}

int8 I2C_READ(void){ //LER 8 BITS DO DS1307
int8 c=0;
int8 a;
tris_sda=1;
for(a=0;a<8;a++){
c=c<<1;
if(sda) c++;
clock();

}
tris_sda=0;
return ©;
}



void ds_write(int8 adr,int8 valor){//escreve 8 bits no endereço informado
I2C_START();
I2C_WRITE(0xd0);
ACK();
I2C_WRITE(adr);
ACK();
I2C_WRITE(valor);
ACK();
I2C_STOP();
}

int8 ds_read(int8 adr){//le 8 bits do DS1307 no endereço informado
int8 a;
I2C_START();
I2C_WRITE(0xd0);
ACK();
I2C_WRITE(adr);
ACK();
I2C_START();
I2C_WRITE(0xd1);
ACK();
a=I2C_READ();
NO_ACK();
I2C_STOP();
RETURN (a);
}

void ds_read8(void){//ler todos os registradores de tempo
int8 a;
I2C_START();
I2C_WRITE(0xd0);
ACK();
I2C_WRITE(0);
ACK();
I2C_START();
I2C_WRITE(0xd1);
ACK();
for(a=0;a<7;a++){
time[a]=I2C_READ();
if(a==6)no_ack();else ACK();
}
I2C_STOP();

}

void ds_write8(void){//escreve todos os registradores de tempo
int8 a;
I2C_START();
I2C_WRITE(0xd0);
ACK();
I2C_WRITE(0);
for(a=0;a<7;a++){
ACK();
I2C_WRITE(time[a]);
}
ACK();
I2C_STOP();
}


//==============================================================================
// ROTINAS PARA LCD
//==============================================================================
//clock para lcd
void lcd_clk(void){
trisb=tris_out;
en=1;
delay_us(58);
en=0;
}

//envia nible para lcd
void env_nib(int8 B){
int8 pb;
pb=portb&0x0f;
portb= pb|(b&0xf0);
lcd_clk();
}

//envia comando para lcd
void env_lcd_c(int8 val){
rs=0;
env_nib(val);
env_nib(swap(val));
delay_ms(10);
}
//envia dados para lcd
void env_lcd_d(int8 val){
rs=1;
env_nib(val);
env_nib(swap(val));
}


//inicialização do lcd
void lcd_init(void){
int8 a,*b;
b=&k;
delay_ms(40);
db4=1; db5=1;
for(a=0;a<3;a++) lcd_clk();
db4=0;
lcd_clk();
env_lcd_c(0x28);//ajusta para 4 bits o modo de envio
env_lcd_c(0x06);// no shift
env_lcd_c(0x0c);//Display ON, Cursor OFF, Blink OFF
env_lcd_c(0x01);//limpa tela
*b=(eep_[0x16]|0x08);//
}
//apresenta um byte no lcd
void show_byte(int8 r1){
int8 a,b;
b=k+2;
for(a=0;a<2;a++){env_lcd_d( b|(swap(r1)&0x0f));}//dezena e unidade

}
// mostra todos os dados do relogio e calendário no lcd
void ver_relogio(){
int c;

//envia hora/min/seg
env_lcd_c(0x84);
show_byte(time[2]);
env_lcd_d(':');
show_byte(time[1]);
env_lcd_d(':');
show_byte(time[0]);
env_lcd_c(0xc2);


//envia dia da semana
switch (time[3]){
case 1: pos=0; break;
case 2: pos=3; break;
case 3: pos=6; break;
case 4: pos=9; break;
case 5: pos=12; break;
case 6: pos=15; break;
case 7: pos=18; break;
}
for(c=0;c<3;c++){
env_lcd_d(semana[pos+c]);
}
//envia calendário com dia/mes/ano
env_lcd_d(' ');
show_byte(time[4]);
env_lcd_d('/');
show_byte(time[5]);
env_lcd_d('/');
show_byte(time[6]);
}
//mostra nome do aparelho

void show_blog(){
int8 k_;
for(k_=0;k_<15;k_++){env_lcd_d(eep_[k_]+k);}//
env_lcd_c(0xc0);
for(k_=0;k_<16;k_++){env_lcd_d(eep_[k_+15]+k);}
delay_ms(1500);//delay inicial
//env_lcd_c(0x01);//limpa tela

}

//rotina que busca conforme 'vez' a posição da eeprom correspondente e mostra
// no lcd o ajuste

void m_can(void){
env_lcd_d('C');
env_lcd_d('A');
env_lcd_d('N');
env_lcd_d('>');

}
void ver_temporizacao(void){
int8 a,b;
env_lcd_c(0x01); //apaga tela do lcd
env_lcd_c(0x80);
m_can();
a=(vez&0xfe)-3;
a=(a++)>>1;
a++;
a=a|0x30;
env_lcd_d(a);
env_lcd_d(' ');
env_lcd_d('L');
env_lcd_d(' ');
for(b=0;b<3;b++){
if(b)env_lcd_d(':');
show_byte(cal);}
env_lcd_c(0xc6);
env_lcd_d('D');
env_lcd_d(' ');
for(b=3;b<6;b++){
if(b!=3)env_lcd_d(':');
show_byte(cal);}

}


void salvar_pegar(void){
int8 d,m,n;
if(!fc){
if(vez>4){
n=vez;
n--;
n=n&0x01;
n=n*3;
for(d=0;d<3;d++){write_eeprom(d+((qcan-1)*3),cal[d+n]);}//salva anterior na eeprom
}
m=vez&0x01;
if(!m){//se par carrega os dois valores
for(d=0;d<6;d++){ cal[d]= read_eeprom(d+(qcan*3));}//carrega eeprom
}
fc=1;
}
}

//incrementa e converte byte (hexa para decimal)
int8 inc_reg(int8 reg1){
int8 a,b;
if((vez<=3)&&(vez)) f=1; //se foi ajuste para DS1307 seta 'f'
a=reg1;
b=a;
b=swap( B)&0x0f;
a=a&0x0f;
if(++a>9) {a=0; ++b;}//incrementa e testa
return ( a|swap( B));//retorna em decimal
}
void adj_canais(int8 t){
trisb=tris_in;//pinos como entrada
if(!sw_seg) {val= inc_reg(cal[2+t]);if(val>0x59) cal[2+t]=0; else cal[2+t]=val;}
if(!sw_min) {val= inc_reg(cal[1+t]);if(val>0x59) cal[1+t]=0; else cal[1+t]=val;}
if(!sw_hora){val= inc_reg(cal[0+t]);if(val>0x23) cal[0+t]=0; else cal[0+t]=val;}
}
void spal1(){
int8 d;
salvar_pegar();
env_lcd_c(0x88);
for(d=0;d<9;d++){env_lcd_d(' ');}
adj_canais(0); //0=ligar
}

void spal2(){
int8 d;
salvar_pegar();
env_lcd_c(0xc8);
for(d=0;d<9;d++){env_lcd_d(' ');}
adj_canais(3); //0=ligar
}


//testa por acionamento nos botões de acionamento
void testa_chaves(void){
int8 d;
f=0;
vez=0;
trisb=tris_in;//pinos como entrada
if(!sw_adj) vez++;
delay_ms(5);
while(!sw_adj);
trisb=tris_out;//pinos como saida
//se registrador'vez' for diferente de '0', vai ajustar relogio/calendario

while(vez){
qcan=vez-4;// determina canal em modo de acerto da temporização
if(vez==1){
//faz piscar
env_lcd_c(0x84);
for(d=0;d<9;d++){env_lcd_d(' ');}
trisb=tris_in;//pinos como entrada
//incrementa o registrador conforme chave apertada (relógio)
if(!sw_seg) {val= inc_reg(time[0]);if(val>0x59) time[0]=0; else time[0]=val;}
if(!sw_min) {val= inc_reg(time[1]);if(val>0x59) time[1]=0; else time[1]=val;}
if(!sw_hora){val= inc_reg(time[2]);if(val>0x23) time[2]=0; else time[2]=val;}
}

if(vez==2){
//faz piscar
env_lcd_c(0xc2);
for(d=0;d<3;d++){env_lcd_d(' ');}
trisb=tris_in;//pinos como entrada
//se um dos 3 botões for pressionado, incrementa dia da semana
if((!sw_seg)|(!sw_min)|(!sw_hora)) {
val= inc_reg(time[3]);
if(val>0x07) time[3]=1; else time[3]=val;
}
}

if(vez==3){
//faz piscar
env_lcd_c(0xc6);
for(d=0;d<9;d++){env_lcd_d(' ');}
trisb=tris_in;//pinos como entrada
//incrementa o registrador conforme chave apertada (calendário)
if(!sw_seg) {val= inc_reg(time[4]);if(val>0x31) time[4]=1; else time[4]=val;}
if(!sw_min) {val= inc_reg(time[5]);if(val>0x12) time[5]=1; else time[5]=val;}
if(!sw_hora){val= inc_reg(time[6]);if(val>0x99) time[6]=0; else time[6]=val;}
}

if(vez==4){
if(f) {ds_write8();f=0;} //acerta ajustes do Ds1307 antes de passar para eeprom
spal1(); //salva ajuste anterior,pega novos, ajusta
}
if(vez==5){ spal2();}
if(vez==6){ spal1();}
if(vez==7){ spal2();}
if(vez==8){ spal1();}
if(vez==9){ spal2();}
if(vez==10){spal1();}
if(vez==11){spal2();}
if(vez==12){spal1();}
if(vez==13){spal2();}
if(vez==14){spal1();}
if(vez==15){spal2();}
if(vez==16){
for(d=0;d<3;d++){write_eeprom(d+((qcan-1)*3),cal[d+3]);}//salva anterior na eeprom
vez=0;
}
delay_ms(150);//tempo desligado
trisb=tris_in;//pinos como entrada
if(!sw_adj);
if(!sw_adj){
if(++vez>16) vez=0;
while(!sw_adj) delay_ms(10);
fc=0;

}
trisb=tris_out;//pinos como saida
if(vez<4){
env_lcd_c(0x01);
ver_relogio();}// mostra o incremento realizado no LCD
else
//colocar modo de visualização de programação dos canais
{ if(vez<16) {ver_temporizacao();} else {env_lcd_c(0x01);} }
delay_ms(150);// tempo ligado

}

trisb=tris_out;//pinos como saida

}


int8 pegamem(int8 a){

return (read_eeprom(a));
}

int1 t_acionar(int8 pnt){
if(!vez){//compara somente após sair do modo de ajuste
int32 h_inic,h_atual,h_fim;
h_fim=make32(pegamem(pnt+3),pegamem(pnt+4),pegamem(pnt+5));//hms
h_inic=make32(pegamem(pnt),pegamem(pnt+1),pegamem(pnt+2));//hms
h_atual=make32(time[2],time[1],time[0]);//hms


if(h_inic<=h_fim){
if((h_atual>=h_inic)&&(h_atual<h_fim)) return(1);else return(0);
}
else{
if((h_atual<=0x235959)&&(h_atual>=h_inic)){return (1);}
else{
if(h_atual<h_fim){ return (1);} else {return (0);}
}
}

}//if(!vez)
}//void acionar

void comparar(void){
canal1= t_acionar(0);
canal2= t_acionar(6);
canal3= t_acionar(12);
canal4= t_acionar(18);
canal5= t_acionar(24);
canal6= t_acionar(30);


}


void wake_up(){//testa se ds 1307 está acordado
cnt=0;
ds_read8(); //pega dados do ds1307
while(time[0]&0x80) {//se ds1307 estiver desligado, religa e zera
// time[0]&=0x7f;
time[0]=0; time[1]=0; time[2]=0; time[3]=0; time[4]=1; time[5]=1;time[6]=0;
ds_write8();
delay_ms(10);
ds_read8(); //pega dados do ds1307
if(!++cnt){
env_lcd_d('E');
env_lcd_d('R');
env_lcd_d('R');
env_lcd_d('0');
env_lcd_d(' ');
env_lcd_d('D');
env_lcd_d('S');
env_lcd_d(' ');
env_lcd_d('I');
env_lcd_d('2');
env_lcd_d('C');
env_lcd_d(' ');
env_lcd_d('C');
env_lcd_d('O');
env_lcd_d('M');
for(; ;);
}
}
env_lcd_c(0x01);//limpa tela
}


//==============================================================================
// ROTINA MAIN
//==============================================================================



void main() {

port_b_pullups(TRUE);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);
setup_comparator(NC_NC_NC_NC);
porta=0; portb=0; trisb=0; trisa=0;
lcd_init();//inicializa o lcd
show_blog();//mostra nome do aparelho
delay_ms(1000);
wake_up();

while(1){

while(!tmr1_if);//aguarda timer 1 estourar
tmr1_if=0;
ds_read8(); //pega dados do ds1307
delay_ms(10);//
ver_relogio();//visualisa relogio e calendario no lcd
testa_chaves();//testa se alguma chave foi acionada
comparar();


}//while

}//main
Postado

E mais ou menos assim:

 

#device adc=10                   //Habilitar ADC de 10 bits.
 
int16 adc;
float temperatura;
 
void main()
   setup_adc_ports(AN0);                             //Configura canal 0 analógico
   setup_adc(ADC_CLOCK_INTERNAL);     //De acordo com relógio interno.
   set_adc_channel(0);                                 //Habilita canal 0
   delay_us(20);                                           //Espera um pouco (obrigatório!)
      
 
default:
         {  
            adc = read_adc();                                             //Lê canal 0
            temperatura = (5.0 * adc * 100) / 1024.0;         //Conversão para tensão. 
 
           printf(lcd_putc,,............
Postado
  Em 05/05/2015 às 19:33, MatheusLPS disse:

@MatheusLPG

O link que me enviou se trata apenas de um display mostrando data e temperatura. O meu também é assim porém só me falta a temperatura, só que no meu projeto depois de se ajustar a data e hora eu consigo temporizar o horario de ligar e desligar saidas no PIC atraves do display. Exemplo RB0>L 12.00.00 (ligar)

D 15:00:00(desligar)

Tentei fazer esta função de temporazação no codigo que me enviou do link,porém sem Exito algum, também tentei passar a parte do LM35 pro meu mas não consegui.

Será que consegue aplicar a função de temporização naquele ou adicionar o lm35 ao meu ?

To quebrando a cabeça, mas não consigo.

  Em 05/05/2015 às 19:33, MatheusLPS disse:

@MatheusLPS

O link que me enviou se trata apenas de um display mostrando data e temperatura. O meu também é assim porém só me falta a temperatura, só que no meu projeto depois de se ajustar a data e hora eu consigo temporizar o horario de ligar e desligar saidas no PIC atraves do display. Exemplo RB0>L 12.00.00 (ligar)

D 15:00:00(desligar)

Tentei fazer esta função de temporazação no codigo que me enviou do link,porém sem Exito algum, também tentei passar a parte do LM35 pro meu mas não consegui.

Será que consegue aplicar a função de temporização naquele ou adicionar o lm35 ao meu ?

To quebrando a cabeça, mas não consigo.

post-758740-0-83026100-1430953566_thumb.

post-758740-0-60642600-1430953594_thumb.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Mostrar mais  

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

Mostrar mais  
×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!