Библиотека Sensirion для датчика влажности SHT7x
У меня есть следующий код (и он отлично работает!) для датчика SHT75 Sensirion.
/*
* Пример кода для датчиков SHT1x или SHT7x, демонстрирующий блокировку вызовов
* для измерения температуры и влажности в программе настройки и
* неблокирующие вызовы в основном цикле. Светодиод на контакте 13 мигает, как
* фоновая задача во время измерения температуры и влажности.
* Кроме того, датчик может быть переведен в режим низкого разрешения путем
* раскомментировать вызов записи регистра состояния в setup().
*/
#include <Sensirion.h>
const uint8_t dataPin = 2; // серийные данные SHT
const uint8_t sclkPin = 3; // серийные часы SHT
const uint8_t ledPin = 13; // Встроенный светодиод Arduino
const uint32_t TRHSTEP = 3000UL; // период запроса датчика
const uint32_t BLINKSTEP = 250UL; // период мигания светодиода
Sensirion sht = Sensirion(dataPin, sclkPin);
uint16_t rawData;
float temperature;
float humidity;
float dewpoint;
byte shtState = 0;
byte ledState = 0;
unsigned long curMillis; // Отслеживание временного интервала
unsigned long trhMillis = 0;
unsigned long blinkMillis = 0;
void setup()
{
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
delay(15); // Подождите не менее 11 мс перед первой командой
// шт.writeSR(LOW_RES); // Установить сенсор на низкое разрешение
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()
{
curMillis = millis();
if (curMillis - blinkMillis >= BLINKSTEP) { // Пришло время изменить состояние светодиода?
ledState ^= 1;
digitalWrite(ledPin, ledState);
blinkMillis = curMillis;
}
switch (shtState) {
case 0:
if (curMillis - trhMillis >= TRHSTEP) { // Начать новое измерение температуры/влажности?
sht.meas(TEMP, &rawData, NONBLOCK);
shtState++;
trhMillis = curMillis;
}
break;
case 1:
if (sht.measRdy()) { // Измерение температуры процесса?
temperature = sht.calcTemp(rawData);
sht.meas(HUMI, &rawData, NONBLOCK);
shtState++;
}
break;
case 2:
if (sht.measRdy()) { // Измерение влажности процесса?
humidity = sht.calcHumi(rawData, temperature);
dewpoint = sht.calcDewpoint(humidity, temperature);
shtState = 0;
logData();
}
break;
default:
Serial.println("How did I get here?");
break;
}
}
void logData() {
Serial.print("Temperature = "); Serial.print(temperature);
Serial.print(" C, Humidity = "); Serial.print(humidity);
Serial.print(" %, Dewpoint = "); Serial.print(dewpoint);
Serial.println(" C");
}
Как я могу расширить его для двух датчиков (конечно, используя другие контакты)?
@Viktor Scherf, 👍0
1 ответ
Лучший ответ:
▲ 1
Вы просто создаете второй экземпляр объекта с другими выводами и сохраняете результат в другом наборе переменных. Любая дополнительная логика того, когда делать то, что нужно делать, зависит только от вас.
,
@Majenko
Смотрите также:
- DS18B20 дает высокие показания. Как заставить его вернуть правильную температуру?
- Проблема с датчиком температуры и влажности DHT11
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- Сокращение времени считывания показаний датчиков температуры DS18B20.
- Проблемы с подключением I2C на ESP8266 — 12F, какие контакты использовать?
- DHT11 возвращает неверные значения
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Как изменить разрешение DS18B20?
т.е.
Sensirion sht2 = Sensirion(dataPin2, sclkPin2);
, @Gerben@Majenko Спасибо! Ваша рекомендация работает очень хорошо! Большое спасибо Гербену., @Viktor Scherf