Программатор цифровых термостатов

Программирование DS1620 - Цифровой термостат

С чего все началось - с нервозного состояния и бессонных ночей. Бывают такие вещи которые крайне боятся заморозков, даже краткосрочных, например свежевысаженная рассада в тепличке, овощи в утепленном ящике на балконе, помещения с трубами заполненными водой или овощной ларек на рынке (это я к примеру). Поскольку прогноз погоды точным не бывает невозможно заранее предусмотреть падение температуры и в результате как только складываются условия к заморозкам - бессонная ночь гарантирована.
Первой мыслью было найти готовое устройство контроля температуры по бюджетной стоимости и с достаточной точностью.
Изучение рынка предлагаемого оборудования дало отрицательный результат
Механические термостаты от холодильников работают на замыкание при снижении температуры и обратной группы контактов, необходимой для включения нагревателя, как правило нет
  • Электронные аналоговые устройства (например термостат мастеркит NM4022/BM4022) требуют достаточно трудоемкой калибровки которая "уходит" даже при незначительных изменениях напряжения питания
  • Цифровые погодные станции с индикацией температуры и влажности - не имеют выхода термостата
  • Термостаты для систем теплого пола не точны, дороги и не позволяют регулировать ниже +15
  • Промышленные термостаты на Din-рейку очень дороги
  • Цифровые датчики температуры 1-wire DS1820 как оказалось требуют дополнительной обвязки - ведущего устройства и контроллера


После долгих поисков было подобрано оптимальное решение: это две модели цифровых автономных термостатов DS1620 и DS1821. Особенностью этих микросхем является что каждая из них является однокристальной вычислительной машиной в которой установлен точный сенсор температуры и схема съема и преобразования его показаний, после программирования необходимых значений температуры в энергонезависимые регистры эти микросхемы будут выдавать на выход логический уровень соответствующий состоянию термостата. 1620 имеет два выхода, точность установки регистров высокой и низкой температуры с точностью до 0,5 градуса цельсия, причем в случае снижения температуры ниже порога установленного в регистре низкой температуры на выводе TLow (включение нагревателя) появляется логическая единица, вывод Thigh зависим от регистра верхней температуры (включение вентиляции) При покупке микросхемы могут быть запрограммированы на различные значения температур (зависит от партии) поэтому для конкретного применения требуется их запрограммировать. В качестве программатора я решил воспользоваться контроллером ардуино:



В ардуино следует залить следующий код, в котором можно задать требуемую вам температуру

// DS1620 termostat setup
// -- by kozin alexey (hobby.msdatabase.ru)
// -- 13 Feb 2011


// DS1620 to Arduino Connections

#define DQ 2 //pin 1 of ds1620
#define CLK 3 //pin 2 of ds1620
#define RST 4 //pin 3 of ds1620
//pin 4 of ds1620 0v
//pin 8 of ds1620 +5v


// DS1620 Commands

#define RD_TEMP 0xAA // read temperature register
#define WRITE_TH 0x01 // write high temperature register
#define WRITE_TL 0x02 // write low temperature register
#define READ_TH 0xA1 // read high temperature register
#define READ_TL 0xA2 // read low temperature register
#define READ_CNTR 0xA0 // read counter register
#define READ_SLOPE 0xA9 // read slope register
#define START_CNV 0xEE // start temperature conversion
#define STOP_CNV 0x22 // stop temperature conversion
#define WRITE_CFG 0x0C // write configuration register
#define READ_CFG 0xAC // read configuration register

// DS1620 configuration bits

#define DONE B10000000 // conversion is done
#define THF B01000000 // high temp flag
#define TLF B00100000 // low temp flag
#define NVB B00010000 // non-volatile memory is busy
#define CPU B00000010 // 1 = use with CPU
#define ONE_SHOT B00000001 // 1 = one conversion; 0 = continuous conversion


void setup()
{
int ts = 0;
int tenths = 0;

pinMode(DQ, INPUT); // start safely (this pin is bi-directional)
pinMode(CLK, OUTPUT);
digitalWrite(CLK, HIGH); // put clock in idle state
pinMode(RST, OUTPUT);
digitalWrite(RST, LOW); // de-activate DS1620

// setup for continuous conversion


Serial.begin(9600);
delay(5);
ts = ds1620_read_register (READ_CNTR, 16);
Serial.print("counter register is "); Serial.println(ts);
ts = ds1620_read_register (READ_SLOPE, 16);
Serial.print("Slope register is "); Serial.println(ts);
ts = ds1620_read_register (READ_CFG, 8);
Serial.print("config register is "); Serial.println(ts);
ts = ds1620_read_register (READ_TH, 8);
Serial.print("TH register is "); Serial.println(ts);
ts = ds1620_read_register (READ_TL, 8);
Serial.print("TL register is "); Serial.println(ts);



ds1620_write_register(WRITE_CFG, CPU, 8); // enable cpu mode - disable termostat

digitalWrite(RST, HIGH);
delayMicroseconds(1);
ds1620Out(START_CNV, 8);
digitalWrite(RST, LOW);
delay(1000);
ts = ds1620_read_register (RD_TEMP, 9);
Serial.print("Temperature register is "); Serial.println(ts);

if (ts > 0xFF) // if negative
ts |= 0xFF00; // extend sign bits

tenths = (ts*5) % 10;

Serial.print("Temperature Celsium is "); Serial.print(ts/2);Serial.print(".");Serial.println(tenths);



ds1620_write_register(WRITE_TH, 44, 16); // set th to 22 C
ds1620_write_register(WRITE_TL, 6, 16); // set tl to 3 C

ds1620_write_register(WRITE_CFG, 0, 8); // disable cpu mode - enable termostat
digitalWrite(CLK, LOW); // set clock Low to termostat mode






}


void loop()
{
int tC = 0;
}


// Send value to DS1620

void ds1620Out(unsigned int outVal, int count)
{
pinMode(DQ, OUTPUT); // set DQ for write
for (int idx = 0; idx < count; idx++) {
if (outVal & 0x0001 == 1) // test LSB
digitalWrite(DQ, HIGH);
else
digitalWrite(DQ, LOW);
delayMicroseconds(1); // let bit settle
digitalWrite(CLK, LOW);
delayMicroseconds(1); // let clock settle
digitalWrite(CLK, HIGH); // clock it
outVal >>= 1; // get next bit
}
pinMode(DQ, INPUT); // make DQ safe
}


// Returns value from DS1620

int ds1620In(int count)
{
unsigned int inVal = 0;

pinMode(DQ, INPUT); // set DQ for read

for (int idx = 0; idx < count; idx++) {
inVal >>= 1; // prep for new bit
digitalWrite(CLK, LOW);
delayMicroseconds(1);
if (digitalRead(DQ) == HIGH)
inVal |= 0x8000; // set bit if DQ high
digitalWrite(CLK, HIGH);
delayMicroseconds(1);
}
inVal >>= (16-count); // correct bits for count
return int(inVal);
}


int ds1620_read_register( unsigned int CMD, int outbitcount)
{
unsigned int inVal = 0;
digitalWrite(RST, HIGH);
delayMicroseconds(1);
ds1620Out(CMD, 8);
delayMicroseconds(1);
inVal = ds1620In(outbitcount);
digitalWrite(RST, LOW);
delay(15);
return int(inVal);
}

void ds1620_write_register(unsigned int CMD, unsigned int rval, int outbitcount)
{
digitalWrite(RST, HIGH);
delayMicroseconds(1);
ds1620Out(CMD, 8);
ds1620Out(rval, outbitcount);
digitalWrite(RST, LOW);
delay(15);
}




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

Обратите внимание:
При подключении нагрузки к микросхеме DS1620 следует учесть, что любая токовая нагрузка (например светодиод) подключенная к выходам без усилителя приводит к разогреву корпуса микросхемы и как следствие - неточные показания

Исполнительное устройство.






Comments