Ich habe einen ESP8266 mit einem CCS811 verbunden, ein bißchen Code und schon hat man ein Co2 Messgerät / Luftqualitätsmesser
Hier mein Code für Arduino (hingeschmiert):
#include <ESP8266WiFi.h>
#include <AsyncMqttClient.h>
#define aktordebug 1
#define serialout 1
#include "Adafruit_CCS811.h"
Adafruit_CCS811 ccs;
float temp;
int co2;
int tvoc;
float temp2;
int co22;
int tvoc2;
unsigned long timestamp;
bool go=false;
AsyncMqttClient mqttClient;
#include <ArduinoJson.h>
IPAddress mqttserver( 192, 168, 0, 3 );
//IPAddress mqttserver = { 192, 168, 0, 5 };
String mqttvalue;
String hbmqttvalue;
String hbmqttvalue2;
String mqttvalueold;
long mqttontimer = 0;
int mqttstatus [] = {0, 0, 0, 0};
const char* clientname;
const char* mqttpublishvalue;
String mqttpublishabo = "/device/co2/status/";
String mqttsubscribeabo = "/arduino/co2-Labor/remote/";
String hbmqttsubscribeabo = "homebridge/from/set";
String mqttusername = "lol";
String mqttpassword = "lol";
String devicename = "Co2-Sensor";
void onMqttConnect(bool sessionPresent) {
const char* mqttsubscribeabo2 = mqttsubscribeabo.c_str();
Serial.println("** Connected to the broker **");
Serial.print("Session present: ");
Serial.println(sessionPresent);
/*
uint16_t packetIdSub = mqttClient.subscribe(mqttsubscribeabo2, 0);
Serial.print("Subscribing at QoS 1, packetId: ");
Serial.println(packetIdSub);
uint16_t packetIdSub2 = mqttClient.subscribe("homebridge/from/set", 0);
Serial.print("Subscribing2 at QoS 1, packetId: ");
Serial.println(packetIdSub2);
*/
}
void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
Serial.println("** Disconnected from the broker **");
Serial.println("Reconnecting to MQTT...");
mqttClient.connect();
}
void onMqttSubscribe(uint16_t packetId, uint8_t qos) {
// Serial.println("** Subscribe acknowledged **");
//Serial.print(" packetId: ");
//Serial.println(packetId);
//Serial.print(" qos: ");
//Serial.println(qos);
}
void onMqttUnsubscribe(uint16_t packetId) {
Serial.println("** Unsubscribe acknowledged **");
Serial.print(" packetId: ");
Serial.println(packetId);
}
void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) {
Serial.println("** Publish received **");
Serial.print(" topic: ");
Serial.println(topic);
/*
Serial.print(" qos: ");
Serial.println(properties.qos);
Serial.print(" dup: ");
Serial.println(properties.dup);
Serial.print(" retain: ");
Serial.println(properties.retain);
Serial.print(" len: ");
Serial.println(len);
Serial.print(" index: ");
Serial.println(index);
Serial.print(" total: ");
Serial.println(total);
*/
Serial.print(" payload: ");
Serial.println(payload);
// Serial.print(" abo: ");
//Serial.println(mqttsubscribeabo.c_str());
if (strcmp (topic, mqttsubscribeabo.c_str()) == 0 )
{
mqttvalue = payload;
if (serialout == 1 or aktordebug == 1) Serial.println("mqttvalue: " + mqttvalue);
}
if (strcmp(topic, "homebridge/from/set") == 0)
{
DynamicJsonBuffer jsonBuffer;
const char* json = payload;
JsonObject& input = jsonBuffer.parseObject(json);
String hbname = input["name"];
String characteristic = input["characteristic"];
String hbvalue = input["value"];
if (serialout == 1 or aktordebug == 1) Serial.println("characteristic: " + characteristic);
if (characteristic != "On")
{
if (serialout == 1 or aktordebug == 1) Serial.println("mqttvalue: " + mqttvalue);
hbmqttvalue = payload;
if (serialout == 1 or aktordebug == 1) Serial.println("hb-characteristic: " + characteristic);
}
if (characteristic == "On")
{
hbmqttvalue2 = payload;
if (serialout == 1 or aktordebug == 1) Serial.println("hb-mqttvalue2: " + hbmqttvalue2);
mqttontimer = millis() + 1000;
if (serialout == 1 or aktordebug == 1) Serial.println("hb-Timer: " + mqttontimer);
}
}
}
void onMqttPublish(uint16_t packetId) {
//Serial.println("** Publish acknowledged **");
//Serial.print(" packetId: ");
//Serial.println(packetId);
}
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println();
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
Serial.print("Connecting to Wi-Fi");
WiFi.begin("lol", "lol");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" OK");
//************************************************** MQTT Subscribe Abo ************************************
if (mqttsubscribeabo != "")
{
const char* mqttusername2 = mqttusername.c_str();
const char* mqttpassword2 = mqttpassword.c_str();
const char* mqttpublishabo2 = mqttpublishabo.c_str();
const char* deviceid = devicename.c_str();
mqttClient.onConnect(onMqttConnect);
mqttClient.onDisconnect(onMqttDisconnect);
//mqttClient.onSubscribe(onMqttSubscribe);
//mqttClient.onUnsubscribe(onMqttUnsubscribe);
//mqttClient.onMessage(onMqttMessage);
mqttClient.onPublish(onMqttPublish);
mqttClient.setServer(IPAddress(192, 168, 0, 5), 1883);
mqttClient.setKeepAlive(5).setCleanSession(false).setWill("topic/online", 2, true, "no").setCredentials(mqttusername2, mqttpassword2).setClientId(deviceid);
Serial.println("Connecting to MQTT...");
mqttClient.connect();
Serial.println("CCS811 test");
if (!ccs.begin()) {
Serial.println("Failed to start sensor! Please check your wiring.");
while (1);
}
//calibrate temperature sensor
while (!ccs.available());
temp = ccs.calculateTemperature();
ccs.setTempOffset(temp - 25.0);
if (ccs.available())
{
temp2 = float(ccs.calculateTemperature());
}
if (!ccs.readData())
{
co22 = int(ccs.geteCO2());
Serial.println("CO2: ");
Serial.println(co22);
delay(10);
tvoc2 =int (ccs.getTVOC());
}
}
go=true;
}
void loop()
{
if (millis() - timestamp >= 60000 or go==true)
{
go=false;
for (int i = 1; i < 7; i++)
{
Serial.println("For Schleife Durchgang: ");
Serial.println(i);
if (ccs.available())
{
temp2 = ccs.calculateTemperature();
while (temp2 == 0)
{
temp2 = ccs.calculateTemperature();
Serial.println("Temp2: ");
Serial.println(temp2);
delay(1000);
}
temp=temp2 + temp;
if (!ccs.readData())
{
co22 = int(ccs.geteCO2());
while (co22 == 0)
{
co22 = int(ccs.geteCO2());
Serial.println("CO2: ");
Serial.println(co22);
delay(1000);
}
co2 = co22 + co2;
tvoc2 =int (ccs.getTVOC());
while (tvoc2 == 0)
{
tvoc2 =int (ccs.getTVOC());
Serial.println("TVOC2: ");
Serial.println(tvoc2);
delay(1000);
}
tvoc = tvoc2 + tvoc;
}
else Serial.println("ERROR: Kann nicht messen !");
}
delay(10000);
}
co2 = co2 / 7;
tvoc = tvoc / 7;
temp = temp / 7;
clientname = devicename.c_str();
const char* mqttusername2 = mqttusername.c_str();
const char* mqttpassword2 = mqttpassword.c_str();
const char* mqttpublishabo2 = mqttpublishabo.c_str();
DynamicJsonBuffer jsonBuffer;
JsonObject& mqttsenden = jsonBuffer.createObject();
mqttsenden["devicename"] = devicename.c_str();
mqttsenden["model"] = "co2";
mqttsenden["room"] = "Wohnzimmer";
mqttsenden["infoart"] = "co2";
mqttsenden["value"] = String (co2);
String mqttpublishvaluetest;
mqttsenden.printTo(mqttpublishvaluetest);
mqttpublishvalue = mqttpublishvaluetest.c_str();
uint16_t packetIdPub1 = mqttClient.publish(mqttpublishabo2, 1, false, mqttpublishvalue);
if (serialout == 1 or aktordebug == 1) Serial.println("MQTT mit ATH Senden....");
if (serialout == 1 or aktordebug == 1) Serial.print(mqttpublishvaluetest.c_str());
JsonObject& mqttsenden2 = jsonBuffer.createObject();
mqttsenden2["devicename"] = devicename.c_str();
mqttsenden2["model"] = "Temperature";
mqttsenden2["room"] = "Wohnzimmer";
mqttsenden2["infoart"] = "tvoc";
mqttsenden2["value"] = String (tvoc);
String mqttpublishvaluetest2;
mqttsenden2.printTo(mqttpublishvaluetest2);
mqttpublishvalue = mqttpublishvaluetest2.c_str();
uint16_t packetIdPub2 = mqttClient.publish(mqttpublishabo2, 1, false, mqttpublishvalue);
if (serialout == 1 or aktordebug == 1) Serial.println("MQTT mit ATH Senden....");
if (serialout == 1 or aktordebug == 1) Serial.print(mqttpublishvaluetest2.c_str());
JsonObject& mqttsenden3 = jsonBuffer.createObject();
mqttsenden3["devicename"] = devicename.c_str();
mqttsenden3["model"] = "Temperature";
mqttsenden3["room"] = "Wohnzimmer";
mqttsenden3["infoart"] = "Temperature";
mqttsenden3["value"] = String(temp);
String mqttpublishvaluetest3;
mqttsenden3.printTo(mqttpublishvaluetest3);
mqttpublishvalue = mqttpublishvaluetest3.c_str();
uint16_t packetIdPub3 = mqttClient.publish(mqttpublishabo2, 1, false, mqttpublishvalue);
if (serialout == 1 or aktordebug == 1) Serial.println("MQTT mit ATH Senden....");
if (serialout == 1 or aktordebug == 1) Serial.print(mqttpublishvaluetest3.c_str());
timestamp = millis();
}
}
Ich mache jede Minute eine Messung, jede Messung wird 6 x innerhalb eine Minute gemacht und dann den Mittelwert ausgerechnet…
Die Messwerte gefallen mir aber überhaupt nicht, ich empfinde Sie viel zu Hoch:
Habt Ihr noch eine Idee ?