lape
  LAPE e-log  ELOG logo
Message ID: 114     Entry time: Tue Sep 10 19:54:14 2013
Author: Saullo 
Type: Routine 
Category: Hardware Problem 
Subject: Caracterização sensores PT100 e SHT15 com RH520 

Foi feita uma caracterização dos sensores SHT15 e do PT100.

Para faze-la fiz uma comparação entre as temperaturas e umidades medidas em cada sensor com as medidas pelo vulgo "treco verde" o sensor de temperatura e umidade "Extech instruments RH520 Humidity and temperature Recorder" (cujo o manual se encontra em anexo).

Para fazer essa comparação precisei do software do RH520 e do Gobetwino (para gravar os dados no arduino com data)

Algumas observações:

1) O programa que retira os dados do RH520 foi feito em labview;

2) Outra coisa que apesar de voce consertar no aparelho a hora local de forma correta o programa na hora de gerar o arquivo com os dados, sempre marca o número da hora 1h a mais que o correto;

3) Antes de começar a tomar os dados,é uma boa resetar o RH520, através de um pequeno botão interno na parte traseira dele, mas como voce tera a marcação do tempo, isso nao será tao grave;

4) Sincronizar os dados corretamente, pode ser uma tarefa meio complicada.

 

hist_Hsht.png

                        Histograma da umidade do SHT15

 hist_H_Vsht.png

                  Histograma da umidade do SHT15 - RH520

 

hist_Tsht.png

                        Histograma da temperatura do SHT15

 

hist_T_Vsht.png

                   Histograma da temperatura do SHT15 - RH520

 

                        Histograma da temperatura do PT100

 

hist_T_Vpt.png

             Histograma da temperatura do SHT15 - RH520

 

Anexo tambem, o codigo do Arduino (.ino) para gerar os pontos e poder ser lido com o Gobetwino.

 

 

 

Attachment 1: RH520.pdf  385 kB  Uploaded Thu Sep 12 15:50:45 2013
Attachment 2: leitura_sensor.ino  5 kB  Uploaded Thu Sep 12 15:59:03 2013  | Hide | Hide all
/*#######################################
               Hora                
#######################################*/
/*
int hora( int time){
  
 int segundos = time/1000;
 
 if (segundos > 60){
   int min = segundos/60; 
 }
    
  
  
  
}*/

char buffer[5];


/*#######################################
               PT100                
#######################################*/

float volt = 5.030; // (V) voltagem maxima de referencia fornecida pelo arduino
float Raf = 100700.00; // (Ohm) resistencias usadas no amplificador
float Ra1 = 980.0; // (Ohm) idem
float R1 = 10070.00; // (Ohm) Resistencia em paralelo ao pt100
float calcula_temp(float Rpt){ // valido apenas para temperaturas entre (0 e 850)C
  
  float R0 = 100.00; // (Ohm) resistencia a zero graus
  float A = +3.9083E-03;
  float B = -5.775E-07;
  float C = -4.183E-12;
  float T = (Rpt - R0)/(A*R0); // como B e C sao pequenos, boa aproximacao ela ser linear...
  return (T);
  
}

float pt100(){
     float leitura_porta1 = analogRead(A1); // voltagem de entrada
     float leitura_porta2 = analogRead(A2); // voltagem pt100 amplificado
     float leitura_porta3 = analogRead(A3); // voltagem real do pt100
     float voltagem1 = leitura_porta1 * (volt / 1023); // voltagem entrada
     float voltagem2 = leitura_porta2 * (volt / 1023) - 0.01; //voltagem amplificada - offset de 10mV
     float voltagem3 = voltagem2/(1+Raf/Ra1); //voltagem real do pt100
     float Rpt = voltagem3*R1/(voltagem1 - voltagem3);

     float T_medido = calcula_temp(Rpt);
//   Serial.print("Ve(V)= ");
//     Serial.print(voltagem1);
//     Serial.print("\t\t");
 //    Serial.print("Vamp(V)= ");
     Serial.print(voltagem2);
     Serial.print("\t");
   /*  Serial.print("Vpt100(mV)= ");
     Serial.print(voltagem3*1000);
     Serial.print("\t\t"); 
     Serial.print("Rpt100(Ohm)= ");
     Serial.print(Rpt);
     Serial.print("\t\t");    
     Serial.print("T(0C)= ");
     Serial.println(T_medido);
     Serial.print("\t\t");  */

     return(T_medido); 
  
  
}//end pt100 cod

/*#######################################
               SHT15                
 #######################################*/

int SHT_clockPin = 9;  // pin used for clock
int SHT_dataPin  = 7;  // pin used for data

float getTemperature(){
  //Return Temperature in Celsius
  SHT_sendCommand(B00000011, SHT_dataPin, SHT_clockPin);
  SHT_waitForResult(SHT_dataPin);

  float val = SHT_getData(SHT_dataPin, SHT_clockPin);
  SHT_skipCrc(SHT_dataPin, SHT_clockPin);
//  return (float)val * 0.01 - 40; //convert to celsius
  return val * 0.01 - 40; //convert to celsius
}

float getHumidity(){
  //Return  Relative Humidity
  SHT_sendCommand(B00000101, SHT_dataPin, SHT_clockPin);
  SHT_waitForResult(SHT_dataPin);
  float val = SHT_getData(SHT_dataPin, SHT_clockPin);
  SHT_skipCrc(SHT_dataPin, SHT_clockPin);
  return -4.0 + 0.0405 * val + -0.0000028 * val * val; 
}


void SHT_sendCommand(int command, int dataPin, int clockPin){
  // send a command to the SHTx sensor
  // transmission start
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  digitalWrite(dataPin, HIGH);
  digitalWrite(clockPin, HIGH);
  digitalWrite(dataPin, LOW);
  digitalWrite(clockPin, LOW);
  digitalWrite(clockPin, HIGH);
  digitalWrite(dataPin, HIGH);
  digitalWrite(clockPin, LOW);

  // shift out the command (the 3 MSB are address and must be 000, the last 5 bits are the command)
  shiftOut(dataPin, clockPin, MSBFIRST, command);

  // verify we get the right ACK
  digitalWrite(clockPin, HIGH);
  pinMode(dataPin, INPUT);

  if (digitalRead(dataPin)) Serial.println("ACK error 0");
  digitalWrite(clockPin, LOW);
  if (!digitalRead(dataPin)) Serial.println("ACK error 1");
}


void SHT_waitForResult(int dataPin){
  // wait for the SHTx answer
  pinMode(dataPin, INPUT);

  int ack; //acknowledgement

  //need to wait up to 2 seconds for the value
  for (int i = 0; i < 1000; ++i){
    delay(2);
    ack = digitalRead(dataPin);
    if (ack == LOW) break;
  }

  if (ack == HIGH) Serial.println("ACK error 2");
}

int SHT_getData(int dataPin, int clockPin){
  // get data from the SHTx sensor

  // get the MSB (most significant bits)
  pinMode(dataPin, INPUT);
  pinMode(clockPin, OUTPUT);
  byte MSB = shiftIn(dataPin, clockPin, MSBFIRST);

  // send the required ACK
  pinMode(dataPin, OUTPUT);
  digitalWrite(dataPin, HIGH);
  digitalWrite(dataPin, LOW);
  digitalWrite(clockPin, HIGH);
  digitalWrite(clockPin, LOW);

  // get the LSB (less significant bits)
  pinMode(dataPin, INPUT);
  byte LSB = shiftIn(dataPin, clockPin, MSBFIRST);
  return ((MSB << 8) | LSB); //combine bits
}

void SHT_skipCrc(int dataPin, int clockPin){
  // skip CRC data from the SHTx sensor
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  digitalWrite(dataPin, HIGH);
  digitalWrite(clockPin, HIGH);
  digitalWrite(clockPin, LOW);
}


/*#######################################
               Arduino                
#######################################*/


void setup() {
 Serial.begin(9600);
}

void loop() {  

  //unsigned long time = millis();//marca o tempo em milisegundos, a partir do momento que ele comeca a rodar
  
  float T_pt100 = pt100();
  float T_sht15 = getTemperature();
  float H_sht15 = getHumidity();

  //Serial.print(time); //tempo em milisegundos
  //Serial.print("\t");  
  Serial.print(T_pt100); //temperatura pt100
  Serial.print("\t");
  Serial.print(T_sht15); // temperatura sht15
  Serial.print("\t");
  Serial.println(H_sht15);// umidade sht15

  Serial.print("#S|SAVEDATE|[");
  Serial.print("\t");
  Serial.print(itoa((T_pt100*100), buffer, 10));
  Serial.print("\t");
  Serial.print(itoa((T_sht15*100), buffer, 10));
  Serial.print("\t");
  Serial.print(itoa((H_sht15*100), buffer, 10));
  Serial.println("]#");


  delay(6000);//roda proprama a cada 6 segundos
     
   
 }
Attachment 5: hist_Tpt.png  14 kB  Uploaded Mon Sep 16 19:01:43 2013  | Hide | Hide all
hist_Tpt.png
Attachment 8: hist_H_Vsht.png  14 kB  Uploaded Mon Sep 16 19:04:39 2013  | Hide | Hide all
hist_H_Vsht.png
ELOG V2.9.2-2455