CCS811 Sensor met MQTT

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Davo
  • Registratie: Januari 2011
  • Laatst online: 07-05-2024
Hallo iedereen,

Heb hier een CCS811 CO2 sensor. Nu heb ik een Ardiuno skets gevonden die de waren van de sensor op de serial montor laat zien. Nu ben ik geen programmer. Heb via zoeken op Google de skets zo aangepast dat deze ook verbinding maakt met Wifi en een Mosquitto server. Ik kan wel de fout code in een MQTT topic krijgen. Het lukt mij alleen niet op de CO2 warden in een MQTT topic te krijgen. Is er its in de code wat ik kan gebruiken om de waarden van de sensor in een MQTT topic te krijgen, of moet daarvoor de code compleet veranderd worden?

Dit is de aangepaste skets:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
 /*
  ccs811basic.ino - Demo sketch printing results of the CCS811 digital gas sensor for monitoring indoor air quality from ams.
  Created by Maarten Pennings 2017 Dec 11
*/


#include <Wire.h>    // I2C library
#include "ccs811.h"  // CCS811 library
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// Wiring for ESP8266 NodeMCU boards: VDD to 3V3, GND to GND, SDA to D2, SCL to D1, nWAKE to D3 (or GND)
CCS811 ccs811(D3); // nWAKE on D3

//Wifi Settings
const char* ssid = "My SSID";
const char* password =  "MyPasswd";

//MQTT Settings
const char* mqttServer = "192.168.178.192";
const int mqttPort = 1883;
const char* mqttUser = "openhab2";
const char* mqttPassword = "MyPasswd";


WiFiClient espClient;
PubSubClient client(espClient);



void setup() {

  Serial.begin(115200);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi..");
  }
  Serial.println("Connected to the WiFi network");
 
  client.setServer(mqttServer, mqttPort);
 
 
  while (!client.connected()) {
    Serial.println("Connecting to MQTT...");
 
    if (client.connect("ESP8266Client", mqttUser, mqttPassword )) {
 
      Serial.println("connected");  
 
    } else {
 
      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(2000);
 
    }

  }
     
  client.publish("CCS811/Info", "Hello from ESP8266");
  client.subscribe("CCS811/Info");
  client.subscribe("CCS811/CO2");

  // Enable I2C
  Wire.begin(); 
  
  // Enable CCS811
  ccs811.set_i2cdelay(50); // Needed for ESP8266 because it doesn't handle I2C clock stretch correctly
  bool ok= ccs811.begin();
  if( !ok ) Serial.println("init: CCS811 begin FAILED");

  // Print CCS811 versions
  Serial.print("init: hardware    version: "); Serial.println(ccs811.hardware_version(),HEX);
  Serial.print("init: bootloader  version: "); Serial.println(ccs811.bootloader_version(),HEX);
  Serial.print("init: application version: "); Serial.println(ccs811.application_version(),HEX);
  
  // Start measuring
  ok= ccs811.start(CCS811_MODE_1SEC);
  if( !ok ) Serial.println("init: CCS811 start FAILED");
}


void loop() {
  // Read
  uint16_t eco2, etvoc, errstat, raw;
  ccs811.read(&eco2,&etvoc,&errstat,&raw); 
  
   // Print measurement results based on status
  if( errstat==CCS811_ERRSTAT_OK ) { 
    Serial.print("CCS811: ");
    Serial.print("eco2=");  Serial.print(eco2);     Serial.print(" ppm  ");
    Serial.print("etvoc="); Serial.print(etvoc);    Serial.print(" ppb  ");
     client.publish("CCS811/CO2", "eco2");
    //Serial.print("raw6=");  Serial.print(raw/1024); Serial.print(" uA  "); 
    //Serial.print("raw10="); Serial.print(raw%1024); Serial.print(" ADC  ");
    //Serial.print("R="); Serial.print((1650*1000L/1023)*(raw%1024)/(raw/1024)); Serial.print(" ohm");
    Serial.println();
  } else if( errstat==CCS811_ERRSTAT_OK_NODATA ) {
    Serial.println("CCS811: waiting for (new) data");
     client.publish("CCS811/CO2", "waiting for (new) data");
  } else if( errstat & CCS811_ERRSTAT_I2CFAIL ) { 
    Serial.println("CCS811: I2C error");
  } else {
    Serial.print("CCS811: errstat="); Serial.print(errstat,HEX); 
    Serial.print("="); Serial.println( ccs811.errstat_str(errstat) ); 
  }
  
  // Wait
  delay(1000); 
}


Dit stukje code laat de warden zien op de serial monitor. Nu heb ik eigenlijk alles wat daar gebruikt wordt geprobeerd, maar ik krijg alleen text en geen waarden.
code:
1
2
    Serial.print("eco2=");  Serial.print(eco2);     Serial.print(" ppm  ");
    Serial.print("etvoc="); Serial.print(etvoc);    Serial.print(" ppb  ");


Hier twee voorbeelden van wat ik geprobeerd heb:
code:
1
2
client.publish("CCS811/CO2", "(eco2)");
client.publish("CCS811/CO2", "eco2");


Met vriendelijke groet

Beste antwoord (via Davo op 03-01-2019 12:25)


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je stuurt letterlijk de string eco2 of (eco2). Heb je dit al geprobeerd?

code:
1
client.publish("CCS811/CO2",  String(eco2).c_str());

Of iets in die richting?

Verder: probeer volgende keer als je code post het een beetje te beperken tot relevante code; al je debugstatements en setup etc. had je prima weg kunnen laten want niet relevant.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Alle reacties


Acties:
  • Beste antwoord
  • +2 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je stuurt letterlijk de string eco2 of (eco2). Heb je dit al geprobeerd?

code:
1
client.publish("CCS811/CO2",  String(eco2).c_str());

Of iets in die richting?

Verder: probeer volgende keer als je code post het een beetje te beperken tot relevante code; al je debugstatements en setup etc. had je prima weg kunnen laten want niet relevant.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Davo
  • Registratie: Januari 2011
  • Laatst online: 07-05-2024
Beste Robll, bedankt voor de reactie. Het voorbeeld wat je hebt gegeven werkt perfect, nogmaals super bedankt hier voor. Nu kan ik de CO2 waarden in mijn woning uitlezen via openhab2.

Zal volgende keer alleen de relevante code plaatsen.

Met vriendelijke groet
Davo