#1 2019-01-02 23:09:53

vpatik
Учасник
Зареєстрований: 2019-01-02
Повідомлень: 3

Включення бойлера по двухзонному счетчику.

Так як форум зветься "Проекти" викладу тут свій , прийму критику мож і щось перероблю , а мож і так лишу. Проект пока тільки проект , потрібно запихнути в якись корпус , а пока так на проводках лежить на столі wink. Склад , давно вже мав Ардуіно уно , одноканальне реле  , і датчик температури Ds18b20 . Але було воно все без діла так погрався і забув . Тут поставив двох зоний лічильник і рішив перевести бойлер щоб включався о 23 і виключався о 7 ранку , спочатку включав лягав спати просипався виключав і поняв шо ні я неробот можу заснуть раніше невключить можу зранку забуть виключити. Купить готовий невопрос але механічний то нето пропало світло він збився а електроне трохи дорого і згадав є у мене ардуіно , прикупив ще часи DS1307 і погнав гортати ГУГЛ.
От що з цього вийшло

#include "U8glib.h"                     // бібліотека екрану  сіменс а52
#include <Wire.h>                       // бібліотека для сом порта
#include "RTClib.h"                     // бібліотека часів
RTC_DS1307 RTC;                         //  переменна часів 
#include <OneWire.h>                    // бібліотека для градусніка 
#include <DallasTemperature.h>          // бібліотека градусніка
#define ONE_WIRE_BUS 5                  // порт датчика температури
OneWire oneWire(ONE_WIRE_BUS);          //  переменна для градусніка 
DallasTemperature sensors(&oneWire);    //  переменна градусніка  
int Relay = 3;                          // порт реле
U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8);		// порти ардуіно для екрану сіменс а52 - SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
const int buttonPin = 2;                // порт кнопки
int buttonState = 0;                    // статус кнопки

void setup(void) {
  // flip screen, if required
  // u8g.setRot180();
    pinMode(buttonPin,INPUT_PULLUP);
    pinMode(Relay, OUTPUT); 
    digitalWrite(Relay, LOW); 
    Serial.begin(9600);
    sensors.begin();
    Wire.begin();
    RTC.begin();
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}


void loop () {
    sensors.requestTemperatures(); // отримання температури
    Serial.println(sensors.getTempCByIndex(0));  
    DateTime now = RTC.now();   // отримання дати годин 
Serial.print(now.year(), DEC);   // вивід в ком порт - рік , можна забрати
Serial.print('/');
Serial.print(now.month(), DEC);  // вивід в ком порт - місяць , можна забрати
Serial.print('/');
Serial.print(now.day(), DEC);    // вивід в ком порт - день , можна забрати
Serial.print(' ');
Serial.print(now.hour(), DEC);   // вивід в ком порт - години , можна забрати 
Serial.print(':');
Serial.print(now.minute(), DEC);  // вивід в ком порт - минути , можна забрати
Serial.print(':');
Serial.print(now.second(), DEC); // вивід в ком порт - секунди , можна забрати
Serial.println();

    // вивід на екран начало
  u8g.firstPage();  
  do {
     u8g.setFont(u8g_font_5x8);
     u8g.setPrintPos( 20, 8);
     u8g.print("Avto Boiler");
     u8g.setPrintPos( 0, 16);
     u8g.print(now.day(), DEC);
     u8g.print('.');
     u8g.print(now.month(), DEC);
     u8g.print('.');
     u8g.print(now.year(), DEC);
     u8g.setPrintPos( 61, 16);
     u8g.print(now.hour(), DEC);
     u8g.print(':');
     u8g.print(now.minute(), DEC);
     u8g.print(':');
     u8g.print(now.second(), DEC);
         
          //temperatura display on   
          u8g.setFont(u8g_font_unifont);
          u8g.setPrintPos( 20, 60);
          u8g.print("t-");
          u8g.print(sensors.getTempCByIndex(0));
          //temperatura display end   
 
 //реле начало, реле запускається якщо на часах години = 23,0,1,2,3,4,5,6 якщо на часах години інші воно незапуститься
  u8g.setFont(u8g_font_unifont);
  u8g.setPrintPos( 10, 40);  
if ( now.hour()== 0 || now.hour() == 1 || now.hour() == 2 || now.hour() == 3 || now.hour() == 4 || now.hour() == 5 || now.hour() == 6 || now.hour() == 23) 
{
digitalWrite(Relay, HIGH); 
u8g.print("RELAY - On"); 
}
else
{digitalWrite(Relay, LOW);
  u8g.setPrintPos( 5, 40);  

 u8g.print("RELAY - Off"); }
//реле кінець
 
 //кнопка начало  включився новий екран включилось реле на заданий час в 
  buttonState = digitalRead(buttonPin);
 if (buttonState == LOW) {     //нажав на кнопку
    digitalWrite(Relay, HIGH); //включилось реле
    u8g.firstPage();           //включився новий екран   
  do {
     u8g.setFont(u8g_font_unifont);
  u8g.setPrintPos( 25, 15);
   u8g.print("MANUAL");
    u8g.setPrintPos( 21, 32);
   u8g.print("STARTUP");
   u8g.setPrintPos( 10, 50);
  u8g.print("RELAY - On");
  } while ( u8g.nextPage() );
    delay(3600000);              // час на який включилось реле 1 час = 3600000 мілісікунд
   } else {
    digitalWrite(Relay, LOW);
  }
   //кнопка кінець

    
    } while( u8g.nextPage() );
 // вивід на екран кінець
delay(500); 
  }

а да забув ще причіпив до цього всього заліза екранчик від старого телефона сіменс а52 та від старого системніка кнопку ресета для того щоб був ручний запуск бойлера, всяке буває то гості прийшли то так багато води за день витратять тай на вечір не хвате. Датчик температури там так просто показує яка температура в приміщенні просто він у мене був тай просто впихнув.
Прошу сильно не пинайте код писався разом з гуглом три вечора 31.12 ,  01.01 і сьогодні закінчив , в завтра візьмусь за корпус . І з писаниною я недуже освіта не та.

Неактивний

#2 2019-01-03 14:03:51

Андрей
Учасник
Зареєстрований: 2014-06-17
Повідомлень: 46

Re: Включення бойлера по двухзонному счетчику.

Цікавий проект. Було б добре, якби ви виклали фото і схему.

Неактивний

#3 2019-01-04 15:24:04

vpatik
Учасник
Зареєстрований: 2019-01-02
Повідомлень: 3

Re: Включення бойлера по двухзонному счетчику.

Допилив. Запихнув все оте залізо в корпус (корпус на 4 автомати- ціна 20грн) .Так як датчик температури там був лишній тоя його викинув .Ітрохи поправив код ато той неробив , два if  було і коли спрацьовував 1 то другий його вирубав а він знову включався. і так виходило циклічне моргання.
Поправлений  робочий код:

#include "U8glib.h"                     // бібліотека екрану  сіменс а52
#include <Wire.h>                       // бібліотека для сом порта
#include "RTClib.h"                     // бібліотека часів
RTC_DS1307 RTC;                         //  переменна часів 
int Relay = 3;                          // порт реле
U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8);		// порти ардуіно для екрану сіменс а52 - SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
const int buttonPin = 2;                // порт кнопки
int buttonState = 0;                    // статус кнопки

void setup(void) {
  // нижня стріка перевертає екран на 180 градусів
    u8g.setRot180();
    pinMode(buttonPin,INPUT_PULLUP);
    pinMode(Relay, OUTPUT); 
    // digitalWrite(Relay, LOW); 
    // Serial.begin(9600);
    Wire.begin();
    RTC.begin();
    if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // нижня стрічка для настройки часу , після першого разу можна закоментірувати
    //RTC.adjust(DateTime(__DATE__, __TIME__));
     }
}


void loop () {

    DateTime now = RTC.now();   // отримання дати годин 
    buttonState = digitalRead(buttonPin); //считуєм статус кнопки

//Serial.print(now.year(), DEC);   // вивід в ком порт - рік , можна забрати
//Serial.print('/');
//Serial.print(now.month(), DEC);  // вивід в ком порт - місяць , можна забрати
//Serial.print('/');
//Serial.print(now.day(), DEC);    // вивід в ком порт - день , можна забрати
//Serial.print(' ');
//Serial.print(now.hour(), DEC);   // вивід в ком порт - години , можна забрати 
//Serial.print(':');
//Serial.print(now.minute(), DEC);  // вивід в ком порт - минути , можна забрати
//Serial.print(':');
//Serial.print(now.second(), DEC); // вивід в ком порт - секунди , можна забрати
//Serial.println();

    // вивід на екран начало
  u8g.firstPage();  
  do {
     u8g.setFont(u8g_font_5x8);
     u8g.setPrintPos( 20, 8);
     u8g.print("Avto Boiler");
     u8g.setPrintPos( 0, 16);
     u8g.print(now.day(), DEC);
     u8g.print('.');
     u8g.print(now.month(), DEC);
     u8g.print('.');
     u8g.print(now.year(), DEC);
     u8g.setPrintPos( 61, 16);
     u8g.print(now.hour(), DEC);
     u8g.print(':');
     u8g.print(now.minute(), DEC);
     u8g.print(':');
     u8g.print(now.second(), DEC);
                     
 //реле начало, реле запускається якщо на часах години = 23,0,1,2,3,4,5,6 якщо на часах години інші воно незапуститься
  u8g.setFont(u8g_font_unifont);
if ( now.hour()== 0 || now.hour() == 1 || now.hour() == 2 || now.hour() == 3 || now.hour() == 4 || now.hour() == 5 || now.hour() == 6 || now.hour() == 23) 
{
      digitalWrite(Relay, HIGH); 
      u8g.setPrintPos( 10, 40);  
      u8g.print("RELAY - On"); 
}

 else if (buttonState == LOW) {     //нажав на кнопку
   digitalWrite(Relay, HIGH); //включилось реле
   u8g.firstPage();           //включився новий екран   
  do {
     u8g.setFont(u8g_font_unifont);
 u8g.setPrintPos( 25, 15);
   u8g.print("MANUAL");
    u8g.setPrintPos( 21, 32);
   u8g.print("STARTUP");
   u8g.setPrintPos( 10, 50);
  u8g.print("RELAY - On");
  } while ( u8g.nextPage() );
    delay(4000);              // час на який включилось реле 1 час = 3600000 мілісікунд
   }

else
{
     digitalWrite(Relay, LOW);
     u8g.setPrintPos( 5, 40);
     u8g.print("RELAY - Off"); 
}
//реле кінець
 
  
    } while( u8g.nextPage() );
 // вивід на екран кінець
delay(500); 
  }

Прин скрин схеми , нелякайтесь як зміг так зробив  wink

https://drive.google.com/open?id=1oJMKgnGtJL28_c0rnBducmlihZV-frAq

кілька фото в корпусі

https://drive.google.com/open?id=1Uh_4VTrZtRDHQ1Hd1CVfvGDxckduiLVA
https://drive.google.com/open?id=1P4oNkNd7MosOrRTiJfdQhA2_mN6SfkZx
https://drive.google.com/open?id=1w-LgsTOJ00GCoZS_F4AUtwGl4CvkzYo9
https://drive.google.com/open?id=1gVDvkcXxG5ItCZpDdn9Ejahp-upsK2gD
https://drive.google.com/open?id=1JJh7VQ_BYWWUyy98KQHTwhHdJN-e0Aed
https://drive.google.com/open?id=1KA_WracVHFI06ZlrQcStUonmdvDGF07l
https://drive.google.com/open?id=1M-oBkVbHwFojuYLKSTJsuNeXaQNZSm-P

Вибачте незміг вставити фото.
Ще добавлю в корпус під верхнім розємом  стоїть плата з мобільної зарядки 5 вольт 0.7 а , яка і запітує всю схему вихід припаяний прям до ножок входу пітанія ардуино уно . Да зверху над екранчиком є дирка її закрию якимось білим пластиком, і ще потрібно щось приклеїти до екрану знизу , а то светодіоди контролера його трохи просвічують

Неактивний

#4 2019-02-17 19:42:03

assa
Учасник
Зареєстрований: 2019-01-03
Повідомлень: 2

Re: Включення бойлера по двухзонному счетчику.

vpatik пише:

Допилив.

Питання. Вигода з того є? Сам думаю таке зробити, але чомусь думаю, що вигоди немає.

Неактивний

#5 2019-02-17 22:52:53

vpatik
Учасник
Зареєстрований: 2019-01-02
Повідомлень: 3

Re: Включення бойлера по двухзонному счетчику.

Вигода чи ні,   але  економія по оплаті  за електроенергію приблизно 120-130 гривень в місяць ,  кіловати лишились приблизно тіж самі  , у мене приблизно в місяць 420-500 кіловат  за місяць (в зимку 420-450, в літку 450-500) крім бойлера більш нічим не заморачувався, пока все робе як і раніше.

Неактивний

#6 2019-02-18 00:10:15

г0сть
Гість

Re: Включення бойлера по двухзонному счетчику.

Якщо купувати всі ці модулі в Україні, то за цю ж ціну краще купити готовий таймер. Наприклад https://feron.ua/elektrotovary-i-komplektuyushchie/rozetki-s-taymerami/

#7 2019-03-17 11:41:43

Zeng
Гість

Re: Включення бойлера по двухзонному счетчику.

Так на счетчиках же есть выход, сигнализирующий о типе текущего тарифа, а на котлах/бойлерах - соответствующий вход HDO.

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму