Wsparcie dla czujnika AHT10

User avatar
QLQ
Posts: 2354
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Post

@klew - może warto było by dodać wsparcie czujnika AHT20 - występuje razem z BMP280 - taki zamiennik BME280. Cena tego AHT20 + BMP280 to około 8 zł - jak porównamy z BME około 30 złociszy .... można o tym pomyśleć może ?
takie combo: https://pl.aliexpress.com/item/10050045 ... usXaLU3yX4
jak coś nie działa to włącz zasilanie.....
User avatar
veeroos
Posts: 652
Joined: Sun Mar 20, 2022 9:30 am
Location: Głogów

Post

w sumie z tym Combo czujnikiem fajna sprawa. Można by było zrobić na podstawie biblioteki od BME280, tylko teraz czy BMP czy AHT byłby odpowiedzialny za odczyt temperatury, no chyba żeby zostawić oba pomiary temperatury. Ja na szybko zrobiłem na podstawie biblioteki z SuplaDevice BME280.h bibliotekę która odczytuje temperaturę i wilgotność z AHT a ciśnienie bierze z BMP. nie robiłem tylko korekty w stosunku do wysokości NPM, ale działa.
Link do biblioteki:
https://github.com/v33r005/Supla/blob/m ... or/Combo.h

wywołujemy standardowo
new Supla::Sensor::Combo();
musi być zainstalowana biblioteka:
Adafruit_AHTX0.h

u mnie to chodzi, wiadomo, że można by było to lepiej zrobić, ale na moje potrzeby to starcza.
Zamel Mew-01, Wemos D1 mini Pro + Ikea vindriktning + BME280, 3x - SonOff mini, 3x - SonOff Basic, 3xGosund SP111, SonOff S55, 2x GOSUND WB4

https://github.com/v33r005
User avatar
klew
Posts: 10757
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

veeroos wrote: Fri Feb 17, 2023 7:37 am w sumie z tym Combo czujnikiem fajna sprawa. Można by było zrobić na podstawie biblioteki od BME280, tylko teraz czy BMP czy AHT byłby odpowiedzialny za odczyt temperatury, no chyba żeby zostawić oba pomiary temperatury. Ja na szybko zrobiłem na podstawie biblioteki z SuplaDevice BME280.h bibliotekę która odczytuje temperaturę i wilgotność z AHT a ciśnienie bierze z BMP. nie robiłem tylko korekty w stosunku do wysokości NPM, ale działa.
Link do biblioteki:
https://github.com/v33r005/Supla/blob/m ... or/Combo.h

wywołujemy standardowo
new Supla::Sensor::Combo();
musi być zainstalowana biblioteka:
Adafruit_AHTX0.h

u mnie to chodzi, wiadomo, że można by było to lepiej zrobić, ale na moje potrzeby to starcza.
Ogólnie najlepiej by było, gdyby we własnych rozszerzeniach do supla-device, nie używać oficjalnego namespace "Supla". Wynika to z tego, że może się zdarzyć, że dodam potem klasę o takiej samej nazwie, np. Supla::Sensor::Combo i ten kod przestanie się kompilować. Raczej takiej klasy nie dodam, ale podaję to jako przykład. Można używać własnych nazw, w stylu Veeroos::Sensor::Combo, albo SuplaExt:: Sensor::Combo itd. Wtedy minimalizujemy potencjalne problemy z konfliktem nazwy i użytkownicy też mają większą jasność skąd co pochodzi.
Natomiast namespace Supla zostaw, jeśli zamierzasz zrobić PR do oficjalnej biblioteki, aby w ten sposób udostępnić innym Twoją pracę.

Osobiście też nie widzę potrzeby łączenia dwóch czujników w jedną klasę. Klasa "thermo hygro press meter" to taka mocna proteza, bo BME ma pomiar tych trzech wartości, a Supla używa do tego dwóch osobnych kanałów. Równie dobrze mógłbyś dodać dwie osobne klasy dla osobnych czujników - dzięki temu można użyć obu sensorów osobno bez konieczności posiadania obu i kod jest nieco prostszy.
User avatar
veeroos
Posts: 652
Joined: Sun Mar 20, 2022 9:30 am
Location: Głogów

Post

W sumie to masz rację. mając te biblioteki piszemy kod typu:

Code: Select all

/*
  Copyright (C) AC SOFTWARE SP. Z O.O.

  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License
  as published by the Free Software Foundation; either version 2
  of the License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

/* This example shows ESP82xx/ESP32 based device with simple WebInterface
 * used to configure Wi-Fi parameters and Supla server connection.
 * There is one RollerShutter, one Relay and 3 buttons configured.
 * Two buttons are for roller shutter with Action Trigger.
 * Third button is for controlling the relay and for switching module to
 * config mode.
 * After fresh installation, device will be in config mode. It will have its
 * own Wi-Fi AP configured. You should connect to it with your mobile phone
 * and open http://192.168.4.1 where you can configure the device.
 * Status LED is also configured. Please adjust GPIOs to your HW.
 */

#define STATUS_LED_GPIO 2
#define BUTTON_CFG_RELAY_GPIO 0
#include <Adafruit_BMP280.h>
#include <Adafruit_AHTX0.h>
#include <SuplaDevice.h>
#include <supla/network/esp_wifi.h>
#include <supla/control/button.h>
#include <supla/control/action_trigger.h>
#include <supla/device/status_led.h>
#include <supla/storage/littlefs_config.h>
#include <supla/network/esp_web_server.h>
#include <supla/network/html/device_info.h>
#include <supla/network/html/protocol_parameters.h>
#include <supla/network/html/status_led_parameters.h>
#include <supla/network/html/wifi_parameters.h>
#include <supla/device/supla_ca_cert.h>
#include <supla/events.h>
#include <supla/sensor/therm_hygro_meter.h>
#include <supla/sensor/pressure.h>
// Choose where Supla should store roller shutter data in persistent memory
// We recommend to use external FRAM memory
#include <supla/storage/eeprom.h>
Supla::Eeprom eeprom;
// #include <supla/storage/fram_spi.h>
// Supla::FramSpi fram(STORAGE_OFFSET);

Supla::ESPWifi wifi;
Supla::LittleFsConfig configSupla;

Supla::Device::StatusLed statusLed(STATUS_LED_GPIO, true); // inverted state
Supla::EspWebServer suplaServer;

Adafruit_AHTX0 aht; 
Adafruit_BMP280 bmp;
class Czujnik_AHT : public Supla::Sensor::ThermHygroMeter {
 public:
  explicit Czujnik_AHT() {
  }

  double getTemp() {
    temperature = temp.temperature;
    if (isnan(temperature)) {
      temperature = TEMPERATURE_NOT_AVAILABLE;
    }

    if (temperature == TEMPERATURE_NOT_AVAILABLE) {
      retryCountTemp++;
      if (retryCountTemp > 3) {
        retryCountTemp = 0;
      } else {
        temperature = lastValidTemp;
      }
    } else {
      retryCountTemp = 0;
    }
    lastValidTemp = temperature;

    return temperature;
  }

  double getHumi() {
    humidity = humi.relative_humidity;
    if (isnan(humidity)) {
      humidity = HUMIDITY_NOT_AVAILABLE;
    }

    if (humidity == HUMIDITY_NOT_AVAILABLE) {
      retryCountHumi++;
      if (retryCountHumi > 3) {
        retryCountHumi = 0;
      } else {
        humidity = lastValidHumi;
      }
    } else {
      retryCountHumi = 0;
    }
    lastValidHumi = humidity;
    return humidity;
  }

 private:
  void iterateAlways() {
    aht.getEvent(&humi, &temp);
    if (millis() - lastReadTime > 10000) {
      lastReadTime = millis();
      
      channel.setNewValue(getTemp(), getHumi());
    }
  }

  void onInit() {
    aht.getEvent(&humi, &temp);// populate temp and humidity objects with fresh data
    channel.setNewValue(getTemp(), getHumi());
  }

 protected:
  sensors_event_t humi, temp;
  
  int8_t address;
  double temperature = TEMPERATURE_NOT_AVAILABLE;
  double humidity = HUMIDITY_NOT_AVAILABLE;
  double lastValidTemp;
  double lastValidHumi;
  int8_t retryCountTemp;
  int8_t retryCountHumi;
  int8_t retryCount = 0;
  
};
 class Cisnienie : public Supla::Sensor::Pressure {
 public:
  explicit Cisnienie() {
  }
  double get_pressure(){
 cisnienie = pressure_event.pressure;
 return cisnienie;
  }
  private:
  void iterateAlways() {
    bmp_pressure->getEvent(&pressure_event);
    if (millis() - lastReadTime > 10000) {
      lastReadTime = millis();
      
      channel.setNewValue(get_pressure());
    }
  }

  void onInit() {
    
    channel.setNewValue(get_pressure());
  }
  protected:
  Adafruit_Sensor *bmp_pressure = bmp.getPressureSensor();
  sensors_event_t pressure_event;\
  double cisnienie;
 };

Supla::Html::DeviceInfo htmlDeviceInfo(&SuplaDevice);
Supla::Html::WifiParameters htmlWifi;
Supla::Html::ProtocolParameters htmlProto;
Supla::Html::StatusLedParameters htmlStatusLed;

void setup() {

  Serial.begin(115200);
  if (! aht.begin()) {
    Serial.println("Could not find AHT? Check wiring");
    while (1) delay(10);
  }
  if (!bmp.begin()) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1) delay(10);
  }
  // Channels configuration
  // CH 0 - Roller shutter
 
  auto buttonCfgRelay =
    new Supla::Control::Button(BUTTON_CFG_RELAY_GPIO, true, true);

  new Czujnik_AHT();
  new Cisnienie();
  buttonCfgRelay->configureAsConfigButton(&SuplaDevice);
  

  // configure defualt Supla CA certificate
  SuplaDevice.setSuplaCACert(suplaCACert);
  SuplaDevice.setSupla3rdPartyCACert(supla3rdCACert);

  SuplaDevice.begin();
}

void loop() {
  SuplaDevice.iterate();
}
I załatwiamy całą sprawę nie ingerując w inne biblioteki
Zamel Mew-01, Wemos D1 mini Pro + Ikea vindriktning + BME280, 3x - SonOff mini, 3x - SonOff Basic, 3xGosund SP111, SonOff S55, 2x GOSUND WB4

https://github.com/v33r005
User avatar
klew
Posts: 10757
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

veeroos wrote: Fri Feb 17, 2023 9:19 am W sumie to masz rację. mając te biblioteki piszemy kod typu:
Zupełnie nie to miałem na myśli :)

Chodziło mi o to, że takie "Combo" nie jest konieczne.
Lepiej dodać osobno BMP i AHT, w stylu:

Code: Select all

  new Supla::Sensor::AHT10(...);
  new Supla::Sensor::BMP(...);
  
  // zamiast:
  new Supla::Sensor::Combo();
Chodzi o to, że "Combo" można użyć tylko jak masz oba sensory u siebie podłączone. Natomiast mając osobne klasy BMP i AHT, będzie można użyć ich razem (jak w combo) ale też osobno, jeśli ktoś nie ma takiego "combo" :).
User avatar
veeroos
Posts: 652
Joined: Sun Mar 20, 2022 9:30 am
Location: Głogów

Post

A no w sumie tak, no to dodajcie czujniki AHT do wyboru i zadowolicie dużą część odbiorców, a zwłaszcza tych, którzy chcą mieć taniej czujnik o możliwościach BME280 😉, a nie za bardzo radzą sobie z kodem 😉
Zamel Mew-01, Wemos D1 mini Pro + Ikea vindriktning + BME280, 3x - SonOff mini, 3x - SonOff Basic, 3xGosund SP111, SonOff S55, 2x GOSUND WB4

https://github.com/v33r005
User avatar
klew
Posts: 10757
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

veeroos wrote: Fri Feb 17, 2023 9:38 am A no w sumie tak, no to dodajcie czujniki AHT do wyboru i zadowolicie dużą część odbiorców, a zwłaszcza tych, którzy chcą mieć taniej czujnik o możliwościach BME280 😉, a nie za bardzo radzą sobie z kodem 😉
Już to prawie zrobiłeś i do tego masz czujnik aby sprawdzić czy działa.
Dodaj klasę do biblioteki i zrób PR
milanos
Posts: 24
Joined: Thu Sep 01, 2022 8:20 am

Post

Czy jest szansa na dodanie AHT10 do GUI, albo jak można wspomóc wdrożenie AHT10 do GUI ? Cena AHT10 vs BME280 vs DHT22 jest kluczowym argumentem
User avatar
veeroos
Posts: 652
Joined: Sun Mar 20, 2022 9:30 am
Location: Głogów

Post

klew wrote: Fri Feb 17, 2023 9:47 am Już to prawie zrobiłeś i do tego masz czujnik aby sprawdzić czy działa.
Dodaj klasę do biblioteki i zrób PR
W sumie kolega @milanos zrobił już bibliotekę jedynie co to nie jest w niej potrzebne podtrzymanie wartości temperatury i wilgotności przy braku odczytu. Wywaliłem to i powinno chodzić zarówno dla czujników AHT10 i AHT20. U mnie na czujniku podwójnym (BMP + AHT) działa doskonale. Link do biblioteki:
https://github.com/v33r005/Supla/tree/m ... pla/sensor
Możesz ją poprawić jak zobaczysz błędy, a jak nie to jak możesz to dodaj do SuplaDevice.
Zamel Mew-01, Wemos D1 mini Pro + Ikea vindriktning + BME280, 3x - SonOff mini, 3x - SonOff Basic, 3xGosund SP111, SonOff S55, 2x GOSUND WB4

https://github.com/v33r005
User avatar
klew
Posts: 10757
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

veeroos wrote: Fri Feb 17, 2023 12:11 pm
klew wrote: Fri Feb 17, 2023 9:47 am Już to prawie zrobiłeś i do tego masz czujnik aby sprawdzić czy działa.
Dodaj klasę do biblioteki i zrób PR
W sumie kolega @milanos zrobił już bibliotekę jedynie co to nie jest w niej potrzebne podtrzymanie wartości temperatury i wilgotności przy braku odczytu. Wywaliłem to i powinno chodzić zarówno dla czujników AHT10 i AHT20. U mnie na czujniku podwójnym (BMP + AHT) działa doskonale. Link do biblioteki:
https://github.com/v33r005/Supla/tree/m ... pla/sensor
Możesz ją poprawić jak zobaczysz błędy, a jak nie to jak możesz to dodaj do SuplaDevice.
Niestety nie mogę dodać kodu, którego nie jestem autorem. Możesz zrobić PR do repozytorium, wtedy zrobię review i poproszę o ewentualne zmiany, jeśli coś będzie potrzebne. Dodatkowo będziesz poproszony o zaakpectowanie warunków licencji.

Return to “Zagadnienia ogólne”