second part of the code
// esperar a la respuesta del Sensirion
void waitForResultSHT(int dataPin) {
int ack;
pinMode(dataPin, INPUT);
ack = digitalRead(dataPin);
while (ack == HIGH){
ack = digitalRead(dataPin);
}
}
// leemos dato del data stream del Sensirion
int shiftIn(int dataPin, int clockPin, int numBits) {
int ret = 0;
for (int i=0; i<numBits; i++) {
digitalWrite(clockPin, HIGH);
delayMicroseconds(1000);
ret = ret * 2 + digitalRead(dataPin);
digitalWrite(clockPin, LOW);
}
return ret;
}
// obtener dato del Sensirion
int getData16SHT(int dataPin, int clockPin) {
int val, aux;
// obtener los MSB (bits mas significativos)
pinMode(dataPin, INPUT);
pinMode(clockPin, OUTPUT);
val = shiftIn(dataPin, clockPin, 8);
val *= 256; // esto es equivalente a desplazar a la izq, SHIFT: val << 8;
// escucho el 1 de propina tras el MSB
aux = digitalRead(dataPin);
while (aux != 1) {
aux = digitalRead(dataPin);
}
// enviar el ACK, MUCHO CUIDADO
pinMode(dataPin, OUTPUT);
digitalWrite(clockPin, HIGH);
digitalWrite(dataPin, HIGH);
delayMicroseconds(10);
digitalWrite(dataPin, LOW);
digitalWrite(clockPin, LOW);
// obtener los LSB (bits menos significativos)
pinMode(dataPin, INPUT);
pinMode(clockPin, OUTPUT);
val |= shiftIn(dataPin, clockPin, 8);
return val;
}
// obtener el estatus del Sensirion
int getDataEstatus(int dataPin, int clockPin) {
int val, aux;
// obtener los 8 bits
pinMode(dataPin, INPUT);
pinMode(clockPin, OUTPUT);
val = shiftIn(dataPin, clockPin, 8);
// escucho el 1 de propina tras el less significant bit
aux = digitalRead(dataPin);
while (aux != 1) {
aux = digitalRead(dataPin);
}
// enviar el ACK, MUCHO CUIDADO
pinMode(dataPin, OUTPUT);
digitalWrite(clockPin, HIGH);
digitalWrite(dataPin, HIGH);
delayMicroseconds(10);
digitalWrite(dataPin, LOW);
digitalWrite(clockPin, LOW);
}
// saltarse (no solicitar) la comprobacion CRC
void skipCrcSHT(int dataPin, int clockPin) {
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
digitalWrite(dataPin, HIGH);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
// calcular la temperatura en grados Celsius
float calcularTemperatura(int valT, int numerobitsT) {
float d1, d2 = 0.0;
float temperatura = 0.0;
d1 = -40.1; // es para el caso de alimentacion = 5 volts
// d1 = -39.7; // alimentacion = 3.5 volts
// d1 = -39.6; // alimentacion = 3.0 volts
if (numerobitsT == 14) {
d2 = 0.01;
}
else {
d2 = 0.04;
}
temperatura = d1 + d2 * valT;
return temperatura;
}
// calcular la humedad relativa en tanto por ciento
float calcularHR(int valH, int numerobitsH) {
float c1 = -4.0;
float c2, c3 = 0.0;
float HR = 0.0;
if (numerobitsH == 12) {
c2 = 0.0405;
c3 = -0.0000028;
}
else {
c2 = 0.6480;
c3 = -0.00072;
}
HR = c1 + c2 * valH + c3 * valH * valH;
return HR;
}
// calcular el punto de rocio (T_dew)
float calcularRocio(float RH, float T) {
float Tn1 = 243.12; // de 0 a 50 grados C
float Tn2 = 272.62; // de -40 a 0 grados C
float m1 = 17.62; // de 0 a 50 grados C
float m2 = 22.46; // de -40 a 0 grados C
float Ro = 0.0; // variables
float Tn = 0.0;
float m = 0.0;
if (T < 0.0) { // elijo segun por encima de 0 o no
Tn = Tn1;
m = m1;
}
else {
Tn = Tn2;
m = m2;
}
Ro = Tn * (log(RH/100) + ((m*T) / (Tn+T))) / (m - log(RH/100) - ((m*T) / (Tn*T)));
return Ro; // devuelvo
}
// sacar por pantalla (se puede comentar al gusto, para no sacar tanta info)
void representar(float T, float HR, float RHtrue, float Rocio, int valT, int valH) {
Serial.println("*************************************************************************");
// escribo los datos binarios q he leido (opcional)
Serial.print("val temp = ");
Serial.print(valT);
Serial.print(" = ");
Serial.print(valT, BIN);
Serial.print(", val hum = ");
Serial.print(valH);
Serial.print(" = ");
Serial.print(valH, BIN);
// datos adicionales (opcional)
Serial.print(" HR verdadera = ");
Serial.print(RHtrue);
Serial.print(" %, T de rocio = ");
Serial.print(Rocio);
Serial.println(" C");
// datos importantes
Serial.print("Sensirion (T, HR) : ");
Serial.print(temp);
Serial.print(" C ");
Serial.print(hum);
Serial.println(" %");
}
// calcular la humedad relativa verdadera corregido por la temperatura
float calcularHumedadVerdadera(float T, int valH, float HR, int numerobitsH) {
float t1 = 0.01;
float t2 = 0.0;
float HRtrue = 0.0;
if (numerobitsH == 12) { // el numero de bits para medir la humedad son 8 o 12
t2 = 0.00008;
}
else {
t2 = 0.00128;
}
HRtrue = (T - 25.0) * (t1 + t2 * valH) + HR;
return HRtrue;
}
// leer la palabra de estatus
void leerEstatus() {
int val= 0;
sendCommandSHT(comandoEstatus, dataPin, clockPin);
waitForResultSHT(dataPin);
val = getDataEstatus(dataPin, clockPin);
skipCrcSHT(dataPin, clockPin);
Serial.print("estatus = ");
Serial.println(val, BIN);
}
how dcan i activate the internal pull-up for this code, to see if tha works