Библиотека 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");
} 

Как я могу расширить его для двух датчиков (конечно, используя другие контакты)?

, 👍0


1 ответ


Лучший ответ:

1

Вы просто создаете второй экземпляр объекта с другими выводами и сохраняете результат в другом наборе переменных. Любая дополнительная логика того, когда делать то, что нужно делать, зависит только от вас.

,

т.е. Sensirion sht2 = Sensirion(dataPin2, sclkPin2);, @Gerben

@Majenko Спасибо! Ваша рекомендация работает очень хорошо! Большое спасибо Гербену., @Viktor Scherf