Официальный сайт компании Arduino по адресу arduino.cc
регулировка температуры проточной воды (смеситель)
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вс, 26/10/2014 - 03:32
решил в качестве учебно-прикладного проекта собрать смеситель для душа на ардуино.
кнопками выставляем желаемую температуру(на дисплее справа), сравниваем с показаниями датчика(аналоговый), кран регулирующий вращаем мотором стеклоподъемника от авто.
Дописал кодч, прошу дать комментарии по оптимизации и предупредить об очевидных ошибках.
/* 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); }
Прикольно выглядит, тоже хочу такую штуку собрать))
интересно как выглядят детали которыми вы привод стеклоподъемника присоединили
для этой задачи лучше подошел бы трехходовой вентиль где на две стороны подаются холодная и горячая вода, а с третьего выхода получаем воду регулируемой температуры, думаю будет более плавная регулировка
у меня была похожая задумка, только я за основу хотел взять термостатический вентиль (купил такой в китае), прикрутить к нему шаговый двигатель с датчиком нуля и регулировку делать подстройкой термостата, сама регулировка воды осталась бы механическая
Слышал что у термостатических вентилей задержка большая из за инертности, по моему в идеале найтиэлектронный кран. Будет достаточно одного на горячую воду)
А Вы не думале в своем девайсе применить какойнибудь принцип регулирования?
Задумка очень даже ничего, тоже подумываю над таким девайсом в душевую.
Я думаю что на подаче холодной воды должен стоять дискретный датчик расхода, а на выходе смесителя датчик температуры, устройство должно иметь один "кран" регулировки расхода (холодной воды).
При открытии холодной воды срабатывает датчик расхода и устройство включаетьсяя в работу, а по температуре воды на выходе осуществляеться регулировка подачи горячей.
Добрый день.Хочу реализовать подобный проект для себя.Задумка такая.Имеется электрический бойлер.На выходе с бойлера горячей воды ставится;смеситель с терморегулятором(Китай) и с сервоприводом.Дальше электромагнитный клапан,расходомер воды и последний датчик температуры воды.Все это будет выполнено в виде байпаса.Управление arduino uno ,дисплей 2.8 дюйма сенсорный.
Алгоритм работы.Основное меню три позиции.Душ,ванна,горячая вода.Выбираем душ,далее выставляем нужную температуру и старт.Выбираем ванна ,далее температура,далее количество воды и старт.А горячая вода ,это просто самая горячая вода.Датчик температуры воды служит для того ,чтобы в случае понижения заданной температуры допустим на пять градусов прекращать подачу воды.В процессе работы на дисплее отображается количество использованной воды и температура.
Может кто-то подобное уже сделал.Огромная просьба поделится опытом .Ну и самая большая проблема для меня в этом проекте это программная часть.Буду очень благодарен любой помощи.И сколько вообще может стоить написание подобной программы???Спасибо!!!
Еще не собрал, но для себя остановился на варианте: электромагнитный клапан на горячую воду управляемый ШИМ сигналом перед смесителем и датчик температуры после смесителя на душ. Но мне одного душа достаточно. У вас какая та сильно мудреная конструкция получается ИМХО
Вот китайский аналог
LCD Сенсорный Экран Цифровой Душ Термостат Термостатический Смеситель Для душа Душевая Панель Digitale Чмо Thermostaat
http://s.aliexpress.com/ye2QZVna
(from AliExpress Android)
По моим подсчетам самому сделать будет в три раза дешевле.Ну и функционал поболее будет.
А каким образом у вас будет вода смешиваться???
Прикольная штука по ссылке, но в моем варианте можно в 500 рублей уложится. У меня вода смешиватся будет смесителем и после него проверятся температура и при необходимости менятся поток горячей воды. Можно и два клапана поставить, но придется тогда немного с кодом помучатся
Очень интересно.Огромная просьба,по возможности,выкладывать отчеты своих трудов.Спасибо!!!
Не уверен что вообще буду реализовывать, это так, наброски. Сейчас заказываю себе 3д принтер и возможно, когда нибудь, напечатаю приставку которая на смеситель будет одеватся.