С чего все началось - с нервозного состояния и бессонных ночей.
Бывают такие вещи которые крайне боятся заморозков, даже краткосрочных,
например свежевысаженная рассада в тепличке, овощи в утепленном ящике на
балконе, помещения с трубами заполненными водой или овощной ларек на рынке
(это я к примеру). Поскольку прогноз погоды точным не бывает невозможно
заранее предусмотреть падение температуры и в результате как только
складываются условия к заморозкам - бессонная ночь
гарантирована.
Первой мыслью было найти готовое устройство контроля
температуры по бюджетной стоимости и с достаточной точностью.
Изучение
рынка предлагаемого оборудования дало отрицательный результат
Механические термостаты от холодильников работают на замыкание при
снижении температуры и обратной группы контактов, необходимой для
включения нагревателя, как правило нет
- Электронные аналоговые устройства (например термостат мастеркит
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 следует учесть, что любая токовая нагрузка
(например светодиод) подключенная к выходам без усилителя приводит к
разогреву корпуса микросхемы и как следствие - неточные показания
Исполнительное устройство.