Ir ao conteúdo
  • Cadastre-se

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


Posts recomendados

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!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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...

Link para o comentário
Compartilhar em outros sites

  • 7 meses depois...
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

Link para o comentário
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?

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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

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

×
×
  • Criar novo...