CWU , przyciski + warunki

Hektorek
Posts: 176
Joined: Wed Apr 22, 2020 10:27 am
Been thanked: 1 time

Post

Siema maniacy.
Na początku szacun za zużytą energię w rozwój i pomoc w projekcie Supli.
Jak trafiłem na to rowiązanie postanowiłem sobie , a co inni maja to ja też spróbuję.
Czytałem , zakupiłem pare gratów , instalacja arduino i do dzieła.
Wgranie kilku gotowców i radośc, że działa postanowiłem, że z dostepnych kodów urzeźbię sobie coś oryginalnego.
Zaadoptowałem sobie kilka rozwiązań i po skompilowaniu i wgraniu do WEMOS-a funguje :).
I niestety następne pomysły w ulepszaniu przerosły moje możliwości i umiejętności , stąd ten post, może ktoś poratuje.
Poniżej działający kod:

Code: Select all

//  **************************************************************************************************************
//  * Kompilowane na Arduino 1.8.5 by@wojtas567                                                                            

   *
//  * Po odczytaniu adresów czujników należy je wpisać do tablicy wg poniższego wzoru                            *
//  * DeviceAddress jeden = { 0x28, 0xFF, 0xE8, 0x00, 0xB6, 0x16, 0x03, 0x65 };                                  *      
//  * DeviceAddress dwa = { 0x28, 0xFF, 0x54, 0x6F, 0xB3, 0x16, 0x05, 0xE9 };                                    *
//  * ...                                                                                                        *
//  *                                                                                                            *
//  * a na stępnie usunąć wiersze:                                                                               *
//  *        *    DeviceAddress jeden, dwa, trzy, cztery, piec, szesc, siedem, osiem;                            *
//  *                                                                                                            *
//  *        *    if (!sensors.getAddress(jeden, 0)) Serial.println("Nie można znaleźć adresu urządzenia 0");    *
//  *        *    if (!sensors.getAddress(dwa, 1)) Serial.println("Nie można znaleźć adresu urządzenia 1");      *
//  *        *    if (!sensors.getAddress(trzy, 2)) Serial.println("Nie można znaleźć adresu urządzenia 2");     *
//  *        *    if (!sensors.getAddress(cztery, 3)) Serial.println("Nie można znaleźć adresu urządzenia 3");   *
//  *        *    if (!sensors.getAddress(piec, 4)) Serial.println("Nie można znaleźć adresu urządzenia 4");     *
//  *        *    if (!sensors.getAddress(szesc, 5)) Serial.println("Nie można znaleźć adresu urządzenia 5");    *
//  *        *    if (!sensors.getAddress(siedem, 6)) Serial.println("Nie można znaleźć adresu urządzenia 6");   *
//  *        *    if (!sensors.getAddress(osiem, 7)) Serial.println("Nie można znaleźć adresu urządzenia 6");    *
//  *                                                                                                            *
//  **************************************************************************************************************


#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPUpdateServer.h>

#include <EEPROM.h>
#include <DNSServer.h>
#include <ESP8266mDNS.h>


#define SUPLADEVICE_CPP 
#include <SuplaDevice.h>

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>


extern "C" {
#include "user_interface.h"
}


// Setup Supla connection
const char* ssid     = "moja siec";
const char* password = "password";

WiFiClient client;
const char* host = "supla_cwu";
const char* update_path = "/cwu";
const char* update_username = "admin";
const char* update_password = "hasło";

ESP8266WebServer httpServer(81);
ESP8266HTTPUpdateServer httpUpdater;



// Ustawienie portu 2 na DS1820 - wemos D4
#define ONE_WIRE 2

// rozdzielczość czujnika DS 9 -12 bit (9 - co 0,5 st., 10 - co 0,25 st)
#define TEMPERATURE_PRECISION 9  

// Konfiguracja oneWire, aby komunikowała się z dowolnym urządzeniem OneWire (nie tylko układami temperatury Maxim / 

Dallas)
OneWire oneWire(ONE_WIRE);

// Przekaż nasze odniesienie oneWire do temperatury Dallas
DallasTemperature sensors(&oneWire);

// tablica do przechowywania adresów urządzeń
//DeviceAddress jeden, dwa;

// lub tu już wprowadzone

DeviceAddress jeden = { 0x28, 0xF2, 0xD1, 0xDF, 0x0B, 0x0, 0x0, 0xCB };       // odczytany adres 28F2D1DF0B0000CB   - temp 

bojler
DeviceAddress dwa = { 0x28, 0xB9, 0x89, 0xDF, 0x0B, 0x0, 0x0, 0xED };     //Odczytany adres 28B989DF0B0000ED        - temp 

powrotu cyrkulacji
 

// DS18B20 Sensor read implementation
double get_temperature(int channelNumber, double last_val) {

    double t = -275;
          switch(channelNumber)
         {

            case 0:
         sensors.requestTemperatures();
         t = sensors.getTempC(jeden);
        Serial.print("Temp 1 : ");
        Serial.println(t);
                    break;

            case 1:
         t = sensors.getTempC(dwa);
        Serial.print("Temp 2 : ");
        Serial.println(t);
                    break;
                 
          }
         
    return t;  
}
                                 
// funkcja drukowania adresu urządzenia
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    // zero pad the address if necessary
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}


void setup() {
  Serial.begin(74880);
  delay(100);
   
  wifi_station_set_hostname("Supla-cwu");  //nazwa w sieci lokalnej
  WiFi.softAPdisconnect(true); // wyłączenie rozgłaszania sieci ESP

// Inicjalizacja DS18B20
  sensors.begin();
  SuplaDevice.setTemperatureCallback(&get_temperature);


// ustaw rozdzielczość na 9 bitów na urządzeniach
  sensors.setResolution(jeden, TEMPERATURE_PRECISION);
  sensors.setResolution(dwa, TEMPERATURE_PRECISION); 


//******Odczyt DS wraz z adresami********************
  // zlokalizuj urządzenia na szynie danych
  Serial.print("Lokalizowanie urządzeń...");
  Serial.print(" znaleziono ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" urządzeń.");

 
  Serial.print("Rozdzielczość urządzeń: ");
  Serial.print(sensors.getResolution(), DEC);
  Serial.println();

// Szukanie adresów DS
//  if (!sensors.getAddress(jeden, 0)) Serial.println("Nie można znaleźć adresu urządzenia 0");
//  if (!sensors.getAddress(dwa, 1)) Serial.println("Nie można znaleźć adresu urządzenia 1");

 
  // pokaż adresy, które znaleźliśmy na szynie
  Serial.print("Adres Urządzenia 0: ");
  printAddress(jeden);
  Serial.println();

  Serial.print("Adres Urządzenia 1: ");
  printAddress(dwa);
  Serial.println();



//SuplaDevice *********************************************************************************************
  // CHANNEL0,1 - DS
  SuplaDevice.addDS18B20Thermometer();  
  SuplaDevice.addDS18B20Thermometer();  
  // CHANNEL2,3 - RELAY
  SuplaDevice.addRelay(12, true);       //   D6   , pompa cyrkulacyjna
  SuplaDevice.addRelay(13, true);       //  D7    , grzałka bojler


SuplaDevice.addSensorNO(14); // A0 - sensor otwarcia drzwi. na razie go nie używam. podłączamy go przez rezystor 10k  
                               

  // Replace the falowing GUID
  uint8_t mac[WL_MAC_ADDR_LENGTH];
  WiFi.macAddress(mac);
  // Replace the falowing GUID
  char GUID[SUPLA_GUID_SIZE] = {0x95,0xD7,0xF0,xxx,0x3B,0x56,0x6F,0x27};
  // with GUID that you can retrieve from https://www.supla.org/arduino/get-guid





  SuplaDevice.setName("cwu");
  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    ".supla.org",      // SUPLA server address
                    id,        // Location ID 
                    "1234");    // Location Password

  Serial.println();
  Serial.println("Uruchamianie serwera aktualizacji...");
  WiFi.mode(WIFI_STA);

  MDNS.begin(host);
  httpUpdater.setup(&httpServer, update_path, update_username, update_password);
  httpServer.begin();
  MDNS.addService("http", "tcp", 81);
  Serial.printf("HTTPUpdateServer ready! Open http://%s.local%s in your browser and login with username '%s' and password 

'%s'\n", host, update_path, update_username, update_password);
}

void loop() {

  SuplaDevice.iterate();
  SuplaDevice.setTemperatureCallback(&get_temperature);
  httpServer.handleClient();

}

// 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;
  cb.get_temperature = &get_temperature;
// cb.get_temperature_and_humidity = &get_temperature_and_humidity;
  return cb;
}

I teraz proszę czy ktoś może mi pomóc w kwestii:
1. Dodania przycisku bisstabilny ( nie wiem czy to dobre rozwiązanie ) dla przekaźnika na pinie 13 ( wł/wył grzałkę bojlera )
2 dodania przycisku monostabilnego dla przekaźnika na pinie 12
3 czujnik otwarcia drzwi ( łazienka)

poza tym:
1 otwarcie drzwi inicjuje przekaźnik włączający pompę cyrkulacyjną i pracuje do czasu , aż termometr dwa uzyska temp ( np o 1-2 stopnie mniej niż termometr 1 bojlera). Harmonogram włączania pompy o zadanych godzinach zrealizuje na cloudzie
2 przycisk pompy inicjuje działanie j.w
3 włączenie grzałki gdy temp bojlera spadnie poniżej zadanej wartości i działa do uzyskania zadanej wartości max. autonomicznie jak również z przycisku.

Niestety wszystkie znalezione kody nie spełniają moich potrzeb a próba zrobienia samemu spaliła na panewce ( nie jestem programistą ).
Trochę się rozpisałem ale jestem już zdesperowany.

p.s.
biblioteka supli mam z projektu poziomu groszku ( zmodyfikowaną przez autora ).
preferuję wpisywanie haseł i ID w kodzie bez używania gui.
I działa dla płytki esp w wersji 2.3.0

Pozdrawiam i proszę nie zlinczujcie mnie
Pozdrawiam:
Sławek
User avatar
klew
Posts: 13911
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 135 times
Been thanked: 137 times

Post

Czy bojler i grzałka mają jakiś wbudowany termostat zabezpieczający przed zagotowaniem wody?

Opisz jeszcze raz cały ten układ, ale podając:
1. Jakie urządzenia podłączasz do Twojego sterownika i do czego mają służyć?
2. Jakie kanały mają być widoczne w Supli na telefonie?
3. Którymi urządzeniami chcesz mieć możliowść sterowania z Supli z telefonu/clouda?
Najlepsze suple dla Twojego domu :mrgreen:
Hektorek
Posts: 176
Joined: Wed Apr 22, 2020 10:27 am
Been thanked: 1 time

Post

ad 1.
pompka cyrkulacyjna, grzałka bojlera z termostatem, kontaktron w drzwiach (do wł pompki cyrkulacyjnej), 2 termometry do pomiaru temp bojlera i powrotu cyrkulacji
ad 2.
wszystkie 5
ad 3.
pompą i grzałką z tel i clouda

P. s. w międzyczasie testuje rozwiązanie na primary_gui od krycha88 i główkuję nad pracą wemos w trybie autonomicznym ( po utracie WiFi lub internetu).
Coś mi się zdaje, że powinienem zacząć od prostrzych układów :)
Ale używać supli tylko aby patrzeć na temp. i wl/wył światełka to chyba nie dla mnie i wiem, że prędzej czy później dopnę swego i coś czuję, że z Wasza pomocą będzie prędzej :l
Jeszcze raz szacun za zaangażowanie w projekt któremu kibicuję (niestety nie jestem programistą i nie mogę pomóc).
Pozdrawiam:
Sławek

Return to “Pomoc”