Click here to Skip to main content
15,896,269 members
Please Sign up or sign in to vote.
1.00/5 (2 votes)
See more:
C++
#include <16F877A.h>
#include <string.h>
// #device *=16
#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>

// Definiciones Sensores Temp y HR
#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


///////////////////////////////////////////////////////////////sensor1
// SHT1x Transmission Start Sequence
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);
}
// SHT1x Connection Reset Sequence
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();
}
// SHT1x Address & Command Mode with address=000
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);
}
// SHT1x Soft Reset
// resets the interface, clears the status register to default values
// wait minimum 11ms before next command
void sht1x_soft_reset()
{ sht1x_connection_reset(); sht1x_command_mode(RESET); }
// read DATA_SHT from SHT1x and store
long sht1x_read_DATA_SHT()
{  int i;
   long lTmp;
   long lVal1=0;
   long lVal2=0;
   long lValue;
   // get MSB from SHT1x
   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;
   }
   // acknowledge routine
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);
   // get LSB from SHT1x
   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);
}
// calculate dewpoint
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;
}
///////////////////////////////////////////////////////////////sensor1

///////////////////////////////////////////////////////////////sensor2
// SHT1x Transmission Start Sequence
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);
}
// SHT1x Connection Reset Sequence
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();
}
// SHT1x Address & Command Mode with address=000
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);
}
// SHT1x Soft Reset
// resets the interface, clears the status register to default values
// wait minimum 11ms before next command
void sht1x_soft_reset2()
{ sht1x_connection_reset2(); sht1x_command_mode2(RESET); }
// read DATA_SHT from SHT1x and store
long sht1x_read_DATA_SHT2()
{  int i;
   long lTmp;
   long lVal1=0;
   long lVal2=0;
   long lValue;
   // get MSB from SHT1x
   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;
   }
   // acknowledge routine
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);
   // get LSB from SHT1x
   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);
}
// calculate dewpoint
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;
}
///////////////////////////////////////////////////////////////sensor2







// Main Program
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));     // calcula la medida fisica de temp1
   delay_ms(12); sht1x_xmission_start(); sht1x_command_mode(MEASURE_HUMI);
   lValue_rh = sht1x_read_DATA_SHT();                                           // calcula la humedad relativa
   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);     // convierte a cadena el valor de Temp ##
    sprintf(humi_cadena,"%02.0f",fRh_true);
    strcpy(transmite,"");
    strcat(transmite,temp_cadena);                // añade este valor a cadena tranmite
    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));   // calcula la medida fisica de 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);     // convierte a cadena el valor de Temp ##
    sprintf(humi_cadena,"%02.0f",fRh_true2);
    strcpy(transmite,"");
    strcat(transmite,temp_cadena);                // añade este valor a cadena tranmite
    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); // cual=1; esto lo puse pal tec
       strcat(transmite,espacio);
       strcat(transmite,cadena_rs232);
       fprintf(COM_A,"%s",transmite);
       printf("\r");
     }

} // while
} // main</string.h></math.h></string.h>


[Edit]Code block added[/Edit]
Posted
Updated 29-Oct-12 4:29am
v2
Comments
michaelmel 29-Oct-12 21:04pm    
Looks like plain old ANSI C to me, NOT C++.

Given that your particular PIC is a very low end micro, with something like 14K of program memory, I would say one would fail spectacularly trying to use C++ to write programs for it (even if you find a C++ cross compiler for it which I doubt).

1 solution

How would we know?
We do not have access to your hardware diagrams and so have no idea how everything is connected together.
You have the software, you have the hardware.
Try it. See if it works!

BTW: in future, please sort out your indentation before you post code - it makes it a lot easier to read, and don't just post a whole program - taht's called a code dump and is considered rude.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900