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.

Histograma da umidade do SHT15

Histograma da umidade do SHT15 - RH520

Histograma da temperatura do SHT15

Histograma da temperatura do SHT15 - RH520

Histograma da temperatura do PT100

Histograma da temperatura do SHT15 - RH520
Anexo tambem, o codigo do Arduino (.ino) para gerar os pontos e poder ser lido com o Gobetwino.
|
/*#######################################
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
}
|