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
