-czujniki ds18b20 na osobnych gpio (nie trzeba odczytywać adresów)
-załączenie przy różnicy temperatury 6 i więcej
-wyłączenie przy różnicy temperatury 3 i mniej
-załączenie pompy poniżej -25 °C oraz przy uszkodzeniu czujnika temperatury
kod Arduino IDE ( zlepek z róznych przykładów)
biblioteka SuplaDevice z managera bibliotek w Arduino wersja 2.4.2
Działa od 24h bezawaryjnie
Kod: Zaznacz cały
/*
Copyright (C) AC SOFTWARE SP. Z O.O.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <SuplaDevice.h>
/*
* This example requires Dallas Temperature Control library installed.
* https://github.com/milesburton/Arduino-Temperature-Control-Library
*/
// Add include to DS sensor
#include <supla/sensor/DS18B20.h>
#include <supla/control/relay.h>
//histereza
int roznica = 6; //roznica załączenia
int roznica2 = 3; //roznica wyłączenia
float T1;
float T2;
int licz;
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;
unsigned long roznicaCzasu = 0;
//channel 0
auto r1 = new Supla::Control::Relay(5); // przekaźnik gpio 5 sterowany stanem wysokim
// Choose proper network interface for your card:
#ifdef ARDUINO_ARCH_AVR
// Arduino Mega with EthernetShield W5100:
#include <supla/network/ethernet_shield.h>
// Ethernet MAC address
uint8_t mac[6] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05};
Supla::EthernetShield ethernet(mac);
// Arduino Mega with ENC28J60:
// #include <supla/network/ENC28J60.h>
// Supla::ENC28J60 ethernet(mac);
#elif defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
// ESP8266 and ESP32 based board:
#include <supla/network/esp_wifi.h>
Supla::ESPWifi wifi("wifi", "pass");
#endif
void setup() {
Serial.begin(115200);
// Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
char GUID[SUPLA_GUID_SIZE] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
// Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/*
* Having your device already registered at cloud.supla.org,
* you want to change CHANNEL sequence or remove any of them,
* then you must also remove the device itself from cloud.supla.org.
* Otherwise you will get "Channel conflict!" error.
*/
// CHANNEL 1-2 - Thermometer DS18B20
new Supla::Sensor::DS18B20(12); //channel 1 czujnik kolektora gpio 12
new Supla::Sensor::DS18B20(4); //channel 2 czujnik CWU gpio 4
/*
* SuplaDevice Initialization.
* Server address, LocationID and LocationPassword are available at https://cloud.supla.org
* If you do not have an account, you can create it at https://cloud.supla.org/account/create
* SUPLA and SUPLA CLOUD are free of charge
*
*/
SuplaDevice.begin(GUID, // Global Unique Identifier
"svr1.supla.org", // SUPLA server address
"email@email.pl", // Email address used to login to Supla Cloud
AUTHKEY); // Authorization key
}
void loop() {
SuplaDevice.iterate();
//czas
aktualnyCzas = millis(); //Pobierz liczbe milisekund od startu
roznicaCzasu = aktualnyCzas - zapamietanyCzas;
//Jeśli różnica wynosi ponad 5 sekund
if (roznicaCzasu >= 5000UL) {
//Zapamietaj aktualny czas
zapamietanyCzas = aktualnyCzas;
//odzcyt temp
for (auto element = Supla::Element::begin(); element != nullptr; element = element->next()) { // iterujemy po wszystkich elementach dodanych do programu
if (element->getChannel()) { // sprawdzamy, czy do elementu jest przypisany kanał. Niektóre elementy (np. button) nie posiadają kanału.
auto channel = element->getChannel();
if (channel->getChannelNumber() == 1) {
double lastTemperature = channel->getValueDouble();
T1 = lastTemperature;
// do something with lastTemperature
}
if (channel->getChannelNumber() == 2) {
double lastTemperature = channel->getValueDouble();
T2 = lastTemperature;
}
}
}
//Wyslij do PC
Serial.println(aktualnyCzas);
Serial.print(T1) ;
Serial.println("C T1");
Serial.print(T2) ;
Serial.println("C T2");
//termostat
if((roznica)<=T1-T2)
{
licz =0;
}
else if(T1-T2<=(roznica2))
{
licz =1;
}
//temperatura ponizej -25 oraz uszkodzenie czujnika kolektora załącza pompę
if( T1<-25)
{
licz =0;
}
//sterowanie pompą
if(licz>0)
{
r1->turnOff();
Serial.println(" pompa OFF ");
}
else
{
r1->turnOn(); // włącza przekaźnik.
Serial.println(" pompa ON ");
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
}