Infineon Team
Published © MIT

Smartify your home with one board: The XENSIV™ Sensor Shield

Air Quality, Radar, and more on one board, the ultimate start for your smart home - Let's see how to integrate this into Home Assistant!

BeginnerFull instructions provided4 hours713
Smartify your home with one board: The XENSIV™ Sensor Shield

Things used in this project

Hardware components

UNO R4 WiFi
Arduino UNO R4 WiFi
×1
XENSIV™ Sensor Shield
Infineon XENSIV™ Sensor Shield
×1

Software apps and online services

Arduino IDE
Arduino IDE
Home Assistant
Home Assistant

Story

Read more

Schematics

Schematic Modifications

Modifications to use I2C bus with Arduino Uno and XENSIV Sensor Shield.

Code

xensiv_sensorshield_ha.ino

Arduino
Full arduino application code.
#include <Arduino.h>
#include <WiFiS3.h>

#include <PubSubClient.h>
#include <HaMqttEntities.h>

// Sensors
#include <pas-co2-ino.hpp>
#include <SensirionI2cSht3x.h>
#include <Dps3xx.h>

#define WIFI_SSID ""
#define WIFI_PASSWORD ""
#define MQTT_SERVER "192.168.x.y"
#define MQTT_PORT 1883
#define MQTT_USER ""
#define MQTT_PASSWORD ""

WiFiClient wifi_client;
PubSubClient mqtt_client(wifi_client);

SensirionI2cSht3x sht_sensor;
PASCO2Ino cotwo;
Dps3xx Dps3xxPressureSensor = Dps3xx();
#define PERIODIC_MEAS_INTERVAL_IN_SECONDS 60

#define RADAR_SENSOR_PIN 4

#define HA_DEVICE_ID "ifx-xensiv-shield"
#define HA_DEVICE_FRIENDLY_NAME "XENSIV Sensor Shield"
#define HA_DEVICE_FW "0.1.0"
#define HA_DEV_MANUFACTURER "Infineon"
#define HA_DEV_MODEL "XENSIV Sensor Shield"
#define ENTITIES_COUNT 4
#define HA_DEV_HARDWARE_VERSION "A"

HADevice ha_device = HADevice(HA_DEVICE_ID, HA_DEVICE_FRIENDLY_NAME,
                              HA_DEVICE_FW, HA_DEV_MANUFACTURER, HA_DEV_MODEL, HA_DEV_HARDWARE_VERSION);

HASensorNumeric ha_sensor_co2 = HASensorNumeric(
  "ha-xensiv-co2", "CO2 Level", ha_device, "ppm", 0);

HASensorNumeric ha_sensor_temp = HASensorNumeric(
  "ha-sht-temp", "Temperature", ha_device, "C", 1);

HASensorNumeric ha_sensor_hum = HASensorNumeric(
  "ha-sht-hum", "Humidity", ha_device, "%", 0);

HASensorNumeric ha_sensor_dps = HASensorNumeric(
  "ha-sht-dps", "Pressure", ha_device, "Pa", 0);

HASensorBinary ha_sensor_radar = HASensorBinary(
  "ha-radar", "Motion Detection", ha_device);

void setup() {
  Serial.begin(9600);
  mqtt_client.setServer(MQTT_SERVER, MQTT_PORT);

  HAMQTT.begin(mqtt_client, ENTITIES_COUNT);
  ha_sensor_radar.addFeature(HA_FEATURE_DEVICE_CLASS,"motion");

  HAMQTT.addEntity(ha_sensor_co2);
  HAMQTT.addEntity(ha_sensor_temp);
  HAMQTT.addEntity(ha_sensor_hum);
  HAMQTT.addEntity(ha_sensor_dps);
  HAMQTT.addEntity(ha_sensor_radar);

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  Wire.begin();

  sht_sensor.begin(Wire, SHT30_I2C_ADDR_44);
  sht_sensor.startPeriodicMeasurement(REPEATABILITY_MEDIUM,
                                      MPS_ONE_PER_SECOND);

  cotwo.begin();
  cotwo.startMeasure(PERIODIC_MEAS_INTERVAL_IN_SECONDS);

  Dps3xxPressureSensor.begin(Wire, 0x76);

  pinMode(RADAR_SENSOR_PIN, INPUT);
}

void loop() {
  uint32_t loop_start = millis();

  HAMQTT.loop();
  if (!HAMQTT.connected() && !HAMQTT.connect("examples", MQTT_USER, MQTT_PASSWORD))
    delay(1000);

  // CO2 sensor measurement
  int16_t co2_value;
  Error_t err;
  err = cotwo.getCO2(co2_value);
  if (!err) {
    ha_sensor_co2.setState(co2_value);
  }

  // SHT humidity/temperature sensor measurement
  float temp_value;
  float hum_value;
  sht_sensor.blockingReadMeasurement(temp_value, hum_value);
  ha_sensor_temp.setState(temp_value);
  //Serial.write("\xC2\xB0");  //The Degree symbol
  ha_sensor_hum.setState(hum_value);

  // DPS atmospheric pressure measurement
  float pressure;
  Dps3xxPressureSensor.measurePressureOnce(pressure, 7);
  ha_sensor_dps.setState(pressure);

  while (millis() - loop_start < 10000) {
    ha_sensor_radar.setState(!digitalRead(RADAR_SENSOR_PIN));  // This is fine because it's only acting on updated state.
    delay(10);
  }
}

Credits

Infineon Team
112 projects • 183 followers
Thanks to paulino.

Comments