Analogowy KPOP - AKPOP

iM@rek
Posts: 343
Joined: Thu Feb 09, 2023 1:25 pm

Post

Dla KPOP trzeba ustawić nast. dane:

Code: Select all

1.
// plik nagłówkowy:
#include <supla/sensor/general_purpose_measurement.h>
2.
// dodajemy wskaźnik do kanału, jako zmienną globalną (aby mieć do niego dostęp w setup i w loop):
Supla::Sensor::GeneralPurposeMeasurement *gpm = nullptr;
3.
// w setup tworzymy instancję kanału:
gpm = new Supla::Sensor::GeneralPurposeMeasurement();
4.
// i przykładowy loop wygląda tak:
void loop() {
  SuplaDevice.iterate();
  static uint32_t lastTime = 0;
  if (millis() - lastTime > 1000) {
    lastTime = millis();
    // set some new value on gpm:
    gpm->setValue(millis() / 1000.0);
  }
}
Co trzeba ustawić dla Analogowego KPOP?

EDIT:

Zrobiłem jak poniżej i działa (w każdym razie się kompiluje bez błędów):

ad. 1. // plik nagłówkowy:
#include <supla/sensor/general_purpose_measurement.h>
ad. 2. // wskaźnik do kanału:
Supla::Sensor::GeneralPurposeMeasurement *akpop = nullptr;
ad. 3. instancja kanału:
akpop0 = new Supla::Sensor::AnalogReading()

A jak mam ustawić/podać wartości wejściowe i oczekiwane?
User avatar
veeroos
Posts: 491
Joined: Sun Mar 20, 2022 9:30 am
Location: Głogów

Post

a nie lepiej Ci zrobić wszystko funkcją "map" i wynik zapisywać do kanału?
w loopie zrobisz korzystając z przykładu na przykład coś takiego:

Code: Select all

void loop() {
  SuplaDevice.iterate();
  static uint32_t lastTime = 0;
  if (millis() - lastTime > 1000) {
    lastTime = millis();
    akpop ->setValue( map(analogRead(pin_analogowy), wejściowa_min, wejściowa_max, oczekiwana_min, oczekiwana_max));
  }
}
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
iM@rek
Posts: 343
Joined: Thu Feb 09, 2023 1:25 pm

Post

veeroos wrote: Tue Jun 11, 2024 5:14 am
Pewnie, że lepiej.
Tylko nie wiedziałem, jak to zrobić.
Dziękuję.
W sumie to tylko jeszcze nie wiem, jak skalibrować wartości wejściowe.
User avatar
veeroos
Posts: 491
Joined: Sun Mar 20, 2022 9:30 am
Location: Głogów

Post

Musiałbyś na szybko zrobić szkic który będzie Ci zwracał w terminalu wartość odczytaną z pinu analogowego. Nie napisałeś do czego to będziesz używał, czy do pomiaru napięcia, czy masz czujnik ciśnienia z wyjściem napięciowym czy cokolwiek innego też z wyjściem napięciowym, jeśli napięcie to wartość minimalną masz zawsze 0, wartość maksymalną podajesz na wejście i odczytujesz wartość w terminalu. Tylko musisz pamiętać, że na wejście esp32 możesz podać max 3,3v, do wemosa mini, node MCU i innych dev płytkach też (jest tam fabrycznie montowany dzielnik napięcia 220k/100k), ale już gołe esp8266, czy też jakieś ESP12, esp-07 itp na wejście możesz maksymalnie 1V podać, bo tam nie ma tego dzielnika napięcia. Jeśli masz czujniki z wyjściem napięciowym to w dokumentacji powinieneś mieć podane jakie napięcie masz przy minimalnej i maksymalnej wartości. Wielkością wejściową maksymalną dla esp8266 jest 1023, a dla esp32 - 4095. Czyli przy maksymalnym dopuszczalnym napięciu, układ będzie nam zwracał taką wartość.
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
iM@rek
Posts: 343
Joined: Thu Feb 09, 2023 1:25 pm

Post

veeroos wrote: Tue Jun 11, 2024 10:32 am
To do czujnika deszczu. Zabawka.
Dziękuję za przypomnienie zakresów napięć wejściowych dla różnych modułów.
W moim przypadku to ESP32, stacja pogody, dalsza rozbudowa.
Zrobię odczyt zakresów w terminalu.
Jeszcze raz dzięki za pomoc.
iM@rek
Posts: 343
Joined: Thu Feb 09, 2023 1:25 pm

Post

Zrobiłem kilka kanałów, jeden z nich bezpośrednio odczytuje napięcie, bez mapowania.
Na drugim użyłem funkcji "map".
Przez kilka dni pojawiały się dziwne, niestabilne odczyty napięć, w zakresie 2100 - 2400 dla suchego czujnika, a wg info powinno być 4095.
Te odczyty zmieniały się co kilka sekund - co aktualizację.
Wczoraj zmieniłem typ zmiennych z "float" na "int" i wprowadziłem dodatkową zmienną "int val" jako pośrednika przy odczytach.

Code: Select all

    int val = analogRead(akp0_Pin);    ->>>> nowa zmienna
    //akp0 ->setValue(analogRead(akp0_Pin));   ->>>>> tak było
    akp0 ->setValue(val);
    akp1 ->setValue(map(val, akp1_Vmin, akp1_Vmax, akp_Emin, akp_Emax));
 
Zaraz potem przyszła ulewa.
Dzisiaj rano sprawdziłem i czujnik bezpośredni pokazuje stabilnie 4095.
Podlałem go testowo i odczyt się zmniejszył do około 500, ale po kilku minutach, gdy woda wyschła, pokazuje stabilne 4095.
I tak jest od paru godzin.
No i w sumie nie wiem, co było przyczyną tych dziwnych, niestabilnych wskazań:
- zmienne typu float
- brak pośrednika - zmiennej int val
- zabrudzony czujnik - wydawał się być czysty
User avatar
lukfud
Posts: 2173
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

iM@rek wrote: Thu Jun 20, 2024 8:55 am

Code: Select all

double mapDouble(double val, double in_min, double in_max, double out_min, double out_max) {
  return (val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Code: Select all

class GPMAnalogSensor : public Supla::Sensor::GeneralPurposeMeasurement {
 public: GPMAnalogSensor(Supla::Io *io, int pin, uint32_t in_min = 0,
  uint32_t in_max = 32767, double out_min = 0.00, double out_max = 100.00,
                                                         int32_t nanValue = -1)
    : pin(pin), in_min(in_min), in_max(in_max), out_min(out_min),
                                  out_max(out_max), nanValue(nanValue),
                                    GeneralPurposeMeasurement(nullptr, false) {
    this->io = io;
    setDefaultUnitAfterValue("?");
    setDefaultValuePrecision(2);
  }

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

  double getRawValue() {
    _rawValue = Supla::Io::analogRead(pin, io);
    SUPLA_LOG_DEBUG("GPM[%d] raw value: %d", pin, _rawValue);
    return _rawValue;
  }
  
  double getValue() override {
    double _raw = getRawValue();
    if (_raw < nanValue) {
      value = NAN;
    } else {
      value = mapDouble(_raw, in_min, in_max, out_min, out_max);
      value = (value < 0) ? 0 : value;
    }
    return value;
  }

 protected:
  int pin;
  int32_t _rawValue = 0;
  uint32_t in_min = 0;
  uint32_t in_max = 32767;
  int32_t nanValue = -1;
  double out_min = 0;
  double out_max = 100;
  double value = NAN;
  Supla::Io *io = nullptr;
};
https://www.facebook.com/groups/supladiy/
iM@rek
Posts: 343
Joined: Thu Feb 09, 2023 1:25 pm

Post

Czy dobrze to rozumiem?
- mapowanie dopuszcza double (float),
--- double mapDouble()

- klasa class GPMAnalogSensor dopuszcza int na wejściach:
--- uint32_t in_min = 0, uint32_t in_max = 32767,
ale na wyjściach już double:
--- double out_min = 0.00, double out_max = 100.00,

Czyli ograniczeniem są dane wejściowe, które muszą być typu int.?

Return to “supla-dev”