int TemperGetOtherStuff(Temper *t, char *buf, int length) { TemperSendCommand(t, 10, 11, 12, 13, 0, 0, 2, 0); TemperSendCommand(t, 0x52, 0, 0, 0, 0, 0, 0, 0); TemperSendCommand(t, 10, 11, 12, 13, 0, 0, 1, 0); return TemperGetData(t, buf, length); }
int TemperGetTempAndRelHum(Temper *t, double *tempC, double *relhum) { char buf[256]; int ret, temperature, rh, i; double temp_hum; TemperSendCommand(t, 10, 11, 12, 13, 0, 0, 2, 0); TemperSendCommand(t, 0x48, 0, 0, 0, 0, 0, 0, 0); for(i = 0; i < 7; i++) { TemperSendCommand(t, 0, 0, 0, 0, 0, 0, 0, 0); } TemperSendCommand(t, 10, 11, 12, 13, 0, 0, 1, 0); /* According to Sensirion datasheet for SHT1x the time for 8/12/14 bit measurements is 20/80/320 ms. Trial and error suggests that sleeping less that 400ms can produce spurious measurements */ usleep(400000); ret = TemperGetData(t, buf, 256); if(ret < 2) { return -1; } if(t->debug) { printf("TempAndRelHum (%d bytes):\n", ret); for(i = 0; i < ret; i++) { printf(" %02x", buf[i]); if(i % 16 == 15) { printf("\n"); } } printf("\n"); } /* Numerical constants below come from the Sensirion SHT1x datasheet (Table 9 for temperature and Table 6 for humidity */ temperature = (buf[1] & 0xFF) + (buf[0] << 8); *tempC = -39.7 + .01*temperature; rh = (buf[3] & 0xFF) + ((buf[2] & 0xFF) << 8); temp_hum = -2.0468 + 0.0367*rh - 1.5955e-6*rh*rh; *relhum = (*tempC-25)*(.01 + .00008 * rh) + temp_hum; return 0; }
int TemperGetTemperatureInC(Temper *t, float *tempC) { char buf[256]; int ret, temperature, i; TemperSendCommand(t, 10, 11, 12, 13, 0, 0, 2, 0); TemperSendCommand(t, 0x54, 0, 0, 0, 0, 0, 0, 0); for(i = 0; i < 7; i++) { TemperSendCommand(t, 0, 0, 0, 0, 0, 0, 0, 0); } TemperSendCommand(t, 10, 11, 12, 13, 0, 0, 1, 0); ret = TemperGetData(t, buf, 256); if(ret < 2) { return -1; } temperature = (buf[1] & 0xFF) + (buf[0] << 8); temperature += 1152; // calibration value *tempC = temperature * (125.0 / 32000.0); return 0; }