ENGINEERING IMPLEMENTATION GUIDE

ESP32 and SHT40 Smart Greenhouse: Wiring, Heater Control and Fault-Safe Code

A greenhouse controller needs more than a readable SHT40 value. This guide connects the sensor to an ESP32, keeps heated or mist-affected readings out of the control loop, and shows how to test fan and spray behavior before connecting live loads.

Illustrated ESP32 and SHT40 greenhouse control bench with sensor board, relay drivers, fan and misting equipment
Illustrative greenhouse control layout. The devices and wiring shown are visual context; use the pin table and the actual module schematics for electrical connections.

What must work before an SHT40 controls a greenhouse?

First obtain a valid SHT40 measurement on a verified 3.3 V I²C bus. Place the sensor where it samples crop-zone air without direct sun or spray. Then add fan hysteresis and a separate irrigation trigger. During a heater pulse, spraying, and the subsequent settling period, do not feed affected temperature or relative-humidity values to the controller. Test fault behavior with the loads disconnected before commissioning the actual fan, pump or valve.

Sensor Capabilities and Application Limits

Key SHT40 Specifications

ParameterTypical Value or RangeEngineering Implications
Relative humidity accuracy±1.8 %RHSuitable for greenhouse trend monitoring and most environmental controls
Relative humidity range0–100 %RHCovers high-humidity conditions before and after condensation; persistent condensation still requires protection
Temperature accuracy±0.2 °CSuitable for ventilation control and environmental logging; not a replacement for metrological calibration
Temperature range−40 to 125 °CThe sensor measurement range does not define the rated operating range of every housing or module
InterfaceI²C; default address 0x44Avoid address conflicts on a shared bus
Sensor supply voltage1.08–3.6 VBare sensors and unregulated modules must not be connected directly to 5 V
Integrated heaterThree power levels; two durationsFor condensation removal and recovery from contamination; not for heating the greenhouse air

The accuracy curves in the datasheet depend on environmental conditions. Near the extremes of the temperature and humidity ranges, maximum errors are generally higher than in the primary operating region.

Include hysteresis when defining control thresholds, and do not interpret small changes in a single measurement as definitive environmental changes.

Selecting Within the SHT4x Family

DeviceTypical RH AccuracyTypical Temperature AccuracyRecommended Applications
SHT40±1.8 %RH±0.2 °CStandard greenhouses, equipment rooms, warehouses, and consumer products
SHT41±1.8 %RH±0.2 °CApplications requiring better performance across the complete measurement range
SHT45±1.0 %RH±0.1 °CHigh-accuracy logging, instruments, and systems with more demanding calibration requirements

Check the complete orderable part number. The current SHT4x datasheet describes a polyimide-membrane option and a removable protective-cover option.

Select protection against the actual spray, dust and chemical exposure, then verify response time and service access in the final installation. Do not assume every breakout board carries the same protection.

System Architecture and Hardware Wiring

Control-System Boundaries

Greenhouse systems should separate sensing, decision-making, and actuation.

The SHT40 measures ambient temperature and relative humidity; the ESP32 validates the data and executes threshold logic and the state machine; relays or drivers only switch the loads.

Spray-pump operation must have an independent trigger, preferably soil moisture content, an irrigation schedule, or a manual command.

LayerPrimary ResponsibilityResponse to Failure
SensingMeasure ambient temperature and RH; report communication statusFlag measurements as invalid; do not generate control inputs
ControlFiltering, hysteresis, state machine, interlocks, loggingEnter safe mode and retain the fault code
ActuationDrive fans, pumps, solenoid valves, and alarmsDefault to off on loss of power, or follow a documented risk assessment
CommunicationsUpload telemetry; receive remote commandsLoss of network connectivity must not compromise local safety control

The diagram-like photo above is not a wiring schematic. The table below is the electrical connection reference for the low-voltage sensor path; the relay module and loads require their own reviewed schematics.

ESP32-to-SHT40 Wiring

SHT40 PinESP32 PinNotes
VDD or 3V33V3Supply a bare sensor or standard module from 3.3 V
GNDGNDConnect sensor and ESP32 grounds together
SDAGPIO21Common default ESP32 SDA pin; configurable in firmware
SCLGPIO22Common default ESP32 SCL pin; configurable in firmware

Before using a third-party SHT40 breakout board, review its schematic. A board incorporating a voltage regulator and bidirectional level shifter may accept 5 V on VIN. If it contains only the sensor and pull-up resistors, use 3.3 V.

Do not infer the voltage rating from the connector silkscreen alone.

I²C Bus Wiring

Verify the low-voltage bus before connecting any actuator. These four checks prevent an address scan from being mistaken for a reliable measurement.

Pull-ups

Pull SDA and SCL up to 3.3 V. Many breakouts include resistors; account for their combined effective resistance when boards share the bus.

Bus length

There is no universal safe greenhouse cable length. Check total capacitance, pull-up values and noise at the installed clock rate. Put the acquisition node near the sensor or validate a suitable extender for longer runs.

Cable routing

Keep sensor wiring away from pump, fan, valve and AC power cables. Where paths cross, use near-perpendicular crossings and physical separation.

Clock and errors

In a noisy installation, start at 100 kHz. Record communication errors before changing speed or wiring.

Relay and Load Safety

An ESP32 GPIO cannot drive a relay coil, pump or fan directly. Select a driver for the actual load and 3.3 V input logic. Check its schematic: an optocoupler or removed jumper alone does not prove galvanic isolation or eliminate the need for a shared ground.

Suppress switching spikes

Protect DC coils and motors against flyback. For AC inductive loads, qualified personnel should select the appropriate snubber, surge protection, contactor or solid-state relay.

Keep power stable

Where practical, supply the ESP32 and relay coils from separate regulated branches. Add local decoupling and adequate bulk capacitance at the ESP32 input.

Enclose mains wiring

Use a compliant enclosure, overcurrent protection, protective grounding, guarded terminals and strain relief. Isolate power and verify it is absent before maintenance.

Check startup pins

Avoid boot-strapping pins for loads that could start unexpectedly. The reference sketch uses GPIO25 and GPIO26; confirm both are free on the selected board.

Illustrative ESP32 board connected to a small SHT40 I2C breakout, with a separate relay module and fan on the bench
The ESP32–SHT40 sensor link and separate load-driver hardware. This image is a visual guide, not a pin-level schematic; verify the board schematic, 3.3 V I²C pull-ups and relay input before wiring.

Greenhouse Installation and Environmental Protection

Sensor Placement

Sample crop-zone air

Mount the sensor near the canopy with airflow around it, clear of leaves, soil and dripping water.

Shade the sensor

Use a naturally ventilated radiation shield. Direct sun can bias temperature high and relative humidity low.

Avoid local extremes

Keep it away from fan outlets, heating pipes, cooling pads and spray nozzles. Use more than one node if the greenhouse has distinct microclimates.

Route condensate away

Use a drip loop and suitable cable entry so water cannot track along the cable into the enclosure.

Illustrative louvered temperature and humidity probe mounted near crop canopy inside a greenhouse
A ventilated shield keeps the sensing area out of direct sunlight and spray. Check the installed shield for drainage, representative airflow and access for inspection.

Breathable Water-Repellent Protection and Maintenance

A breathable, water-repellent barrier can reduce direct droplet and dust exposure, but it does not make an entire sensor assembly waterproof.

Specify the barrier and housing separately, keep an air path to the opening, provide drainage and inspection access, and validate the response time.

Keep detergents, solvents, uncured adhesives and direct compressed air away from the sensing opening.

Integrated Heater and Measurement Validity

Correct Heater Invocation Sequence

In the Adafruit SHT4x library, setHeater() stores the mode for the next read. getEvent() sends the matching measurement or heater command and waits for its response.

Select one heater mode, call getEvent() once, restore SHT4X_NO_HEATER, and wait for the installed sensor to settle before normal control resumes. The heated reading confirms a transaction, not ambient greenhouse conditions.

ESP32 Arduino sketch
sht4.setHeater(SHT4X_MED_HEATER_1S);
sensors_event_t heaterHumidity, heaterTemperature;
bool heaterOk = sht4.getEvent(&heaterHumidity, &heaterTemperature);
sht4.setHeater(SHT4X_NO_HEATER);
 
// heaterHumidity and heaterTemperature are affected by sensor self-heating
// Do not use these values as inputs to fan, cooling-pad, or alarm control
cooldownStart = millis();
state = COOLING_DOWN;

Six Heater Operating Modes

Library ConstantNominal PowerDurationApplication Guidance
SHT4X_HIGH_HEATER_1SHigh1 sRecovery after significant condensation; use cautiously following validation
SHT4X_HIGH_HEATER_100MSHigh0.1 sShort, high-power heating pulse
SHT4X_MED_HEATER_1SMedium1 sPeriodic recovery in high-humidity environments
SHT4X_MED_HEATER_100MSMedium0.1 sLess aggressive maintenance pulse
SHT4X_LOW_HEATER_1SLow1 sPower-constrained systems or small enclosures
SHT4X_LOW_HEATER_100MSLow0.1 sShort pulse with minimum disturbance

The datasheet defines three heater power settings and two pulse durations. Do not derive an automatic heater schedule from one relative-humidity threshold alone: require sustained conditions, a minimum interval and a spray interlock.

Cooldown depends on the installed sensor and airflow. Persistent liquid exposure calls for a placement or protection change, not repeated heater pulses.

Recommended State Machine

StatePermitted ActionsProhibited ActionsExit Condition
Normal SamplingUpdate valid temperature/RH data and apply ventilation hysteresisRepeated heater activation without spacingSustained high humidity and minimum heater interval reached
SprayingContinue spray timer; suspend measurements susceptible to mistHeater activation or use of mist-contaminated readingsSpray cycle complete
Heated MeasurementExecute a single heated getEvent() callFeed that measurement into the controllerCommand completes or reports an error
CooldownTemporarily retain the last valid measurementUpdate control readingsCooldown duration elapsed
Sensor FaultDisable spraying and enter the predefined fail-safe stateContinue using stale measurements indefinitelyReinitialization and consecutive valid samples
Illustrated greenhouse sensor sequence during mist exposure, heater operation and cooldown
Conceptual sequence: pause mist-affected control updates, execute one heater measurement only when the defined trigger permits it, then resume after the sensor has settled. The colored curves are illustrative, not measured data.

ESP32 Reference Firmware

The complete sketch below is an ESP32 Arduino reference for a normally closed-loop greenhouse prototype: it samples the SHT40, applies fan hysteresis, accepts an S command for a single bench-test spray cycle, blocks control updates during heater and cooldown, and enters a fault state after repeated read failures.

The heater read can block the loop for approximately one second in the chosen mode, so this is a timed state machine rather than a fully non-blocking implementation. Disconnect live loads while validating the example.

ESP32 Arduino sketch
#include <Wire.h>
#include <Adafruit_SHT4x.h>
 
constexpr uint8_t PIN_SDA = 21;
constexpr uint8_t PIN_SCL = 22;
constexpr uint8_t PIN_FAN = 25;
constexpr uint8_t PIN_SPRAY = 26;
constexpr bool RELAY_ACTIVE_LOW = true;
 
constexpr uint32_t SAMPLE_MS = 5000;
constexpr uint32_t SPRAY_MS = 10000;
constexpr uint32_t COOLDOWN_MS = 5000;
constexpr uint32_t HEATER_MIN_INTERVAL_MS = 10UL * 60UL * 1000UL;
constexpr float FAN_HUM_ON = 85.0f;
constexpr float FAN_HUM_OFF = 80.0f;
constexpr float FAN_TEMP_ON = 30.0f;
constexpr float FAN_TEMP_OFF = 28.0f;
constexpr float HEATER_HUM_TRIGGER = 90.0f;
constexpr uint8_t MAX_SENSOR_FAILURES = 3;
 
Adafruit_SHT4x sht4;
 
enum class State { NORMAL, SPRAYING, HEATER_MEASUREMENT,
                   COOLING, SENSOR_FAULT };
State state = State::NORMAL;
 
uint32_t lastSample = 0;
uint32_t sprayStarted = 0;
uint32_t cooldownStarted = 0;
uint32_t lastHeater = 0;
float validTemperature = NAN;
float validHumidity = NAN;
uint8_t sensorFailures = 0;
uint8_t recoverySamples = 0;
uint8_t highHumiditySamples = 0;
bool fanOn = false;
 
bool elapsed(uint32_t now, uint32_t since, uint32_t interval) {
  return static_cast<uint32_t>(now - since) >= interval;
}
 
void writeRelay(uint8_t pin, bool on) {
  digitalWrite(pin, RELAY_ACTIVE_LOW ? !on : on);
}
 
void setFan(bool on) {
  fanOn = on;
  writeRelay(PIN_FAN, on);
}
 
void enterSafeState() {
  writeRelay(PIN_SPRAY, false);
  setFan(true);  // Example policy; validate against crop and climate risks on site
}
 
bool readNormalSample() {
  sensors_event_t humidity, temperature;
  sht4.setHeater(SHT4X_NO_HEATER);
  if (!sht4.getEvent(&humidity, &temperature)) return false;
  if (!isfinite(temperature.temperature) || !isfinite(humidity.relative_humidity)) return false;
  validTemperature = temperature.temperature;
  validHumidity = humidity.relative_humidity;
  Serial.printf("T %.2f C  RH %.2f %%\n",
                validTemperature, validHumidity);
  return true;
}
 
void updateFanControl() {
  if (isnan(validTemperature) || isnan(validHumidity)) return;
  if (!fanOn && (validHumidity >= FAN_HUM_ON ||
                 validTemperature >= FAN_TEMP_ON)) {
    setFan(true);
  } else if (fanOn && validHumidity <= FAN_HUM_OFF &&
             validTemperature <= FAN_TEMP_OFF) {
    setFan(false);
  }
}
 
void startSpray(uint32_t now) {
  setFan(false);                 // Example interlock; verify crop and airflow impact
  highHumiditySamples = 0;
  writeRelay(PIN_SPRAY, true);
  sprayStarted = now;
  state = State::SPRAYING;
}
 
void runHeaterMeasurement(uint32_t now) {
  sensors_event_t ignoredHumidity, ignoredTemperature;
  sht4.setHeater(SHT4X_MED_HEATER_1S);
  bool ok = sht4.getEvent(&ignoredHumidity, &ignoredTemperature);
  sht4.setHeater(SHT4X_NO_HEATER);
  if (!ok) {
    state = State::SENSOR_FAULT;
    enterSafeState();
    return;
  }
  lastHeater = now;
  cooldownStarted = millis();
  state = State::COOLING;
}
 
void setup() {
  Serial.begin(115200);
  writeRelay(PIN_FAN, false);  // Set output latch before enabling GPIO output
  writeRelay(PIN_SPRAY, false);
  pinMode(PIN_FAN, OUTPUT);
  pinMode(PIN_SPRAY, OUTPUT);
 
  Wire.begin(PIN_SDA, PIN_SCL);
  Wire.setClock(100000);
  if (!sht4.begin(&Wire)) {
    state = State::SENSOR_FAULT;
    enterSafeState();
    return;
  }
  sht4.setPrecision(SHT4X_HIGH_PRECISION);
  sht4.setHeater(SHT4X_NO_HEATER);
}
 
void loop() {
  const uint32_t now = millis();
 
  // Test command: send S over the serial interface to initiate one spray cycle
  if (state == State::NORMAL && Serial.available() &&
      Serial.read() == 'S') {
    startSpray(now);
  }
 
  switch (state) {
    case State::NORMAL:
      if (elapsed(now, lastSample, SAMPLE_MS)) {
        lastSample = now;
        if (readNormalSample()) {
          sensorFailures = 0;
          updateFanControl();
          if (validHumidity >= HEATER_HUM_TRIGGER) {
            if (highHumiditySamples < 3) ++highHumiditySamples;
          } else {
            highHumiditySamples = 0;
          }
          if (highHumiditySamples >= 3 &&
              elapsed(now, lastHeater, HEATER_MIN_INTERVAL_MS)) {
            highHumiditySamples = 0;
            state = State::HEATER_MEASUREMENT;
          }
        } else {
          highHumiditySamples = 0;
          if (++sensorFailures >= MAX_SENSOR_FAILURES) {
            state = State::SENSOR_FAULT;
            enterSafeState();
          }
        }
      }
      break;
 
    case State::SPRAYING:
      if (elapsed(now, sprayStarted, SPRAY_MS)) {
        writeRelay(PIN_SPRAY, false);
        cooldownStarted = now;
        state = State::COOLING;  // Spraying does not itself request a heater pulse
      }
      break;
 
    case State::HEATER_MEASUREMENT:
      runHeaterMeasurement(now);
      break;
 
    case State::COOLING:
      if (elapsed(now, cooldownStarted, COOLDOWN_MS)) {
        lastSample = now;
        state = State::NORMAL;
      }
      break;
 
    case State::SENSOR_FAULT:
      // Retry sensor initialization every 30 s; require three consecutive valid samples before leaving fault mode
      if (elapsed(now, lastSample, 30000)) {
        lastSample = now;
        if (sht4.begin(&Wire) && readNormalSample()) {
          if (++recoverySamples >= 3) {
            sensorFailures = 0;
            recoverySamples = 0;
            state = State::NORMAL;
            updateFanControl();
          }
        } else {
          recoverySamples = 0;
        }
      }
      break;
  }
}

Parameters to Verify Before Using the Code

ParameterExample SettingPre-Deployment Verification
RELAY_ACTIVE_LOWtrueVerify active-high/active-low relay behavior to prevent unintended activation at startup
PIN_FAN / PIN_SPRAY25 / 26Check development-board pin availability and peripheral conflicts
Fan thresholds85/80 %RH; 30/28 °CTune against crop stage, ventilation capacity, and seasonal field measurements
Heater trigger90 %RH; 10 min minimum intervalOptimize using condensation records; avoid excessive heater cycling
Fail-safe stateSpray OFF; fan ONEvaluate cold/heat stress, disease risk, and equipment hazards

Commissioning and Acceptance Testing

Bring Up the System in Six Stages

Start with the sensor alone. Add the driver and live loads only after each earlier stage passes.

  1. Prepare the IDEInstall the correct ESP32 board package. Select the exact board and serial port.
  2. Install the sensor libraryInstall Adafruit SHT4x with its BusIO and Unified Sensor dependencies.
  3. Prove the I²C readingConnect only the ESP32 and SHT40. Run the official SHT4test example; confirm the expected 0x44 address and stable readings.
  4. Check the relay without AC loadsVerify the module defaults to off at power-up and confirm its active-high or active-low input behavior.
  5. Exercise the reference firmwareSend S through the serial port. Observe spray, heated measurement, cooldown and return to normal sampling.
  6. Connect the final loadsOnly after the preceding tests, have qualified personnel inspect mains protection, grounding and the enclosure.
Illustrative engineer checking ESP32 greenhouse controller and environmental sensor at a bench
Commission with mains loads disconnected first. The screen content is illustrative, not a recorded NYFEA test log.

Fault-Injection Tests

TestMethodAcceptance Criteria
Network outageDisable the hotspot or router while local equipment remains poweredSampling and local control continue; reconnect automatically when the network returns
Sensor disconnectionDisconnect SDA or SCL on the low-voltage sideAfter consecutive failures, disable spraying and enter the fail-safe state
High humidityApply a controlled humidity source; avoid direct droplets at the openingAfter trigger conditions are met, execute no more than one heater cycle and complete cooldown
Spray interlockIssue the test spray commandDo not run the heater or update mist-contaminated readings during spraying
Power-cycle recoveryDisconnect and restore low-voltage power under safe conditionsAll relays initially remain off; system recovers automatically
Electromagnetic interferenceSwitch a fan or pump under electrically isolated test conditionsESP32 does not reset; I²C error rate remains within acceptable limits

Troubleshooting Guide

Symptom or ErrorInitial ChecksRecommended Action
Failed to connect to ESP32Bootloader/download mode, data-capable USB cable, port, board selectionHold BOOT during “Connecting” until programming starts; use a known data-capable USB cable
Serial port not foundUSB-to-UART driver and port ownershipVerify CP210x, CH34x, or onboard USB drivers; close other serial-monitor applications
Adafruit_SHT4x.h not foundLibrary and dependency installationInstall Adafruit SHT4x through Library Manager and accept all dependencies
I²C address 0x44 not detectedVoltage, SDA, SCL, pull-ups, and solder jointsRun an I²C scanner; lower the bus clock to 100 kHz and shorten the cable
Garbled serial outputSerial Monitor baud rateMatch Serial.begin(); this example uses 115200 baud
Humidity remains near 100 %RHCondensation, water droplets, contamination, and placementImprove protection and airflow first; then use limited heater recovery
Abnormal measurements after heatingNO_HEATER restoration and cooldownDiscard heated measurements; sample again only after cooldown
ESP32 resets when fan startsSupply droop, ground loops, EMI, and relay driverSeparate supply branches, improve decoupling, suppression, and routing
Watchdog compilation errorsESP32 Arduino Core versionAdapt to the official API for that version; do not mix Core 2.x and 3.x examples

Optional: Network and Watchdog Enhancements

The reference sketch above runs locally; it does not implement Wi-Fi or a Task Watchdog. If you add remote monitoring, keep those services outside the control path.

Keep control running when Wi-Fi fails

Sensor acquisition, fan hysteresis and spray interlocks must continue during an outage. A failed connection or upload should return control to loop() promptly.

  • Set finite connection and request timeouts shorter than the watchdog window.
  • On failure, retain data in a bounded buffer or record the current state; send it when connectivity returns.
  • Never wait indefinitely for Wi-Fi inside loop().

Configure the watchdog for the installed core

ESP32 Arduino Core 2.x and 3.x bundle different ESP-IDF versions. Check the installed board-package version and follow its Task Watchdog API.

  • Set the timeout beyond the longest normal blocking interval, including a heated read, network timeout and flash operation.
  • Feed the watchdog only after the main loop completes its critical work. A separate timer that feeds it unconditionally can hide a stalled control loop.

Before commissioning

  • Set every actuator to its safe output level before starting sensors or Wi-Fi.
  • Log reset cause, last operating state and fault count to distinguish brownouts, watchdog resets and software faults.
  • Test watchdog recovery with controlled firmware and live pumps or heaters disconnected.

Recommended Deployment Bill of Materials

Illustrated SHT40 and ESP32 greenhouse deployment components including shield, relay, fan, pump, valve and enclosure
Component overview for a greenhouse controller. Verify the exact SHT40 protection option, relay input and load ratings, supply, enclosure, and cable entry against the parts selected for the installation.
CategoryRecommended ComponentSelection Criteria
ControllerESP32 development board3.3 V logic, reliable USB interface, sufficient available GPIO pins
SensorSHT40 module or documented protected variantSpecified supply range, pull-up arrangement, and protection design
EnclosureIP65-rated or higher electrical enclosureEnvironmental sealing, protected terminals, thermal management, service clearance
Probe protectionRadiation shield, breathable membrane, probe housingAirflow, drainage, serviceability, and low solar-radiation error
Cable entryM12 or M16 waterproof cable glandSelect for cable diameter; provide drip loops
Drive stage3.3 V-compatible isolated driver or industrial relayContact rating, inrush capability, default state, documented isolation
Power supplyCompliant DC supply with separate regulated branchesPeak-current margin, fuse protection, surge suppression
WiringShielded cable, twisted pair, terminals, cable ductsSeparate signal and power wiring; clear identification and service access

Pre-Deployment Checklist

CheckPass condition
Power and I²CSensor and module supply are verified; SDA/SCL pull-ups and bus speed suit the installed wiring.
PlacementSensor is shaded, ventilated and protected from spray; recovery after mist or heater use is measured.
ActuatorsRelay polarity and default state match firmware; qualified personnel verify protection for the actual loads.
Control logicFan hysteresis is tested; irrigation has an independent trigger; heater readings are excluded through cooldown.
Fault handlingSensor loss, network loss and restart tests enter the defined safe state; stale readings are rejected.
LoggingLogs include timestamps, sensor status, actuator states and reset causes; watchdog configuration matches the installed core.

Technical sources

Sensirion SHT4x datasheet

Adafruit SHT4x Arduino library source

Espressif Task Watchdog documentation

Scope and limitations

Set thresholds, heater intervals and cooldown times through on-site testing; the 5-second example is not a confirmed recovery time. For mains-powered or unattended equipment, use qualified electrical protection and hardware interlocks. Firmware safeguards alone are not a safety system.

Start with the basic ESP32–SHT40 readout if I²C acquisition is not yet stable. For unexplained offsets, see the accuracy guide; for heater effects, see heater diagnostics.

Evaluate the complete sensor assembly

NYFEA FHT40 is an independent temperature and humidity sensor candidate for new greenhouse designs. Compare the exact device datasheet, interface, package, protective housing and environmental test results before considering it for this controller.

Review NYFEA FHT40Browse humidity sensors

SHT40 and SHT4x are Sensirion identifiers. NYFEA and FHT40 are independent products and are not affiliated with or endorsed by Sensirion. Illustrative images on this page are not installation records or performance evidence.

© 2023 All Rights Reserved. www.nyfea.com Terms of Use | Privacy Policy