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
CCS811 czujnik jakości powietrza
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:
To pseudokod pisany na kolanie także popraw co trzeba i uzupełnij, ale powinno oddawać dobrze ideę
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;
}
Widzimy się na Supla Offline Party vol. 2
dziękuję bardzo
o właśnie coś takiego mi chodziło, tylko nie umiem jeszcze teraz tego wywołać,
a teraz nie umiem tego kanału wywołać czy mam wywołać element? czy jakoś te dwa therm1,therm2 jako sensory?
Pozdrawiam
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();
Pozdrawiam
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();
}
a teraz kiedy stworzyłem klase z typem ::Element nie wiem jak to wywołaś aby supla zarejestrowała mi te dwa termometry:)
w setup() dodaj
Kod: Zaznacz cały
new myCCS811();
https://gui-generic-builder.supla.io/
To mam jeszcze jedno pytanie:)
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?
Kod: Zaznacz cały
if (millis() - lastReadTime > 20000) {
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?
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?