#include <16F877A.h>
#include <string.h>
#fuses HS,NOLVP,WDT,NOPUT,NOBROWNOUT
#use delay (clock=10000000,RESTART_WDT)
#USE RS232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7,STREAM=COM_A)
#USE RS232(BAUD=9600,XMIT=PIN_D2,RCV=PIN_D3,STREAM=COM_B)
#include <math.h>
#include <string.h>
#define DATA_SHT PIN_C0 // sht75 1
#define SCK_SHT PIN_C1
#define DATA_SHT2 PIN_C2 // sht75 2
#define SCK_SHT2 PIN_C3
#define noACK 0
#define ACK 1
#define STATUS_REG_W 0x06 //000 0011 0 //adr|command|r/w command code
#define STATUS_REG_R 0x07 //000 0011 1
#define MEASURE_TEMP 0x03 //000 0001 1
#define MEASURE_HUMI 0x05 //000 0010 1
#define RESET 0x1E //000 1111 0
#define C1 -4.0 // constant use for SHT1x Humidity Measurement
#define C2 0.0405
#define C3 -0.0000028
#define D1 -40.00 // constant use for SHT1x Temperature Measurement
#define D2 0.01
#define T1 0.01 // constant use for SHT1x True Humidity Measurement
#define T2_ 0.00008
void sht1x_xmission_start()
{ output_high(DATA_SHT);output_low(SCK_SHT);delay_us(2);output_high(SCK_SHT);
delay_us(2);output_low(DATA_SHT);delay_us(2);output_low(SCK_SHT);delay_us(2);
delay_us(2);delay_us(2);output_high(SCK_SHT);delay_us(2);
output_high(DATA_SHT);delay_us(2);output_low(SCK_SHT);delay_us(2);
}
void sht1x_connection_reset()
{ int i;
output_high(DATA_SHT);
for (i=0; i<9; i++)
{output_high(SCK_SHT);delay_us(2);output_low(SCK_SHT);delay_us(2);}
sht1x_xmission_start();
}
void sht1x_command_mode(int iMode)
{ int i;
for (i=128; i>0; i/=2)
{ if (i & iMode) output_high(DATA_SHT);
else output_low(DATA_SHT);
delay_us(2); output_high(SCK_SHT);
delay_us(2); output_low(SCK_SHT);
}
output_float(DATA_SHT); delay_us(2);
output_high(SCK_SHT); delay_us(2);
output_low(SCK_SHT); delay_ms(250);
}
void sht1x_soft_reset()
{ sht1x_connection_reset(); sht1x_command_mode(RESET); }
long sht1x_read_DATA_SHT()
{ int i;
long lTmp;
long lVal1=0;
long lVal2=0;
long lValue;
for (i=0; i<8; i++)
{
lVal1<<=1;
output_high(SCK_SHT);
lTmp = input(DATA_SHT);
delay_us(2);
output_low(SCK_SHT);
delay_us(2);
if (lTmp) lVal1|=1;
}
output_low(DATA_SHT); delay_us(2);
output_high(SCK_SHT); delay_us(2);
output_low(SCK_SHT);
output_float(DATA_SHT);
delay_us(2);
for (i=0; i<8; i++)
{
lVal2<<=1;
output_high(SCK_SHT);
lTmp = input(DATA_SHT);
delay_us(2);
output_low(SCK_SHT);
delay_us(2);
if (lTmp) lVal2|=1;
}
lValue = make16(lVal1,lVal2);
return(lValue);
}
float sht1x_calc_dewpoint(float h,float t)
{
float logEx,dew_point;
logEx=-2+0.66077+((7.5*t)/(237.3+t))+log10(h);
dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
return dew_point;
}
void sht1x_xmission_start2()
{ output_high(DATA_SHT2);
output_low(SCK_SHT2); delay_us(2);
output_high(SCK_SHT2); delay_us(2);
output_low(DATA_SHT2); delay_us(2);
output_low(SCK_SHT2); delay_us(2); delay_us(2); delay_us(2);
output_high(SCK_SHT2); delay_us(2);
output_high(DATA_SHT2); delay_us(2);
output_low(SCK_SHT2); delay_us(2);
}
void sht1x_connection_reset2()
{ int i;
output_high(DATA_SHT2);
for (i=0; i<9; i++)
{ output_high(SCK_SHT2); delay_us(2);
output_low(SCK_SHT2); delay_us(2);
}
sht1x_xmission_start2();
}
void sht1x_command_mode2(int iMode)
{ int i;
for (i=128; i>0; i/=2)
{ if (i & iMode) output_high(DATA_SHT2);
else output_low(DATA_SHT2);
delay_us(2); output_high(SCK_SHT2);
delay_us(2); output_low(SCK_SHT2);
}
output_float(DATA_SHT2); delay_us(2);
output_high(SCK_SHT2); delay_us(2);
output_low(SCK_SHT2); delay_ms(250);
}
void sht1x_soft_reset2()
{ sht1x_connection_reset2(); sht1x_command_mode2(RESET); }
long sht1x_read_DATA_SHT2()
{ int i;
long lTmp;
long lVal1=0;
long lVal2=0;
long lValue;
for (i=0; i<8; i++)
{
lVal1<<=1;
output_high(SCK_SHT2);
lTmp = input(DATA_SHT2);
delay_us(2);
output_low(SCK_SHT2);
delay_us(2);
if (lTmp) lVal1|=1;
}
output_low(DATA_SHT2); delay_us(2);
output_high(SCK_SHT2); delay_us(2);
output_low(SCK_SHT2);
output_float(DATA_SHT2);
delay_us(2);
for (i=0; i<8; i++)
{
lVal2<<=1;
output_high(SCK_SHT2);
lTmp = input(DATA_SHT2);
delay_us(2);
output_low(SCK_SHT2);
delay_us(2);
if (lTmp) lVal2|=1;
}
lValue = make16(lVal1,lVal2);
return(lValue);
}
float sht1x_calc_dewpoint2(float h,float t)
{
float logEx,dew_point;
logEx=-2+0.66077+((7.5*t)/(237.3+t))+log10(h);
dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
return dew_point;
}
void main(void)
{ float fRh_lin, fRh_true, fTemp_true;
float fRh_lin2, fRh_true2, fTemp_true2;
long lValue_rh,lValue_temp;
long lValue_rh2,lValue_temp2;
char temp_cadena[6];
char humi_cadena[6];
char cadena_rs232[25];
char espacio[2];
char transmite[42];
char transmite2[6];
char transmite3[6];
strcpy(espacio," ");
strcpy(transmite,"");
strcpy(transmite2,"");
strcpy(transmite3,"");
setup_wdt(WDT_2304MS);
while(TRUE)
{ restart_wdt();
sht1x_connection_reset(); delay_ms(500);
sht1x_connection_reset2(); delay_ms(500);
strcpy(transmite,"");
strcpy(temp_cadena,"");
strcpy(humi_cadena,"");
delay_ms(12); sht1x_xmission_start(); sht1x_command_mode(MEASURE_TEMP);
lValue_temp = sht1x_read_DATA_SHT(); fTemp_true = (D1+(D2*lValue_temp)); delay_ms(12); sht1x_xmission_start(); sht1x_command_mode(MEASURE_HUMI);
lValue_rh = sht1x_read_DATA_SHT(); if((lValue_temp==65535)||(lValue_rh==65535)) {sht1x_connection_reset();
}
else
{fRh_lin = (C1+(C2*lValue_rh)+(C3*lValue_rh*lValue_rh));
fRh_true = (((fTemp_true-25)*(T1+(T2_*lValue_rh)))+fRh_lin);
strcpy(temp_cadena,"");
sprintf(temp_cadena,"%02.0f",fTemp_true); sprintf(humi_cadena,"%02.0f",fRh_true);
strcpy(transmite,"");
strcat(transmite,temp_cadena); strcat(transmite,espacio);
strcat(transmite,humi_cadena);
strcpy(transmite2,"");
strcpy(transmite2,transmite);
}
strcpy(transmite,"");
strcpy(temp_cadena,"");
strcpy(humi_cadena,"");
delay_ms(12);sht1x_xmission_start2();sht1x_command_mode2(MEASURE_TEMP);
lValue_temp2 = sht1x_read_DATA_SHT2(); fTemp_true2 = (D1+(D2*lValue_temp2)); delay_ms(12); sht1x_xmission_start2(); sht1x_command_mode2(MEASURE_HUMI);
lValue_rh2 = sht1x_read_DATA_SHT2();
if((lValue_temp2==65535)||(lValue_rh2==65535)) {sht1x_connection_reset2();
}
else
{fRh_lin2 = (C1+(C2*lValue_rh2)+(C3*lValue_rh2*lValue_rh2));
fRh_true2 = (((fTemp_true2-25)*(T1+(T2_*lValue_rh2)))+fRh_lin2);
strcpy(temp_cadena,"");
sprintf(temp_cadena,"%02.0f",fTemp_true2); sprintf(humi_cadena,"%02.0f",fRh_true2);
strcpy(transmite,"");
strcat(transmite,temp_cadena); strcat(transmite,espacio);
strcat(transmite,humi_cadena);
strcpy(transmite3,"");
strcpy(transmite3,transmite);
}
if ((strlen(transmite2))!=0&&(strlen(transmite3))!=0)
{ strcpy(transmite,"");
strcat(transmite,transmite2);
strcat(transmite, espacio);
strcat(transmite,transmite3);
fgets(cadena_rs232,COM_B); strcat(transmite,espacio);
strcat(transmite,cadena_rs232);
fprintf(COM_A,"%s",transmite);
printf("\r");
}
} }
[Edit]Code block added[/Edit]