регулировка температуры проточной воды (смеситель)

Gonzo
Offline
Зарегистрирован: 28.04.2014

решил в качестве учебно-прикладного проекта собрать смеситель для душа на ардуино.

 

 

 

 

 

 

 кнопками выставляем желаемую температуру(на дисплее справа), сравниваем с показаниями датчика(аналоговый), кран регулирующий вращаем мотором стеклоподъемника от авто.

Дописал кодч,  прошу дать комментарии по оптимизации и предупредить об очевидных ошибках.

/*
  Button . Autor Ilya P
 */
#include "TM1637.h"
#define CLK 4//pins definitions for TM1637 and can be changed to other ports       
#define DIO 5
TM1637 tm1637(CLK,DIO);
// устанавливаем номера пинов
const int buttonUpPin = 2;     // пин кнопки1 повышения температуры
const int buttonDownPin = 3;     // пин кнопка2 понижения температуры
const int rele7Pin =  7;      // пин реле включает двигатель прямо
const int rele6Pin =  6;      // пин реле включает двигатель обратно

// variables will change:
int buttonUpState = 0;         //  значение отображающее внешнее состояние кнопки1
int buttonDownState = 0;         // значение отображающее внешнее состояние кнопки2
int val1 = 0; // переменная действий с кнопкой1
int val2 = 0; // переменная действий с кнопкой2

// переменные аналового датчика температуры
int r=1 ; //значение на пине датчика
unsigned long preMil[5]= {
  0,0,0,0,0};// [1]=7hi 2=7lo 3=6hi 4=6lo 

double temp;// температура С, с датчика

// переменные внутренних значений температуры
double contemp = 22.0; // предустановленная температура, будет менятся кнопками
double t = 0.0; // сравнение реальной и предустановленной температуры

//создаем массив переменных временнЫх значений для реле (и состояний?)


void setup() {
  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
  // назначаем пины реле выходами
  pinMode(rele7Pin, OUTPUT);   
  pinMode(rele6Pin, OUTPUT);

  // назначаем пины кнопки входами
  pinMode(buttonUpPin, INPUT);
  pinMode(buttonDownPin, INPUT);  
  Serial.begin(9600);
  Serial.println("go");
}

void loop()
{

  r= analogRead(0); // считываем данные с аналогового датчика температуры
  // пересчитываем значения пина в гр.цельсия
  temp = log(((10240000/r) - 10000)); 
  temp = 1 / (0.001129148 + (0.000234125 * temp) + (0.0000000876741 * temp * temp * temp)); 
  temp = temp - 273.15;
  //Serial.print(" A0=r=");
 // Serial.print(r);

  // считываем состояние кнопки в переменную
  buttonUpState = digitalRead(buttonUpPin);
  buttonDownState = digitalRead(buttonDownPin);
  // задаем желаемую температуру кнопкой
  if (buttonUpState == HIGH&&val1 == 0)      // проверяем значение переменной кнопки,если значение 1(HIGH) то поднимаем задание температуры +1
  {
    contemp = contemp + 1.0;
    val1=1;
  } 
  if (buttonUpState == LOW&&val1 == 1)      
  {
    val1=0;
  }

  if (buttonDownState == HIGH&&val2 == 0) 
  {     
    contemp = contemp - 1.0;
    //  digitalWrite(rele6Pin, !digitalRead(rele6Pin)); // инвертируем реле6
    val2=1;
  } 

  if (buttonDownState == LOW&&val2 == 1) 
  {     
    val2=0;
  }
  //Serial.print(" bUpS=");
  //Serial.print(buttonUpState);
  //Serial.print(" bDownS=");
  //Serial.print(buttonDownState);
  //Serial.print(" rT=");
 // Serial.print(temp);
 // Serial.print(" InT=");
 // Serial.print(contemp);

  t = contemp - temp; // разница температур= t
  Serial.print(" dif T=");
  Serial.print(t);

  Serial.print(" pm1=");
  Serial.print(millis() -preMil[1]);
  Serial.print(" pm2=");
  Serial.print(millis() -preMil[2]);
  Serial.print(" pm3=");
  Serial.print(millis() -preMil[3]);
  Serial.print(" pm4=");
  Serial.println(millis() -preMil[4]);
  Serial.print(" r7p=");
  Serial.print(digitalRead(rele7Pin));
  // реле и серва
  // проверяем: пин серывы влючен && время истекло > откл серву
  // для пин7
  if (digitalRead(rele7Pin)==1) // 
  {
    if (t<2)
    {
      digitalWrite(rele7Pin, LOW); // выключаем реле
      preMil[1]=millis();
      tm1637.point(POINT_ON);
    }
    else 
      if (millis() -preMil[1] >t*100)
    {
      digitalWrite(rele7Pin, LOW); // выключаем реле
      preMil[1]=millis();
      tm1637.point(POINT_ON);
    }

  }   
  else 
    if (t>2&&millis() -preMil[2] >3000)
  {
    digitalWrite(rele7Pin, HIGH); // включаем реле
    preMil[2]=millis(); // обнуляем LO счетчик вр. для 7пин
    preMil[1]=millis();
    tm1637.point(POINT_OFF);
  }
  
  //для пин6  
  
  if (digitalRead(rele6Pin)==1) // 
  {
    if (t>-2)
    {
      digitalWrite(rele7Pin, LOW); // выключаем реле
      preMil[3]=millis();
      tm1637.point(POINT_ON);
    }
    else 
      if (millis() -preMil[3] >(temp - contemp)*100)
    {
      digitalWrite(rele6Pin, LOW); // выключаем реле
      preMil[3]=millis();
      tm1637.point(POINT_ON);
    }

  }   
  else 
    if (t<-2&&millis() -preMil[4] >3000)
  {
    digitalWrite(rele6Pin, HIGH); // включаем реле
    preMil[4]=millis(); // обнуляем LO счетчик вр. для 7пин
    preMil[3]=millis();
    tm1637.point(POINT_OFF);
  }
 // tm1637.point(POINT_ON);
    tm1637.display(0,int(temp/10));
    tm1637.display(1,int(temp)-(int(temp/10))*10); 
    tm1637.display(2,int(contemp/10));
    tm1637.display(3,int(contemp)-(int(contemp/10))*10);
   
}

 

alex0
Offline
Зарегистрирован: 14.12.2015

Прикольно выглядит, тоже хочу такую штуку собрать))

axill
Offline
Зарегистрирован: 05.09.2011

интересно как выглядят детали которыми вы привод стеклоподъемника присоединили

для этой задачи лучше подошел бы трехходовой вентиль где на две стороны подаются холодная и горячая вода, а с третьего выхода получаем воду регулируемой температуры, думаю будет более плавная регулировка

у меня была похожая задумка, только я за основу хотел взять термостатический вентиль (купил такой в китае), прикрутить к нему шаговый двигатель с датчиком нуля и регулировку делать подстройкой термостата, сама регулировка воды осталась бы механическая

alex0
Offline
Зарегистрирован: 14.12.2015

Слышал что у термостатических вентилей задержка большая из за инертности, по моему в идеале найтиэлектронный кран. Будет достаточно одного на горячую воду)

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

А Вы не думале в своем девайсе применить какойнибудь принцип регулирования?

Задумка очень даже ничего, тоже подумываю над таким девайсом в душевую.

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

При открытии холодной воды срабатывает датчик расхода и устройство включаетьсяя в работу, а по температуре воды на выходе осуществляеться регулировка подачи горячей.

Сашок-22
Offline
Зарегистрирован: 14.04.2017

Добрый день.Хочу реализовать подобный проект для себя.Задумка такая.Имеется электрический бойлер.На выходе с бойлера горячей воды ставится;смеситель с терморегулятором(Китай) и с сервоприводом.Дальше электромагнитный клапан,расходомер воды и последний датчик температуры воды.Все это будет выполнено в виде байпаса.Управление arduino uno ,дисплей 2.8 дюйма сенсорный.
Алгоритм работы.Основное меню три позиции.Душ,ванна,горячая вода.Выбираем душ,далее выставляем нужную температуру и старт.Выбираем ванна ,далее температура,далее количество воды и старт.А горячая вода ,это просто самая горячая вода.Датчик температуры воды служит для того ,чтобы в случае понижения заданной температуры допустим на пять градусов прекращать подачу воды.В процессе работы на дисплее отображается количество использованной воды и температура.
Может кто-то подобное уже сделал.Огромная просьба поделится опытом .Ну и самая большая проблема для меня в этом проекте это программная часть.Буду очень благодарен любой помощи.И сколько вообще может стоить написание подобной программы???Спасибо!!!

alex0
Offline
Зарегистрирован: 14.12.2015

Еще не собрал, но для себя остановился на варианте: электромагнитный клапан на горячую воду управляемый ШИМ сигналом перед смесителем и датчик температуры после смесителя на душ. Но мне одного  душа достаточно.  У вас какая та сильно мудреная конструкция получается ИМХО

Сашок-22
Offline
Зарегистрирован: 14.04.2017

Вот китайский аналог
LCD Сенсорный Экран Цифровой Душ Термостат Термостатический Смеситель Для душа Душевая Панель Digitale Чмо Thermostaat
http://s.aliexpress.com/ye2QZVna
(from AliExpress Android)
По моим подсчетам самому сделать будет в три раза дешевле.Ну и функционал поболее будет.

Сашок-22
Offline
Зарегистрирован: 14.04.2017

А каким образом у вас будет вода смешиваться???

alex0
Offline
Зарегистрирован: 14.12.2015

Прикольная штука по ссылке, но в моем варианте можно в 500 рублей уложится. У меня вода смешиватся будет смесителем и после него проверятся температура и при необходимости менятся поток горячей воды. Можно и два клапана поставить, но придется тогда немного с кодом помучатся

Сашок-22
Offline
Зарегистрирован: 14.04.2017

Очень интересно.Огромная просьба,по возможности,выкладывать отчеты своих трудов.Спасибо!!!

alex0
Offline
Зарегистрирован: 14.12.2015

Не уверен что вообще буду реализовывать, это так, наброски. Сейчас заказываю себе 3д принтер и возможно, когда нибудь, напечатаю приставку которая на смеситель будет одеватся.