Автопортал || Авто - статьи

Сельскохозяйственная техника
Чтение RSS

Термореле для холодильника на Arduino Pro Mini і ds18b20.

Є у мене холодильник Nord. Вже не молодий, але цілком собі робочий. Працював він собі, працював, як раптом став помічати, що не вимикається він. Компресор працює постійно, полій на "потіє" стінці утворилася. Коротше, термореле зламалося. Викликали майстра і з'ясувався неприємний момент - дана модель холодильника йшла з термореле, яке вже знято з виробництва, а інші реле мають не зовсім підходящі характеристики. Холодильник - штука корисна, тому, зітхнувши, сказав, щоб ставив хоч щось. Нове реле вимикали час від часу компресор, але все-таки температуру заганяли в мінус і раз в день доводилося холодильник приблизно на годину-півтора вимикати з розетки. Обзвон інших майстрів-холодильщиків результатів не дав (хто з Норд взагалі не працював, у кого теж такого термореле не було) і встав одвічне питання "Що робити?"

Вирішено було зробити своє термореле "з преферанс і поетесами" з по-можливості найменшим втручанням в сам холодильник. Насамперед перейнявся вимогами до реле. Пошук по форумах холодильщиків привів до наступного списку вимог:
- при включенні напруги мережі - пауза 10 хвилин до включення двигуна незалежно від температури;
- при відключенні, повторне включення не раніше 10 хвилин незалежно від температури;
- при перезавантаженні - пауза 10 хвилин до включення двигуна незалежно від температури;
- якщо компресор працює більше 1 години - примусова зупинка незалежно від температури.

Пауза перед кожним повторним включенням для компресора необхідна. Це пов'язано з тим, що приблизно за 5 хвилин повинно стравити тиск в компресорі. Якщо компресор включиться раніше, то він буде відчувати підвищене навантаження. Розпочнеться перегрів обмоток і для компресора це може закінчитися зовсім сумно.

Встановити датчик в тому-ж місці, що і звичайний не виходило, так як там вже стояв датчик термореле холодильника. Термореле холодильника я вирішив не чіпати, а використовувати як резервне, для страховки. Тому свій датчик я вирішив завести через трубку зливу конденсату, а на час налагодження, тимчасово, завести його через ущільнювач двері (але, відчуваю, це тимчасове рішення виявиться постійним). Для того, щоб при випадковому обриві датчика холодильник не залишився без управління, ввів ще одне правило:
- якщо температурний датчик обірваний або несправний, то компресор працює в циклі (20 хв робота / 40 хв відпочинок), при цьому загоряється аварійний світлодіод.

Установка датчика в нестандартному місці привела до того, що скористатися даними з довідника по термореле було не можна. Там були параметри при установці в штатне місце штатним чином. Тому, для початку, вибравши місце установки датчика ds18b20, промерял температури, при якому вмикається і вимикається компресор при вже встановленому реле. Оскільки цей діапазон приводив до наморожуванню, я просто підняв і температуру включення, і температуру вимикання на градус. Це виявилося вдалим рішенням. На іншій моделі холодильника і в іншому місці установки це може виявитися і не так, доведеться експериментувати.

Для виготовлення термореле я вирішив використовувати 5-вольтової Arduino Pro Mini, куплене в Китаї ( http://www.aliexpress.com/item/10Pcs-Lot-Pro-Mini-Module-Atmega328-5V-16M-For-Arduino-Compatible-With-Nano/1432639609.html ) Для виготовлення термореле я вирішив використовувати 5-вольтової Arduino Pro Mini, куплене в Китаї (   http://www

і релейний модуль,

і релейний модуль,

куплений там-же ( http://www.aliexpress.com/item/Wholesale-Retail-New-1-Channel-HL-Level-Triger-Optocoupler-Relay-Module-For-Arduino-5V-Hot/1321978586.html ).

В якості блоку живлення були використані нутрощі зарядного пристрою для мобільних телефонів.
В якості блоку живлення були використані нутрощі зарядного пристрою для мобільних телефонів
Термодатчик виконаний на ds18b20 і підключений до Arduino Pro Mini кручений парою, висмикнутою з кабелю локальної мережі. Для герметичності місце висновків залито термоклеем.

Ось фото зібраного на макетке пристрою. Як видно на фотографії, була ще й звукова сигналізація помилки датчика при кожному відключенні компресора, але я від неї відмовився і в підсумкову схему пищалка не ввійшла.

Плати блоку живлення, Arduino Pro Mini і релейного модуля були з'єднані навісним монтажем і поміщені в корпус з мережевою вилкою.

На тильну сторону корпусу прикріплена розетка для зовнішньої проводки, в яку і включається холодильник.

Таке рішення не позбавлене недоліків - при паузах в роботі компресора холодильник знеструмлюється повністю, тому внутрішнє освітлення не працює. З іншого боку відсутня втручання в схему холодильника. Ось як це виглядає в роботі.

Ну і програма для Arduino.

/ * Termostat_for_nord.ino Термореле для побутового холодильника При включенні напруги мережі - пауза 10 хвилин до включення двигуна незалежно від температури. При відключенні, повторне включення не раніше 10 хвилин незалежно від температури. При перезавантаженні - пауза 10 хвилин до включення двигуна незалежно від температури. Якщо компресор працює більше 1 години - примусова зупинка незалежно від температури. Якщо температурний датчик обірваний або несправний, то компресор працює в циклі (20 хв робота / 40 хв відпочинок), при цьому загоряється аварійний світлодіод Version: 20141018 * / #include <avr / wdt.h> #include <OneWire.h> #include <DallasTemperature.h> // Температура включення компресора #define TEMPERATURE_MAX 5.0 // Температура відключення компресора #define TEMPERATURE_MIN -2.0 // Пауза перед включенням компресора (600000 = 10 хвилин) #define DELAY_COMPRESSOR 600000 // Максимальний час роботи компресора (3600000 = 1 годину) #define MAXTIME_COMPRESSOR 3600000 // Реле підключено до 3 піну #define RELE 3 // Датчик температури підключений до 2 піну #define ONE_WIRE_BUS 2 // Світлодіод а ності підключений до 13 піну #define LED_ACTIVITY 13 // Савчин світлодіода активності в мс #define LED_ACTIVITY_ON 50 // Пауза світлодіода активності в мс #define LED_ACTIVITY_OFF 3950 // Світлодіод помилки датчика температури підключений до 12 піну #define LED_ERROR 12 // Час роботи компресора при помилку датчика температури (1200000 = 20 хвилин) #define ERROR_COMPRESSOR_ON 1200000 // Час паузи компресора при помилку датчика температури (2400000 = 40 хвилин) #define ERROR_COMPRESSOR_OFF 2400000 float f_tempC; // Поточна температура unsigned long ul_offTime; // Час відключення компресора unsigned long ul_workTime; // Час включення компресора unsigned long ul_newTime; // Поточний час unsigned long ul_deltaTime; // Різниця часу unsigned long ul_actHeartLedTime; // Час світлодіода активності boolean b_actLedOn; // Світлодіод активності включений boolean b_compressorOff; // Компресор вимкнений OneWire oneWire (ONE_WIRE_BUS); DallasTemperature sensors (& oneWire); void setup () {wdt_enable (WDTO_2S); pinMode (RELE, OUTPUT); pinMode (LED_ACTIVITY, OUTPUT); pinMode (LED_ERROR, OUTPUT); digitalWrite (RELE, LOW); // При завантаженні компресор відключений b_compressorOff = true; digitalWrite (LED_ACTIVITY, LOW); b_actLedOn = false; digitalWrite (LED_ERROR, LOW); sensors.begin (); ul_offTime = millis (); // Запам'ятовуємо час початку роботи програми ul_actHeartLedTime = ul_offTime; } // Функція обчислення різниці часу unsigned long deltamills (unsigned long t_old, unsigned long t_new) {unsigned long delta; if (t_old <= t_new) {delta = t_new - t_old; } Else {delta = (4294967295 - t_old) + t_new; } Return delta; } // Функція моргання светодиодом активності void heartIndication (unsigned long ul_newLedTime) {unsigned long ul_deltaHeartTime = deltamills (ul_actHeartLedTime, ul_newLedTime); if (b_actLedOn) {// Якщо світлодіод активності включений, чекаємо інтервалу LED_ACTIVITY_ON мс if (ul_deltaHeartTime> LED_ACTIVITY_ON) {digitalWrite (LED_ACTIVITY, LOW); b_actLedOn = false; ul_actHeartLedTime = ul_newLedTime; }} Else {// Якщо світлодіод активності вимкнений, чекаємо інтервалу LED_ACTIVITY_OFF мс if (ul_deltaHeartTime> LED_ACTIVITY_OFF) {digitalWrite (LED_ACTIVITY, HIGH); b_actLedOn = true; ul_actHeartLedTime = ul_newLedTime; }}} Void loop () {wdt_reset (); // Обнуляємо WDT (сторожовий таймер) ul_newTime = millis (); // Отримуємо поточний час heartIndication (ul_newTime); // Морган светодиодом активності sensors.requestTemperatures (); f_tempC = sensors.getTempCByIndex (0); // Отримуємо температуру з датчика // Перевіряємо працездатність датчика температури if ((f_tempC> -20.0) && (f_tempC <50.0)) {// Температурний датчик справний digitalWrite (LED_ERROR, LOW); if (b_compressorOff) {// Якщо компресор вимкнений ul_deltaTime = deltamills (ul_offTime, ul_newTime); // Різниця часу простою if (ul_deltaTime> DELAY_COMPRESSOR) {// Якщо різниця часу простою більше дозволеної if (f_tempC> TEMPERATURE_MAX) {// Якщо температура більше максимально допустимої digitalWrite (RELE, HIGH); // Включаємо компресор b_compressorOff = false; ul_workTime = millis (); // Записуємо час включення}}} else {// Якщо компресор працює ul_deltaTime = deltamills (ul_workTime, ul_newTime); // Різниця часу роботи // Якщо температура менше мінімально допустимої або час роботи більше допустимого if ((f_tempC <TEMPERATURE_MIN) || (ul_deltaTime> MAXTIME_COMPRESSOR)) {digitalWrite (RELE, LOW); // Вимикаємо компресор b_compressorOff = true; ul_offTime = millis (); // Запам'ятовуємо час вимикання компресора}}} else {// Температурний датчик несправний або обірваний digitalWrite (LED_ERROR, HIGH); if (b_compressorOff) {// Якщо компресор вимкнений при несправному датчику ul_deltaTime = deltamills (ul_offTime, ul_newTime); // Різниця часу простою if (ul_deltaTime> ERROR_COMPRESSOR_OFF) {// Якщо різниця часу простою більше дозволеної digitalWrite (RELE, HIGH); // Включаємо компресор b_compressorOff = false; ul_workTime = millis (); // Записуємо час включення}} else {// Якщо компресор працює при несправному датчику ul_deltaTime = deltamills (ul_workTime, ul_newTime); if (ul_deltaTime> ERROR_COMPRESSOR_ON) {digitalWrite (RELE, LOW); // Вимикаємо компресор b_compressorOff = true; ul_offTime = millis (); // Запам'ятовуємо час вимикання компресора}}}}

Обзвон інших майстрів-холодильщиків результатів не дав (хто з Норд взагалі не працював, у кого теж такого термореле не було) і встав одвічне питання "Що робити?