HC-SR04

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

Post

wrzuciłem czatowi instrukcje, cos poprawił, działają przekaźniki właściwie ale nadal załączaj sie na chwile podczas startu ESP, na razie tak zostawię bo już chyba więcej czat nie wymyśli i nie mam więcej cierpliwości do niego :p

Code: Select all

// ----------------------------------------------
// SUPLA Device – ESP32/ESP32-S3 z 2 przekaźnikami, DS18B20 i HC-SR04
// Poprawka: strona konfiguracyjna działa
// ----------------------------------------------

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

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

#include "driver/gpio.h"

// PINY
#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

const bool RELAY_INVERTED = false;

// SUPLA – OBIEKTY
Supla::ESPWifi wifi;
Supla::LittleFsConfig configSupla;
Supla::Device::StatusLed statusLed(STATUS_LED_GPIO, true);
Supla::EspWebServer suplaServer; // musi istnieć

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

Supla::Sensor::GeneralPurposeMeasurement *hcChannel = nullptr;
Supla::Control::Relay *relay1 = nullptr;
Supla::Control::Relay *relay2 = nullptr;

// PREINIT – BEZPIECZNE PRZEKAŹNIKI
class _PreInit {
public:
  _PreInit() {
    int inactive = (RELAY_INVERTED ? 1 : 0);

    gpio_config_t io_conf = {};
    io_conf.intr_type = GPIO_INTR_DISABLE;
    io_conf.mode = GPIO_MODE_OUTPUT;
    io_conf.pin_bit_mask = (1ULL << RELAY1_GPIO) | (1ULL << RELAY2_GPIO);
    io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
    io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
    gpio_config(&io_conf);

    gpio_set_level((gpio_num_t)RELAY1_GPIO, inactive);
    gpio_set_level((gpio_num_t)RELAY2_GPIO, inactive);

    gpio_hold_dis((gpio_num_t)RELAY1_GPIO);
    gpio_hold_dis((gpio_num_t)RELAY2_GPIO);
  }
} _preinit_instance;

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

  relay1 = new Supla::Control::Relay(RELAY1_GPIO, RELAY_INVERTED);
  relay2 = new Supla::Control::Relay(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 = sensors.getDeviceCount();
  Serial.printf("Wykryto %d czujniki DS18B20\n", detected);
  for (int i = 0; i < detected; i++) {
    if (sensors.getAddress(tempAddr, i)) {
      new Supla::Sensor::DS18B20(DS18B20_GPIO, tempAddr);
    }
  }

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

  // ---> TYLKO BEGIN bez podawania wskaźnika webservera
  SuplaDevice.begin();

  // HTML konfiguracyjny
  new Supla::Html::DeviceInfo(&SuplaDevice);
  new Supla::Html::WifiParameters;
  new Supla::Html::ProtocolParameters;
  new Supla::Html::StatusLedParameters;
}

// LOOP
void loop() {
  SuplaDevice.iterate();

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

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

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

Post

Jak sterujesz przekaźnikami? Stanem niskim czy wysokim?
Najlepsze suple dla Twojego domu :mrgreen:
Juszczaczek1
Posts: 389
Joined: Sun Nov 08, 2020 3:41 pm
Been thanked: 2 times

Post

klew wrote: Wed Jan 14, 2026 6:45 pm Jak sterujesz przekaźnikami? Stanem niskim czy wysokim?
Takie cudo mam
Właśnie udało mi się znaleźć to na AliExpress:
7,66zł | Moduł przekaźnika 3 V 1/2/4-kanałowy moduł przekaźnika wyjściowego przekaźnika wyzwalonego niskiego poziomu przyjmuje здатність jazdy tranzystorem 8550
https://a.aliexpress.com/_EGJvRhe
User avatar
klew
Posts: 13908
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 6:51 pm
Ok, czyli wyzwalany stanem niskim.
Kilka lat temu ten temat był ogarniany dla esp8266 pod Arduino. Na esp-idf też to jest ogarnięte.
Ale jak to teraz się zachowuje na esp32 na Arduino - nie mam pojęcia ;)
Teoretycznie jest ustawienie pinmode przed digitalWrite, ale z tego co piszesz, to to nie działa dobrze.

Najprościej:
Wyrzucić wszystko z projektu.
Dodaj tylko ustawienie pinmode i digital write na high.
Kombinuj na tym prostym przykładzie, aż przestanie cykać na starcie. Jak już ustalisz co działa, daj tu kod :)
Najlepsze suple dla Twojego domu :mrgreen:
Juszczaczek1
Posts: 389
Joined: Sun Nov 08, 2020 3:41 pm
Been thanked: 2 times

Post

Udało się poprawić kod. Teraz nie cyka przy starcie. Zobaczymy czy po kilku dniach będzie stabilnie.Dzieki wszystkim za pomoc i wskazówki.

Code: Select all

// ----------------------------------------------
// SUPLA Device – ESP32 | Active Low | HC-SR04 Pro Filtered
// ----------------------------------------------

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

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

// PINY
#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

Supla::ESPWifi wifi;
Supla::LittleFsConfig configSupla;
Supla::Device::StatusLed statusLed(STATUS_LED_GPIO, true); // true = dioda na ESP32 (GND)
Supla::EspWebServer suplaServer;

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

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

// --- ZAAWANSOWANY FILTR ŚREDNIEJ KROCZĄCEJ ---
const int numReadings = 10;
float readings[numReadings];
int readIndex = 0;
float total = 0;
float averageDist = 0;

void readDistance() {
static unsigned long lastMeasurement = 0;
if (millis() - lastMeasurement < 1000) return; // Pomiar co 1 sekunda
lastMeasurement = millis();

// Sekwencja Trig
digitalWrite(HC_TRIG_GPIO, LOW);
delayMicroseconds(5);
digitalWrite(HC_TRIG_GPIO, HIGH);
delayMicroseconds(10);
digitalWrite(HC_TRIG_GPIO, LOW);

// Pomiar Echo z timeoutem 20ms (~340cm)
unsigned long duration = pulseIn(HC_ECHO_GPIO, HIGH, 20000UL);

if (duration == 0) return; // Jeśli brak echa, pomiń ten cykl

float currentDistance = (duration * 0.0343f) / 2.0f;

// Ignoruj błędy zakresu czujnika
if (currentDistance < 2.0f || currentDistance > 450.0f) return;

// Logika filtra kołowego
total -= readings[readIndex];
readings[readIndex] = currentDistance;
total += readings[readIndex];
readIndex++;

if (readIndex >= numReadings) readIndex = 0;

averageDist = total / numReadings;

// Wysłanie do Supli (tylko jeśli wartość jest liczbą)
if (hcChannel && isfinite(averageDist)) {
hcChannel->setValue(averageDist);
}
}

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

// 1. Inicjalizacja zmiennych filtra
for (int i = 0; i < numReadings; i++) readings[i] = 0;
total = 0;
readIndex = 0;
averageDist = 0;

// 2. PRZEKAŹNIKI: ACTIVE LOW (Zgodnie z Twoimi ustawieniami)
// Cisza na pinach przy starcie (HIGH = wyłączony dla Twoich modułów)
pinMode(RELAY1_GPIO, OUTPUT);
digitalWrite(RELAY1_GPIO, HIGH);
pinMode(RELAY2_GPIO, OUTPUT);
digitalWrite(RELAY2_GPIO, HIGH);

// 3. KONFIGURACJA KANAŁÓW SUPLA
// Parametr 'false' = sterowanie stanem niskim
auto r1 = new Supla::Control::Relay(RELAY1_GPIO, false);
r1->setDefaultStateOff();

auto r2 = new Supla::Control::Relay(RELAY2_GPIO, false);
r2->setDefaultStateOff();

// HC-SR04 - Kanał pomiarowy
hcChannel = new Supla::Sensor::GeneralPurposeMeasurement();
hcChannel->setInitialCaption("Poziom wody");
hcChannel->setDefaultUnitAfterValue("cm");
// Opcjonalnie: hcChannel->setDefaultIcon(X); // Możesz ustawić ikonę przez Cloud

pinMode(HC_TRIG_GPIO, OUTPUT);
pinMode(HC_ECHO_GPIO, INPUT);

// DS18B20
sensors.begin();
DeviceAddress tempAddr;
int detected = sensors.getDeviceCount();
for (int i = 0; i < detected; i++) {
if (sensors.getAddress(tempAddr, i)) {
new Supla::Sensor::DS18B20(DS18B20_GPIO, tempAddr);
}
}

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

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

void loop() {
SuplaDevice.iterate();
readDistance();
} 
User avatar
veeroos
Posts: 1081
Joined: Sun Mar 20, 2022 9:30 am
Location: Głogów
Has thanked: 1 time
Been thanked: 9 times

Post

Tak z mojej strony jak mogę doradzić to zrób zapisanie ilości czujników do pamięci nieulotnej, bo jak tak zrobisz a jakiś czujnik się rozłączy, to pojawi się konflikt kanałów i urządzenie może być widoczne offline, a jeśli będziesz miał zapisaną ilość czujników to jak wypadnie czujnik to nie będziesz miał na nim odczytu, ale urządzenie będzie on-line. Będziesz widział że czujnik wyleciał. Najlepiej by było żebyś miał.zapis adresów czujników do pamięci wtedy będziesz wiedział który czujnik wypadł, bo tak to zawsze czujnik 4 będzie niewidoczny jak wypadnie jeden czujnik. Ale to tak ode mnie, trochę trzeba się napisać kodu żeby to zrobić, ale nie jest to niewykonalne, tak działa program w GG zobacz do niego i na jego podstawie zrób tak samo,.źródła GG są dostępne.
Zamel Mew-01, Zamel PEW-01, Zamel SBW-01, Zamel THW-01, Zamel SRW-01, Zamel mSLW-02, Auraton BOX + Indor Sensor, Airly Gate By Veeroos, Zigbee to Supla Gateway + sensors, Zamel SGW-01 and more

https://github.com/v33r005
Juszczaczek1
Posts: 389
Joined: Sun Nov 08, 2020 3:41 pm
Been thanked: 2 times

Post

veeroos wrote: Sat Jan 17, 2026 8:01 pm Tak z mojej strony jak mogę doradzić to zrób zapisanie ilości czujników do pamięci nieulotnej, bo jak tak zrobisz a jakiś czujnik się rozłączy, to pojawi się konflikt kanałów i urządzenie może być widoczne offline, a jeśli będziesz miał zapisaną ilość czujników to jak wypadnie czujnik to nie będziesz miał na nim odczytu, ale urządzenie będzie on-line. Będziesz widział że czujnik wyleciał. Najlepiej by było żebyś miał.zapis adresów czujników do pamięci wtedy będziesz wiedział który czujnik wypadł, bo tak to zawsze czujnik 4 będzie niewidoczny jak wypadnie jeden czujnik. Ale to tak ode mnie, trochę trzeba się napisać kodu żeby to zrobić, ale nie jest to niewykonalne, tak działa program w GG zobacz do niego i na jego podstawie zrób tak samo,.źródła GG są dostępne.
Dzięki za wskazówki spróbuję coś takiego zrobić za pomocą gpt 😀

Return to “Pomoc”