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);
}
