Infineon Team
Published © MIT

Hack Your Air Quality: CO2 Monitoring with PSOC6 Arduino!

Unlock new ways to monitor air quality, powered by Infineon's PAS CO2 sensor, PSOC6, Home Assistant, and Arduino!

BeginnerFull instructions provided1 hour824
Hack Your Air Quality: CO2 Monitoring with PSOC6 Arduino!

Things used in this project

Story

Read more

Schematics

CO2_Sensor_Fritzing

Code

Application code

Arduino
#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <pas-co2-ino.hpp>
#include <ArduinoJson.h>

#define I2C_FREQ_HZ 400000
#define PERIODIC_MEAS_INTERVAL_IN_SECONDS 10
#define PRESSURE_REFERENCE 900
#define MSG_BUFFER_SIZE (256)

const char* ssid = "";
const char* password = "";
const char* mqtt_server = "";
const uint32_t mqtt_port = 1883;
const char* mqtt_user = "";
const char* mqtt_password = "";

const char* client_id = "co2-test-client";
const char* entity_id = "co2test";
const char* device_name = "CO2 Sensor Device";
const char* entity_name = "CO2 Value";
const char* discoveryTopic = "homeassistant/sensor/co2-test-client/config";
const char* stateTopic = "homeassistant/sensor/co2-test-client/state";

StaticJsonDocument<512> discoveryMessage;

WiFiClient sta;
PubSubClient mqttc(sta);
PASCO2Ino cotwo;

char msg[MSG_BUFFER_SIZE];
int16_t co2ppm;
Error_t err;

void connect_wifi() {
  //connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void reconnect_mqtt() {
  while (!mqttc.connected()) {
    Serial.print("Attempting MQTT connection...");

    if (mqttc.connect(client_id, mqtt_user, mqtt_password)) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(mqttc.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(3000);
    }
  }
}

void setup() {
  Serial.begin(115200);

  /* CO2 Setup */

  Wire.begin();
  Wire.setClock(I2C_FREQ_HZ);

  err = cotwo.begin();

  if (XENSIV_PASCO2_OK != err) {
    Serial.print("initialization error : ");
    Serial.println(err);
  }

  err = cotwo.setPressRef(PRESSURE_REFERENCE);
  if (XENSIV_PASCO2_OK != err) {
    Serial.print("Pressure reference error: ");
    Serial.println(err);
  }

  err = cotwo.startMeasure(PERIODIC_MEAS_INTERVAL_IN_SECONDS);
  if (XENSIV_PASCO2_OK != err) {
    Serial.print("Start measure error: ");
    Serial.println(err);
  }

  /* WiFi & MQTT Setup */
  connect_wifi();
  mqttc.setServer(mqtt_server, mqtt_port);
  mqttc.setBufferSize(512);
  reconnect_mqtt();

  /* Home Assistant Auto Discovery */
  discoveryMessage["name"] = entity_name;
  discoveryMessage["state_topic"] = stateTopic;
  discoveryMessage["unit_of_measurement"] = "ppm";
  discoveryMessage["device_class"] = "carbon_dioxide";
  discoveryMessage["unique_id"] = entity_id;
  JsonObject device = discoveryMessage.createNestedObject("device");
  device["name"] = device_name;
  JsonArray identifiers = device.createNestedArray("identifiers");
  identifiers.add(client_id);

  String mqtt_discovery_payload;
  serializeJson(discoveryMessage, mqtt_discovery_payload);

  Serial.print("Publish:\t");
  Serial.println(mqtt_discovery_payload.c_str());
  mqttc.publish(discoveryTopic, mqtt_discovery_payload.c_str(), false);
}

void loop() {

  /* Keep connection to MQTT broker */
  if (!mqttc.connected()) {
    reconnect_mqtt();
  }

  /* Get CO2 Sensor value */
  err = cotwo.getCO2(co2ppm);

  if (XENSIV_PASCO2_OK != err) {
    if (XENSIV_PASCO2_ERR_COMM == err) {
      delay(600);
      err = cotwo.getCO2(co2ppm);
      if (XENSIV_PASCO2_OK != err) {
        Serial.print("get co2 error: ");
        Serial.println(err);
      }
    }
  } else {
    /* If successful, publish to MQTT broker */
    Serial.print("Co2 PPM value: ");
    Serial.println(co2ppm);
    snprintf(msg, MSG_BUFFER_SIZE, "%d", co2ppm);
    Serial.print("Publish message: ");
    Serial.println(msg);
    mqttc.publish(discoveryMessage["state_topic"], msg);
  }

  mqttc.loop();
  delay(PERIODIC_MEAS_INTERVAL_IN_SECONDS * 1000);
}

PSOC 6 Arduino Core

Credits

Infineon Team
106 projects • 171 followers
Contact

Comments

Please log in or sign up to comment.