HC-SR04

Juszczaczek1
Posts: 389
Joined: Sun Nov 08, 2020 3:41 pm
Been thanked: 2 times

Post

Witam wszystkich, przychodzę z pytaniem gdzie szukać problemu z zawieszającym się pomiarem z hcsr-04? Mam wgrany soft GG wybrane przekaźniki (2), ds18b20 (4) i hcsr-04. W GG ustawiona wysokość np 50cm. Soft działa do momentu aż czujnik nie zejdzie do ustawionej wartości wtedy już pokazuje ta wartość i nie reaguje na zmianę. Gdzie może leżeć problem? Czujnik do wymiany czy może to wina softu lub ESP? Dodam że mam esp32u z zewnątrzna anteną , sygnał w okolicach 85% .
User avatar
Zibi_007
Posts: 3985
Joined: Tue Oct 31, 2023 10:06 pm
Has thanked: 10 times
Been thanked: 31 times

Post

Juszczaczek1 wrote: Mon Jan 12, 2026 5:14 am Witam wszystkich, przychodzę z pytaniem gdzie szukać problemu z zawieszającym się pomiarem z hcsr-04? Mam wgrany soft GG wybrane przekaźniki (2), ds18b20 (4) i hcsr-04. W GG ustawiona wysokość np 50cm. Soft działa do momentu aż czujnik nie zejdzie do ustawionej wartości wtedy już pokazuje ta wartość i nie reaguje na zmianę. Gdzie może leżeć problem? Czujnik do wymiany czy może to wina softu lub ESP? Dodam że mam esp32u z zewnątrzna anteną , sygnał w okolicach 85% .
W GG jest stara wersja biblioteki NewPing i może być właśnie taki objaw, jak u Ciebie. Rozwiązanie? Najprościej skorzystać z rozwiązania kolegi @vajera i zrobić pomiar odległości przez SR-04 na kanale ogólnym pomiarowym. Na Forum są źródła i gotowy soft pod esp32c3. Poszukaj, bo z telefonu ciężko mi teraz znaleźć.
Image Wiesz, że Supla obsługuje Zigbee? Wstąp do Klubu Promila: https://forum.supla.org/viewtopic.php?t=18018
Image Szukasz nowego GG? Jest tutaj: https://forum.supla.org/viewtopic.php?t=18036
User avatar
vajera
Posts: 7290
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 289 times
Been thanked: 161 times

Post

Zibi_007 wrote: Mon Jan 12, 2026 9:05 am
Juszczaczek1 wrote: Mon Jan 12, 2026 5:14 am Witam wszystkich, przychodzę z pytaniem gdzie szukać problemu z zawieszającym się pomiarem z hcsr-04? Mam wgrany soft GG wybrane przekaźniki (2), ds18b20 (4) i hcsr-04. W GG ustawiona wysokość np 50cm. Soft działa do momentu aż czujnik nie zejdzie do ustawionej wartości wtedy już pokazuje ta wartość i nie reaguje na zmianę. Gdzie może leżeć problem? Czujnik do wymiany czy może to wina softu lub ESP? Dodam że mam esp32u z zewnątrzna anteną , sygnał w okolicach 85% .
W GG jest stara wersja biblioteki NewPing i może być właśnie taki objaw, jak u Ciebie. Rozwiązanie? Najprościej skorzystać z rozwiązania kolegi @vajera i zrobić pomiar odległości przez SR-04 na kanale ogólnym pomiarowym. Na Forum są źródła i gotowy soft pod esp32c3. Poszukaj, bo z telefonu ciężko mi teraz znaleźć.
viewtopic.php?t=17651
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
Juszczaczek1
Posts: 389
Joined: Sun Nov 08, 2020 3:41 pm
Been thanked: 2 times

Post

Czytałem ten temat ale tam jest chyba tylko HC-SR04 i 1ds18b20 a ja muszę mieć 4 ds i 2 przekaźniki dodatkowo ,
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Jeśli dobrze pamiętam (to było z 6 lat temu), to część HC sr04 miała jakąś wadę konstrukcyjną przez którą się zawieszała - szczególnie gdy czujnik nie miał obiektu od którego dźwięk się odbija i mierzył poza swój zakres.
Kojarzę że były w sieci jakieś poradniki co z tym zrobić.
Poszukaj w google po angielsku tego typu problemów
Najlepsze suple dla Twojego domu :mrgreen:
Juszczaczek1
Posts: 389
Joined: Sun Nov 08, 2020 3:41 pm
Been thanked: 2 times

Post

za pomocą GPT próbuje napisać kod pod ten hcsro4 ale jednego problemu nie umie rozwiązać. Jak zrobić, żeby podczas uruchamiania przekaźniki nie uruchamiały się na moment (około 2s) Kod wygląda tak:

Code: Select all

// Poprawka: wywołujemy bazowe turnOn/turnOff aby Supla zaktualizowała stan (ikonę)
// oraz pozostawiamy możliwość odwrócenia logiki przez RELAY_INVERTED.

#include <SuplaDevice.h>
#include <supla/device/status_led.h>
#include <supla/network/esp_web_server.h>
#include <supla/network/esp_wifi.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/sensor/DS18B20.h>
#include <supla/sensor/HC_SR04.h>
#include <supla/sensor/general_purpose_measurement.h>
#include <supla/control/virtual_relay.h>
#include <supla/storage/littlefs_config.h>

#include <OneWire.h>
#include <DallasTemperature.h>

#include "driver/gpio.h"
#include "esp_err.h"

#define STATUS_LED_GPIO     2
#define RELAY1_GPIO         26
#define RELAY2_GPIO         27
#define DS18B20_GPIO        4
#define HC_TRIG_GPIO        18
#define HC_ECHO_GPIO        19

// Jeśli przekaźniki są active-high (HIGH = ON) -> false
// Jeśli active-low (LOW = ON) -> true
const bool RELAY_INVERTED = true;

Supla::ESPWifi wifi;
Supla::LittleFsConfig configSupla;
Supla::Device::StatusLed statusLed(STATUS_LED_GPIO, true);
Supla::EspWebServer suplaServer;

OneWire oneWire(DS18B20_GPIO);
DallasTemperature sensors(&oneWire);

Supla::Sensor::GeneralPurposeMeasurement *hcChannel = nullptr;

// ---- Bezpieczna klasa sterująca GPIO na żądanie Supla ----
class HWVirtualRelay : public Supla::Control::VirtualRelay {
public:
  HWVirtualRelay(int gpioPin, bool inverted) : gpioPin(gpioPin), inverted(inverted) {}

  // Ustaw fizyczny stan zgodny z aktualnym stanem w Supla
  void onInit() override {
    bool on = isOn(); // pobiera aktualny stan kanału (jeśli Supla ma jakiś zapis)
    int level = (on ? (inverted ? LOW : HIGH) : (inverted ? HIGH : LOW));
    digitalWrite(gpioPin, level);
  }

  // Supla wywoła gdy użytkownik przełączy kanał -> najpierw powiadamiamy Suplę, potem GPIO
  void turnOn(_supla_int_t duration = 0) override {
    // najpierw zaktualizuj stan w Supla (zaktualizuje ikonę i wewnętrzny stan)
    Supla::Control::VirtualRelay::turnOn(duration);
    // potem wykonaj fizyczne przełączenie pinu
    digitalWrite(gpioPin, inverted ? LOW : HIGH);
  }

  void turnOff(_supla_int_t duration = 0) override {
    Supla::Control::VirtualRelay::turnOff(duration);
    digitalWrite(gpioPin, inverted ? HIGH : LOW);
  }

protected:
  int gpioPin;
  bool inverted;
};

// instancje
HWVirtualRelay *vrelay1 = nullptr;
HWVirtualRelay *vrelay2 = nullptr;

// GLOBALNY KONSTRUKTOR: zabezpieczenie pinów przed mruganiem
class _PreInit {
public:
  _PreInit() {
    int inactive = (RELAY_INVERTED ? HIGH : LOW);

    gpio_hold_dis((gpio_num_t)RELAY1_GPIO);
    gpio_hold_dis((gpio_num_t)RELAY2_GPIO);

    digitalWrite(RELAY1_GPIO, inactive);
    digitalWrite(RELAY2_GPIO, inactive);
    pinMode(RELAY1_GPIO, OUTPUT);
    pinMode(RELAY2_GPIO, OUTPUT);
  }
} _preinit_instance;
// --------------------------------------------------------------------

void setup() {
  Serial.begin(115200);

  new Supla::Html::DeviceInfo(&SuplaDevice);
  new Supla::Html::WifiParameters;
  new Supla::Html::ProtocolParameters;
  new Supla::Html::StatusLedParameters;

  // tworzymy virtual relaye (zarejestrują się w Supla)
  vrelay1 = new HWVirtualRelay(RELAY1_GPIO, RELAY_INVERTED);
  vrelay2 = new HWVirtualRelay(RELAY2_GPIO, RELAY_INVERTED);

  // HC-SR04
  hcChannel = new Supla::Sensor::GeneralPurposeMeasurement();
  hcChannel->setInitialCaption("Odległość");
  hcChannel->setDefaultUnitAfterValue("cm");
  pinMode(HC_TRIG_GPIO, OUTPUT);
  pinMode(HC_ECHO_GPIO, INPUT);

  // DS18B20
  sensors.begin();
  DeviceAddress tempAddr;
  int detected = 0;
  for (int i = 0; i < sensors.getDeviceCount(); i++) {
    if (sensors.getAddress(tempAddr, i)) {
      new Supla::Sensor::DS18B20(DS18B20_GPIO, tempAddr);
      detected++;
    }
  }
  Serial.printf("Wykryto %d czujniki DS18B20\n", detected);

  SuplaDevice.setInitialMode(Supla::InitialMode::StartInCfgMode);
  SuplaDevice.begin();
}

void loop() {
  SuplaDevice.iterate();

  digitalWrite(HC_TRIG_GPIO, LOW);
  delayMicroseconds(2);
  digitalWrite(HC_TRIG_GPIO, HIGH);
  delayMicroseconds(10);
  digitalWrite(HC_TRIG_GPIO, LOW);

  long duration = pulseIn(HC_ECHO_GPIO, HIGH, 30000);
  float distanceCm = 0;
  if (duration > 0) distanceCm = duration * 0.034 / 2.0;
  if (hcChannel && distanceCm > 0.0) {
    hcChannel->setValue(distanceCm);
  }

  delay(200);
}
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Co to jest HW virtual relay? ;)

Od tego jest klasa relay.
Klasa virtual relay obcina operacje w stylu digital write, a Ty je przywracasz ;)
Najlepsze suple dla Twojego domu :mrgreen:
Juszczaczek1
Posts: 389
Joined: Sun Nov 08, 2020 3:41 pm
Been thanked: 2 times

Post

gdzie mogę znaleźć przykład jak ma to wyglądać?
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Juszczaczek1 wrote: Wed Jan 14, 2026 4:36 pm gdzie mogę znaleźć przykład jak ma to wyglądać?
Nie wiem co ;)
Sam Relay I jego użycie jest w kilku przykładach, w tym w Web interface.

Przy okazji dziś w repo pojawił się plik z instrukcjami dla AI.
Wrzuć mu link do pliku LLM.md i zobacz czy będzie sobie lepiej radził.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
Zibi_007
Posts: 3985
Joined: Tue Oct 31, 2023 10:06 pm
Has thanked: 10 times
Been thanked: 31 times

Post

Juszczaczek1 wrote: Wed Jan 14, 2026 4:36 pm gdzie mogę znaleźć przykład jak ma to wyglądać?
Zajrzyj tutaj https://github.com/SUPLA/supla-device/b ... lRelay.ino
Image Wiesz, że Supla obsługuje Zigbee? Wstąp do Klubu Promila: https://forum.supla.org/viewtopic.php?t=18018
Image Szukasz nowego GG? Jest tutaj: https://forum.supla.org/viewtopic.php?t=18036

Return to “Pomoc”