Сигнализация о неисправности отопления.
Mar. 4th, 2015 02:38 amИмеется GSM сигнализация, которая шлёт SMSки и звонит на заранее выбранные номера в случае срабатывания датчиков на открытие двери и/или датчиков движения. Надо временно прикрутить к ней сенсор температуры, чтобы в случае снижения ниже допустимого сообщила о проблеме (например, на даче котёл погас, а в ночь мороз будет -20) надо обязательно ехать или чинить котёл или сливать воду.
Потом закажу с Китая нормальный термодатчик, а сейчас надо сделать "чтоб работало". Сигнализация имеет ещё и 4 проводных канала.

Один из них мы и будем замыкать-размыкать.
У меня есть несколько вот таких ARDUINOк

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

Начав работу примерно при 20C (температура помещения), микроконтроллер быстро начал нагреваться, дойдя до теплового равновесия в 24C за 1 минуту. Таким образом, используя ATMEGA32u4, мы можем узнать температуру окружающей среды, вычитая 4C от текущих показаний.
#define TEMP_OFFSET -17 // у меня получилось 17 градусов разница.
byte Flag_send = 0;
void setupADC(){
cli(); //Отключаем глобальные прерывания
ADMUX = 0;
ADMUX |= (1 << REFS1);
ADMUX |= (1 << REFS0);
ADMUX |= (0 << MUX4);
ADMUX |= (0 << MUX3);
ADMUX |= (1 << MUX2);
ADMUX |= (1 << MUX1); // настраиваем АЦП на считывание показаний внутреннего датчика температуры.
ADMUX |= (1 << MUX0); // Сначала следует в качестве источника опорного напряжения установить внутренний источник 2.56 В,
ADCSRA = 0;
ADCSRA |= (1 << ADEN); // настроить мультиплексор на датчик температуры и в итоге включить АЦП.
ADCSRA |= (1 << ADPS2);
ADCSRB = 0;
ADCSRB |= (1 << MUX5);
sei(); //Разрешаем глобальные прерывания
}
int getTemp(){
ADCSRA |= (1 << ADSC);
while (bit_is_set(ADCSRA, ADSC));
byte low = ADCL;
byte high = ADCH;
int temperature = (high << 8) | low;
return temperature - 273 + TEMP_OFFSET; //Изначально датчик выдает температуру в Кельвинах, поэтому ее нужно скорректировать на 273.
}
void setup(){
Serial.begin(9600);
setupADC();
}
void loop(){
Serial.print("Time: ");
Serial.print(millis());
Serial.print(" Core Temperature: ");
int porog = getTemp();
Serial.print(porog);
Serial.println(" C");
if ( porog < 15 && Flag_send == 0 ) {
Flag_send = 1;
pinMode (13,OUTPUT);
digitalWrite(13,HIGH); // сейчас пока зажигаю светодиодик, завтра будет дёргать релюшку.
delay(2000);
digitalWrite(13,LOW);
}
if ( porog > 20 ) Flag_send = 0;
Serial.print("Flag_send ");
Serial.print(Flag_send);
delay(300000); // раз в пять минут будем проверять.
}
Логика работы: при снижении температуры ниже 15 градусов срабатывает реле 1 раз на 2 секунды и система "перезаряжается" только если температура поднималась после этого выше 20 градусов. Это задумано, чтобы она не отправляла SMSки много раз на границе контроля.
Выдачу информации в порт можно убрать, но я столкнулся тут с проблемой :-))) Микросхема настолько крута, что упростив программу она стала меньше греться и соответственно калибровка уплыла на 2 градуса. Оставлю для контроля.
Отличительные особенности:
Высокопроизводительный, малопотребляющий 8-битный микроконтроллер семейства AVR
Передовая RISC архитектура 135 инструкций, большинство выполняется за один такт
32х8 регистров общего назначения
Полностью статический режим работы
Производительность до 16 MIPS (млн. операций в секунду) при тактовой частоте ядра 16 МГц
Встроенный двухтактный умножитель
Энергонезависимая память программ и память данных 32 КБайт самопрограммируемой в системе FLASH памяти 100000 циклов записи/стирания
Встроенный загрузчик программ с независимыми битами защиты Загрузчик активируется после команды сброса
Возможен режим чтения во время записи
Все микроконтроллеры поставляются с "прошитым" USB загрузчиком
2.5 КБайт внутренней SRAM данных
1 КБайт внутренней EEPROM 100000 циклов записи/стирания
Программная защита от считывания
JTAG интерфейс (совместимый с IEEE 1149.1) Сканирование периферии в соответствии стандарту JTAG
Расширенный режим отладки
Поддерживает программирование FLASH, EEPROM и битов защиты
Высокоскоростной/низкоскоростной модуль USB 2.0 с функцией прерывания по окончании передачи Полностью соответствует спецификации Универсальной последовательной Шины версии 2.0
Поддерживает скорость передачи данных 1.5 Мбит/с и 12 Мбит/с
Шесть программируемых оконечных точек на вход или выход с возможность передачи сигнала прерывания, групповой и изохронной передачи данных
Конфигурируемый размер оконечных точек до 256 Байт в режиме сдвоенного банка
832 Байта полностью независимой USB DPRAM для распределения оконечных точек
Сигналы прерывания для останова/возобновления работы
Возможность сброса ЦПУ по сигналу сброса USB шины
Соединение/разъединение с USB шиной по запросу микроконтроллера
Периферия Встроенный PLL для USB и высокоскоростного таймера: рабочая частота от 32 МГц до 96 МГц
Два 8-битных таймера/счетчика с независимым предделителем и режимом сравнения
Два 16-битных таймера/счетчика с независимым предделителем и режимом сравнения и захвата
Один 10-битный высокоскоростной таймер/счетчик с PLL (64 МГц) и режимом сравнения
Четыре 8-битных канала ШИМ
Четыре канала ШИМ с программируемым разрешением от 2 до 16 бит
Шесть каналов ШИМ для высокоскоростной работы с программируемым разрешением от 2 до 11 бит
12-канальный, 10-битный АЦП
Программируемый последовательный USART
Последовательный интерфейс SPI с режимами ведущий/ведомый
Последовательный интерфейс I2C
Программируемый сторожевой таймер с независимым встроенным генератором
Встроенный аналоговый компаратор
Встроенный датчик температуры
Особенности микроконтроллера Сброс по включению питания и функция определения провалов напряжения питания
Встроенный калиброванный генератор на 8 МГц
Встроенный предделитель тактов и переключатель источника тактового сигнала (внутренний RC / внешний генератор) в безостановочном режиме (on-the-fly)
Внешние и внутренние источники прерываний
Шесть энергосберегающих режимов ожидание: Idle, ADC Noise Reduction, Power-save, Power-down, Standby и Extended Standby
Линии ввода/вывода и типы корпуса Все линии ввода/вывода совместимы с CMOS и LVTTL уровнями сигнала
26 линий ввода/вывода
44-выводной корпус TQFP 10х10 мм
44-выводной корпус QFN 7х7 мм
Диапазон напряжения питания 2.7...5.5 Вольта
Рабочий диапазон температур -40°C...+85°C
Максимальная тактовая частота 8 МГц при напряжении питания 2.7 Вольта
16 МГц при напряжении питания 5.5 Вольта
Потом закажу с Китая нормальный термодатчик, а сейчас надо сделать "чтоб работало". Сигнализация имеет ещё и 4 проводных канала.

Один из них мы и будем замыкать-размыкать.
У меня есть несколько вот таких ARDUINOк
ATmega32u4 имеет внутри датчик температуры кристалла. Попробуем им воспользоваться :-)
Проблема в том, что этот датчик измеряет температуру кристалла и для повседневных нужд, вроде измерения окружающей температуры, изначально он не пригоден. Но, используя известную разницу между температурой окружающего воздуха и температурой кристалла, можно найти эту температуру.

Начав работу примерно при 20C (температура помещения), микроконтроллер быстро начал нагреваться, дойдя до теплового равновесия в 24C за 1 минуту. Таким образом, используя ATMEGA32u4, мы можем узнать температуру окружающей среды, вычитая 4C от текущих показаний.
#define TEMP_OFFSET -17 // у меня получилось 17 градусов разница.
byte Flag_send = 0;
void setupADC(){
cli(); //Отключаем глобальные прерывания
ADMUX = 0;
ADMUX |= (1 << REFS1);
ADMUX |= (1 << REFS0);
ADMUX |= (0 << MUX4);
ADMUX |= (0 << MUX3);
ADMUX |= (1 << MUX2);
ADMUX |= (1 << MUX1); // настраиваем АЦП на считывание показаний внутреннего датчика температуры.
ADMUX |= (1 << MUX0); // Сначала следует в качестве источника опорного напряжения установить внутренний источник 2.56 В,
ADCSRA = 0;
ADCSRA |= (1 << ADEN); // настроить мультиплексор на датчик температуры и в итоге включить АЦП.
ADCSRA |= (1 << ADPS2);
ADCSRB = 0;
ADCSRB |= (1 << MUX5);
sei(); //Разрешаем глобальные прерывания
}
int getTemp(){
ADCSRA |= (1 << ADSC);
while (bit_is_set(ADCSRA, ADSC));
byte low = ADCL;
byte high = ADCH;
int temperature = (high << 8) | low;
return temperature - 273 + TEMP_OFFSET; //Изначально датчик выдает температуру в Кельвинах, поэтому ее нужно скорректировать на 273.
}
void setup(){
Serial.begin(9600);
setupADC();
}
void loop(){
Serial.print("Time: ");
Serial.print(millis());
Serial.print(" Core Temperature: ");
int porog = getTemp();
Serial.print(porog);
Serial.println(" C");
if ( porog < 15 && Flag_send == 0 ) {
Flag_send = 1;
pinMode (13,OUTPUT);
digitalWrite(13,HIGH); // сейчас пока зажигаю светодиодик, завтра будет дёргать релюшку.
delay(2000);
digitalWrite(13,LOW);
}
if ( porog > 20 ) Flag_send = 0;
Serial.print("Flag_send ");
Serial.print(Flag_send);
delay(300000); // раз в пять минут будем проверять.
}
Логика работы: при снижении температуры ниже 15 градусов срабатывает реле 1 раз на 2 секунды и система "перезаряжается" только если температура поднималась после этого выше 20 градусов. Это задумано, чтобы она не отправляла SMSки много раз на границе контроля.
Выдачу информации в порт можно убрать, но я столкнулся тут с проблемой :-))) Микросхема настолько крута, что упростив программу она стала меньше греться и соответственно калибровка уплыла на 2 градуса. Оставлю для контроля.
Отличительные особенности:
Высокопроизводительный, малопотребляющий 8-битный микроконтроллер семейства AVR
Передовая RISC архитектура 135 инструкций, большинство выполняется за один такт
32х8 регистров общего назначения
Полностью статический режим работы
Производительность до 16 MIPS (млн. операций в секунду) при тактовой частоте ядра 16 МГц
Встроенный двухтактный умножитель
Энергонезависимая память программ и память данных 32 КБайт самопрограммируемой в системе FLASH памяти 100000 циклов записи/стирания
Встроенный загрузчик программ с независимыми битами защиты Загрузчик активируется после команды сброса
Возможен режим чтения во время записи
Все микроконтроллеры поставляются с "прошитым" USB загрузчиком
2.5 КБайт внутренней SRAM данных
1 КБайт внутренней EEPROM 100000 циклов записи/стирания
Программная защита от считывания
JTAG интерфейс (совместимый с IEEE 1149.1) Сканирование периферии в соответствии стандарту JTAG
Расширенный режим отладки
Поддерживает программирование FLASH, EEPROM и битов защиты
Высокоскоростной/низкоскоростной модуль USB 2.0 с функцией прерывания по окончании передачи Полностью соответствует спецификации Универсальной последовательной Шины версии 2.0
Поддерживает скорость передачи данных 1.5 Мбит/с и 12 Мбит/с
Шесть программируемых оконечных точек на вход или выход с возможность передачи сигнала прерывания, групповой и изохронной передачи данных
Конфигурируемый размер оконечных точек до 256 Байт в режиме сдвоенного банка
832 Байта полностью независимой USB DPRAM для распределения оконечных точек
Сигналы прерывания для останова/возобновления работы
Возможность сброса ЦПУ по сигналу сброса USB шины
Соединение/разъединение с USB шиной по запросу микроконтроллера
Периферия Встроенный PLL для USB и высокоскоростного таймера: рабочая частота от 32 МГц до 96 МГц
Два 8-битных таймера/счетчика с независимым предделителем и режимом сравнения
Два 16-битных таймера/счетчика с независимым предделителем и режимом сравнения и захвата
Один 10-битный высокоскоростной таймер/счетчик с PLL (64 МГц) и режимом сравнения
Четыре 8-битных канала ШИМ
Четыре канала ШИМ с программируемым разрешением от 2 до 16 бит
Шесть каналов ШИМ для высокоскоростной работы с программируемым разрешением от 2 до 11 бит
12-канальный, 10-битный АЦП
Программируемый последовательный USART
Последовательный интерфейс SPI с режимами ведущий/ведомый
Последовательный интерфейс I2C
Программируемый сторожевой таймер с независимым встроенным генератором
Встроенный аналоговый компаратор
Встроенный датчик температуры
Особенности микроконтроллера Сброс по включению питания и функция определения провалов напряжения питания
Встроенный калиброванный генератор на 8 МГц
Встроенный предделитель тактов и переключатель источника тактового сигнала (внутренний RC / внешний генератор) в безостановочном режиме (on-the-fly)
Внешние и внутренние источники прерываний
Шесть энергосберегающих режимов ожидание: Idle, ADC Noise Reduction, Power-save, Power-down, Standby и Extended Standby
Линии ввода/вывода и типы корпуса Все линии ввода/вывода совместимы с CMOS и LVTTL уровнями сигнала
26 линий ввода/вывода
44-выводной корпус TQFP 10х10 мм
44-выводной корпус QFN 7х7 мм
Диапазон напряжения питания 2.7...5.5 Вольта
Рабочий диапазон температур -40°C...+85°C
Максимальная тактовая частота 8 МГц при напряжении питания 2.7 Вольта
16 МГц при напряжении питания 5.5 Вольта
no subject
Date: 2015-03-04 01:28 am (UTC)no subject
Date: 2015-03-04 06:51 am (UTC)Вчера хотел сделать экономию электричества. Отправлять микроконтролллер в сон, и раз в пять минуть просыпаться измерять и снова спать. Тогда можно и не калибровать :-) температура кристалла будет равна окружающему воздуху. Но просто некогда этим заняться, пока оставлю так как сделал.
no subject
Date: 2015-03-04 12:55 pm (UTC)