Управление сервоприводом

jonik007
Offline
Зарегистрирован: 20.09.2016

В ардуино "полный ноль", шапками не забрасывать. Мне для бюджета предприятия нужно знать цену скетча.

Задача: необходимо, что бы в любое время отопительного сезона была циркуляция теплоносителя в частном доме, а его температура (теплоносителя) была минимально возможной для определенной температуре на улице. В доме стоит недельный термостат, по его команде сервопривод открывает полностью проток на трехходовом клапане в батареи поступает горячий теплоноситель), а при отключении термостата сервопривод возвращался в исходное состояние, т.е. вновь на угол, определенный уличным датчиком температуры.

На трехходовом клапане стоит mg995, на улице PT100, в комнате недельный термостат (NO,NC), экран не нужен. Связь только через ПК.

PS Дому хватает теплого пола, но при -10 и ниже, в нижних углах стеклопакетов, при выключенных радиаторах, образуется конденсат- что не есть хорошо. Поэтому, выход вижу в создании минимально возможной циркуляции воздуха в районе стеклопакетов. Вентиляция в доме и уровень влажности тут ни при чем. Уровень конденсата минимален, но просто бесит.

Повторюсь, пока нужен только бюджет.

 

Onkel
Offline
Зарегистрирован: 22.02.2016

нужно чтобы температура всегда была выше точки росы? Я делал систему вентиляции с учетом абсолютной влажности, засада (если считать засадой цену) будет не в скетче, а в нормальном датчике влажности (или в датчиках).  Ну и бюджет скетча штука такая - кто-то за сто рублей предложит, только это работать не будет. Укажите пожалуйста ваш адрес или мне напишите ydom@mail.ru  Посчитаем вам бюджет.

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

Что значит "создание циркуляции воздуха" ?  Я правильно понимаю - вы хотите недельным термостатом разгонять температуру в помещении, осушая воздух и таким образов избавляясь от конденсата на окнах ? 

Что есть "связь через ПК" - вы видите некую клиентскую программу на компьютере для настройки блока на базе ардуино ? 

Про измерение температуры в доме не скзанно ни слова. Все делаем по наружней температуре ? 

По большому счету ваша проблемма не в отоплении, а в неправильной работе вентиляции и/или неправильной установке окон, как вариант установке откосов/подоконников. Думаю, что осушением воздуха можно попробывать избавится от конденсата, но сухость атмосферы в доме будет дискомфортна для всего живого. Поставьте на окна вентилляционные клапана.

Если все же решили действовать только таким способом, то по цене смогу сказать только после уточнения нюансов, которые я озвучил выше. Пишите brokly(at)mail.ru

jonik007
Offline
Зарегистрирован: 20.09.2016

Логика простая:

На улице датчик температуры.

Трехходовой (угол поворота 90 град.) - на нем сервопривод типа mg995, а управляет им датчик температуры (уличный).

от 0 до -5 угол открытия - 10%;

от -5 до -10 угол открытия - 15%;

от -10 до -15 угол открытия - 20%;

от -15 до -20 угол открытия - 30%;

от -20 до -40 угол открытия - 60%;

Но при замыкании термостата сервопривод должен открыться на все 100%,

а при размыкании термостата закрыться на те же 10 или 15% в зависимости от температуры на улице.



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

Tomcat
Offline
Зарегистрирован: 16.12.2014

Если грубо - то примерно так, я думаю. 

******************************************************
float Temperature;      //значение датчика температуры LM35
int PinThermostat=12;   // номер пина, на котором будет сигнал замыкания термостата
 
 
  void setup() {
Temperature=0.00;
pinMode(PinThermostat, INPUT);      // устанавливает режим работы - вход
}
 
/*
от 0 до -5 угол открытия - 10%;
от -5 до -10 угол открытия - 15%;
от -10 до -15 угол открытия - 20%;
от -15 до -20 угол открытия - 30%;
от -20 до -40 угол открытия - 60%;
 */
 
void loop() {
  
Temperature=analogRead(0);
Temperature=Temperature*0.48828125;;          // получаем приведённое значение температуры для датчика LM35DZ
  if (digitalRead(PinThermostat)== HIGH)      // термостат открыт ???
    {
    // выполнять действие при сработавшем термостате - угол открытия 100%;
    }
  else {                                       // если не открыт - проверяем датчик температуры
  if (Temperature >= -5 && Temperature <= 0)
  {
  // выполнять действие от 0 до -5 угол открытия - 10%;
  }
  else if (Temperature >= -10 && Temperature < -5)
        {
        // выполнять действие от -5 до -10 угол открытия - 15%;
        }
        else if (Temperature >= -15 && Temperature < -10)
              {
              // выполнять действие от -15 до -10 угол открытия - 20%;
              }
              else if (Temperature >= -20 && Temperature < -15)
                    {
                    // выполнять действие от -20 до -15 угол открытия - 30%;
                    }
                    else
                    {
                    // выполнять действие от -999 до -20 угол открытия - 60%;
                    }
   }
  
}
*********************************************************
 
 
если  знать как отрабатывает (какими сигналами управляется) mg995, то можно вставить и действия (ШИМ или аналоговые сигналы) на его управление
Также пример сделан под датчик LM35 (не лучший, но просто более понятный) , хотя есть и другие - просто это был под рукой, т.к. пишу сейчас скетч под него - для определения температуры водяной трубы в колодце со счётчиком
Для вашего датчика просто потребуется другой коэффициент, в зависимости от схемы включения 
jonik007
Offline
Зарегистрирован: 20.09.2016

Tomcat, сколько вы возьмете за работу?

мой адрес jonik007     yandex точкару.

Tomcat
Offline
Зарегистрирован: 16.12.2014

Меня тут камнями забросают :) 

Работа больше в том, чтобы оценить ваш клапан - как им можно управлять

Остальное - скорее всего уже заработаеет

И я бы временно (хотя бы на период тестирвоания) предложил использовать другой температурный датчик - попроще и поизвестнее. Не думаю, что погрешность измерения слишком уж важна - +/- 1 град.

К тому же популярные датчики совмещают ещё и измерение влажности , а я как понял - это тоже интересно бы знать

 

 

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

Я дико извиняюсь :)

Вот это перлы:

 if (Temperature >= -5 && Temperature <= 0)  {
 ...  
 }  else if (Temperature >= -10 && Temperature < -5) {
...
 }  else if (Temperature >= -15 && Temperature < -10)  {
...
 else if (Temperature >= -20 && Temperature < -15)....
 
Ну ладно, хрен с ним с форматированием, но зачем дважды проверять диапазоны, уж в коммерческом проекте сделайте типа так:
 
if (Temperature < -20)  {
 ...  
 }  else if (Temperature < -15) {
...
 }  else if (Temperature < -10)  {
...
 else if (Temperature < -5)....
 
Надеюсь понятно показал :) А то как то глаз режет :))) Мягко говоря...
 

 

Tomcat
Offline
Зарегистрирован: 16.12.2014

Спасибо brokly!

Показали понятно. И конечно, Вы правы. В Вашем варианте экономится код.

Проект некоммерческий, человек, который обращается - пишет что плохо знает Arduino.

Я не хвастаюсь своими знаниями, просто как раз решаю нечто подобное и почему бы не показать на примере - как  можно делать. А код , который показал - сделал таким ИМЕННО для наглядности - поверьте, человек, который знает язык хуже Вас - он просто более понятен - какой  диапазон и где

Можно вообще - засунуть интервалы и % в массив и просто в цикле "пробежаться" по массиву, проверить попадание в диапазоны и повернуть серву - будет ЕЩЁ короче. 

Думаю - пока можно оставить свой вариант, а в процессе оптимизации - выбрать самый удобный :)

 

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

С массивом будет медленнее, даже Case, в конечном итоге даст более долгий и объемный код. 

Не, я не претендую на учителя или нотатора, просто глаз режет немного (но это мои проблеммы :) ). 

Извините, если чем обидел.

Tomcat
Offline
Зарегистрирован: 16.12.2014

Да Бог с Вами. Я же говорю - Ваш код -  он более понятен программисту. И красивее - спору нет!!!

Просто я, стараюсь, написать так чтобы было понятно простому человеку 

Так же как и с углами машинки

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

ИМХО, лучше, для "хюман андерстандинг" использовать пояснения ;)

Tomcat
Offline
Зарегистрирован: 16.12.2014

Jonik007  - приветствую!

Добавил команды для сервы:

****************************************************************************
#include <Servo.h>
 
Servo ServoMG955;        // создаем объект servo для управления серводвигателем
float Temperature;       //значение датчика температуры LM35
int PinThermostat=12;    // номер пина, на котором будет сигнал замыкания термостата
int PinServoMG955=10;    // номер пина, к которому подключен сервомеханизм
 
 
 
  void setup() {
Temperature=0.00;
pinMode(PinThermostat, INPUT);      // устанавливает режим работы пина термостата- вход
ServoMG955.attach(PinServoMG955);   // указываем, куда серва подключена
}
 
/*
от 0 до -5 угол открытия - 10%;
от -5 до -10 угол открытия - 15%;
от -10 до -15 угол открытия - 20%;
от -15 до -20 угол открытия - 30%;
от -20 до -40 угол открытия - 60%;
 */
 
void loop() {
  
Temperature=analogRead(0);                    // считываем значение температурного датчика с аналогового входа A0
Temperature=Temperature*0.48828125;          // получаем приведённое значение температуры для датчика LM35DZ
  if (digitalRead(PinThermostat)== HIGH)      // термостат открыт ???
    {
    // выполнять действие при сработавшем термостате - угол открытия 100%;
    ServoMG955.write(180*1.00); //поворот сервы на 180 град - 
    }
  else {                                       // если не открыт - проверяем датчик температуры
  if (Temperature >= -5 && Temperature <= 0)
  {
  // выполнять действие от 0 до -5 угол открытия - 10%;
  ServoMG955.write(180*0.10); //поворот сервы на 10% от 180 град
  }
  else if (Temperature >= -10 && Temperature < -5)
        {
        // выполнять действие от -5 до -10 угол открытия - 15%;
        ServoMG955.write(180*0.15);  //поворот сервы на 15% от 180 град
        }
        else if (Temperature >= -15 && Temperature < -10)
              {
              // выполнять действие от -15 до -10 угол открытия - 20%;
              ServoMG955.write(180*0.20);  //поворот сервы на 20% от 180 град
              }
              else if (Temperature >= -20 && Temperature < -15)
                    {
                    // выполнять действие от -20 до -15 угол открытия - 30%;
                    ServoMG955.write(180*0.30);  //поворот сервы на 30% от 180 град
                    }
                    else
                    {
                    // выполнять действие от -999 до -20 угол открытия - 60%;
                    ServoMG955.write(180*0.60);  //поворот сервы на 60% от 180 град
                    }
   }
 } 
*************************************
 

 

Tomcat
Offline
Зарегистрирован: 16.12.2014

Jonik007  - а ещё скажите - для чего ПК Вам нужен???

jonik007
Offline
Зарегистрирован: 20.09.2016

Tomcat пишет:

Jonik007  - а ещё скажите - для чего ПК Вам нужен???

Т.е. что бы настройку вести только через скетч на пк.

 

Tomcat
Offline
Зарегистрирован: 16.12.2014

Настройку чего - углов открытия???

 

 

jonik007
Offline
Зарегистрирован: 20.09.2016

да, углов.

Tomcat
Offline
Зарегистрирован: 16.12.2014

jonik007 пишет:

да, углов.

учёл поправку для клапана - ввёл как константу - так проще ссылаться
 
**********************************************************
#include <Servo.h>
 
Servo ServoMG955;        // создаем объект servo для управления серводвигателем
float Temperature;       //значение датчика температуры LM35
int PinThermostat=12;    // номер пина, на котором будет сигнал замыкания термостата
int PinServoMG955=10;    // номер пина, к которому подключен сервомеханизм
const int MaxAngle=90          // максимальный угол открытия клапана
 
 
 
  void setup() {
Temperature=0.00;
pinMode(PinThermostat, INPUT);      // устанавливает режим работы пина термостата- вход
ServoMG955.attach(PinServoMG955);   // указываем, куда серва подключена
}
 
/*
от 0 до -5 угол открытия - 10%;
от -5 до -10 угол открытия - 15%;
от -10 до -15 угол открытия - 20%;
от -15 до -20 угол открытия - 30%;
от -20 до -40 угол открытия - 60%;
 */
 
void loop() {
  
Temperature=analogRead(0);                    // считываем значение температурного датчика с аналогового входа A0
Temperature=Temperature*0.48828125;          // получаем приведённое значение температуры для датчика LM35DZ
  if (digitalRead(PinThermostat)== HIGH)      // термостат открыт ???
    {
    // выполнять действие при сработавшем термостате - угол открытия 100%;
    ServoMG955.write(180);     //поворот сервы на 100% от 180 град
    }
  else {                                       // если не открыт - проверяем датчик температуры
  if (Temperature >= -5 && Temperature <= 0)
  {
  // выполнять действие от 0 до -5 угол открытия - 10%;
  ServoMG955.write(MaxAngle*0.10);    //поворот сервы на 10% от 90 град
  }
  else if (Temperature >= -10 && Temperature < -5)
        {
        // выполнять действие от -5 до -10 угол открытия - 15%;
        ServoMG955.write(MaxAngle*0.15);    //поворот сервы на 15% от 90 град
        }
        else if (Temperature >= -15 && Temperature < -10)
              {
              // выполнять действие от -15 до -10 угол открытия - 20%;
              ServoMG955.write(MaxAngle*0.20);    //поворот сервы на 20% от 90 град
              }
              else if (Temperature >= -20 && Temperature < -15)
                    {
                    // выполнять действие от -20 до -15 угол открытия - 30%;
                    ServoMG955.write(MaxAngle*0.30);    //поворот сервы на 30% от 90 град
                    }
                    else
                    {
                    // выполнять действие от -999 до -20 угол открытия - 60%;
                    ServoMG955.write(MaxAngle*0.60);    //поворот сервы на 60% от 90 град
                    }
   }
  
}
Tomcat
Offline
Зарегистрирован: 16.12.2014

Это уже интереснее. Т.к. при выключении питания - все введённые данные будут стёрты - скетч будет залит в Arduino исходный.  Значит нужно  сохранить ваши пользовательские углы в энергонезависимой памяти, и потом оттуда их после рестарта прочитать.