CCS811 czujnik jakości powietrza

wojaran
Posts: 8
Joined: Mon Aug 15, 2022 5:24 pm

Post

Witam
próbuje dodać czujnik jakości powietrza do supli, ma on dwa odczyty CO2 i TVOC, dodałem jeden odczyt jako Thermometer, a jak mogę dodać drugi też jako termometer? czy jest jakiś przykład który mogłbym użyć? wiem że mógłbym użyć wilgotnośc jako drugi odczyt ale czy mogę oba mieć jako temperaturę?
mój kod

#ifndef _ccs811_h
#define _ccs811_h

#define CO2_NOT_AVAILABLE -1
#include "Adafruit_CCS811.h"
#include "thermometer.h"

namespace Supla {
namespace Sensor {
class ccs811 : public Thermometer {
public:
ccs811() {
if(!ccs.begin()){
Serial.println("Failed to start sensor! Please check your wiring.");
}
delay(200);
}

double getValue() {
double value = CO2_NOT_AVAILABLE;
if(ccs.available()){
if(!ccs.readData()){
Serial.print("CO2: ");
value=ccs.geteCO2();;
Serial.print(value);
Serial.print("ppm, TVOC: ");
Serial.println(ccs.getTVOC());
//delay(10000);
}
else{
Serial.println("ERROR!");
value=-2;

}
}
return value;
}

void onInit() {
channel.setNewValue(getValue());
}

void iterateAlways() {
if (lastReadTime + 20000 < millis()) {
lastReadTime = millis();
channel.setNewValue(getValue());
}
}

protected:
Adafruit_CCS811 ccs; // I2C
};

}; // namespace Sensor
}; // namespace Supla

#endif
User avatar
klew
Posts: 8356
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Możesz to zrobić na kilka sposobów.

Może najprościej byłoby zrobić klasę CCS811, która nie dziedziczy po Thermometer, ale zawiera w sobie dwie instancje klas VirtualThermometer, np:

Code: Select all

class myCCS811: public Supla::Element {
  public:
    void onInit() override {
       // tu wstaw inicjalizację i2c/biblioteki ccs
      // oraz dodaj pierwszy odczyt z czujnika i ustawienie kanałów:
      therm1.setValue(co2);
      therm2.setValue(tvoc);
    }

    void iterateAlways() override {
      if (millis() - lastReadTime > 20000) {
        lastReadTime = millis();
      // odczyt ccs'a, a następnie ustawienie wartości na kanały:
      therm1.setValue(co2);
      therm2.setValue(tvoc);
     }
    }
 protected:
   Supla::Sensor::VirtualThermometer therm1;
   Supla::Sensor::VirtualThermometer therm2;
   uint64_t lastReadTime = 0;
 }
 
To pseudokod pisany na kolanie ;) także popraw co trzeba i uzupełnij, ale powinno oddawać dobrze ideę ;)
Widzimy się na Supla Offline Party vol. 2 :!:
wojaran
Posts: 8
Joined: Mon Aug 15, 2022 5:24 pm

Post

dziękuję bardzo
o właśnie coś takiego mi chodziło, tylko nie umiem jeszcze teraz tego wywołać,

Code: Select all

 auto ccs = new Supla::Sensor::ccs811();
a teraz nie umiem tego kanału wywołać :) czy mam wywołać element? czy jakoś te dwa therm1,therm2 jako sensory?
Pozdrawiam
User avatar
klew
Posts: 8356
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Nie rozumiem co chcesz zrobić. Co to znaczy "wywołać kanał"?
Widzimy się na Supla Offline Party vol. 2 :!:
wojaran
Posts: 8
Joined: Mon Aug 15, 2022 5:24 pm

Post

Code: Select all

#include <SuplaDevice.h>
#include <SuplaSomfy.h>
#include <SPI.h>
#include <supla/network/esp_wifi.h>
#include <supla/sensor/virtual_thermometer.h>
#include "Adafruit_CCS811.h"

#define WIFI_NETWORK "xxx"
#define WIFI_PASSWORD "xxxx"
#define WIFI_TIMEOUT_MS 20000

char *WiFiStatusNames[] = {"WL_IDLE_STATUS", "WL_NO_SSID_AVAIL", "WL_SCAN_COMPLETED",
                     "WL_CONNECTED", "WL_CONNECT_FAILED", "WL_CONNECTION_LOST","WL_DISCONNECTED"
                    };

Supla::ESPWifi wifi(WIFI_NETWORK,WIFI_PASSWORD);

class myCCS811: public Supla::Element {
  public:
    void onInit() override {
       // tu wstaw inicjalizację i2c/biblioteki ccs
      // oraz dodaj pierwszy odczyt z czujnika i ustawienie kanałów:
      if(!ccs.begin()){
        Serial.println("Failed to start sensor! Please check your wiring.");
      }
	    delay(200);
      if(ccs.available()){
		      if(!ccs.readData()){
			      Serial.print("CO2: ");
			      eCO2=ccs.geteCO2();
            TVOC=ccs.geteCO2();
			      Serial.print(eCO2);
			      Serial.print("ppm, TVOC: ");
			      Serial.println(TVOC);
		      }
		      else{
			      Serial.println("ERROR! Reading ccs811 failed.");
      		}		
	     }
      therm1.setValue(eCO2);
      therm2.setValue(TVOC);
    }

    void iterateAlways() override {
        if (millis() - lastReadTime > 20000) {
        lastReadTime = millis();
        if(ccs.available()){
		      if(!ccs.readData()){
            eCO2=ccs.geteCO2();
            TVOC=ccs.geteCO2();
			      Serial.print("CO2: ");
			      Serial.print(eCO2);
			      Serial.print("ppm, TVOC: ");
			      Serial.println(TVOC);
		      }
		      else{
			      Serial.println("ERROR! Reading ccs811 failed.");
      		}		
	     }
      // odczyt ccs'a, a następnie ustawienie wartości na kanały:
      therm1.setValue(eCO2);
      therm2.setValue(TVOC);
     }
    }

 protected:
   Supla::Sensor::VirtualThermometer therm1;
   Supla::Sensor::VirtualThermometer therm2;
   uint64_t lastReadTime = 0;
   double eCO2;
   double TVOC;
   Adafruit_CCS811 ccs; 

 };
 
void SuplaInit() {

  Serial.begin(115200);
  // Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
  char GUID[SUPLA_GUID_SIZE] = {xx};

  // Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {xx};

  auto css=new Supla::Sensor::ccs811();
 //ccs->getChannel()->setValidityTimeSec(5*60);
  /*
   * SuplaDevice Initialization.
   * Server address, LocationID and LocationPassword are available at https://cloud.supla.org 
   * If you do not have an account, you can create it at https://cloud.supla.org/account/create
   * SUPLA and SUPLA CLOUD are free of charge
   * 
   */
  SuplaDevice.setName("ESP32");
  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    "xx",  // SUPLA server address
                    "xx",   // Email address used to login to Supla Cloud
                    AUTHKEY);          // Authorization key
}

void setup()
{
    SuplaInit();
}

void loop()
{
    SuplaDevice.iterate();
}
tak wyglada moj kod w Arduino IDE pod ESP32, wczesniej kiedy miałem podłaczony moj kod sensora jako thermometer wywowyłałem channel tak: auto css=new Supla::Sensor::ccs811();

a teraz kiedy stworzyłem klase z typem ::Element nie wiem jak to wywołaś aby supla zarejestrowała mi te dwa termometry:)
krycha88
Posts: 5208
Joined: Fri Nov 16, 2018 7:25 am

Post

w setup() dodaj

Code: Select all

new myCCS811();
https://gui-generic-builder.supla.io/
wojaran
Posts: 8
Joined: Mon Aug 15, 2022 5:24 pm

Post

super działa!!
bardzo dziękuję za pomoc pozdrawiam
wojaran
Posts: 8
Joined: Mon Aug 15, 2022 5:24 pm

Post

To mam jeszcze jedno pytanie:)

Code: Select all

if (millis() - lastReadTime > 20000) {
ten fragment oznacza że wysyłany jest pomiar co 20sekund, a jeśli chcę go wydłużyć powyżej 30sekund to wywala połączenie ze suplą, czy da się zmienić czas sprawdzania przez suplę że to urzadzenie jest aktywne? albo jak zrobić aby pomiar był robiony z dłuższymi przerwami i żeby nie zrywało połaczenia z serwerem supli?
User avatar
klew
Posts: 8356
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Zwiększenie tego czasu nie powinno mieć wpływu na połączenie z serwerem. Czy to co wkleiłeś wcześniej to jest kompletny kod, którego używasz?
Widzimy się na Supla Offline Party vol. 2 :!:
wojaran
Posts: 8
Joined: Mon Aug 15, 2022 5:24 pm

Post

ok tego pytania nie było, coś widocznie inaczej robiłem w poprzedniej wersji, pewnie dawałem jakieś "delay'je nie potrzebnie i one coś blokowały.
wczoraj wyszła wersja SuplyDevice 22.10.01 (2022-10-03), ale kiedy skompilowałem ten skrypt z tą wersja, czujnik wykrywa na chwilę, ale potem pokazuje że jest rozłączony aż do resetu ESP, i podczas łączenia się z serwerem supli mam błąd SSL error: 48 padding .. coś tam, jak uzywam wersji 2.4.2 łączy sie bez błędow i wszystko działa? czy coś się zmieniło?

Return to “Ogólna dyskusja”