189 lines
6.4 KiB
Plaintext
189 lines
6.4 KiB
Plaintext
/*
|
|
* Example code for SHT1x or SHT7x sensors demonstrating blocking calls
|
|
* for temperature and humidity measurement in the setup routine and
|
|
* non-blocking calls in the main loop. The pin 13 LED is flashed as a
|
|
* background task while temperature and humidity measurements are made.
|
|
* Note that the status register read/write demonstration code places the
|
|
* sensor in low resolution mode. Delete it to stay in high res mode.
|
|
*
|
|
* This example contains two versions of the code: one that checks library
|
|
* function return codes for error indications and one that does not.
|
|
* The version with error checking may be useful in debuging possible
|
|
* connection issues with the sensor. A #define selects between versions.
|
|
*/
|
|
|
|
#include <Sensirion.h>
|
|
|
|
#define ENA_ERRCHK // Enable error checking code
|
|
|
|
const byte dataPin = 2; // SHTxx serial data
|
|
const byte sclkPin = 3; // SHTxx serial clock
|
|
const byte ledPin = 13; // Arduino built-in LED
|
|
const unsigned long TRHSTEP = 5000UL; // Sensor query period
|
|
const unsigned long BLINKSTEP = 250UL; // LED blink period
|
|
|
|
Sensirion sht = Sensirion(dataPin, sclkPin);
|
|
|
|
unsigned int rawData;
|
|
float temperature;
|
|
float humidity;
|
|
float dewpoint;
|
|
|
|
byte ledState = 0;
|
|
byte measActive = false;
|
|
byte measType = TEMP;
|
|
|
|
unsigned long trhMillis = 0; // Time interval tracking
|
|
unsigned long blinkMillis = 0;
|
|
|
|
#ifdef ENA_ERRCHK
|
|
|
|
// This version of the code checks return codes for errors
|
|
byte error = 0;
|
|
|
|
void setup() {
|
|
byte stat;
|
|
Serial.begin(9600);
|
|
pinMode(ledPin, OUTPUT);
|
|
delay(15); // Wait >= 11 ms before first cmd
|
|
// Demonstrate status register read/write
|
|
if (error = sht.readSR(&stat)) // Read sensor status register
|
|
logError(error);
|
|
Serial.print("Status reg = 0x");
|
|
Serial.println(stat, HEX);
|
|
if (error = sht.writeSR(LOW_RES)) // Set sensor to low resolution
|
|
logError(error);
|
|
if (error = sht.readSR(&stat)) // Read sensor status register again
|
|
logError(error);
|
|
Serial.print("Status reg = 0x");
|
|
Serial.println(stat, HEX);
|
|
// Demonstrate blocking calls
|
|
if (error = sht.measTemp(&rawData)) // sht.meas(TEMP, &rawData, BLOCK)
|
|
logError(error);
|
|
temperature = sht.calcTemp(rawData);
|
|
if (error = sht.measHumi(&rawData)) // sht.meas(HUMI, &rawData, BLOCK)
|
|
logError(error);
|
|
humidity = sht.calcHumi(rawData, temperature);
|
|
dewpoint = sht.calcDewpoint(humidity, temperature);
|
|
logData();
|
|
}
|
|
|
|
void loop() {
|
|
unsigned long curMillis = millis(); // Get current time
|
|
|
|
// Rapidly blink LED. Blocking calls take too long to allow this.
|
|
if (curMillis - blinkMillis >= BLINKSTEP) { // Time to toggle the LED state?
|
|
ledState ^= 1;
|
|
digitalWrite(ledPin, ledState);
|
|
blinkMillis = curMillis;
|
|
}
|
|
|
|
// Demonstrate non-blocking calls
|
|
if (curMillis - trhMillis >= TRHSTEP) { // Time for new measurements?
|
|
measActive = true;
|
|
measType = TEMP;
|
|
if (error = sht.meas(TEMP, &rawData, NONBLOCK)) // Start temp measurement
|
|
logError(error);
|
|
trhMillis = curMillis;
|
|
}
|
|
if (measActive && (error = sht.measRdy())) { // Check measurement status
|
|
if (error != S_Meas_Rdy)
|
|
logError(error);
|
|
if (measType == TEMP) { // Process temp or humi?
|
|
measType = HUMI;
|
|
temperature = sht.calcTemp(rawData); // Convert raw sensor data
|
|
if (error = sht.meas(HUMI, &rawData, NONBLOCK)) // Start humi measurement
|
|
logError(error);
|
|
} else {
|
|
measActive = false;
|
|
humidity = sht.calcHumi(rawData, temperature); // Convert raw sensor data
|
|
dewpoint = sht.calcDewpoint(humidity, temperature);
|
|
logData();
|
|
}
|
|
}
|
|
}
|
|
|
|
#else // If ENA_ERRCHK is not defined
|
|
|
|
// This code is the same as above but without error checking
|
|
void setup() {
|
|
byte stat;
|
|
byte error = 0;
|
|
Serial.begin(9600);
|
|
pinMode(ledPin, OUTPUT);
|
|
delay(15); // Wait >= 11 ms before first cmd
|
|
// Demonstrate status register read/write
|
|
sht.readSR(&stat); // Read sensor status register
|
|
Serial.print("Status reg = 0x");
|
|
Serial.println(stat, HEX);
|
|
sht.writeSR(LOW_RES); // Set sensor to low resolution
|
|
sht.readSR(&stat); // Read sensor status register again
|
|
Serial.print("Status reg = 0x");
|
|
Serial.println(stat, HEX);
|
|
// Demonstrate blocking calls
|
|
sht.measTemp(&rawData); // sht.meas(TEMP, &rawData, BLOCK)
|
|
temperature = sht.calcTemp(rawData);
|
|
sht.measHumi(&rawData); // sht.meas(HUMI, &rawData, BLOCK)
|
|
humidity = sht.calcHumi(rawData, temperature);
|
|
dewpoint = sht.calcDewpoint(humidity, temperature);
|
|
logData();
|
|
}
|
|
|
|
void loop() {
|
|
unsigned long curMillis = millis(); // Get current time
|
|
|
|
// Rapidly blink LED. Blocking calls take too long to allow this.
|
|
if (curMillis - blinkMillis >= BLINKSTEP) { // Time to toggle the LED state?
|
|
ledState ^= 1;
|
|
digitalWrite(ledPin, ledState);
|
|
blinkMillis = curMillis;
|
|
}
|
|
|
|
// Demonstrate non-blocking calls
|
|
if (curMillis - trhMillis >= TRHSTEP) { // Time for new measurements?
|
|
measActive = true;
|
|
measType = TEMP;
|
|
sht.meas(TEMP, &rawData, NONBLOCK); // Start temp measurement
|
|
trhMillis = curMillis;
|
|
}
|
|
if (measActive && sht.measRdy()) { // Check measurement status
|
|
if (measType == TEMP) { // Process temp or humi?
|
|
measType = HUMI;
|
|
temperature = sht.calcTemp(rawData); // Convert raw sensor data
|
|
sht.meas(HUMI, &rawData, NONBLOCK); // Start humi measurement
|
|
} else {
|
|
measActive = false;
|
|
humidity = sht.calcHumi(rawData, temperature); // Convert raw sensor data
|
|
dewpoint = sht.calcDewpoint(humidity, temperature);
|
|
logData();
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif // End of non-error-checking example
|
|
|
|
void logData() {
|
|
Serial.print("Temperature = "); Serial.print(temperature);
|
|
Serial.print(" C, Humidity = "); Serial.print(humidity);
|
|
Serial.print(" %, Dewpoint = "); Serial.print(dewpoint);
|
|
Serial.println(" C");
|
|
}
|
|
|
|
// The following code is only used with error checking enabled
|
|
void logError(byte error) {
|
|
switch (error) {
|
|
case S_Err_NoACK:
|
|
Serial.println("Error: No response (ACK) received from sensor!");
|
|
break;
|
|
case S_Err_CRC:
|
|
Serial.println("Error: CRC mismatch!");
|
|
break;
|
|
case S_Err_TO:
|
|
Serial.println("Error: Measurement timeout!");
|
|
break;
|
|
default:
|
|
Serial.println("Unknown error received!");
|
|
break;
|
|
}
|
|
}
|