Как отобрать у квартирного радиатора немного тепла

kasper007
Offline
Зарегистрирован: 23.05.2016

Итак, как это обычно и бывает зима наступила внезапно :) и ничего не предвещало ее приход.

В комнате имеется очень старый пластинчатый радиатор вот такого типа:

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

Как обычно батареи горячими не бывают, а площадь комнаты 21 м2 (52,5 м3). В интернете есть достаточное  количество описаний подобных реализаций, но ардуину и температурный датчик к этому делу еще никто ранее не привязывал.

Итак было куплено 5 компьютерных вентиляторов 80*80 (12В, 120 мА). После чего они были связаны между собой обыкновенной стяжкой:

Запитал вентиляторы  от 7,5В (чтобы медленней и тише крутились). Питание завел через реле. Реле управляется ардуинкой.

Также взял два датчика ds18b20. Один датчик клеится на радиатор и измеряет его температуру, второй измеряет температуру в комнате. Общий вид получился вот такой:

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

При температуре радиатора в 56 С потребовалось 3 часа работы, чтобы температуру комнаты поднять с 23 С до 28 С. При этом энергозатраты на работу 7,5В * 300 мА * 1ч = 0,00225 кВт/ч, что гораздо эффективней маслянного радиатора.

#include <Adafruit_NeoPixel.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// Пин Arduino куда подключен датчик
#define ONE_WIRE_BUS 5
#define Relay 6
#define PIN 2
#define NUMPIXELS 4
#define low_tem 23.0 //температура ниже которой включается вентилятор
#define high_tem 26.0 //температура выше которой выключается вентилятор
#define bat_tem 42.0 //температура батареи при которой работает система
 
// Объявляем переменные
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer, insideThermometer2;
float temp_ds_1, temp_ds_2 ;
boolean flag = false;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
 
void setup(void)
{
  Serial.begin(9600);
 
  // Поиск устройств на выбранном пине
  Serial.print("Find devices...");
  sensors.begin();
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" pcs.");
 
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("The adress didn't found ");  else printAddress(insideThermometer);
  if (!sensors.getAddress(insideThermometer2, 1)) Serial.println("The adress didn't found ");  else printAddress(insideThermometer2); 
  sensors.setResolution(insideThermometer, 10);
  sensors.setResolution(insideThermometer2, 10);

  pinMode(Relay, OUTPUT); 
  digitalWrite(Relay, LOW);

  strip.begin();
  strip.show();  
}

 
void loop(void)
{ 
  delay(5000);
  sensors.requestTemperatures(); // Отправка команды на получение температуры
  temp_ds_1 = sensors.getTempC(insideThermometer);   //температура в помещении
  temp_ds_2 = sensors.getTempC(insideThermometer2);   //температура батареи
  
  if ((flag == false) && (temp_ds_1 < low_tem)) {flag = true;}
  
  if ((flag == true) && (temp_ds_1 < high_tem) && (temp_ds_2 > bat_tem))  {
  digitalWrite(Relay, HIGH);
  Serial.println("ON");
  Serial.println(temp_ds_1);
  Serial.println(temp_ds_2);
  } 
  
  if ((flag == true) && (temp_ds_1 > high_tem) && (temp_ds_2 > bat_tem))  {
   digitalWrite(Relay, LOW);
   Serial.println("OFF");  
   Serial.println(temp_ds_1);
   Serial.println(temp_ds_2);
   flag = false;
  }
  
if (temp_ds_1 < low_tem) {
    for(int i=0;i<NUMPIXELS;i++){
    strip.setPixelColor(i, strip.Color(0,0,127)); // Moderately bright green color.
    strip.show(); // This sends the updated pixel color to the hardware.
    } 
  }

if (temp_ds_1 > low_tem) {
    for(int i=0;i<NUMPIXELS;i++){
    strip.setPixelColor(i, strip.Color(0,127,0)); // Moderately bright green color.
    strip.show(); // This sends the updated pixel color to the hardware.
    } 
  }

if (temp_ds_2 < bat_tem) {
    for(int i=0;i<NUMPIXELS;i++){
    strip.setPixelColor(i, strip.Color(127,0,0)); // Moderately bright green color.
    strip.show(); // This sends the updated pixel color to the hardware.
    } 
  }
}

void printAddress(DeviceAddress deviceAddress)
{
  Serial.print("Adress ");
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
   Serial.println();
}

 

kasper007
Offline
Зарегистрирован: 23.05.2016

Сейчас, чтобы как-то понимать режимы работы, был прикручен фрагмент светодиодной ленты. Но уже где-то на подходе с али очередная esp'шка, так что полный контроль температурной обстановки в комнате и управлять режимами планирую осуществлять со смартфона.