Контроль температуры воды в газовой колонке при помощи Arduino

сервомашинка вращает регулятор
SONce собрал автоматический регулятор для своей газовой колонки — Oasis 20RG.
Всё что для этого потребовалось — это:
Arduino,
сервомашинка,
— проводочки, резисторы и прочая мелочевка.
Колонка умеет показывать текущую температуру воды, а значит — у неё на борту уже есть датчик который можно считать при помощи ардуино.
Датчик нашёлся на выходе горячей воды и оказался обычным термистором.
Подключив его через делитель напряжения к аналоговому входу Arduino, получаем аналоговое значение, которое, при помощи функции map() переводится в температуру.

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


Скетч:
#include <Servo.h>
int termalPin=A5;
int enablePin=8;
int ledPin=7;
int temp;
int lastTemp=0;
boolean enabled=false;
static int minAngle=5;
static int maxAngle=100;
static int needTemp=40;
Servo myservo;

void setup()
{

//включаем сериал
  Serial.begin(9600); 
//устанавливаем режимы пинов
  pinMode(enablePin,INPUT);
  pinMode(ledPin,OUTPUT);
}

void loop()
{
//мапим показания датчика на температуру
 temp = map(analogRead(termalPin),800,635,31,51);
 if(digitalRead(enablePin)==HIGH)
  {
//колонка включена
    if(!enabled)
    {
//если до этого не была включена

//атачим серву
      myservo.attach(9);
//ставим на середину
      myservo.write(50);
     Serial.println("WARMING UP BOILER.");
//ждем пока колонка разогреется
      delay(10000);
      Serial.println("BOILER READY!");
      
    }
//поехали
    enabled=true;
//зажигаем светодиод
    digitalWrite(ledPin,HIGH);
    Serial.print("BOILER ONLINE. CURRENT TEMP: ");
    Serial.print(temp);
    Serial.println(" C");
//смотрим на температуру и куда ее крутить
      if(temp>needTemp) decTemp();
      if(temp<needTemp) incTemp();
   
    delay(300);
  }
  else
  {
    if(enabled)
    {
//выключение
      Serial.println("BOILER OFFLINE. GOOD LUCK!");
//ставим серву посредине
      myservo.write(50);
//детачим чтоб не жужжала
      myservo.detach();
      enabled=false;
    }
//гасим лампочку
    digitalWrite(ledPin,LOW);
  }
 
}

void incTemp()
{
  int p=needTemp-temp;
  Serial.print("Increasing TEMP. P=");
  Serial.println(p);
  int pos=myservo.read();
  int newpos=pos-p;
  for(int i=pos;i>=newpos;i--)
  {
    if(i>minAngle) myservo.write(i);
    if(i<minAngle) myservo.write(minAngle);
    delay(50);
  }
  if(p>5)
  {
  delay(p*1000);
  }
  else
  {
    if(p<=3) delay(p*3000);
    else
  delay(p*2000);
  }

}

void decTemp()
{
 int p=temp-needTemp;
  Serial.print("Decreasing TEMP. P=");
  Serial.println(p);
  int pos=myservo.read();
  int newpos=pos+p;
  for(int i=pos;i<=newpos;i++)
  {
    if(i<maxAngle) myservo.write(i);
    if(i>maxAngle) myservo.write(maxAngle);
    delay(50);
  }
  if(p>5)
  {
  delay(p*1000);
  }
  else
  {
     if(p<=3) delay(p*3000);
     else
  delay(p*2000);
  }
 }


Ссылки
Контроль температуры воды в газ. колонке

По теме
Использование ПИД на Arduino для управления электрическим нагревателем
  • 0
  • 27 июня 2012, 06:46
  • admin

Комментарии (2)

RSS свернуть / развернуть
+
0
Этот чел — гений. Я уже несколько лет мучаюсь с похожей проблемой. У меня нет колонки, простой смеситель. Но давление воды постоянно скачет. Стоит кому-нибудь спустить бачок или открыть холодную воду на кухне, пока я принимаю душ, как у меня рождается масса новых ругательств. Словарь пора составлять.

Прикрутить бы подобную систему к смесителю… да походу нормально это сделать будет не просто.
avatar

Ozze

  • 27 июня 2012, 12:36
+
0
решение вашей проблемы: смеситель с термостатом
ammo1.livejournal.com/5019.html
ammo1.livejournal.com/97686.html
avatar

chyvack

  • 2 августа 2012, 21:22

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.