Examples - Electronic Bricks - Electronic Brick SHT1x Digital Temp/Humidity

SHT1x Digital Temp/Humidity Brick -

This program gives you a basic understanding the SHT1x Digital Temp/Humidity Brick using the 2-Wire Serial Protocol.

Hardware Setup:

Connect the SCK (clock) cable to pin 12.

Connect the DATA cable to pin 11.



// SPI temperature/humidity reading from an SHT1x digital sensor

// By: Dino Rossi 08.04.10
// EmbeddedLab CAAD ETHZ

// Adapted from:
// http://wiring.org.co/learning/basics/humiditytemperaturesht15.html


int temperatureCommand  = B00000011;  // command used to read temperature
int humidityCommand = B00000101;  // command used to read humidity

int clockPin = 12;  // pin used for clock (SCK)
int dataPin  = 11;  // pin used for data
int ack;  // track acknowledgment for errors
int val;
float temperature;
float humidity;

void setup() {
        Serial.begin(9600); // open serial at 9600 bps
}

void loop() {
        delay(5000);
        // read the temperature and convert it to centigrade
        sendCommandSHT(temperatureCommand, dataPin, clockPin);
        waitForResultSHT(dataPin);
        val = getData16SHT(dataPin, clockPin);
        skipCrcSHT(dataPin, clockPin);
        temperature = (float)val * 0.01 - 40;
        Serial.print("temperature: ");
        Serial.print((long)temperature, DEC);
        Serial.println();

        // read the humidity
        sendCommandSHT(humidityCommand, dataPin, clockPin);
        waitForResultSHT(dataPin);
        val = getData16SHT(dataPin, clockPin);
        skipCrcSHT(dataPin, clockPin);
        humidity = -4.0 + 0.0405 * val + -0.0000028 * val * val;
        Serial.print("humidity: ");
        Serial.print((long)humidity, DEC);
        Serial.println();
        Serial.println();

        delay(1000); // wait 1 second for next reading
}


// commands for reading/sending data to a SHTx sensor

int shiftIn(int dataPin, int clockPin, int numBits) {
        int ret = 0;

        for (int i=0; i<numBits; ++i) {
                digitalWrite(clockPin, HIGH);
                //delay(10); not needed :)
                ret = ret*2 + digitalRead(dataPin);
                digitalWrite(clockPin, LOW);
        }
        return(ret);
}

// send a command to the SHTx sensor
void sendCommandSHT(int command, int dataPin, int clockPin) {
        int ack;

        // 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);
        ack = digitalRead(dataPin);
        if (ack != LOW)
        Serial.println("ACK error 0");
        digitalWrite(clockPin, LOW);
        ack = digitalRead(dataPin);
        if (ack != HIGH)
        Serial.println("ACK error 1");
}

// wait for the SHTx answer
void waitForResultSHT(int dataPin) {
        int ack;

        pinMode(dataPin, INPUT);
        for(int i=0; i<100; ++i) {
                delay(10);
                ack = digitalRead(dataPin);
                if (ack == LOW)
                break;
        }
        if (ack == HIGH)
        Serial.println("ACK error 2");
}

// get data from the SHTx sensor
int getData16SHT(int dataPin, int clockPin) {
        int val;

        // get the MSB (most significant bits)
        pinMode(dataPin, INPUT);
        pinMode(clockPin, OUTPUT);
        val = shiftIn(dataPin, clockPin, 8);
        val *= 256; // this is equivalent to val << 8;

        // 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);
        val |= shiftIn(dataPin, clockPin, 8);
        return val;
}

// skip CRC data from the SHTx sensor
void skipCrcSHT(int dataPin, int clockPin) {
        pinMode(dataPin, OUTPUT);
        pinMode(clockPin, OUTPUT);
        digitalWrite(dataPin, HIGH);
        digitalWrite(clockPin, HIGH);
        digitalWrite(clockPin, LOW);
}