Автоматическое управление ГВС

mrtester
Offline
Зарегистрирован: 26.02.2015

Добрый день! Ищу исполнителя для написание arduino скетча Автоматическое управление ГВС (горячие водоснабжение) Имеется: 1 газовая колонка китайская собранная в России с электроподжигом от 2 батареек 3 вольта (когда буду все переделывать в место батареек будет подано питание 3 вольта) 2 водопровод с гуляющим напором от 0,5 до 4,5 атм. Идея заключается в таком решении http://ru.aliexpress.com/item/Intelligent-thermostatic-shower-faucet-sho... Недостатки у китайцев все работает от 2 труб горячая и холодная, стабильное давление воды, цена и как всегда что-то не доделали (управление клапанами не даст ровный поток) Алгоритм Т. к. газовая колонка снабжает ГВС всю квартиру, то надо делать так При открывании любого крана горячей воды срабатывает выключатель на газовой колонке S1 (стоит в проточном регуляторе) подаётся питание + (открывается газ, срабатывает электроподжиг и колонка работает) http://kotel.kr.ua/image/cache/data/rele_valliant/CIMG2122-500x500.JPG Нужно сделать задержку на 2-3 сек. и включить колонку релейними контактами К1 ради безопасности последовательно с S1 Датчик температуры LM35 (T1) измеряет температуру выходящий воды на теплообменнике Клапан с электроприводом М1 (http://ru.aliexpress.com/item/-/1938495319.html?recommendVersion=1 )стоит на входе воды в колонку. управление двигателем (http://ru.aliexpress.com/item/Special-promotions-L298N-motor-driver-boar...), в приводе есть 2 контакта S2 полностью открыт S3 полностью закрыт, можно сделать 1 или 0 на обоих. При срабатывание S2 включается насос повышения давления К2 реле (http://ru.aliexpress.com/item/-/1946710301.html?recommendVersion=1) управление 0, насос выключается при достижения 2 атм (датчик пока не нашел) или при закрытии любого крана (разомкнулся S1) Когда газовая колонка работает: поддержание 37 град (данные c T1), выше 50 град выключается (обнуляется 50 град при разомкнутых контакте S1) Когда газовая колонка выключается (разомкнулся S1) М1 электропривод остается в последнем положении Алгоритм работы контроля температуры Т.к. поток воды постоянно меняется, то регулировать надо постоянно 1 напряжение по ШИМ задается в строке, открываем (закрываем) подаем питание на М1 на 1 сек. ждем показания с T1 1,5 сек., повторяем или останавливаемся если условия совпали 2 напряжение по ШИМ задается в строке, открываем (закрываем) 0,5 град. 0,5 сек, 1 град 1 сек и т. д. ждем 2 сек показания с Т1, повторяем или останавливаемся если условия совпали Вот примел подсветки лестницы, очень удобно для себя настроить //************************* Все что ниже - определить самостоятельно ********************* unsigned int sensorRef = 1010; // Референсное значение сенсора освещенности, выше которого считается ночь; #define timer 20 // Таймер для задержек при включении/выключении последовательности ступенек; #define SwitchOffDelay 15000 // Задержка выключения посветки, милисекунды (здесь 15 секунд) ; #define SwitchOnBright 180 // Яркость включенных ступенек, максимально - 255; #define NightBright 30 // Яркость подсвеченных ступенек в ночном режиме (первая, последняя); //int timeForBlink = 100; // Число циклов мерцания включенной подсветки; #define bottomDistance 140 // Расстояние в см для срабатывания нижнего ультрасоника #define topDistance 55 // Расстояние в см для срабатывания верхнего ультрасоника #define smoothSwitchDelayStep 5 // Скорость нарастания яркости ступеньки мс., чем меньше тем быстрее нарастает; //**************************************************************************************** Как то вот так Дальше сам душ 4 сенсорные кнопки (http://ru.aliexpress.com/item/Touch-Sensor-Jog-type-touch-module-capacit...) 1 сенсор душ верхний А1 2 сенсор душ нижний А2 3 сенсор температура “+” А3 4 сенсор температура “–“ А4 Дисплей (http://ru.aliexpress.com/store/product/Free-Shipping-Red-Color-1-5-inch-...) 4 знака (пример 27,5 значок градусы и давление 1, 5Р) китаец пока не ответил что за чип стоит Работа При срабатывание А1 (так же и А2)включается реле К3 (К4) (открывается клапан и вода потекла) на S1 появляется 3 вольта и пошел работать верхний алгоритм, но температура должна регулироваться с А3 или А4 и дисплей показывать текущую температуру ,при нажимании А3 или А4 дисплей должен моргать и показывать температуру заданную с панели. При повторном нажатии А1 (А2) что было нажато, но не при переключении с А1 на А2 или с А2 на А1 все должно выключатся (реле К3 или К4, подсветка дисплея) При нажатии в выключенном состоянии А3 или А4 или одновременно А3 и А4 (как удобнее сделать) дисплей загорается на 7 сек и показывает давление Хотелось бы влезь в UNO, так что датчик давления аналог, вход с S1 аналог и все что можно в аналоговые входа Вроде всё, хотя аппетит приходит во время еды.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

вы предлагаете разобраться в этой каше?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

водопровод с гуляющим напором от 0,5 до 4,5 атм

насос повышения давления не поможет, вам нужно установить гидроаккумулятор литров на 100....200 в зависимости от потребления воды, колонкой газовой управлять в зависимости от водоразбора - плохой вариант, проще но дороже бойлер-теплообменник на 100 литров с поддержанием в нём Т 70 гр, например

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

колонка не успеет отработать температуру ГВС :( , она хороша только в установившемся режиме расхода ГВС

накопитель ГВС + постоянная циркуляция воды из накопителя через колонку в накопитель + клапан подмеса ХВС в ГВС при водоразборе

вот тут можно задействовать МК для управления колонкой - Т < 65 - включить , Т > 72 - выключить

определитесь с системой ГВС....  в вашей задаче есть несопоставимые штуки - ШИМ ( миллисекунды ) и тепловые процессы, нагрев воды ( минуты )

 

простой душ превратится в контрастный душ ,  в зависимости от помывки посуды и др. :)

mrtester
Offline
Зарегистрирован: 26.02.2015

могу прислать ворд, там всё по строкам

насос с гидроаккумулятором уже стоит и помогает, есть еще регулятор давления, вся механика требует внимания и постоянного регулирования

лучше газовой колонки ни чего нет, остальное требует много внимание

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

лучше газовой колонки ни чего нет, остальное требует много внимание

есть - двухконтурный котёл - отопление и ГВС , нооооо..... да, требует денег и мало внимания :)

 

mrtester
Offline
Зарегистрирован: 26.02.2015

есть другие места где на эту тему можно пообщаться

mrtester
Offline
Зарегистрирован: 26.02.2015

дисплеи на чипе Philip 74hc595

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

это последовательно-параллельный регистр.... 

какие ещё новости есть ? :)

mrtester
Offline
Зарегистрирован: 26.02.2015

остальное в описании

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

.....смемителя - да , вашей системы - нет :(

mrtester
Offline
Зарегистрирован: 26.02.2015

есть, читайте текст, там все описано

mrtester
Offline
Зарегистрирован: 26.02.2015

Так ка я не могу здесь нормально напечатать условия то оставляю ссылку на вордовский документ, там все описано https://cloud.mail.ru/public/75095e065139/%D0%93%D0%92%D0%A1%202.doc

mrtester
Offline
Зарегистрирован: 26.02.2015

Тема закрыта

mrtester
Offline
Зарегистрирован: 26.02.2015
#define RAIN 2 //дождь
#define SHOWER 3 //душ
#define LIGHT 4 //освещение
#define IND1 5 //индикатор кнопки дождь
#define IND2 6 //индикатор кнопки душ
#define PUMP 7 //реле насоса
#define BUTTON_R A0 //контакт А0 для кнопки 1
#define BUTTON_S A1 //контакт А1 для кнопки 2
#define PRESSURE A2 //контакт А2 для датчика давления
#define END A3 //контакт А3 для концевика воды
boolean lastButtonR = LOW; //переменная для хранения последнего состояния кнопки
boolean currentButtonR = LOW; //переменная для хранения текущего статуса кнопки
boolean lastButtonS = LOW; //переменная для хранения последнего состояния кнопки
boolean currentButtonS = LOW; //переменная для хранения текущего статуса кнопки
int P; //датчик давления
int S; // концевик
int D; //перемнная концевика
float P_vkl = 1.8 ;   // Порог напряжения для включения насоса
float P_vikl = 2.5 ;   // Порог напряжения для выключения насоса
int lmodeR = 0; //переменная для статуса светодиода
int lmodeS = 0; //переменная для статуса светодиода
int IND_INTERVAL = 350; //350 мс для моргания 
int SWITCH_INTERVAL = 600; //переключение с душ на дождь и на оборот
unsigned long LIGHT_INTERVAL = 100000; //задержка отключения освещения
unsigned long previousTimeI = 1;
unsigned long previousTimeS = 1;
unsigned long previousTimeL = 1;

void setup()
{
  pinMode (LIGHT, OUTPUT); //устанавливаем пин 4 как выход
  pinMode (SHOWER, OUTPUT); //устанавливаем пин 3 как выход
  pinMode (RAIN, OUTPUT); //устанавливаем пин 2 как выход
  pinMode (IND1, OUTPUT); //устанавливаем пин 5 как выход
  pinMode (IND2, OUTPUT); //устанавливаем пин 6 как выход
  pinMode(PUMP, OUTPUT); //устанавливаем пин 8 как выход
  //pinMode (BUTTON_R, INPUT); //устанавливаем пин 8 как вход
  //pinMode (BUTTON_S, INPUT); //устанавливаем пин 12 как вход

}
boolean debounce(boolean lastR) //функция сглаживания, выдает значения HIGH или LOW
{
  boolean currentR = digitalRead(BUTTON_R); //считываем состояние кнопки
  if (lastR != currentR) //если не такое, как было
  {
    delay(10); //ждём 10 мс
    currentR = digitalRead(BUTTON_R); //опять считываем состояние кнопки
    return currentR; //возвращаем состояние 
  }
  return currentR; //возвращаем состояние 
}
boolean debounce1(boolean lastS) //функция сглаживания, выдает значения HIGH или LOW
{
  boolean currentS = digitalRead(BUTTON_S); //считываем состояние кнопки
  if (lastS != currentS) //если не такое, как было
  {
    delay(10); //ждём 10 мс
     currentS = digitalRead(BUTTON_S); //опять считываем состояние кнопки
    return currentS; //возвращаем состояние
  }
  return currentS; //возвращаем состояние
}
void setModeR (int modeR) //функция для выполнения моргания. void т.к. она ничего не вычисляет
{
  if (modeR == 0) //если режим равен 0
  {
    Blink (IND_INTERVAL, IND1); //моргаем на выводе IND1 с интервалом IND_INTERVAL
    digitalWrite (LIGHT, 0); //включаем питание
    digitalWrite (RAIN, 0); //включаем питание
    lmodeS=1; //если включенно, отключаем
  }
  else if (modeR == 1) //если режим равен 1 
  {
    Switch (SWITCH_INTERVAL, RAIN); //задержка переключения
    Off (LIGHT_INTERVAL, LIGHT);//задержка выключения освещения
    digitalWrite (SHOWER, 1); //выключаем питание
    digitalWrite (IND1, 1); //выключаем питание
  }
}
void setModeS (int modeS) //функция для выполнения моргания. void т.к. она ничего не вычисляет
{
  if (modeS == 0) //если режим равен 0
  {
    Blink (IND_INTERVAL, IND2); //моргаем на выводе IND2 с интервалом IND_INTERVAL
    digitalWrite (LIGHT, 0); //включаем питание
    digitalWrite (SHOWER, 0); //включаем питание
    lmodeR=1; //если включенно, отключаем
  }
  else if (modeS == 1) //если режим равен 1 
  {
    Switch (SWITCH_INTERVAL, SHOWER); //задержка переключения
    Off (LIGHT_INTERVAL, LIGHT); //задержка выключения освещения
    digitalWrite (RAIN, 1); //выключаем питание
    digitalWrite (IND2, 1); //выключаем питание
  }
}
void Blink (unsigned long INTERVAL, int LED_PIN) //функция воспринимает интервал и пин вывода в качетсве входных параметров
{
  unsigned long TimeI = millis(); //записываем время работы контроллера моргания
  if (TimeI - previousTimeI > INTERVAL) //если прошло достаточно времени, то
  {
    previousTimeI = TimeI; //перезаписываем время
    digitalWrite(LED_PIN, !digitalRead(LED_PIN));
  }
}
void Off (unsigned long INTERVALl, int LED_L) //функция воспринимает интервал и пин вывода в качетсве входных параметров
{
  unsigned long TimeL = millis(); //записываем время работы контроллера освещения
  if (TimeL - previousTimeL > INTERVALl) //если прошло достаточно времени, то
  {
    previousTimeL = TimeL; //перезаписываем время
    digitalWrite(LED_L, 1); 
  }
}
void Switch (unsigned long INTERVALs, int SOL_S) //функция воспринимает интервал и пин вывода в качетсве входных параметров
{
  unsigned long TimeS = millis(); //записываем время работы контроллера переключения
  if (TimeS - previousTimeS > INTERVALs) //если прошло достаточно времени, то
  {
    previousTimeS = TimeS; //перезаписываем время
    digitalWrite(SOL_S, 1);
  }
}
void loop()
{
/*extern int P;
extern int S;
extern int D;
extern float P_vkl;
extern float P_vikl;
S = 0;
P = 0;
D = 1; 
//S = analogRead(END);//Считали концевик воды 
//P = analogRead(PRESSURE);//Считали датчик давления воды

if (S >= 412)//Кран воды открыт
  D=0;

if(!D)
     {    
        if(P < (P_vkl * 1024. / 5.))  // было /5
         {
          digitalWrite(PUMP, 0);
         }
         else if(P > (P_vikl * 1024. / 5.))  // было /5
         {
          digitalWrite(PUMP, 1);
         }  
      }
    if (S <= 312)//Кран воды закрыт
  D=1;
  
  if(D)
     {    
        if(P < (P_vkl * 1024. / 5.))  // было /5
         {
          digitalWrite(PUMP, 1);
         }
         else if(P > (P_vikl * 1024. / 5.))  // было /5
         {
          digitalWrite(PUMP, 1);
         }  
      }*/
//
  currentButtonR = debounce(lastButtonR); //подаём функции debounce текущее состояние кнопки, по сути считываем состояние с учётом дребезга
  if (lastButtonR == LOW && currentButtonR == HIGH) //если кнопка нажата
  {
    lmodeR++;    //увеличиваем состояние счётчика режима на 1
  }
  lastButtonR = currentButtonR; //запоминаем последнее состояние кнопки
  if (lmodeR == 2) //если счётчик дошёл до значения 1, которое не предусмотрено в теле функции setMode
  lmodeR = 0; //то мы его обнуляем
  setModeR (lmodeR); //и передаём значение функции setMode

//
  currentButtonS = debounce1(lastButtonS); //подаём функции debounce текущее состояние кнопки, по сути считываем состояние с учётом дребезга
  if (lastButtonS == LOW && currentButtonS == HIGH) //если кнопка нажата
  {
    lmodeS++;    //увеличиваем состояние счётчика режима на 1
  }
  lastButtonS = currentButtonS; //запоминаем последнее состояние кнопки
  if (lmodeS == 2) //если счётчик дошёл до значения 1, которое не предусмотрено в теле функции setMode
  lmodeS = 0; //то мы его обнуляем
  setModeS (lmodeS); //и передаём значение функции setMode
}

 

mrtester
Offline
Зарегистрирован: 26.02.2015

Помогите решить проблемму, 2 выход (RAIN) светит пол накала

Если нет выделенного софта в скобках, то выход равен 2,45 вольт, мери по GND, если убрать скобки то равно 3,55 вольт, если задействовать чтения аналог END или PRESSURE или вместе, то падает до 4,5 вольт

выход 2 менял, источник питания минял, аналоги А0 и А1 на цифру переключал ни чего не помогло

при переключение через SWITCH_INTERVAL на выходе 2- 0,5 вольт и светит как надо

 

mrtester
Offline
Зарегистрирован: 26.02.2015

все остальные выходы работают нормально

mrtester
Offline
Зарегистрирован: 26.02.2015

нашел, но не понял в чем причина, убрал строку 93 и все нормально работает

кто подскажет в чем причина, где я ошибся.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Во первых - этот пост в теме "за деньги"

Во вторых - вы сами "закрыли" тему

В третьих - по вашему коду , так и должно работать.

Я не понимаю, что вам нужно подсказать, поскольку мне не понятно, чего вы хотите получить в итоге.....

mrtester
Offline
Зарегистрирован: 26.02.2015

Спасибо, разобрался.