Ir ao conteúdo
  • Cadastre-se
_SharkBoy_

Termômetro com pic16f628a e ds18b20 p/ sistema de resfriamento

Recommended Posts

Olá pessoal! Tenho experiência com Pascal e Php, mas sou pouco experiente com a linguagem C (ainda mais orientado à eletrônica :mellow:), e peço a ajuda de vocês para o seguinte projeto:

Necessito de fazer uma "interface" do sensor com o Pic para ativar um sistema de resfriamento com um motor DC após a temperatura >= X graus Celsius. Ativar o motor eu já consegui fazer usando o Pic, o meu problema é justamente tratar os dados vindos do sensor pra depois fazer a verificação de temperatura... Procurei por projetos para tentar me orientar, mas todos que encontrei são para outras finalidades (usando lcd, coisa que eu não preciso), daí fico perdido devido à mistura das funções no código... Alguém poderia me ajudar/orientar?

(Obs: Estou usando MikroC)

Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

aprenda a ler a entrada ad e com um if .. else resolve a parada

//#include seus includes.h
#define motor PORTB.F0
#define valor 100 //chute em ºC. Em valor de ad pode ser + de 500. Depende do sensor e tal
#define ligado 1
#define desligado 0
#define histerese 10 //chute em ºC. Em valor de ad pode ser + de 50. Depende do sensor e tal
unsigned int temperatura;
//inicializações do hw e etc
for(;;)
{
temperatura=adcread(0);
if (temperatura>valor) motor=ligado;
else if (temperatura<(valor-histerese)) motor=desligado;
}

Nem precisa perder tempo convertendo pra ºC, jã que não vai ter display mesmo. Espero que seu nível de maturidade o faça deduzir que não é só dar ctrl-c ctrl-v ok?

 

Quer um cafezinho também?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

puts! Desculpa!! Agora que revisei e vi que o 628 não tem ad. Mals!! Desconsidere temporariamente o fonte acima.

Fale sobre o tal ds18b20 (preguiça de googlar). Talvez eu possa te orientar a contento. Publique o esquemático. Talvez voltemos ao fonte...

Compartilhar este post


Link para o post
Compartilhar em outros sites
Citação

Espero que seu nível de maturidade o faça deduzir que não é só dar ctrl-c ctrl-v ok?

 

Quer um cafezinho também?

Calma amigo(a), não fique exaltado, vim numa boa pedir ajuda.

 

Fiquei esse tempo com o projeto parado, agora voltei com tempo livre e ao invés de criar um novo tópico, decidi ressuscitar esse. Enfim...

 

Achei este esquema na net, retirei a parte do LCD e não fiz mais nenhuma modificação para o projeto real. Fui simular no Proteus e:

Spoiler

[PIC16 EEPROM] PC=0x0220. Write to EECON1 sets both EECON1<RD> and EECON1<WR> simultaneously. This is ambiguous - both bits will be considered clear. [U1]
 

 

Códigos:

main.c

#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=20000000)

#include <1wire.c> 
#include <ds1820.c> 

void alarma();
void main(){
float temperatura;
float minimo;
float maximo;
minimo=26;
maximo=28;
while (1){
temperatura = ds1820_read();
if (temperatura<=minimo){
 output_high(PIN_A1);}
if (temperatura>=maximo){
output_low(PIN_A1);
alarma();}
if (temperatura==minimo){
output_low(PIN_A1);}}
}
void alarma(){
output_high(PIN_B3);
delay_ms(100);
output_low(PIN_B3);
delay_ms(100);}

ds1820.c

float ds1820_read() 
{ 
 int8 busy=0, temp1, temp2; 
 signed int16 temp3; 
 float result; 

 onewire_reset(); 
 onewire_write(0xCC); 
 onewire_write(0x44); 

 while (busy == 0) 
  busy = onewire_read(); 

 onewire_reset(); 
 onewire_write(0xCC); 
 onewire_write(0xBE); 
 temp1 = onewire_read(); 
 temp2 = onewire_read(); 
 temp3 = make16(temp2, temp1); 
  
 result = (float) temp3 / 2.0;   //Calculation for DS18S20 with 0.5 deg C resolution 
// result = (float) temp3 / 16.0;  //Calculation for DS18B20 with 0.1 deg C resolution 
  
 delay_ms(200); 
 return(result); 
} 

1wire.c

// (C) copyright 2003 j.d.sandoz / jds-pic !at! losdos.dyndns.org 

// released under the GNU GENERAL PUBLIC LICENSE (GPL) 
// refer to http://www.gnu.org/licenses/gpl.txt 

// This program is free software; you can redistribute it and/or modify 
// it under the terms of the GNU General Public License as published by 
// the Free Software Foundation; either version 2 of the License, or 
// (at your option) any later version. 

// This program is distributed in the hope that it will be useful, 
// but WITHOUT ANY WARRANTY; without even the implied warranty of 
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
// GNU General Public License for more details. 

// You should have received a copy of the GNU General Public License 
// along with this program; if not, write to the Free Software 
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 

/***********************1Wire Class***********************/ 
/*Description: This class handles all communication */ 
/* between the processor and the 1wire */ 
/* sensors. 
/*********************************************************/ 

/*-------1-wire definitions-------*/ 
#define ONE_WIRE_PIN PIN_A0 

/*******************1-wire communication functions********************/ 

/************onewire_reset*************************************************/ 
/*This function initiates the 1wire bus */ 
/* */ 
/*PARAMETERS: */ 
/*RETURNS: */ 
/*********************************************************************/ 

void onewire_reset()  // OK if just using a single permanently connected device 
{ 
 output_low(ONE_WIRE_PIN); 
 delay_us( 500 ); // pull 1-wire low for reset pulse 
 output_float(ONE_WIRE_PIN); // float 1-wire high 
 delay_us( 500 ); // wait-out remaining initialisation window. 
 output_float(ONE_WIRE_PIN); 
} 

/*********************** onewire_write() ********************************/ 
/*This function writes a byte to the sensor.*/ 
/* */ 
/*Parameters: byte - the byte to be written to the 1-wire */ 
/*Returns: */ 
/*********************************************************************/ 

void onewire_write(int data) 
{ 
 int count; 

 for (count=0; count<8; ++count) 
 { 
  output_low(ONE_WIRE_PIN); 
  delay_us( 2 ); // pull 1-wire low to initiate write time-slot. 
  output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // set output bit on 1-wire 
  delay_us( 60 ); // wait until end of write slot. 
  output_float(ONE_WIRE_PIN); // set 1-wire high again, 
  delay_us( 2 ); // for more than 1us minimum. 
 } 
} 

/*********************** read1wire() *********************************/ 
/*This function reads the 8 -bit data via the 1-wire sensor. */ 
/* */ 
/*Parameters: */ 
/*Returns: 8-bit (1-byte) data from sensor */ 
/*********************************************************************/ 

int onewire_read() 
{ 
 int count, data; 

 for (count=0; count<8; ++count) 
 { 
  output_low(ONE_WIRE_PIN); 
  delay_us( 2 ); // pull 1-wire low to initiate read time-slot. 
  output_float(ONE_WIRE_PIN); // now let 1-wire float high, 
  delay_us( 8 ); // let device state stabilise, 
  shift_right(&data,1,input(ONE_WIRE_PIN)); // and load result. 
  delay_us( 120 ); // wait until end of read slot. 
 } 

 return( data ); 
}

-Esquema em anexo-

-Códigos compilados usando PICC, sem erros acusados-

 

Sei que pode ser erro besta, mas reafirmo que sou iniciante na eletrônica. Alguém poderia dar uma luz?

esquema.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Atualizando:

Troquei 

#include <16F877A.h>

Por

#include <16F628A.h>

Agora o Proteus não acusa erro; Mas o projeto não acusa nada quando a temperatura ultrapassa a temp. limite... Voltei a por o LCD e independente da temperatura no ds18b20, é mostrado "-0,5 C" apenas... Qual o erro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia 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

×