Sterowanie bojlera

elegantandrogyne
Posty: 4
Rejestracja: pn mar 09, 2020 8:07 pm

Się pochwalę, a co :)
Celem projektu w wersji podstawowej jest włączanie bojlera tylko w wybranych godzinach dnia, konkretnie w 3...7 i 13...16 (taryfa G12r u Energi). Oprócz tego możliwość ręcznego włączenia/wyłączenia i pomiar temperatury na bieżąco.
Planuję rozwinąć o różne programy temperaturowe (np. 3...7 grzać do 80°C, 13-15 do 50°C, a raz na tydzień albo dwa zagrzać do 85°C w celu wybicia legionelli).
Bojler to Stiebel Eltron SH120S (niestety nie SHZ, gdzie trzeba zrobić mniej przeróbek). Oryginalnie wygląda tak:
WP_20200305_006.jpg
WP_20200305_006.jpg (1.95 MiB) Przejrzano 3668 razy
Dodaję stycznik, zasilacz wtyczkowy 5V w obudowie Z60 oraz elektronikę Olimex ESP8266-EVB + MOD-WIFI-ESP8266-DEV.
Wykorzystuję do tego fabryczne "szyny" TH35 i mocowanie od szyny zaciskowej N.
WP_20200307_001.jpg
WP_20200307_001.jpg (1.81 MiB) Przejrzano 3668 razy
WP_20200307_002.jpg
WP_20200307_002.jpg (1.71 MiB) Przejrzano 3668 razy
Dodaję też DS18B20 na przewodach w izolacji teflonowej (odporne na wysokie temperatury), zaizolowany rurką termokurczliwą. Wprowadzam go do rurki na czujniki w zespole grzałki.

Kod źródłowy - typowy w Arduino.
Przycisk zasilania (start/stop) jest na GPIO 0 tj równolegle z przyciskami na płytce i samym module; przekaźnik jest na GPIO 5, a magistrala 1Wire do DS18B20 - na GPIO 12.

Kod: Zaznacz cały

#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <lck.h>

#include <WiFiClient.h>
#include <ESP8266WiFiType.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiServer.h>
#include <ESP8266WiFiGeneric.h>
#include <WiFiClientSecure.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiSTA.h>
#include <WiFiUdp.h>

WiFiClient client;

// GPIO definitions

const int gpio_button = 0;
const int gpio_relay = 5;
const int gpio_w1 = 12;

//global variables for power_button()

int relay_channel = 0;
int last_button_state = 0;

// wifi credentials

const char* ssid     =   "twoja_nazwa_sieci_wifi";
const char* password = "twoje_hasło_do_wifi";

// Supla server access

const char* device_name = "Bojler";
const char* server_address = "twój_adres_serwera_supla";
const int location_id = twój_location_id;
const char* location_password = "twoje_hasło_do_serwera_supla";

char GUID[SUPLA_GUID_SIZE] = guid_wygenerowany_na_stronie;
uint8_t mac[6] = adres_mac_modułu;

// DS18B20 Sensor read implementation

OneWire oneWire(gpio_w1);
DallasTemperature sensors(&oneWire);
double get_temperature(int channelNumber, double last_val) {

    double t = -275;
    
    if ( sensors.getDeviceCount() > 0 )
      {
         sensors.requestTemperatures();
         t = sensors.getTempCByIndex(0);
      };

    return t;  
}

// button read and state toggle

void power_button() {
  int state = digitalRead(gpio_button);
  char* relay_value;
  int relay_state = digitalRead(gpio_relay);
  if (state == last_button_state) return;
  last_button_state = state;
  if (state == 0) {
  delay(200);
  state = digitalRead(gpio_button);
  }
  if (state == 0) {
    digitalWrite(gpio_relay, !relay_state);
    SuplaDevice.channelValueChanged(relay_channel, !relay_state);
  }
}


void setup() {
  sensors.begin();
  Serial.begin(115200);
  delay(10);

  // initialize GPIOs
  relay_channel = SuplaDevice.addRelay(gpio_relay, 0, 0, false, SUPLA_BIT_RELAYFUNC_POWERSWITCH); 
  SuplaDevice.addDS18B20Thermometer();
  SuplaDevice.setTemperatureCallback(&get_temperature);
  SuplaDevice.setName(device_name);
  SuplaDevice.begin(GUID, mac, server_address, location_id, location_password);
}

void loop() {
  power_button();
  SuplaDevice.iterate();
}


// Supla.org ethernet layer
    int supla_arduino_tcp_read(void *buf, int count) {
        _supla_int_t size = client.available();
       
        if ( size > 0 ) {
            if ( size > count ) size = count;
            return client.read((uint8_t *)buf, size);
        };
    
        return -1;
    };
    
    int supla_arduino_tcp_write(void *buf, int count) {
        return client.write((const uint8_t *)buf, count);
    };
    
    bool supla_arduino_svr_connect(const char *server, int port) {
          return client.connect(server, 2015);
    }
    
    bool supla_arduino_svr_connected(void) {
          return client.connected();
    }
    
    void supla_arduino_svr_disconnect(void) {
         client.stop();
    }
    
    void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) {

        Serial.println("WiFi init");
        WiFi.begin(ssid, password);

        while (WiFi.status() != WL_CONNECTED) {
            delay(500);
            Serial.print(".");
        }

        Serial.print("\nlocalIP: ");
        Serial.println(WiFi.localIP());
        Serial.print("subnetMask: ");
        Serial.println(WiFi.subnetMask());
        Serial.print("gatewayIP: ");
        Serial.println(WiFi.gatewayIP());
    }

SuplaDeviceCallbacks supla_arduino_get_callbacks(void) {
          SuplaDeviceCallbacks cb;
          
          cb.tcp_read = &supla_arduino_tcp_read;
          cb.tcp_write = &supla_arduino_tcp_write;
          cb.eth_setup = &supla_arduino_eth_setup;
          cb.svr_connected = &supla_arduino_svr_connected;
          cb.svr_connect = &supla_arduino_svr_connect;
          cb.svr_disconnect = &supla_arduino_svr_disconnect;
          
          return cb;
}
elegantandrogyne
Posty: 4
Rejestracja: pn mar 09, 2020 8:07 pm

Stycznik:
WP_20200307_005.jpg
WP_20200307_005.jpg (1.71 MiB) Przejrzano 3662 razy
DS-ka na przewodach:
WP_20200307_009.jpg
WP_20200307_009.jpg (1.83 MiB) Przejrzano 3662 razy
W akcji:
WP_20200309_006.jpg
WP_20200309_006.jpg (1.85 MiB) Przejrzano 3662 razy
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

Jak zamierzasz ogarnąć temat harmonogramu? Jakiś zegar czasu rzeczywistego będzie/jest?
Widzimy się na Supla Offline Party vol. 2 :!:
elegantandrogyne
Posty: 4
Rejestracja: pn mar 09, 2020 8:07 pm

Harmonogram po stronie serwera.
Awatar użytkownika
wojtas567
Posty: 2209
Rejestracja: ndz kwie 03, 2016 7:16 pm
Lokalizacja: Olsztyn

Na zdjęciach nie widać za bardzo ale jakby co to termostat oryginalny wyłączy grzałkę?
Pozdrawiam
Wojtek
elegantandrogyne
Posty: 4
Rejestracja: pn mar 09, 2020 8:07 pm

Oczywiście - zostawiam fabryczny termostat jako element odpowiedzialny za bezpieczeństwo.
eradek
Posty: 81
Rejestracja: ndz wrz 09, 2018 5:32 pm

Hej, bardzo ciekawy projekt mam w zamiarach zrobić podobne sterowanie do zbiornika buforowego 1500l. Czy możesz podzielić się schematem? Głównie jak sterujesz stycznikiem?
nava
Posty: 1
Rejestracja: pt cze 16, 2023 12:57 pm

Cześć
Czy ktoś jeszcze zgłębił temat sterowania bojlerem Stiebel? Posiadam model Stiebel SHZ80 i potrzebuję wskazówek. Pozdrawiam Arek
ODPOWIEDZ

Wróć do „Projekty użytkowników”