// sht31_zelf.ino - de SHT31 uitlezen zonder bibliotheek, stap voor stap volgens de datasheet #include const byte ADRES = 0x44; // pin ADDR aan GND (aan VDD: 0x45) float luchtT = NAN, luchtRV = NAN; byte crc8(byte a, byte b) { // CRC-8 over twee bytes: veelterm 0x31, beginwaarde 0xFF byte crc = 0xFF; byte data[2] = {a, b}; for (int i = 0; i < 2; i++) { crc ^= data[i]; for (int bit = 0; bit < 8; bit++) { if (crc & 0x80) crc = (crc << 1) ^ 0x31; else crc = crc << 1; } } return crc; } void printHex(byte b) { if (b < 16) Serial.print('0'); Serial.print(b, HEX); Serial.print(' '); } bool leesSht31() { Wire.beginTransmission(ADRES); Wire.write(0x24); // commando 0x2400: één meting, hoge herhaalbaarheid, Wire.write(0x00); // zonder 'clock stretching' if (Wire.endTransmission() != 0) { // geen ACK: sensor los of verkeerd adres Serial.println("geen antwoord op 0x44"); return false; } delay(20); // de meting duurt tot 15 ms (datasheet) if (Wire.requestFrom(ADRES, (byte)6) != 6) { Serial.println("minder dan 6 bytes ontvangen"); return false; } byte b[6]; for (int i = 0; i < 6; i++) b[i] = Wire.read(); Serial.print("bytes: "); for (int i = 0; i < 6; i++) printHex(b[i]); if (crc8(b[0], b[1]) != b[2] || crc8(b[3], b[4]) != b[5]) { Serial.println(" CRC fout: meting weggegooid"); return false; } unsigned int ruwT = ((unsigned int)b[0] << 8) | b[1]; // twee bytes tot één getal van 16 bit unsigned int ruwRV = ((unsigned int)b[3] << 8) | b[4]; luchtT = -45.0 + 175.0 * ruwT / 65535.0; // formules uit de datasheet luchtRV = 100.0 * ruwRV / 65535.0; Serial.print(" -> "); Serial.print(ruwT); Serial.print(" en "); Serial.print(ruwRV); Serial.print(" -> "); Serial.print(luchtT, 2); Serial.print(" C, "); Serial.print(luchtRV, 1); Serial.println(" %"); return true; } void setup() { Serial.begin(115200); Wire.begin(); Serial.print("test CRC(BE EF) = "); // het voorbeeld uit de datasheet: 92 Serial.println(crc8(0xBE, 0xEF), HEX); } void loop() { leesSht31(); delay(2000); // testschets: hier mag het }