CCS811 czujnik jakości powietrza

wojaran
Posty: 8
Rejestracja: pn sie 15, 2022 5:24 pm

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
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

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:

Kod: Zaznacz cały

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
Posty: 8
Rejestracja: pn sie 15, 2022 5:24 pm

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

Kod: Zaznacz cały

 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
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

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

Kod: Zaznacz cały

#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
Posty: 5187
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

w setup() dodaj

Kod: Zaznacz cały

new myCCS811();
https://gui-generic-builder.supla.io/
wojaran
Posty: 8
Rejestracja: pn sie 15, 2022 5:24 pm

super działa!!
bardzo dziękuję za pomoc pozdrawiam
wojaran
Posty: 8
Rejestracja: pn sie 15, 2022 5:24 pm

To mam jeszcze jedno pytanie:)

Kod: Zaznacz cały

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?
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

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
Posty: 8
Rejestracja: pn sie 15, 2022 5:24 pm

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?
ODPOWIEDZ

Wróć do „Ogólna dyskusja”