TIMOTHY MWALA
Published © GPL3+

Build a Smart Environ-Monitor Using Sensirion SHT40 Sensor

How to turn temperature and humidity into human-centered insights — with real-time warnings displayed on OLED!

BeginnerFull instructions provided2 hours114
Build a Smart Environ-Monitor Using Sensirion SHT40 Sensor

Things used in this project

Hardware components

Sensirion SHT40
×1
CARENUITY C3-MINI
×1
0.96 0LED DISPLAY
×1
BREAD BOARD
×1
Male/Male Jumper Wires
×1

Software apps and online services

Arduino IDE
Arduino IDE

Story

Read more

Schematics

SETUP

Code

SHT40_C3-Mini_0.96-OLED

C/C++
#include <Wire.h>
#include <U8g2lib.h>

// ====== SHT40 Constants ======
#define SHT40_ADDRESS 0x44
#define SHT40_MEASURE_HIGH_PRECISION 0xFD
#define SHT40_SOFT_RESET 0x94

// ====== Heat Warning Threshold ======
#define HEAT_WARNING_THRESHOLD 35.0  // in °C

// ====== OLED Display (128x64, I2C) ======
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup() {
  Serial.begin(9600);
  Wire.begin();
  u8g2.begin();

  Serial.println("SHT40 + OLED + Heat Index");
  resetSHT40();
  delay(1000);
}

void loop() {
  float temperature, humidity;

  if (readSHT40(&temperature, &humidity)) {
    float heatIndex = computeHeatIndex(temperature, humidity);

    // === Serial Monitor Output ===
    Serial.print("Temp: "); Serial.print(temperature); Serial.print(" C, ");
    Serial.print("Humidity: "); Serial.print(humidity); Serial.print(" %, ");
    Serial.print("Heat Index: "); Serial.print(heatIndex); Serial.println(" C");

    // === OLED Display Output ===
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_ncenB08_tr);
    u8g2.drawStr(0, 12, "SHT40 Readings");

    char buffer[32];
    snprintf(buffer, sizeof(buffer), "Temp: %.2f C", temperature);
    u8g2.drawStr(0, 28, buffer);

    snprintf(buffer, sizeof(buffer), "Humidity: %.2f%%", humidity);
    u8g2.drawStr(0, 40, buffer);

    snprintf(buffer, sizeof(buffer), "Heat Index: %.2f C", heatIndex);
    u8g2.drawStr(0, 52, buffer);

    // === Heat Index Warning ===
    if (heatIndex >= HEAT_WARNING_THRESHOLD) {
      u8g2.setFont(u8g2_font_ncenB08_tr);
      u8g2.drawStr(0, 64, "⚠ High Heat Index!");
      u8g2.drawCircle(110, 12, 6, U8G2_DRAW_ALL);  // Warning symbol
      u8g2.drawStr(107, 16, "!");
    }

    u8g2.sendBuffer();

  } else {
    Serial.println("Error reading SHT40!");
  }

  delay(2000); // Wait 2 seconds
}

// === Reset the SHT40 Sensor ===
void resetSHT40() {
  Wire.beginTransmission(SHT40_ADDRESS);
  Wire.write(SHT40_SOFT_RESET);
  Wire.endTransmission();
  delay(10);
}

// === Read Temperature and Humidity from SHT40 ===
bool readSHT40(float *temperature, float *humidity) {
  Wire.beginTransmission(SHT40_ADDRESS);
  Wire.write(SHT40_MEASURE_HIGH_PRECISION);
  if (Wire.endTransmission() != 0) return false;

  delay(10);
  Wire.requestFrom(SHT40_ADDRESS, 6);
  if (Wire.available() < 6) return false;

  uint8_t data[6];
  for (int i = 0; i < 6; i++) data[i] = Wire.read();

  if (!checkCRC(data[0], data[1], data[2]) || !checkCRC(data[3], data[4], data[5])) {
    Serial.println("CRC check failed!");
  }

  uint16_t rawTemp = (data[0] << 8) | data[1];
  uint16_t rawHum = (data[3] << 8) | data[4];

  *temperature = -45.0 + 175.0 * rawTemp / 65535.0;
  *humidity = -6.0 + 125.0 * rawHum / 65535.0;

  if (*humidity > 100.0) *humidity = 100.0;
  if (*humidity < 0.0) *humidity = 0.0;

  return true;
}

// === CRC Check Function (8-bit, polynomial 0x31) ===
bool checkCRC(uint8_t data1, uint8_t data2, uint8_t checksum) {
  uint8_t crc = 0xFF;
  uint8_t data[2] = {data1, data2};

  for (int i = 0; i < 2; i++) {
    crc ^= data[i];
    for (int b = 0; b < 8; b++) {
      if (crc & 0x80) crc = (crc << 1) ^ 0x31;
      else crc <<= 1;
    }
  }
  return (crc == checksum);
}

// === Heat Index Calculation ===
float computeHeatIndex(float temperatureC, float humidity) {
  float T = temperatureC * 9.0 / 5.0 + 32.0;  // °C to °F
  float R = humidity;

  float HI = -42.379 +
             2.04901523 * T +
             10.14333127 * R +
             -0.22475541 * T * R +
             -0.00683783 * T * T +
             -0.05481717 * R * R +
             0.00122874 * T * T * R +
             0.00085282 * T * R * R +
             -0.00000199 * T * T * R * R;

  return (HI - 32.0) * 5.0 / 9.0;  // Convert back to °C
}

Credits

TIMOTHY MWALA
32 projects • 18 followers
I am an Embedded engineer who like prototyping

Comments