quarta-feira, 8 de setembro de 2010

Termômetro e higrômetro usando o sensor SHT15 (PIC)

#include <16F877A.h>
#fuses NOWDT,XT, PUT, NOPROTECT, DEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4M)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include
#define DADOS PIN_C3
#define CLOCK PIN_C4
#define led_on output_high(PIN_D0);
#define led_off output_low(PIN_D0);
#define STATUS_W 0x06 //000 0011 0 escreve status
#define STATUS_R 0x07 //000 0011 1 ler status
#define MEDE_TEMP 0x03 //000 0001 1
#define MEDE_HUMI 0x05 //000 0010 1
#define RESET 0x1e //000 1111 0



// constantes para humidade(12bits e 5V)

const float C1=-4.0; // for 12 Bit
const float C2=+0.0405; // for 12 Bit
const float C3=-0.0000028; // for 12 Bit
const float T1=+0.01; // for 14 Bit @ 5V
const float T2=+0.00008; // for 14 Bit @ 5V

// constantes para temperatura(14bits e 5V)

int checksum;
//----------------------------------------------------------------------------------
long ler_SHT()
//----------------------------------------------------------------------------------
{
int i,Temp;
int Val1=0,Val2=0;
long Valor=0;
//pega MSB de SHT
for (i=0; i<8; i++) { Val1<<=1; output_high(CLOCK); delay_us(1); Temp = input(DADOS); //lê um bit if(Temp) Val1|=1; output_low(CLOCK); delay_us(2); } //rotina de reconhecimento para proximo byte output_low(DADOS); delay_us(1); output_high(CLOCK); delay_us(2); output_low(CLOCK); delay_us(1); output_float(DADOS); //muda para entrada //pega LSB SHT for (i=0; i<8; i++) { Val2<<=1; output_high(CLOCK); delay_us(2); Temp = input(DADOS); //lê um bit delay_us(2); if(Temp) Val2|=1; output_low(CLOCk); delay_us(2); } output_float(DADOS); //muda para entrada delay_us(2); output_high(CLOCK); delay_us(2); output_low(CLOCk); checksum=0; //pega checksum do SHT for (i=0; i<8; i++) { checksum<<=1; output_high(CLOCK); delay_us(2); Temp = input(DADOS); //lê um bit delay_us(2); output_low(CLOCK); delay_us(2); if(Temp) checksum|=1; } valor=make16(val1,val2); //faz uma variavel de 16 bits return(valor); } //---------------------------------------------------------------------------------- //---------------------------------------------------------------------------------- void ini_trans(void) //---------------------------------------------------------------------------------- // inicializa uma transmissao // _____ ________ // dados: |_______| // ___ ___ // clock :___| |___| |______ { output_high(DADOS); output_low(CLOCK); //estado inicial delay_us(2); output_high(CLOCK); delay_us(2); output_low(DADOS); delay_us(2); output_low(CLOCK); delay_us(2); output_high(CLOCK); delay_us(2); output_high(DADOS); delay_us(2); output_low(CLOCK); delay_us(2); } ///////////////////////////////////////////////////////////////////////////////////// boolean escreve_byte(unsigned int valor,long espera) //---------------------------------------------------------------------------------- // escreve 1 byte e checa o reconhecimento { unsigned int i; boolean erro=0; ini_trans(); for (i=0x80;i>0;i/=2) //rotaciona byte 8 vezes
{
if(i & valor)//testa bit na posição 'i' de valor se é igual a 1
{
output_high(DADOS);
}
else
{
output_low(DADOS);
}
delay_us(2);
output_high(CLOCK);
delay_us(2);
output_low(CLOCK);
}
output_float(DADOS);
delay_us(2);
output_high(CLOCK);
delay_us(2);
// se =1 não reconhecido
erro=(input(DADOS));
output_low(CLOCK);
delay_ms(espera);//veja o datasheet
return erro;

}
//----------------------------------------------------------------------------------
void reseta_conexao(void)
//----------------------------------------------------------------------------------
// reseta a conexao colocando a linha de dados=1 e aplicando 9 pulsoso de clock seguido de um pulso de inicio
// _____________________________________________________ ________
// dados: |_______|
// _ _ _ _ _ _ _ _ _ ___ ___
//cloc : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
{
int i;
output_high(DADOS);
for(i=0;i<9;i++) //9 pulsos de clock
{
output_high(CLOCK);
delay_us(2);
output_low(CLOCK);
delay_us(2);
}
ini_trans(); //inicia transmissao
}
//----------------------------------------------------------------------------------
boolean resetar(void)
//----------------------------------------------------------------------------------
// reseta o sensor pelo firmware
{
boolean error=0;
reseta_conexao(); //reseta conexao
error+=escreve_byte(RESET,10);
return error; //error=1 no caso de não ter a resposta do sensor
}
/*//----------------------------------------------------------------------------------
boolean ler_status(unsigned char *valor, unsigned char *checksum)
//----------------------------------------------------------------------------------
// ler o estado do sensor com checksum (8-bit)
{
boolean error=0;
ini_trans();
error=escreve_byte(STATUS_R); //envia comando de ler status do sensor
*valor=ler_SHT();
*checksum=ler_SHT();
return error; //error=1 se não tiver resposta do sensor
}
//----------------------------------------------------------------------------------
boolean escreve_status(unsigned char *valor)
//----------------------------------------------------------------------------------
//escreve no status do sensor com checksum(8-bit)
{
boolean error=0;
ini_trans();
error=escreve_byte(STATUS_W); //envia comando de escrever no status do sensor
error=escreve_byte(*valor); //escreve valor no status do sensor
return error; //error=1 se não tiver resposta do sensor
}*/

//----------------------------------------------------------------------------------
float ponto_de_orvalho(float hum,float Tempe)
{
float ponto;
float auxiliar;

//auxiliar = ((7.5*Tempe)/(237.3+Tempe))+log10(hum)-1.33923;
//ponto = ((0.66077-log10(auxiliar))*(237.3))/(log10(auxiliar)-8.16077);
auxiliar=(0.66077+(7.5*Tempe))/(237.3+Tempe)+(log10(hum)-2);
ponto = (auxiliar - 0.66077)*237.3/(0.66077+7.5-auxiliar);
return(ponto);
}

Nenhum comentário :

Postar um comentário

olá,digite aqui seu comentário!